(LD_SWITCH_SYSTEM): Undo previous change.
[bpt/emacs.git] / src / cmds.c
index 9dfd2b4..e6ceeee 100644 (file)
@@ -1,5 +1,5 @@
 /* Simple built-in editing commands.
 /* Simple built-in editing commands.
-   Copyright (C) 1985, 1992 Free Software Foundation, Inc.
+   Copyright (C) 1985, 1993 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
 
 This file is part of GNU Emacs.
 
@@ -18,7 +18,7 @@ along with GNU Emacs; see the file COPYING.  If not, write to
 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 
 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 
-#include "config.h"
+#include <config.h>
 #include "lisp.h"
 #include "commands.h"
 #include "buffer.h"
 #include "lisp.h"
 #include "commands.h"
 #include "buffer.h"
@@ -26,7 +26,9 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 Lisp_Object Qkill_forward_chars, Qkill_backward_chars, Vblink_paren_function;
 
 
 Lisp_Object Qkill_forward_chars, Qkill_backward_chars, Vblink_paren_function;
 
-int overwrite_binary_mode;
+/* A possible value for a buffer's overwrite-mode variable.  */
+Lisp_Object Qoverwrite_mode_binary;
+
 \f
 DEFUN ("forward-char", Fforward_char, Sforward_char, 0, 1, "p",
   "Move point right ARG characters (left if ARG negative).\n\
 \f
 DEFUN ("forward-char", Fforward_char, Sforward_char, 0, 1, "p",
   "Move point right ARG characters (left if ARG negative).\n\
@@ -39,17 +41,28 @@ On reaching end of buffer, stop and signal error.")
   else
     CHECK_NUMBER (n, 0);
 
   else
     CHECK_NUMBER (n, 0);
 
-  SET_PT (point + XINT (n));
-  if (point < BEGV)
-    {
-      SET_PT (BEGV);
-      Fsignal (Qbeginning_of_buffer, Qnil);
-    }
-  if (point > ZV)
-    {
-      SET_PT (ZV);
-      Fsignal (Qend_of_buffer, Qnil);
-    }
+  /* This used to just set point to point + XINT (n), and then check
+     to see if it was within boundaries.  But now that SET_PT can
+     potentially do a lot of stuff (calling entering and exiting
+     hooks, etcetera), that's not a good approach.  So we validate the
+     proposed position, then set point.  */
+  {
+    int new_point = point + XINT (n);
+
+    if (new_point < BEGV)
+      {
+       SET_PT (BEGV);
+       Fsignal (Qbeginning_of_buffer, Qnil);
+      }
+    if (new_point > ZV)
+      {
+       SET_PT (ZV);
+       Fsignal (Qend_of_buffer, Qnil);
+      }
+
+    SET_PT (new_point);
+  }
+
   return Qnil;
 }
 
   return Qnil;
 }
 
@@ -92,7 +105,7 @@ With positive ARG, a non-empty line at the end counts as one line\n\
     }
 
   negp = count <= 0;
     }
 
   negp = count <= 0;
