]> code.delx.au - gnu-emacs/blob - src/cmds.c
Merge latest fix to xg_event_is_for_menubar.
[gnu-emacs] / src / cmds.c
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.
5
6 This file is part of GNU Emacs.
7
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.
12
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.
17
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/>. */
20
21
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"
34
35 Lisp_Object Qkill_forward_chars, Qkill_backward_chars, Vblink_paren_function;
36
37 /* A possible value for a buffer's overwrite-mode variable. */
38 Lisp_Object Qoverwrite_mode_binary;
39
40 /* Non-nil means put this face on the next self-inserting character. */
41 Lisp_Object Vself_insert_face;
42
43 /* This is the command that set up Vself_insert_face. */
44 Lisp_Object Vself_insert_face_command;
45
46 extern Lisp_Object Qface;
47 extern Lisp_Object Vtranslation_table_for_input;
48 \f
49 DEFUN ("forward-point", Fforward_point, Sforward_point, 1, 1, 0,
50 doc: /* Return buffer position N characters after (before if N negative) point. */)
51 (Lisp_Object n)
52 {
53 CHECK_NUMBER (n);
54
55 return make_number (PT + XINT (n));
56 }
57
58 DEFUN ("forward-char", Fforward_char, Sforward_char, 0, 1, "^p",
59 doc: /* Move point N characters forward (backward if N is negative).
60 On reaching end or beginning of buffer, stop and signal error.
61
62 Depending on the bidirectional context, the movement may be to the
63 right or to the left on the screen. This is in contrast with
64 \\[right-char], which see. */)
65 (Lisp_Object n)
66 {
67 if (NILP (n))
68 XSETFASTINT (n, 1);
69 else
70 CHECK_NUMBER (n);
71
72 /* This used to just set point to point + XINT (n), and then check
73 to see if it was within boundaries. But now that SET_PT can
74 potentially do a lot of stuff (calling entering and exiting
75 hooks, etcetera), that's not a good approach. So we validate the
76 proposed position, then set point. */
77 {
78 int new_point = PT + XINT (n);
79
80 if (new_point < BEGV)
81 {
82 SET_PT (BEGV);
83 xsignal0 (Qbeginning_of_buffer);
84 }
85 if (new_point > ZV)
86 {
87 SET_PT (ZV);
88 xsignal0 (Qend_of_buffer);
89 }
90
91 SET_PT (new_point);
92 }
93
94 return Qnil;
95 }
96
97 DEFUN ("backward-char", Fbackward_char, Sbackward_char, 0, 1, "^p",
98 doc: /* Move point N characters backward (forward if N is negative).
99 On attempt to pass beginning or end of buffer, stop and signal error.
100
101 Depending on the bidirectional context, the movement may be to the
102 right or to the left on the screen. This is in contrast with
103 \\[left-char], which see. */)
104 (Lisp_Object n)
105 {
106 if (NILP (n))
107 XSETFASTINT (n, 1);
108 else
109 CHECK_NUMBER (n);
110
111 XSETINT (n, - XINT (n));
112 return Fforward_char (n);
113 }
114
115 DEFUN ("forward-line", Fforward_line, Sforward_line, 0, 1, "^p",
116 doc: /* Move N lines forward (backward if N is negative).
117 Precisely, if point is on line I, move to the start of line I + N.
118 If there isn't room, go as far as possible (no error).
119 Returns the count of lines left to move. If moving forward,
120 that is N - number of lines moved; if backward, N + number moved.
121 With positive N, a non-empty line at the end counts as one line
122 successfully moved (for the return value). */)
123 (Lisp_Object n)
124 {
125 int opoint = PT, opoint_byte = PT_BYTE;
126 int pos, pos_byte;
127 int count, shortage;
128
129 if (NILP (n))
130 count = 1;
131 else
132 {
133 CHECK_NUMBER (n);
134 count = XINT (n);
135 }
136
137 if (count <= 0)
138 shortage = scan_newline (PT, PT_BYTE, BEGV, BEGV_BYTE, count - 1, 1);
139 else
140 shortage = scan_newline (PT, PT_BYTE, ZV, ZV_BYTE, count, 1);
141
142 /* Since scan_newline does TEMP_SET_PT_BOTH,
143 and we want to set PT "for real",
144 go back to the old point and then come back here. */
145 pos = PT;
146 pos_byte = PT_BYTE;
147 TEMP_SET_PT_BOTH (opoint, opoint_byte);
148 SET_PT_BOTH (pos, pos_byte);
149
150 if (shortage > 0
151 && (count <= 0
152 || (ZV > BEGV
153 && PT != opoint
154 && (FETCH_BYTE (PT_BYTE - 1) != '\n'))))
155 shortage--;
156
157 return make_number (count <= 0 ? - shortage : shortage);
158 }
159
160 DEFUN ("beginning-of-line", Fbeginning_of_line, Sbeginning_of_line, 0, 1, "^p",
161 doc: /* Move point to beginning of current line.
162 With argument N not nil or 1, move forward N - 1 lines first.
163 If point reaches the beginning or end of buffer, it stops there.
164
165 This function constrains point to the current field unless this moves
166 point to a different line than the original, unconstrained result.
167 If N is nil or 1, and a front-sticky field starts at point, the point
168 does not move. To ignore field boundaries bind
169 `inhibit-field-text-motion' to t, or use the `forward-line' function
170 instead. For instance, `(forward-line 0)' does the same thing as
171 `(beginning-of-line)', except that it ignores field boundaries. */)
172 (Lisp_Object n)
173 {
174 if (NILP (n))
175 XSETFASTINT (n, 1);
176 else
177 CHECK_NUMBER (n);
178
179 SET_PT (XINT (Fline_beginning_position (n)));
180
181 return Qnil;
182 }
183
184 DEFUN ("end-of-line", Fend_of_line, Send_of_line, 0, 1, "^p",
185 doc: /* Move point to end of current line.
186 With argument N not nil or 1, move forward N - 1 lines first.
187 If point reaches the beginning or end of buffer, it stops there.
188 To ignore intangibility, bind `inhibit-point-motion-hooks' to t.
189
190 This function constrains point to the current field unless this moves
191 point to a different line than the original, unconstrained result. If
192 N is nil or 1, and a rear-sticky field ends at point, the point does
193 not move. To ignore field boundaries bind `inhibit-field-text-motion'
194 to t. */)
195 (Lisp_Object n)
196 {
197 int newpos;
198
199 if (NILP (n))
200 XSETFASTINT (n, 1);
201 else
202 CHECK_NUMBER (n);
203
204 while (1)
205 {
206 newpos = XINT (Fline_end_position (n));
207 SET_PT (newpos);
208
209 if (PT > newpos
210 && FETCH_CHAR (PT - 1) == '\n')
211 {
212 /* If we skipped over a newline that follows
213 an invisible intangible run,
214 move back to the last tangible position
215 within the line. */
216
217 SET_PT (PT - 1);
218 break;
219 }
220 else if (PT > newpos && PT < ZV
221 && FETCH_CHAR (PT) != '\n')
222 /* If we skipped something intangible
223 and now we're not really at eol,
224 keep going. */
225 n = make_number (1);
226 else
227 break;
228 }
229
230 return Qnil;
231 }
232
233 DEFUN ("delete-char", Fdelete_char, Sdelete_char, 1, 2, "p\nP",
234 doc: /* Delete the following N characters (previous if N is negative).
235 Optional second arg KILLFLAG non-nil means kill instead (save in kill ring).
236 Interactively, N is the prefix arg, and KILLFLAG is set if
237 N was explicitly specified.
238
239 The command `delete-forward' is preferable for interactive use. */)
240 (Lisp_Object n, Lisp_Object killflag)
241 {
242 int pos;
243
244 CHECK_NUMBER (n);
245
246 pos = PT + XINT (n);
247 if (NILP (killflag))
248 {
249 if (XINT (n) < 0)
250 {
251 if (pos < BEGV)
252 xsignal0 (Qbeginning_of_buffer);
253 else
254 del_range (pos, PT);
255 }
256 else
257 {
258 if (pos > ZV)
259 xsignal0 (Qend_of_buffer);
260 else
261 del_range (PT, pos);
262 }
263 }
264 else
265 {
266 call1 (Qkill_forward_chars, n);
267 }
268 return Qnil;
269 }
270
271 static int nonundocount;
272
273 /* Note that there's code in command_loop_1 which typically avoids
274 calling this. */
275 DEFUN ("self-insert-command", Fself_insert_command, Sself_insert_command, 1, 1, "p",
276 doc: /* Insert the character you type.
277 Whichever character you type to run this command is inserted.
278 Before insertion, `expand-abbrev' is executed if the inserted character does
279 not have word syntax and the previous character in the buffer does.
280 After insertion, the value of `auto-fill-function' is called if the
281 `auto-fill-chars' table has a non-nil value for the inserted character. */)
282 (Lisp_Object n)
283 {
284 int remove_boundary = 1;
285 CHECK_NUMBER (n);
286
287 if (!EQ (Vthis_command, current_kboard->Vlast_command))
288 nonundocount = 0;
289
290 if (NILP (Vexecuting_kbd_macro)
291 && !EQ (minibuf_window, selected_window))
292 {
293 if (nonundocount <= 0 || nonundocount >= 20)
294 {
295 remove_boundary = 0;
296 nonundocount = 0;
297 }
298 nonundocount++;
299 }
300
301 if (remove_boundary
302 && CONSP (current_buffer->undo_list)
303 && NILP (XCAR (current_buffer->undo_list)))
304 /* Remove the undo_boundary that was just pushed. */
305 current_buffer->undo_list = XCDR (current_buffer->undo_list);
306
307 /* Barf if the key that invoked this was not a character. */
308 if (!CHARACTERP (last_command_event))
309 bitch_at_user ();
310 {
311 int character = translate_char (Vtranslation_table_for_input,
312 XINT (last_command_event));
313 if (XINT (n) >= 2 && NILP (current_buffer->overwrite_mode))
314 {
315 XSETFASTINT (n, XFASTINT (n) - 2);
316 /* The first one might want to expand an abbrev. */
317 internal_self_insert (character, 1);
318 /* The bulk of the copies of this char can be inserted simply.
319 We don't have to handle a user-specified face specially
320 because it will get inherited from the first char inserted. */
321 Finsert_char (make_number (character), n, Qt);
322 /* The last one might want to auto-fill. */
323 internal_self_insert (character, 0);
324 }
325 else
326 while (XINT (n) > 0)
327 {
328 int val;
329 /* Ok since old and new vals both nonneg */
330 XSETFASTINT (n, XFASTINT (n) - 1);
331 val = internal_self_insert (character, XFASTINT (n) != 0);
332 if (val == 2)
333 nonundocount = 0;
334 frame_make_pointer_invisible ();
335 }
336 }
337
338 return Qnil;
339 }
340
341 /* Insert character C. If NOAUTOFILL is nonzero, don't do autofill
342 even if it is enabled.
343
344 If this insertion is suitable for direct output (completely simple),
345 return 0. A value of 1 indicates this *might* not have been simple.
346 A value of 2 means this did things that call for an undo boundary. */
347
348 static Lisp_Object Qexpand_abbrev;
349
350 int
351 internal_self_insert (int c, int noautofill)
352 {
353 int hairy = 0;
354 Lisp_Object tem;
355 register enum syntaxcode synt;
356 Lisp_Object overwrite, string;
357 /* Length of multi-byte form of C. */
358 int len;
359 /* Working buffer and pointer for multi-byte form of C. */
360 unsigned char str[MAX_MULTIBYTE_LENGTH];
361 int chars_to_delete = 0;
362 int spaces_to_insert = 0;
363
364 overwrite = current_buffer->overwrite_mode;
365 if (!NILP (Vbefore_change_functions) || !NILP (Vafter_change_functions))
366 hairy = 1;
367
368 /* At first, get multi-byte form of C in STR. */
369 if (!NILP (current_buffer->enable_multibyte_characters))
370 {
371 len = CHAR_STRING (c, str);
372 if (len == 1)
373 /* If C has modifier bits, this makes C an appropriate
374 one-byte char. */
375 c = *str;
376 }
377 else
378 {
379 str[0] = (SINGLE_BYTE_CHAR_P (c)
380 ? c
381 : multibyte_char_to_unibyte (c, Qnil));
382 len = 1;
383 }
384 if (!NILP (overwrite)
385 && PT < ZV)
386 {
387 /* In overwrite-mode, we substitute a character at point (C2,
388 hereafter) by C. For that, we delete C2 in advance. But,
389 just substituting C2 by C may move a remaining text in the
390 line to the right or to the left, which is not preferable.
391 So we insert more spaces or delete more characters in the
392 following cases: if C is narrower than C2, after deleting C2,
393 we fill columns with spaces, if C is wider than C2, we delete
394 C2 and several characters following C2. */
395
396 /* This is the character after point. */
397 int c2 = FETCH_CHAR (PT_BYTE);
398
399 /* Column the cursor should be placed at after this insertion.
400 The correct value should be calculated only when necessary. */
401 int target_clm = 0;
402
403 /* Overwriting in binary-mode always replaces C2 by C.
404 Overwriting in textual-mode doesn't always do that.
405 It inserts newlines in the usual way,
406 and inserts any character at end of line
407 or before a tab if it doesn't use the whole width of the tab. */
408 if (EQ (overwrite, Qoverwrite_mode_binary)
409 || (c != '\n'
410 && c2 != '\n'
411 && ! (c2 == '\t'
412 && XINT (current_buffer->tab_width) > 0
413 && XFASTINT (current_buffer->tab_width) < 20
414 && (target_clm = ((int) current_column () /* iftc */
415 + XINT (Fchar_width (make_number (c)))),
416 target_clm % XFASTINT (current_buffer->tab_width)))))
417 {
418 int pos = PT;
419 int pos_byte = PT_BYTE;
420
421 if (target_clm == 0)
422 chars_to_delete = 1;
423 else
424 {
425 /* The actual cursor position after the trial of moving
426 to column TARGET_CLM. It is greater than TARGET_CLM
427 if the TARGET_CLM is middle of multi-column
428 character. In that case, the new point is set after
429 that character. */
430 int actual_clm
431 = XFASTINT (Fmove_to_column (make_number (target_clm), Qnil));
432
433 chars_to_delete = PT - pos;
434
435 if (actual_clm > target_clm)
436 {
437 /* We will delete too many columns. Let's fill columns
438 by spaces so that the remaining text won't move. */
439 spaces_to_insert = actual_clm - target_clm;
440 }
441 }
442 SET_PT_BOTH (pos, pos_byte);
443 hairy = 2;
444 }
445 hairy = 2;
446 }
447
448 synt = SYNTAX (c);
449
450 if (!NILP (current_buffer->abbrev_mode)
451 && synt != Sword
452 && NILP (current_buffer->read_only)
453 && PT > BEGV
454 && (!NILP (current_buffer->enable_multibyte_characters)
455 ? SYNTAX (XFASTINT (Fprevious_char ())) == Sword
456 : (SYNTAX (UNIBYTE_TO_CHAR (XFASTINT (Fprevious_char ())))
457 == Sword)))
458 {
459 int modiff = MODIFF;
460 Lisp_Object sym;
461
462 sym = call0 (Qexpand_abbrev);
463
464 /* If we expanded an abbrev which has a hook,
465 and the hook has a non-nil `no-self-insert' property,
466 return right away--don't really self-insert. */
467 if (SYMBOLP (sym) && ! NILP (sym) && ! NILP (XSYMBOL (sym)->function)
468 && SYMBOLP (XSYMBOL (sym)->function))
469 {
470 Lisp_Object prop;
471 prop = Fget (XSYMBOL (sym)->function, intern ("no-self-insert"));
472 if (! NILP (prop))
473 return 1;
474 }
475
476 if (MODIFF != modiff)
477 hairy = 2;
478 }
479
480 if (chars_to_delete)
481 {
482 string = make_string_from_bytes (str, 1, len);
483 if (spaces_to_insert)
484 {
485 tem = Fmake_string (make_number (spaces_to_insert),
486 make_number (' '));
487 string = concat2 (tem, string);
488 }
489
490 replace_range (PT, PT + chars_to_delete, string, 1, 1, 1);
491 Fforward_char (make_number (1 + spaces_to_insert));
492 }
493 else
494 insert_and_inherit (str, len);
495
496 if ((CHAR_TABLE_P (Vauto_fill_chars)
497 ? !NILP (CHAR_TABLE_REF (Vauto_fill_chars, c))
498 : (c == ' ' || c == '\n'))
499 && !noautofill
500 && !NILP (current_buffer->auto_fill_function))
501 {
502 Lisp_Object tem;
503
504 if (c == '\n')
505 /* After inserting a newline, move to previous line and fill
506 that. Must have the newline in place already so filling and
507 justification, if any, know where the end is going to be. */
508 SET_PT_BOTH (PT - 1, PT_BYTE - 1);
509 tem = call0 (current_buffer->auto_fill_function);
510 /* Test PT < ZV in case the auto-fill-function is strange. */
511 if (c == '\n' && PT < ZV)
512 SET_PT_BOTH (PT + 1, PT_BYTE + 1);
513 if (!NILP (tem))
514 hairy = 2;
515 }
516
517 /* If previous command specified a face to use, use it. */
518 if (!NILP (Vself_insert_face)
519 && EQ (current_kboard->Vlast_command, Vself_insert_face_command))
520 {
521 Fput_text_property (make_number (PT - 1), make_number (PT),
522 Qface, Vself_insert_face, Qnil);
523 Vself_insert_face = Qnil;
524 }
525
526 if ((synt == Sclose || synt == Smath)
527 && !NILP (Vblink_paren_function) && INTERACTIVE
528 && !noautofill)
529 {
530 call0 (Vblink_paren_function);
531 hairy = 2;
532 }
533 return hairy;
534 }
535 \f
536 /* module initialization */
537
538 void
539 syms_of_cmds (void)
540 {
541 Qkill_backward_chars = intern_c_string ("kill-backward-chars");
542 staticpro (&Qkill_backward_chars);
543
544 Qkill_forward_chars = intern_c_string ("kill-forward-chars");
545 staticpro (&Qkill_forward_chars);
546
547 Qoverwrite_mode_binary = intern_c_string ("overwrite-mode-binary");
548 staticpro (&Qoverwrite_mode_binary);
549
550 Qexpand_abbrev = intern_c_string ("expand-abbrev");
551 staticpro (&Qexpand_abbrev);
552
553 DEFVAR_LISP ("self-insert-face", &Vself_insert_face,
554 doc: /* If non-nil, set the face of the next self-inserting character to this.
555 See also `self-insert-face-command'. */);
556 Vself_insert_face = Qnil;
557
558 DEFVAR_LISP ("self-insert-face-command", &Vself_insert_face_command,
559 doc: /* This is the command that set up `self-insert-face'.
560 If `last-command' does not equal this value, we ignore `self-insert-face'. */);
561 Vself_insert_face_command = Qnil;
562
563 DEFVAR_LISP ("blink-paren-function", &Vblink_paren_function,
564 doc: /* Function called, if non-nil, whenever a close parenthesis is inserted.
565 More precisely, a char with closeparen syntax is self-inserted. */);
566 Vblink_paren_function = Qnil;
567
568 defsubr (&Sforward_point);
569 defsubr (&Sforward_char);
570 defsubr (&Sbackward_char);
571 defsubr (&Sforward_line);
572 defsubr (&Sbeginning_of_line);
573 defsubr (&Send_of_line);
574
575 defsubr (&Sdelete_char);
576 defsubr (&Sself_insert_command);
577 }
578
579 void
580 keys_of_cmds (void)
581 {
582 int n;
583
584 nonundocount = 0;
585 initial_define_key (global_map, Ctl ('I'), "self-insert-command");
586 for (n = 040; n < 0177; n++)
587 initial_define_key (global_map, n, "self-insert-command");
588 #ifdef MSDOS
589 for (n = 0200; n < 0240; n++)
590 initial_define_key (global_map, n, "self-insert-command");
591 #endif
592 for (n = 0240; n < 0400; n++)
593 initial_define_key (global_map, n, "self-insert-command");
594
595 initial_define_key (global_map, Ctl ('A'), "beginning-of-line");
596 initial_define_key (global_map, Ctl ('B'), "backward-char");
597 initial_define_key (global_map, Ctl ('E'), "end-of-line");
598 initial_define_key (global_map, Ctl ('F'), "forward-char");
599 }
600
601 /* arch-tag: 022ba3cd-67f9-4978-9c5d-7d2b18d8644e
602 (do not change this comment) */