/* 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.
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"
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\
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;
}
}
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
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
- 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.
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);
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 (current_buffer->overwrite_mode)
+ if (!NILP (overwrite)
&& 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
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\
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");