* .bzrignore, .gitignore: Ignore README.W32 on the root directory.
[bpt/emacs.git] / src / cmds.c
CommitLineData
cd645247 1/* Simple built-in editing commands.
0b5538bd 2 Copyright (C) 1985, 1993, 1994, 1995, 1996, 1997, 1998, 2001, 2002,
114f9c96 3 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
8cabe764 4 Free Software Foundation, Inc.
cd645247
JB
5
6This file is part of GNU Emacs.
7
9ec0b715 8GNU Emacs is free software: you can redistribute it and/or modify
cd645247 9it under the terms of the GNU General Public License as published by
9ec0b715
GM
10the Free Software Foundation, either version 3 of the License, or
11(at your option) any later version.
cd645247
JB
12
13GNU Emacs is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
9ec0b715 19along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
cd645247
JB
20
21
18160b98 22#include <config.h>
d7306fe6 23#include <setjmp.h>
cd645247
JB
24#include "lisp.h"
25#include "commands.h"
26#include "buffer.h"
83be827a 27#include "character.h"
cd645247 28#include "syntax.h"
f109dfa2 29#include "window.h"
346e0c2d 30#include "keyboard.h"
e35f6ff7 31#include "keymap.h"
dfcf069d 32#include "dispextern.h"
2cc7b62f 33#include "frame.h"
cd645247
JB
34
35Lisp_Object Qkill_forward_chars, Qkill_backward_chars, Vblink_paren_function;
36
6bbb0d4a
JB
37/* A possible value for a buffer's overwrite-mode variable. */
38Lisp_Object Qoverwrite_mode_binary;
39
189fad68
RS
40/* Non-nil means put this face on the next self-inserting character. */
41Lisp_Object Vself_insert_face;
42
43/* This is the command that set up Vself_insert_face. */
44Lisp_Object Vself_insert_face_command;
45
189fad68 46extern Lisp_Object Qface;
867d5263 47extern Lisp_Object Vtranslation_table_for_input;
cd645247 48\f
9e4fd67b 49DEFUN ("forward-point", Fforward_point, Sforward_point, 1, 1, 0,
335c5470 50 doc: /* Return buffer position N characters after (before if N negative) point. */)
5842a27b 51 (Lisp_Object n)
9e4fd67b 52{
b7826503 53 CHECK_NUMBER (n);
9e4fd67b 54
049749e6 55 return make_number (PT + XINT (n));
9e4fd67b
KH
56}
57
9ae750f0 58DEFUN ("forward-char", Fforward_char, Sforward_char, 0, 1, "^p",
d20e1419
EZ
59 doc: /* Move point N characters forward (backward if N is negative).
60On reaching end or beginning of buffer, stop and signal error.
61
62Depending on the bidirectional context, the movement may be to the
63right or to the left on the screen. This is in contrast with
5220357f 64\\[right-char], which see. */)
5842a27b 65 (Lisp_Object n)
cd645247 66{
72d5f589
EN
67 if (NILP (n))
68 XSETFASTINT (n, 1);
cd645247 69 else
b7826503 70 CHECK_NUMBER (n);
cd645247 71
72d5f589 72 /* This used to just set point to point + XINT (n), and then check
7b502dc3
JB
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 {
049749e6 78 int new_point = PT + XINT (n);
7b502dc3
JB
79
80 if (new_point < BEGV)
81 {
82 SET_PT (BEGV);
aaf769f1 83 xsignal0 (Qbeginning_of_buffer);
7b502dc3
JB
84 }
85 if (new_point > ZV)
86 {
87 SET_PT (ZV);
aaf769f1 88 xsignal0 (Qend_of_buffer);
7b502dc3
JB
89 }
90
91 SET_PT (new_point);
92 }
93
cd645247
JB
94 return Qnil;
95}
96
9ae750f0 97DEFUN ("backward-char", Fbackward_char, Sbackward_char, 0, 1, "^p",
d20e1419
EZ
98 doc: /* Move point N characters backward (forward if N is negative).
99On attempt to pass beginning or end of buffer, stop and signal error.
100
101Depending on the bidirectional context, the movement may be to the
102right or to the left on the screen. This is in contrast with
5220357f 103\\[left-char], which see. */)
5842a27b 104 (Lisp_Object n)
cd645247 105{
72d5f589
EN
106 if (NILP (n))
107 XSETFASTINT (n, 1);
cd645247 108 else
b7826503 109 CHECK_NUMBER (n);
cd645247 110
72d5f589
EN
111 XSETINT (n, - XINT (n));
112 return Fforward_char (n);
cd645247
JB
113}
114
9ae750f0 115DEFUN ("forward-line", Fforward_line, Sforward_line, 0, 1, "^p",
335c5470
PJ
116 doc: /* Move N lines forward (backward if N is negative).
117Precisely, if point is on line I, move to the start of line I + N.
118If there isn't room, go as far as possible (no error).
119Returns the count of lines left to move. If moving forward,
120that is N - number of lines moved; if backward, N + number moved.
121With positive N, a non-empty line at the end counts as one line
5220357f 122successfully moved (for the return value). */)
5842a27b 123 (Lisp_Object n)
cd645247 124{
049749e6
RS
125 int opoint = PT, opoint_byte = PT_BYTE;
126 int pos, pos_byte;
127 int count, shortage;
cd645247 128
265a9e55 129 if (NILP (n))
cd645247
JB
130 count = 1;
131 else
132 {
b7826503 133 CHECK_NUMBER (n);
cd645247
JB
134 count = XINT (n);
135 }
136
049749e6
RS
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
cd645247 150 if (shortage > 0
049749e6 151 && (count <= 0
502ddf23 152 || (ZV > BEGV
049749e6
RS
153 && PT != opoint
154 && (FETCH_BYTE (PT_BYTE - 1) != '\n'))))
cd645247 155 shortage--;
049749e6
RS
156
157 return make_number (count <= 0 ? - shortage : shortage);
cd645247
JB
158}
159
9ae750f0 160DEFUN ("beginning-of-line", Fbeginning_of_line, Sbeginning_of_line, 0, 1, "^p",
8abc9869
MB
161 doc: /* Move point to beginning of current line.
162With argument N not nil or 1, move forward N - 1 lines first.
163If point reaches the beginning or end of buffer, it stops there.
164
13c42cc5 165This function constrains point to the current field unless this moves
5220357f
JB
166point to a different line than the original, unconstrained result.
167If N is nil or 1, and a front-sticky field starts at point, the point
13c42cc5 168does not move. To ignore field boundaries bind
27806b20
KL
169`inhibit-field-text-motion' to t, or use the `forward-line' function
170instead. For instance, `(forward-line 0)' does the same thing as
171`(beginning-of-line)', except that it ignores field boundaries. */)
5842a27b 172 (Lisp_Object n)
cd645247 173{
265a9e55 174 if (NILP (n))
48c7cef2 175 XSETFASTINT (n, 1);
cd645247 176 else
b7826503 177 CHECK_NUMBER (n);
cd645247 178
0aee588d 179 SET_PT (XINT (Fline_beginning_position (n)));
a731cae2 180
cd645247
JB
181 return Qnil;
182}
183
9ae750f0 184DEFUN ("end-of-line", Fend_of_line, Send_of_line, 0, 1, "^p",
8abc9869
MB
185 doc: /* Move point to end of current line.
186With argument N not nil or 1, move forward N - 1 lines first.
187If point reaches the beginning or end of buffer, it stops there.
6b61353c 188To ignore intangibility, bind `inhibit-point-motion-hooks' to t.
8abc9869 189
13c42cc5
KL
190This function constrains point to the current field unless this moves
191point to a different line than the original, unconstrained result. If
192N is nil or 1, and a rear-sticky field ends at point, the point does
193not move. To ignore field boundaries bind `inhibit-field-text-motion'
194to t. */)
5842a27b 195 (Lisp_Object n)
cd645247 196{
fda3de70
RS
197 int newpos;
198
265a9e55 199 if (NILP (n))
48c7cef2 200 XSETFASTINT (n, 1);
cd645247 201 else
b7826503 202 CHECK_NUMBER (n);
cd645247 203
fda3de70
RS
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 }
cd645247
JB
229
230 return Qnil;
231}
232
233DEFUN ("delete-char", Fdelete_char, Sdelete_char, 1, 2, "p\nP",
335c5470
PJ
234 doc: /* Delete the following N characters (previous if N is negative).
235Optional second arg KILLFLAG non-nil means kill instead (save in kill ring).
236Interactively, N is the prefix arg, and KILLFLAG is set if
b9229673
CY
237N was explicitly specified.
238
239The command `delete-forward' is preferable for interactive use. */)
5842a27b 240 (Lisp_Object n, Lisp_Object killflag)
cd645247 241{
9e4fd67b
KH
242 int pos;
243
b7826503 244 CHECK_NUMBER (n);
cd645247 245
049749e6 246 pos = PT + XINT (n);
265a9e55 247 if (NILP (killflag))
cd645247
JB
248 {
249 if (XINT (n) < 0)
250 {
9e4fd67b 251 if (pos < BEGV)
aaf769f1 252 xsignal0 (Qbeginning_of_buffer);
cd645247 253 else
9e4fd67b 254 del_range (pos, PT);
cd645247
JB
255 }
256 else
257 {
9e4fd67b 258 if (pos > ZV)
aaf769f1 259 xsignal0 (Qend_of_buffer);
cd645247 260 else
9e4fd67b 261 del_range (PT, pos);
cd645247
JB
262 }
263 }
264 else
265 {
266 call1 (Qkill_forward_chars, n);
267 }
268 return Qnil;
269}
270
855a0da7 271static int nonundocount;
1ac9108a 272
867d5263
DL
273/* Note that there's code in command_loop_1 which typically avoids
274 calling this. */
cd645247 275DEFUN ("self-insert-command", Fself_insert_command, Sself_insert_command, 1, 1, "p",
335c5470 276 doc: /* Insert the character you type.
1ac9108a
SM
277Whichever character you type to run this command is inserted.
278Before insertion, `expand-abbrev' is executed if the inserted character does
279not have word syntax and the previous character in the buffer does.
280After 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. */)
5842a27b 282 (Lisp_Object n)
cd645247 283{
1ac9108a 284 int remove_boundary = 1;
b0ca0f33 285 CHECK_NUMBER (n);
1ac9108a
SM
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);
cd645247
JB
306
307 /* Barf if the key that invoked this was not a character. */
a31e445e 308 if (!CHARACTERP (last_command_event))
cd645247 309 bitch_at_user ();
867d5263
DL
310 {
311 int character = translate_char (Vtranslation_table_for_input,
a31e445e 312 XINT (last_command_event));
867d5263 313 if (XINT (n) >= 2 && NILP (current_buffer->overwrite_mode))
cd645247 314 {
867d5263
DL
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. */
ef73e7be 321 Finsert_char (make_number (character), n, Qt);
867d5263
DL
322 /* The last one might want to auto-fill. */
323 internal_self_insert (character, 0);
cd645247 324 }
867d5263
DL
325 else
326 while (XINT (n) > 0)
327 {
1ac9108a 328 int val;
867d5263
DL
329 /* Ok since old and new vals both nonneg */
330 XSETFASTINT (n, XFASTINT (n) - 1);
1ac9108a
SM
331 val = internal_self_insert (character, XFASTINT (n) != 0);
332 if (val == 2)
333 nonundocount = 0;
334 frame_make_pointer_invisible ();
867d5263
DL
335 }
336 }
cd645247
JB
337
338 return Qnil;
339}
340
9e4fd67b 341/* Insert character C. If NOAUTOFILL is nonzero, don't do autofill
4c6e656f
RS
342 even if it is enabled.
343
344 If this insertion is suitable for direct output (completely simple),
aa52fef9
RS
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. */
4c6e656f 347
53abaf54
SM
348static Lisp_Object Qexpand_abbrev;
349
dfcf069d 350int
971de7fb 351internal_self_insert (int c, int noautofill)
cd645247 352{
cd645247
JB
353 int hairy = 0;
354 Lisp_Object tem;
355 register enum syntaxcode synt;
e744155a 356 Lisp_Object overwrite, string;
9e4fd67b
KH
357 /* Length of multi-byte form of C. */
358 int len;
359 /* Working buffer and pointer for multi-byte form of C. */
e55d9cfd 360 unsigned char str[MAX_MULTIBYTE_LENGTH];
049749e6 361 int chars_to_delete = 0;
e744155a 362 int spaces_to_insert = 0;
cd645247 363
e7aacab7 364 overwrite = current_buffer->overwrite_mode;
ad44dffe 365 if (!NILP (Vbefore_change_functions) || !NILP (Vafter_change_functions))
cd645247
JB
366 hairy = 1;
367
9e4fd67b
KH
368 /* At first, get multi-byte form of C in STR. */
369 if (!NILP (current_buffer->enable_multibyte_characters))
b9859007 370 {
e55d9cfd 371 len = CHAR_STRING (c, str);
741263c2
KH
372 if (len == 1)
373 /* If C has modifier bits, this makes C an appropriate
374 one-byte char. */
375 c = *str;
b9859007 376 }
9e4fd67b 377 else
38b62842 378 {
e55d9cfd
KH
379 str[0] = (SINGLE_BYTE_CHAR_P (c)
380 ? c
381 : multibyte_char_to_unibyte (c, Qnil));
38b62842
KH
382 len = 1;
383 }
6bbb0d4a 384 if (!NILP (overwrite)
9e4fd67b 385 && PT < ZV)
cd645247 386 {
9e4fd67b
KH
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
216b9443
RS
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.
9e4fd67b
KH
400 The correct value should be calculated only when necessary. */
401 int target_clm = 0;
402
37c0ed09
RS
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. */
9e4fd67b
KH
408 if (EQ (overwrite, Qoverwrite_mode_binary)
409 || (c != '\n'
410 && c2 != '\n'
37c0ed09
RS
411 && ! (c2 == '\t'
412 && XINT (current_buffer->tab_width) > 0
413 && XFASTINT (current_buffer->tab_width) < 20
a731cae2 414 && (target_clm = ((int) current_column () /* iftc */
06d74a65 415 + XINT (Fchar_width (make_number (c)))),
37c0ed09 416 target_clm % XFASTINT (current_buffer->tab_width)))))
9e4fd67b 417 {
e744155a 418 int pos = PT;
049749e6 419 int pos_byte = PT_BYTE;
e744155a 420
9e4fd67b 421 if (target_clm == 0)
049749e6 422 chars_to_delete = 1;
9e4fd67b
KH
423 else
424 {
9e4fd67b
KH
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. */
cac55749
RS
430 int actual_clm
431 = XFASTINT (Fmove_to_column (make_number (target_clm), Qnil));
9e4fd67b 432
049749e6 433 chars_to_delete = PT - pos;
e744155a 434
9e4fd67b
KH
435 if (actual_clm > target_clm)
436 {
e744155a 437 /* We will delete too many columns. Let's fill columns
9e4fd67b 438 by spaces so that the remaining text won't move. */
e744155a 439 spaces_to_insert = actual_clm - target_clm;
9e4fd67b
KH
440 }
441 }
049749e6 442 SET_PT_BOTH (pos, pos_byte);
9e4fd67b
KH
443 hairy = 2;
444 }
aa52fef9 445 hairy = 2;
cd645247 446 }
9ad8bfb0 447
9ad8bfb0
KH
448 synt = SYNTAX (c);
449
265a9e55 450 if (!NILP (current_buffer->abbrev_mode)
9ad8bfb0 451 && synt != Sword
265a9e55 452 && NILP (current_buffer->read_only)
9ad8bfb0
KH
453 && PT > BEGV
454 && (!NILP (current_buffer->enable_multibyte_characters)
455 ? SYNTAX (XFASTINT (Fprevious_char ())) == Sword
4c0354d7 456 : (SYNTAX (UNIBYTE_TO_CHAR (XFASTINT (Fprevious_char ())))
9ad8bfb0 457 == Sword)))
cd645247 458 {
ee8caabb 459 int modiff = MODIFF;
e57640c0
RS
460 Lisp_Object sym;
461
53abaf54 462 sym = call0 (Qexpand_abbrev);
e57640c0 463
c87dbfd0 464 /* If we expanded an abbrev which has a hook,
9317a902 465 and the hook has a non-nil `no-self-insert' property,
e57640c0 466 return right away--don't really self-insert. */
fb6b6049 467 if (SYMBOLP (sym) && ! NILP (sym) && ! NILP (XSYMBOL (sym)->function)
9317a902 468 && SYMBOLP (XSYMBOL (sym)->function))
e57640c0
RS
469 {
470 Lisp_Object prop;
9317a902 471 prop = Fget (XSYMBOL (sym)->function, intern ("no-self-insert"));
e57640c0 472 if (! NILP (prop))
6787d111 473 return 1;
e57640c0
RS
474 }
475
ee8caabb 476 if (MODIFF != modiff)
aa52fef9 477 hairy = 2;
cd645247 478 }
e744155a 479
049749e6 480 if (chars_to_delete)
e744155a 481 {
f34206b4 482 string = make_string_from_bytes (str, 1, len);
e744155a
RS
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
5f65b1b4 490 replace_range (PT, PT + chars_to_delete, string, 1, 1, 1);
1bf95511 491 Fforward_char (make_number (1 + spaces_to_insert));
e744155a
RS
492 }
493 else
494 insert_and_inherit (str, len);
495
01428933
KH
496 if ((CHAR_TABLE_P (Vauto_fill_chars)
497 ? !NILP (CHAR_TABLE_REF (Vauto_fill_chars, c))
498 : (c == ' ' || c == '\n'))
cd645247 499 && !noautofill
3de15b7a 500 && !NILP (current_buffer->auto_fill_function))
cd645247 501 {
76bb6dbb
KH
502 Lisp_Object tem;
503
9e4fd67b 504 if (c == '\n')
049749e6
RS
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);
76bb6dbb 509 tem = call0 (current_buffer->auto_fill_function);
4d94dd9a
RS
510 /* Test PT < ZV in case the auto-fill-function is strange. */
511 if (c == '\n' && PT < ZV)
049749e6 512 SET_PT_BOTH (PT + 1, PT_BYTE + 1);
76bb6dbb
KH
513 if (!NILP (tem))
514 hairy = 2;
cd645247 515 }
189fad68
RS
516
517 /* If previous command specified a face to use, use it. */
518 if (!NILP (Vself_insert_face)
346e0c2d 519 && EQ (current_kboard->Vlast_command, Vself_insert_face_command))
189fad68 520 {
049749e6
RS
521 Fput_text_property (make_number (PT - 1), make_number (PT),
522 Qface, Vself_insert_face, Qnil);
189fad68
RS
523 Vself_insert_face = Qnil;
524 }
e744155a 525
cd645247 526 if ((synt == Sclose || synt == Smath)
2718dfa4
RS
527 && !NILP (Vblink_paren_function) && INTERACTIVE
528 && !noautofill)
cd645247
JB
529 {
530 call0 (Vblink_paren_function);
aa52fef9 531 hairy = 2;
cd645247
JB
532 }
533 return hairy;
534}
535\f
536/* module initialization */
537
dfcf069d 538void
971de7fb 539syms_of_cmds (void)
cd645247 540{
d67b4f80 541 Qkill_backward_chars = intern_c_string ("kill-backward-chars");
cd645247
JB
542 staticpro (&Qkill_backward_chars);
543
d67b4f80 544 Qkill_forward_chars = intern_c_string ("kill-forward-chars");
cd645247
JB
545 staticpro (&Qkill_forward_chars);
546
d67b4f80 547 Qoverwrite_mode_binary = intern_c_string ("overwrite-mode-binary");
6bbb0d4a 548 staticpro (&Qoverwrite_mode_binary);
e686c647 549
d67b4f80 550 Qexpand_abbrev = intern_c_string ("expand-abbrev");
53abaf54
SM
551 staticpro (&Qexpand_abbrev);
552
189fad68 553 DEFVAR_LISP ("self-insert-face", &Vself_insert_face,
335c5470
PJ
554 doc: /* If non-nil, set the face of the next self-inserting character to this.
555See also `self-insert-face-command'. */);
189fad68
RS
556 Vself_insert_face = Qnil;
557
558 DEFVAR_LISP ("self-insert-face-command", &Vself_insert_face_command,
335c5470
PJ
559 doc: /* This is the command that set up `self-insert-face'.
560If `last-command' does not equal this value, we ignore `self-insert-face'. */);
189fad68
RS
561 Vself_insert_face_command = Qnil;
562
cd645247 563 DEFVAR_LISP ("blink-paren-function", &Vblink_paren_function,
335c5470
PJ
564 doc: /* Function called, if non-nil, whenever a close parenthesis is inserted.
565More precisely, a char with closeparen syntax is self-inserted. */);
cd645247
JB
566 Vblink_paren_function = Qnil;
567
9e4fd67b 568 defsubr (&Sforward_point);
cd645247
JB
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);
cd645247 576 defsubr (&Sself_insert_command);
cd645247
JB
577}
578
dfcf069d 579void
971de7fb 580keys_of_cmds (void)
cd645247
JB
581{
582 int n;
583
1ac9108a 584 nonundocount = 0;
cbf65115 585 initial_define_key (global_map, Ctl ('I'), "self-insert-command");
cd645247
JB
586 for (n = 040; n < 0177; n++)
587 initial_define_key (global_map, n, "self-insert-command");
cf9cdc11
RS
588#ifdef MSDOS
589 for (n = 0200; n < 0240; n++)
590 initial_define_key (global_map, n, "self-insert-command");
591#endif
94748cb9 592 for (n = 0240; n < 0400; n++)
eb46da6a 593 initial_define_key (global_map, n, "self-insert-command");
cd645247
JB
594
595 initial_define_key (global_map, Ctl ('A'), "beginning-of-line");
596 initial_define_key (global_map, Ctl ('B'), "backward-char");
cd645247
JB
597 initial_define_key (global_map, Ctl ('E'), "end-of-line");
598 initial_define_key (global_map, Ctl ('F'), "forward-char");
cd645247 599}
6b61353c
KH
600
601/* arch-tag: 022ba3cd-67f9-4978-9c5d-7d2b18d8644e
602 (do not change this comment) */