Make internal_self_insert static
[emacs.git] / src / cmds.c
blob2b686a44d873d27914ada0a0f3c0cd461e72f038
1 /* Simple built-in editing commands.
2 Copyright (C) 1985, 1993, 1994, 1995, 1996, 1997, 1998, 2001, 2002,
3 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
4 Free Software Foundation, Inc.
6 This file is part of GNU Emacs.
8 GNU Emacs is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
13 GNU Emacs is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
22 #include <config.h>
23 #include <setjmp.h>
24 #include "lisp.h"
25 #include "commands.h"
26 #include "buffer.h"
27 #include "character.h"
28 #include "syntax.h"
29 #include "window.h"
30 #include "keyboard.h"
31 #include "keymap.h"
32 #include "dispextern.h"
33 #include "frame.h"
35 Lisp_Object Qkill_forward_chars, Qkill_backward_chars, Vblink_paren_function;
37 /* A possible value for a buffer's overwrite-mode variable. */
38 Lisp_Object Qoverwrite_mode_binary;
40 /* Non-nil means put this face on the next self-inserting character. */
41 Lisp_Object Vself_insert_face;
43 /* This is the command that set up Vself_insert_face. */
44 Lisp_Object Vself_insert_face_command;
46 extern Lisp_Object Qface;
47 extern Lisp_Object Vtranslation_table_for_input;
49 static int internal_self_insert (int, int);
51 DEFUN ("forward-point", Fforward_point, Sforward_point, 1, 1, 0,
52 doc: /* Return buffer position N characters after (before if N negative) point. */)
53 (Lisp_Object n)
55 CHECK_NUMBER (n);
57 return make_number (PT + XINT (n));
60 DEFUN ("forward-char", Fforward_char, Sforward_char, 0, 1, "^p",
61 doc: /* Move point N characters forward (backward if N is negative).
62 On reaching end or beginning of buffer, stop and signal error.
64 Depending on the bidirectional context, the movement may be to the
65 right or to the left on the screen. This is in contrast with
66 \\[right-char], which see. */)
67 (Lisp_Object n)
69 if (NILP (n))
70 XSETFASTINT (n, 1);
71 else
72 CHECK_NUMBER (n);
74 /* This used to just set point to point + XINT (n), and then check
75 to see if it was within boundaries. But now that SET_PT can
76 potentially do a lot of stuff (calling entering and exiting
77 hooks, etcetera), that's not a good approach. So we validate the
78 proposed position, then set point. */
80 int new_point = PT + XINT (n);
82 if (new_point < BEGV)
84 SET_PT (BEGV);
85 xsignal0 (Qbeginning_of_buffer);
87 if (new_point > ZV)
89 SET_PT (ZV);
90 xsignal0 (Qend_of_buffer);
93 SET_PT (new_point);
96 return Qnil;
99 DEFUN ("backward-char", Fbackward_char, Sbackward_char, 0, 1, "^p",
100 doc: /* Move point N characters backward (forward if N is negative).
101 On attempt to pass beginning or end of buffer, stop and signal error.
103 Depending on the bidirectional context, the movement may be to the
104 right or to the left on the screen. This is in contrast with
105 \\[left-char], which see. */)
106 (Lisp_Object n)
108 if (NILP (n))
109 XSETFASTINT (n, 1);
110 else
111 CHECK_NUMBER (n);
113 XSETINT (n, - XINT (n));
114 return Fforward_char (n);
117 DEFUN ("forward-line", Fforward_line, Sforward_line, 0, 1, "^p",
118 doc: /* Move N lines forward (backward if N is negative).
119 Precisely, if point is on line I, move to the start of line I + N.
120 If there isn't room, go as far as possible (no error).
121 Returns the count of lines left to move. If moving forward,
122 that is N - number of lines moved; if backward, N + number moved.
123 With positive N, a non-empty line at the end counts as one line
124 successfully moved (for the return value). */)
125 (Lisp_Object n)
127 int opoint = PT, opoint_byte = PT_BYTE;
128 int pos, pos_byte;
129 int count, shortage;
131 if (NILP (n))
132 count = 1;
133 else
135 CHECK_NUMBER (n);
136 count = XINT (n);
139 if (count <= 0)
140 shortage = scan_newline (PT, PT_BYTE, BEGV, BEGV_BYTE, count - 1, 1);
141 else
142 shortage = scan_newline (PT, PT_BYTE, ZV, ZV_BYTE, count, 1);
144 /* Since scan_newline does TEMP_SET_PT_BOTH,
145 and we want to set PT "for real",
146 go back to the old point and then come back here. */
147 pos = PT;
148 pos_byte = PT_BYTE;
149 TEMP_SET_PT_BOTH (opoint, opoint_byte);
150 SET_PT_BOTH (pos, pos_byte);
152 if (shortage > 0
153 && (count <= 0
154 || (ZV > BEGV
155 && PT != opoint
156 && (FETCH_BYTE (PT_BYTE - 1) != '\n'))))
157 shortage--;
159 return make_number (count <= 0 ? - shortage : shortage);
162 DEFUN ("beginning-of-line", Fbeginning_of_line, Sbeginning_of_line, 0, 1, "^p",
163 doc: /* Move point to beginning of current line.
164 With argument N not nil or 1, move forward N - 1 lines first.
165 If point reaches the beginning or end of buffer, it stops there.
167 This function constrains point to the current field unless this moves
168 point to a different line than the original, unconstrained result.
169 If N is nil or 1, and a front-sticky field starts at point, the point
170 does not move. To ignore field boundaries bind
171 `inhibit-field-text-motion' to t, or use the `forward-line' function
172 instead. For instance, `(forward-line 0)' does the same thing as
173 `(beginning-of-line)', except that it ignores field boundaries. */)
174 (Lisp_Object n)
176 if (NILP (n))
177 XSETFASTINT (n, 1);
178 else
179 CHECK_NUMBER (n);
181 SET_PT (XINT (Fline_beginning_position (n)));
183 return Qnil;
186 DEFUN ("end-of-line", Fend_of_line, Send_of_line, 0, 1, "^p",
187 doc: /* Move point to end of current line.
188 With argument N not nil or 1, move forward N - 1 lines first.
189 If point reaches the beginning or end of buffer, it stops there.
190 To ignore intangibility, bind `inhibit-point-motion-hooks' to t.
192 This function constrains point to the current field unless this moves
193 point to a different line than the original, unconstrained result. If
194 N is nil or 1, and a rear-sticky field ends at point, the point does
195 not move. To ignore field boundaries bind `inhibit-field-text-motion'
196 to t. */)
197 (Lisp_Object n)
199 int newpos;
201 if (NILP (n))
202 XSETFASTINT (n, 1);
203 else
204 CHECK_NUMBER (n);
206 while (1)
208 newpos = XINT (Fline_end_position (n));
209 SET_PT (newpos);
211 if (PT > newpos
212 && FETCH_CHAR (PT - 1) == '\n')
214 /* If we skipped over a newline that follows
215 an invisible intangible run,
216 move back to the last tangible position
217 within the line. */
219 SET_PT (PT - 1);
220 break;
222 else if (PT > newpos && PT < ZV
223 && FETCH_CHAR (PT) != '\n')
224 /* If we skipped something intangible
225 and now we're not really at eol,
226 keep going. */
227 n = make_number (1);
228 else
229 break;
232 return Qnil;
235 DEFUN ("delete-char", Fdelete_char, Sdelete_char, 1, 2, "p\nP",
236 doc: /* Delete the following N characters (previous if N is negative).
237 Optional second arg KILLFLAG non-nil means kill instead (save in kill ring).
238 Interactively, N is the prefix arg, and KILLFLAG is set if
239 N was explicitly specified.
241 The command `delete-forward' is preferable for interactive use. */)
242 (Lisp_Object n, Lisp_Object killflag)
244 int pos;
246 CHECK_NUMBER (n);
248 pos = PT + XINT (n);
249 if (NILP (killflag))
251 if (XINT (n) < 0)
253 if (pos < BEGV)
254 xsignal0 (Qbeginning_of_buffer);
255 else
256 del_range (pos, PT);
258 else
260 if (pos > ZV)
261 xsignal0 (Qend_of_buffer);
262 else
263 del_range (PT, pos);
266 else
268 call1 (Qkill_forward_chars, n);
270 return Qnil;
273 static int nonundocount;
275 /* Note that there's code in command_loop_1 which typically avoids
276 calling this. */
277 DEFUN ("self-insert-command", Fself_insert_command, Sself_insert_command, 1, 1, "p",
278 doc: /* Insert the character you type.
279 Whichever character you type to run this command is inserted.
280 Before insertion, `expand-abbrev' is executed if the inserted character does
281 not have word syntax and the previous character in the buffer does.
282 After insertion, the value of `auto-fill-function' is called if the
283 `auto-fill-chars' table has a non-nil value for the inserted character. */)
284 (Lisp_Object n)
286 int remove_boundary = 1;
287 CHECK_NUMBER (n);
289 if (!EQ (Vthis_command, current_kboard->Vlast_command))
290 nonundocount = 0;
292 if (NILP (Vexecuting_kbd_macro)
293 && !EQ (minibuf_window, selected_window))
295 if (nonundocount <= 0 || nonundocount >= 20)
297 remove_boundary = 0;
298 nonundocount = 0;
300 nonundocount++;
303 if (remove_boundary
304 && CONSP (current_buffer->undo_list)
305 && NILP (XCAR (current_buffer->undo_list)))
306 /* Remove the undo_boundary that was just pushed. */
307 current_buffer->undo_list = XCDR (current_buffer->undo_list);
309 /* Barf if the key that invoked this was not a character. */
310 if (!CHARACTERP (last_command_event))
311 bitch_at_user ();
313 int character = translate_char (Vtranslation_table_for_input,
314 XINT (last_command_event));
315 if (XINT (n) >= 2 && NILP (current_buffer->overwrite_mode))
317 XSETFASTINT (n, XFASTINT (n) - 2);
318 /* The first one might want to expand an abbrev. */
319 internal_self_insert (character, 1);
320 /* The bulk of the copies of this char can be inserted simply.
321 We don't have to handle a user-specified face specially
322 because it will get inherited from the first char inserted. */
323 Finsert_char (make_number (character), n, Qt);
324 /* The last one might want to auto-fill. */
325 internal_self_insert (character, 0);
327 else
328 while (XINT (n) > 0)
330 int val;
331 /* Ok since old and new vals both nonneg */
332 XSETFASTINT (n, XFASTINT (n) - 1);
333 val = internal_self_insert (character, XFASTINT (n) != 0);
334 if (val == 2)
335 nonundocount = 0;
336 frame_make_pointer_invisible ();
340 return Qnil;
343 /* Insert character C. If NOAUTOFILL is nonzero, don't do autofill
344 even if it is enabled.
346 If this insertion is suitable for direct output (completely simple),
347 return 0. A value of 1 indicates this *might* not have been simple.
348 A value of 2 means this did things that call for an undo boundary. */
350 static Lisp_Object Qexpand_abbrev;
352 static int
353 internal_self_insert (int c, int noautofill)
355 int hairy = 0;
356 Lisp_Object tem;
357 register enum syntaxcode synt;
358 Lisp_Object overwrite, string;
359 /* Length of multi-byte form of C. */
360 int len;
361 /* Working buffer and pointer for multi-byte form of C. */
362 unsigned char str[MAX_MULTIBYTE_LENGTH];
363 int chars_to_delete = 0;
364 int spaces_to_insert = 0;
366 overwrite = current_buffer->overwrite_mode;
367 if (!NILP (Vbefore_change_functions) || !NILP (Vafter_change_functions))
368 hairy = 1;
370 /* At first, get multi-byte form of C in STR. */
371 if (!NILP (current_buffer->enable_multibyte_characters))
373 len = CHAR_STRING (c, str);
374 if (len == 1)
375 /* If C has modifier bits, this makes C an appropriate
376 one-byte char. */
377 c = *str;
379 else
381 str[0] = (SINGLE_BYTE_CHAR_P (c)
383 : multibyte_char_to_unibyte (c, Qnil));
384 len = 1;
386 if (!NILP (overwrite)
387 && PT < ZV)
389 /* In overwrite-mode, we substitute a character at point (C2,
390 hereafter) by C. For that, we delete C2 in advance. But,
391 just substituting C2 by C may move a remaining text in the
392 line to the right or to the left, which is not preferable.
393 So we insert more spaces or delete more characters in the
394 following cases: if C is narrower than C2, after deleting C2,
395 we fill columns with spaces, if C is wider than C2, we delete
396 C2 and several characters following C2. */
398 /* This is the character after point. */
399 int c2 = FETCH_CHAR (PT_BYTE);
401 /* Column the cursor should be placed at after this insertion.
402 The correct value should be calculated only when necessary. */
403 int target_clm = 0;
405 /* Overwriting in binary-mode always replaces C2 by C.
406 Overwriting in textual-mode doesn't always do that.
407 It inserts newlines in the usual way,
408 and inserts any character at end of line
409 or before a tab if it doesn't use the whole width of the tab. */
410 if (EQ (overwrite, Qoverwrite_mode_binary)
411 || (c != '\n'
412 && c2 != '\n'
413 && ! (c2 == '\t'
414 && XINT (current_buffer->tab_width) > 0
415 && XFASTINT (current_buffer->tab_width) < 20
416 && (target_clm = ((int) current_column () /* iftc */
417 + XINT (Fchar_width (make_number (c)))),
418 target_clm % XFASTINT (current_buffer->tab_width)))))
420 int pos = PT;
421 int pos_byte = PT_BYTE;
423 if (target_clm == 0)
424 chars_to_delete = 1;
425 else
427 /* The actual cursor position after the trial of moving
428 to column TARGET_CLM. It is greater than TARGET_CLM
429 if the TARGET_CLM is middle of multi-column
430 character. In that case, the new point is set after
431 that character. */
432 int actual_clm
433 = XFASTINT (Fmove_to_column (make_number (target_clm), Qnil));
435 chars_to_delete = PT - pos;
437 if (actual_clm > target_clm)
439 /* We will delete too many columns. Let's fill columns
440 by spaces so that the remaining text won't move. */
441 spaces_to_insert = actual_clm - target_clm;
444 SET_PT_BOTH (pos, pos_byte);
445 hairy = 2;
447 hairy = 2;
450 synt = SYNTAX (c);
452 if (!NILP (current_buffer->abbrev_mode)
453 && synt != Sword
454 && NILP (current_buffer->read_only)
455 && PT > BEGV
456 && (!NILP (current_buffer->enable_multibyte_characters)
457 ? SYNTAX (XFASTINT (Fprevious_char ())) == Sword
458 : (SYNTAX (UNIBYTE_TO_CHAR (XFASTINT (Fprevious_char ())))
459 == Sword)))
461 int modiff = MODIFF;
462 Lisp_Object sym;
464 sym = call0 (Qexpand_abbrev);
466 /* If we expanded an abbrev which has a hook,
467 and the hook has a non-nil `no-self-insert' property,
468 return right away--don't really self-insert. */
469 if (SYMBOLP (sym) && ! NILP (sym) && ! NILP (XSYMBOL (sym)->function)
470 && SYMBOLP (XSYMBOL (sym)->function))
472 Lisp_Object prop;
473 prop = Fget (XSYMBOL (sym)->function, intern ("no-self-insert"));
474 if (! NILP (prop))
475 return 1;
478 if (MODIFF != modiff)
479 hairy = 2;
482 if (chars_to_delete)
484 string = make_string_from_bytes (str, 1, len);
485 if (spaces_to_insert)
487 tem = Fmake_string (make_number (spaces_to_insert),
488 make_number (' '));
489 string = concat2 (tem, string);
492 replace_range (PT, PT + chars_to_delete, string, 1, 1, 1);
493 Fforward_char (make_number (1 + spaces_to_insert));
495 else
496 insert_and_inherit (str, len);
498 if ((CHAR_TABLE_P (Vauto_fill_chars)
499 ? !NILP (CHAR_TABLE_REF (Vauto_fill_chars, c))
500 : (c == ' ' || c == '\n'))
501 && !noautofill
502 && !NILP (current_buffer->auto_fill_function))
504 Lisp_Object tem;
506 if (c == '\n')
507 /* After inserting a newline, move to previous line and fill
508 that. Must have the newline in place already so filling and
509 justification, if any, know where the end is going to be. */
510 SET_PT_BOTH (PT - 1, PT_BYTE - 1);
511 tem = call0 (current_buffer->auto_fill_function);
512 /* Test PT < ZV in case the auto-fill-function is strange. */
513 if (c == '\n' && PT < ZV)
514 SET_PT_BOTH (PT + 1, PT_BYTE + 1);
515 if (!NILP (tem))
516 hairy = 2;
519 /* If previous command specified a face to use, use it. */
520 if (!NILP (Vself_insert_face)
521 && EQ (current_kboard->Vlast_command, Vself_insert_face_command))
523 Fput_text_property (make_number (PT - 1), make_number (PT),
524 Qface, Vself_insert_face, Qnil);
525 Vself_insert_face = Qnil;
528 if ((synt == Sclose || synt == Smath)
529 && !NILP (Vblink_paren_function) && INTERACTIVE
530 && !noautofill)
532 call0 (Vblink_paren_function);
533 hairy = 2;
535 return hairy;
538 /* module initialization */
540 void
541 syms_of_cmds (void)
543 Qkill_backward_chars = intern_c_string ("kill-backward-chars");
544 staticpro (&Qkill_backward_chars);
546 Qkill_forward_chars = intern_c_string ("kill-forward-chars");
547 staticpro (&Qkill_forward_chars);
549 Qoverwrite_mode_binary = intern_c_string ("overwrite-mode-binary");
550 staticpro (&Qoverwrite_mode_binary);
552 Qexpand_abbrev = intern_c_string ("expand-abbrev");
553 staticpro (&Qexpand_abbrev);
555 DEFVAR_LISP ("self-insert-face", &Vself_insert_face,
556 doc: /* If non-nil, set the face of the next self-inserting character to this.
557 See also `self-insert-face-command'. */);
558 Vself_insert_face = Qnil;
560 DEFVAR_LISP ("self-insert-face-command", &Vself_insert_face_command,
561 doc: /* This is the command that set up `self-insert-face'.
562 If `last-command' does not equal this value, we ignore `self-insert-face'. */);
563 Vself_insert_face_command = Qnil;
565 DEFVAR_LISP ("blink-paren-function", &Vblink_paren_function,
566 doc: /* Function called, if non-nil, whenever a close parenthesis is inserted.
567 More precisely, a char with closeparen syntax is self-inserted. */);
568 Vblink_paren_function = Qnil;
570 defsubr (&Sforward_point);
571 defsubr (&Sforward_char);
572 defsubr (&Sbackward_char);
573 defsubr (&Sforward_line);
574 defsubr (&Sbeginning_of_line);
575 defsubr (&Send_of_line);
577 defsubr (&Sdelete_char);
578 defsubr (&Sself_insert_command);
581 void
582 keys_of_cmds (void)
584 int n;
586 nonundocount = 0;
587 initial_define_key (global_map, Ctl ('I'), "self-insert-command");
588 for (n = 040; n < 0177; n++)
589 initial_define_key (global_map, n, "self-insert-command");
590 #ifdef MSDOS
591 for (n = 0200; n < 0240; n++)
592 initial_define_key (global_map, n, "self-insert-command");
593 #endif
594 for (n = 0240; n < 0400; n++)
595 initial_define_key (global_map, n, "self-insert-command");
597 initial_define_key (global_map, Ctl ('A'), "beginning-of-line");
598 initial_define_key (global_map, Ctl ('B'), "backward-char");
599 initial_define_key (global_map, Ctl ('E'), "end-of-line");
600 initial_define_key (global_map, Ctl ('F'), "forward-char");
603 /* arch-tag: 022ba3cd-67f9-4978-9c5d-7d2b18d8644e
604 (do not change this comment) */