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