-  pos = scan_buffer ('\n', pos2, count - negp, &shortage);
+  pos = scan_buffer ('\n', pos2, count - negp, &shortage, 1);
   if (shortage > 0
       && (negp
          || (ZV > BEGV
   if (shortage > 0
       && (negp
          || (ZV > BEGV
@@ -228,10 +241,10 @@ In Auto Fill mode, if no numeric arg, break the preceding line if it's long.")
   arg = Fprefix_numeric_value (arg1);
 
   if (!NILP (current_buffer->read_only))
   arg = Fprefix_numeric_value (arg1);
 
   if (!NILP (current_buffer->read_only))
-    Fsignal (Qbuffer_read_only, Qnil);
+    Fbarf_if_buffer_read_only ();
 
   /* Inserting a newline at the end of a line produces better
 
   /* Inserting a newline at the end of a line produces better
-     redisplay in try_window_id than inserting at the ebginning fo a
+     redisplay in try_window_id than inserting at the beginning of a
      line, and the textual result is the same.  So, if we're at
      beginning of line, pretend to be at the end of the previous line.  
 
      line, and the textual result is the same.  So, if we're at
      beginning of line, pretend to be at the end of the previous line.  
 
@@ -240,6 +253,15 @@ In Auto Fill mode, if no numeric arg, break the preceding line if it's long.")
      features all do nothing in that case.  */
 
   flag = point > BEGV && FETCH_CHAR (point - 1) == '\n';
      features all do nothing in that case.  */
 
   flag = point > BEGV && FETCH_CHAR (point - 1) == '\n';
+#ifdef USE_TEXT_PROPERTIES
+  /* We cannot use this optimization if properties change
+     in the vicinity.
+     ??? We need to check for change hook properties, etc.  */
+  if (flag)
+    if (! (point - 1 > BEGV && ! property_change_between_p (point - 2, point)))
+      flag = 0;
+#endif
+
   if (flag)
     SET_PT (point - 1);
 
   if (flag)
     SET_PT (point - 1);
 
@@ -273,14 +295,16 @@ internal_self_insert (c1, noautofill)
   Lisp_Object tem;
   register enum syntaxcode synt;
   register int c = c1;
   Lisp_Object tem;
   register enum syntaxcode synt;
   register int c = c1;
+  Lisp_Object overwrite = current_buffer->overwrite_mode;
 
   if (!NILP (Vbefore_change_function) || !NILP (Vafter_change_function))
     hairy = 1;
 
 
   if (!NILP (Vbefore_change_function) || !NILP (Vafter_change_function))
     hairy = 1;
 
-  if (!NILP (current_buffer->overwrite_mode)
+  if (!NILP (overwrite)
       && point < ZV
       && point < ZV
-      && (overwrite_binary_mode || (c != '\n' && FETCH_CHAR (point) != '\n'))
-      && (overwrite_binary_mode
+      && (EQ (overwrite, Qoverwrite_mode_binary)
+         || (c != '\n' && FETCH_CHAR (point) != '\n'))
+      && (EQ (overwrite, Qoverwrite_mode_binary)
          || FETCH_CHAR (point) != '\t'
          || XINT (current_buffer->tab_width) <= 0
          || XFASTINT (current_buffer->tab_width) > 20
          || FETCH_CHAR (point) != '\t'
          || XINT (current_buffer->tab_width) <= 0
          || XFASTINT (current_buffer->tab_width) > 20
@@ -336,11 +360,8 @@ syms_of_cmds ()
   Qkill_forward_chars = intern ("kill-forward-chars");
   staticpro (&Qkill_forward_chars);
 
   Qkill_forward_chars = intern ("kill-forward-chars");
   staticpro (&Qkill_forward_chars);
 
-  DEFVAR_BOOL ("overwrite-binary-mode", &overwrite_binary_mode,
-    "*Non-nil means overwrite mode treats tab and newline normally.\n\
-Ordinarily, overwriting preserves a tab until its whole width is overwritten\n\
-and never replaces a newline.");
-  overwrite_binary_mode = 1;
+  Qoverwrite_mode_binary = intern ("overwrite-mode-binary");
+  staticpro (&Qoverwrite_mode_binary);
 
   DEFVAR_LISP ("blink-paren-function", &Vblink_paren_function,
     "Function called, if non-nil, whenever a close parenthesis is inserted.\n\
 
   DEFVAR_LISP ("blink-paren-function", &Vblink_paren_function,
     "Function called, if non-nil, whenever a close parenthesis is inserted.\n\
@@ -368,6 +389,12 @@ keys_of_cmds ()
   initial_define_key (global_map, Ctl('I'), "self-insert-command");
   for (n = 040; n < 0177; n++)
     initial_define_key (global_map, n, "self-insert-command");
   initial_define_key (global_map, Ctl('I'), "self-insert-command");
   for (n = 040; n < 0177; n++)
     initial_define_key (global_map, n, "self-insert-command");
+#ifdef MSDOS
+  for (n = 0200; n < 0240; n++)
+    initial_define_key (global_map, n, "self-insert-command");
+#endif
+  for (n = 0240; n < 0400; n++)
+    initial_define_key (global_map, n, "self-insert-command");
 
   initial_define_key (global_map, Ctl ('A'), "beginning-of-line");
   initial_define_key (global_map, Ctl ('B'), "backward-char");
 
   initial_define_key (global_map, Ctl ('A'), "beginning-of-line");
   initial_define_key (global_map, Ctl ('B'), "backward-char");