*** empty log message ***
[bpt/emacs.git] / src / cmds.c
CommitLineData
cd645247 1/* Simple built-in editing commands.
4a2f9c6a 2 Copyright (C) 1985, 93, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.
cd645247
JB
3
4This file is part of GNU Emacs.
5
6GNU Emacs is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
502ddf23 8the Free Software Foundation; either version 2, or (at your option)
cd645247
JB
9any later version.
10
11GNU Emacs is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU Emacs; see the file COPYING. If not, write to
3b7ad313
EN
18the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19Boston, MA 02111-1307, USA. */
cd645247
JB
20
21
18160b98 22#include <config.h>
cd645247
JB
23#include "lisp.h"
24#include "commands.h"
25#include "buffer.h"
9e4fd67b 26#include "charset.h"
cd645247 27#include "syntax.h"
f109dfa2 28#include "window.h"
346e0c2d 29#include "keyboard.h"
dfcf069d 30#include "dispextern.h"
cd645247
JB
31
32Lisp_Object Qkill_forward_chars, Qkill_backward_chars, Vblink_paren_function;
33
6bbb0d4a
JB
34/* A possible value for a buffer's overwrite-mode variable. */
35Lisp_Object Qoverwrite_mode_binary;
36
189fad68
RS
37/* Non-nil means put this face on the next self-inserting character. */
38Lisp_Object Vself_insert_face;
39
40/* This is the command that set up Vself_insert_face. */
41Lisp_Object Vself_insert_face_command;
42
189fad68 43extern Lisp_Object Qface;
cd645247 44\f
9e4fd67b
KH
45DEFUN ("forward-point", Fforward_point, Sforward_point, 1, 1, 0,
46 "Return buffer position N characters after (before if N negative) point.")
47 (n)
48 Lisp_Object n;
49{
50 CHECK_NUMBER (n, 0);
51
049749e6 52 return make_number (PT + XINT (n));
9e4fd67b
KH
53}
54
cd645247 55DEFUN ("forward-char", Fforward_char, Sforward_char, 0, 1, "p",
72d5f589 56 "Move point right N characters (left if N is negative).\n\
cd645247 57On reaching end of buffer, stop and signal error.")
72d5f589
EN
58 (n)
59 Lisp_Object n;
cd645247 60{
72d5f589
EN
61 if (NILP (n))
62 XSETFASTINT (n, 1);
cd645247 63 else
72d5f589 64 CHECK_NUMBER (n, 0);
cd645247 65
72d5f589 66 /* This used to just set point to point + XINT (n), and then check
7b502dc3
JB
67 to see if it was within boundaries. But now that SET_PT can
68 potentially do a lot of stuff (calling entering and exiting
69 hooks, etcetera), that's not a good approach. So we validate the
70 proposed position, then set point. */
71 {
049749e6 72 int new_point = PT + XINT (n);
7b502dc3
JB
73
74 if (new_point < BEGV)
75 {
76 SET_PT (BEGV);
77 Fsignal (Qbeginning_of_buffer, Qnil);
78 }
79 if (new_point > ZV)
80 {
81 SET_PT (ZV);
82 Fsignal (Qend_of_buffer, Qnil);
83 }
84
85 SET_PT (new_point);
86 }
87
cd645247
JB
88 return Qnil;
89}
90
91DEFUN ("backward-char", Fbackward_char, Sbackward_char, 0, 1, "p",
72d5f589 92 "Move point left N characters (right if N is negative).\n\
cd645247 93On attempt to pass beginning or end of buffer, stop and signal error.")
72d5f589
EN
94 (n)
95 Lisp_Object n;
cd645247 96{
72d5f589
EN
97 if (NILP (n))
98 XSETFASTINT (n, 1);
cd645247 99 else
72d5f589 100 CHECK_NUMBER (n, 0);
cd645247 101
72d5f589
EN
102 XSETINT (n, - XINT (n));
103 return Fforward_char (n);
cd645247
JB
104}
105
106DEFUN ("forward-line", Fforward_line, Sforward_line, 0, 1, "p",
72d5f589
EN
107 "Move N lines forward (backward if N is negative).\n\
108Precisely, if point is on line I, move to the start of line I + N.\n\
cd645247
JB
109If there isn't room, go as far as possible (no error).\n\
110Returns the count of lines left to move. If moving forward,\n\
72d5f589
EN
111that is N - number of lines moved; if backward, N + number moved.\n\
112With positive N, a non-empty line at the end counts as one line\n\
cd645247
JB
113 successfully moved (for the return value).")
114 (n)
115 Lisp_Object n;
116{
049749e6
RS
117 int opoint = PT, opoint_byte = PT_BYTE;
118 int pos, pos_byte;
119 int count, shortage;
120 int temp;
cd645247 121
265a9e55 122 if (NILP (n))
cd645247
JB
123 count = 1;
124 else
125 {
126 CHECK_NUMBER (n, 0);
127 count = XINT (n);
128 }
129
049749e6
RS
130 if (count <= 0)
131 shortage = scan_newline (PT, PT_BYTE, BEGV, BEGV_BYTE, count - 1, 1);
132 else
133 shortage = scan_newline (PT, PT_BYTE, ZV, ZV_BYTE, count, 1);
134
135 /* Since scan_newline does TEMP_SET_PT_BOTH,
136 and we want to set PT "for real",
137 go back to the old point and then come back here. */
138 pos = PT;
139 pos_byte = PT_BYTE;
140 TEMP_SET_PT_BOTH (opoint, opoint_byte);
141 SET_PT_BOTH (pos, pos_byte);
142
cd645247 143 if (shortage > 0
049749e6 144 && (count <= 0
502ddf23 145 || (ZV > BEGV
049749e6
RS
146 && PT != opoint
147 && (FETCH_BYTE (PT_BYTE - 1) != '\n'))))
cd645247 148 shortage--;
049749e6
RS
149
150 return make_number (count <= 0 ? - shortage : shortage);
cd645247
JB
151}
152
153DEFUN ("beginning-of-line", Fbeginning_of_line, Sbeginning_of_line,
154 0, 1, "p",
155 "Move point to beginning of current line.\n\
72d5f589 156With argument N not nil or 1, move forward N - 1 lines first.\n\
c252ce76
RS
157If point reaches the beginning or end of buffer, it stops there.\n\
158This command does not move point across a field boundary\n\
159unless it would move beyond there to a different line.\n\
160If N is nil or 1, and point starts at a field boundary, point does not move.")
cd645247
JB
161 (n)
162 Lisp_Object n;
163{
265a9e55 164 if (NILP (n))
48c7cef2 165 XSETFASTINT (n, 1);
cd645247
JB
166 else
167 CHECK_NUMBER (n, 0);
168
0aee588d 169 SET_PT (XINT (Fline_beginning_position (n)));
4f13cc99 170
cd645247
JB
171 return Qnil;
172}
173
174DEFUN ("end-of-line", Fend_of_line, Send_of_line,
175 0, 1, "p",
176 "Move point to end of current line.\n\
72d5f589 177With argument N not nil or 1, move forward N - 1 lines first.\n\
c252ce76
RS
178If point reaches the beginning or end of buffer, it stops there.\n\
179This command does not move point across a field boundary\n\
180unless it would move beyond there to a different line.\n\
181If N is nil or 1, and point starts at a field boundary, point does not move.")
cd645247
JB
182 (n)
183 Lisp_Object n;
184{
265a9e55 185 if (NILP (n))
48c7cef2 186 XSETFASTINT (n, 1);
cd645247
JB
187 else
188 CHECK_NUMBER (n, 0);
189
38b294ca 190 SET_PT (XINT (Fline_end_position (n)));
cd645247
JB
191
192 return Qnil;
193}
194
195DEFUN ("delete-char", Fdelete_char, Sdelete_char, 1, 2, "p\nP",
72d5f589 196 "Delete the following N characters (previous if N is negative).\n\
cd645247 197Optional second arg KILLFLAG non-nil means kill instead (save in kill ring).\n\
72d5f589
EN
198Interactively, N is the prefix arg, and KILLFLAG is set if\n\
199N was explicitly specified.")
cd645247
JB
200 (n, killflag)
201 Lisp_Object n, killflag;
202{
9e4fd67b
KH
203 int pos;
204
cd645247
JB
205 CHECK_NUMBER (n, 0);
206
049749e6 207 pos = PT + XINT (n);
265a9e55 208 if (NILP (killflag))
cd645247
JB
209 {
210 if (XINT (n) < 0)
211 {
9e4fd67b 212 if (pos < BEGV)
cd645247
JB
213 Fsignal (Qbeginning_of_buffer, Qnil);
214 else
9e4fd67b 215 del_range (pos, PT);
cd645247
JB
216 }
217 else
218 {
9e4fd67b 219 if (pos > ZV)
cd645247
JB
220 Fsignal (Qend_of_buffer, Qnil);
221 else
9e4fd67b 222 del_range (PT, pos);
cd645247
JB
223 }
224 }
225 else
226 {
227 call1 (Qkill_forward_chars, n);
228 }
229 return Qnil;
230}
231
232DEFUN ("delete-backward-char", Fdelete_backward_char, Sdelete_backward_char,
233 1, 2, "p\nP",
72d5f589 234 "Delete the previous N characters (following if N is negative).\n\
cd645247 235Optional second arg KILLFLAG non-nil means kill instead (save in kill ring).\n\
72d5f589
EN
236Interactively, N is the prefix arg, and KILLFLAG is set if\n\
237N was explicitly specified.")
cd645247
JB
238 (n, killflag)
239 Lisp_Object n, killflag;
240{
aa970069 241 Lisp_Object value;
7c983171 242 int deleted_special = 0;
ceb7e4f8 243 int pos, pos_byte, i;
aa970069 244
cd645247 245 CHECK_NUMBER (n, 0);
aa970069 246
7c983171 247 /* See if we are about to delete a tab or newline backwards. */
ceb7e4f8
KH
248 pos = PT;
249 pos_byte = PT_BYTE;
250 for (i = 0; i < XINT (n) && pos_byte > BEGV_BYTE; i++)
aa970069 251 {
9e4fd67b
KH
252 int c;
253
ceb7e4f8
KH
254 DEC_BOTH (pos, pos_byte);
255 c = FETCH_BYTE (pos_byte);
9e4fd67b 256 if (c == '\t' || c == '\n')
aa970069 257 {
7c983171 258 deleted_special = 1;
aa970069
RS
259 break;
260 }
261 }
262
aa970069
RS
263 /* In overwrite mode, back over columns while clearing them out,
264 unless at end of line. */
265 if (XINT (n) > 0
266 && ! NILP (current_buffer->overwrite_mode)
7c983171 267 && ! deleted_special
049749e6 268 && ! (PT == ZV || FETCH_BYTE (PT_BYTE) == '\n'))
aa970069 269 {
9e4fd67b
KH
270 int column = current_column ();
271
272 value = Fdelete_char (make_number (-XINT (n)), killflag);
273 i = column - current_column ();
cac55749 274 Finsert_char (make_number (' '), make_number (i), Qnil);
049749e6
RS
275 /* Whitespace chars are ASCII chars, so we can simply subtract. */
276 SET_PT_BOTH (PT - i, PT_BYTE - i);
aa970069 277 }
9e4fd67b
KH
278 else
279 value = Fdelete_char (make_number (-XINT (n)), killflag);
aa970069
RS
280
281 return value;
cd645247
JB
282}
283
284DEFUN ("self-insert-command", Fself_insert_command, Sself_insert_command, 1, 1, "p",
285 "Insert the character you type.\n\
286Whichever character you type to run this command is inserted.")
72d5f589
EN
287 (n)
288 Lisp_Object n;
cd645247 289{
a22ca1e0
RS
290 int character = XINT (last_command_char);
291
72d5f589 292 CHECK_NUMBER (n, 0);
cd645247
JB
293
294 /* Barf if the key that invoked this was not a character. */
ed76f667 295 if (!INTEGERP (last_command_char))
cd645247 296 bitch_at_user ();
72d5f589 297 else if (XINT (n) >= 2 && NILP (current_buffer->overwrite_mode))
2718dfa4 298 {
a22ca1e0
RS
299 int modified_char = character;
300 /* Add the offset to the character, for Finsert_char.
301 We pass internal_self_insert the unmodified character
302 because it itself does this offsetting. */
49bc32b0
RS
303 if (! NILP (current_buffer->enable_multibyte_characters))
304 modified_char = unibyte_char_to_multibyte (modified_char);
a22ca1e0 305
72d5f589 306 XSETFASTINT (n, XFASTINT (n) - 2);
2718dfa4 307 /* The first one might want to expand an abbrev. */
a22ca1e0 308 internal_self_insert (character, 1);
2718dfa4
RS
309 /* The bulk of the copies of this char can be inserted simply.
310 We don't have to handle a user-specified face specially
311 because it will get inherited from the first char inserted. */
a22ca1e0 312 Finsert_char (make_number (modified_char), n, Qt);
2718dfa4 313 /* The last one might want to auto-fill. */
a22ca1e0 314 internal_self_insert (character, 0);
2718dfa4 315 }
cd645247 316 else
72d5f589 317 while (XINT (n) > 0)
cd645247 318 {
f58dd69b 319 /* Ok since old and new vals both nonneg */
72d5f589 320 XSETFASTINT (n, XFASTINT (n) - 1);
a22ca1e0 321 internal_self_insert (character, XFASTINT (n) != 0);
cd645247
JB
322 }
323
324 return Qnil;
325}
326
9e4fd67b 327/* Insert character C. If NOAUTOFILL is nonzero, don't do autofill
4c6e656f
RS
328 even if it is enabled.
329
330 If this insertion is suitable for direct output (completely simple),
aa52fef9
RS
331 return 0. A value of 1 indicates this *might* not have been simple.
332 A value of 2 means this did things that call for an undo boundary. */
4c6e656f 333
dfcf069d 334int
9e4fd67b
KH
335internal_self_insert (c, noautofill)
336 int c;
cd645247
JB
337 int noautofill;
338{
339 extern Lisp_Object Fexpand_abbrev ();
340 int hairy = 0;
341 Lisp_Object tem;
342 register enum syntaxcode synt;
e744155a 343 Lisp_Object overwrite, string;
9e4fd67b
KH
344 /* Length of multi-byte form of C. */
345 int len;
346 /* Working buffer and pointer for multi-byte form of C. */
e55d9cfd 347 unsigned char str[MAX_MULTIBYTE_LENGTH];
049749e6 348 int chars_to_delete = 0;
e744155a 349 int spaces_to_insert = 0;
cd645247 350
e7aacab7 351 overwrite = current_buffer->overwrite_mode;
166a4263
RS
352 if (!NILP (Vbefore_change_function) || !NILP (Vafter_change_function)
353 || !NILP (Vbefore_change_functions) || !NILP (Vafter_change_functions))
cd645247
JB
354 hairy = 1;
355
9e4fd67b
KH
356 /* At first, get multi-byte form of C in STR. */
357 if (!NILP (current_buffer->enable_multibyte_characters))
b9859007
KH
358 {
359 c = unibyte_char_to_multibyte (c);
e55d9cfd 360 len = CHAR_STRING (c, str);
741263c2
KH
361 if (len == 1)
362 /* If C has modifier bits, this makes C an appropriate
363 one-byte char. */
364 c = *str;
b9859007 365 }
9e4fd67b 366 else
38b62842 367 {
e55d9cfd
KH
368 str[0] = (SINGLE_BYTE_CHAR_P (c)
369 ? c
370 : multibyte_char_to_unibyte (c, Qnil));
38b62842
KH
371 len = 1;
372 }
6bbb0d4a 373 if (!NILP (overwrite)
9e4fd67b 374 && PT < ZV)
cd645247 375 {
9e4fd67b
KH
376 /* In overwrite-mode, we substitute a character at point (C2,
377 hereafter) by C. For that, we delete C2 in advance. But,
378 just substituting C2 by C may move a remaining text in the
379 line to the right or to the left, which is not preferable.
380 So we insert more spaces or delete more characters in the
381 following cases: if C is narrower than C2, after deleting C2,
382 we fill columns with spaces, if C is wider than C2, we delete
383 C2 and several characters following C2. */
384
216b9443
RS
385 /* This is the character after point. */
386 int c2 = FETCH_CHAR (PT_BYTE);
387
388 /* Column the cursor should be placed at after this insertion.
9e4fd67b
KH
389 The correct value should be calculated only when necessary. */
390 int target_clm = 0;
391
37c0ed09
RS
392 /* Overwriting in binary-mode always replaces C2 by C.
393 Overwriting in textual-mode doesn't always do that.
394 It inserts newlines in the usual way,
395 and inserts any character at end of line
396 or before a tab if it doesn't use the whole width of the tab. */
9e4fd67b
KH
397 if (EQ (overwrite, Qoverwrite_mode_binary)
398 || (c != '\n'
399 && c2 != '\n'
37c0ed09
RS
400 && ! (c2 == '\t'
401 && XINT (current_buffer->tab_width) > 0
402 && XFASTINT (current_buffer->tab_width) < 20
216b9443 403 && (target_clm = (current_column ()
06d74a65 404 + XINT (Fchar_width (make_number (c)))),
37c0ed09 405 target_clm % XFASTINT (current_buffer->tab_width)))))
9e4fd67b 406 {
e744155a 407 int pos = PT;
049749e6 408 int pos_byte = PT_BYTE;
e744155a 409
9e4fd67b 410 if (target_clm == 0)
049749e6 411 chars_to_delete = 1;
9e4fd67b
KH
412 else
413 {
9e4fd67b
KH
414 /* The actual cursor position after the trial of moving
415 to column TARGET_CLM. It is greater than TARGET_CLM
416 if the TARGET_CLM is middle of multi-column
417 character. In that case, the new point is set after
418 that character. */
cac55749
RS
419 int actual_clm
420 = XFASTINT (Fmove_to_column (make_number (target_clm), Qnil));
9e4fd67b 421
049749e6 422 chars_to_delete = PT - pos;
e744155a 423
9e4fd67b
KH
424 if (actual_clm > target_clm)
425 {
e744155a 426 /* We will delete too many columns. Let's fill columns
9e4fd67b 427 by spaces so that the remaining text won't move. */
e744155a 428 spaces_to_insert = actual_clm - target_clm;
9e4fd67b
KH
429 }
430 }
049749e6 431 SET_PT_BOTH (pos, pos_byte);
9e4fd67b
KH
432 hairy = 2;
433 }
aa52fef9 434 hairy = 2;
cd645247 435 }
265a9e55 436 if (!NILP (current_buffer->abbrev_mode)
cd645247 437 && SYNTAX (c) != Sword
265a9e55 438 && NILP (current_buffer->read_only)
9e4fd67b 439 && PT > BEGV && SYNTAX (XFASTINT (Fprevious_char ())) == Sword)
cd645247 440 {
ee8caabb 441 int modiff = MODIFF;
e57640c0
RS
442 Lisp_Object sym;
443
444 sym = Fexpand_abbrev ();
445
446 /* If we expanded an abbrev which has only a hook,
9317a902 447 and the hook has a non-nil `no-self-insert' property,
e57640c0 448 return right away--don't really self-insert. */
9317a902
RS
449 if (! NILP (sym) && ! NILP (XSYMBOL (sym)->function)
450 && SYMBOLP (XSYMBOL (sym)->function))
e57640c0
RS
451 {
452 Lisp_Object prop;
9317a902 453 prop = Fget (XSYMBOL (sym)->function, intern ("no-self-insert"));
e57640c0 454 if (! NILP (prop))
6787d111 455 return 1;
e57640c0
RS
456 }
457
ee8caabb 458 if (MODIFF != modiff)
aa52fef9 459 hairy = 2;
cd645247 460 }
e744155a 461
049749e6 462 if (chars_to_delete)
e744155a 463 {
f34206b4 464 string = make_string_from_bytes (str, 1, len);
e744155a
RS
465 if (spaces_to_insert)
466 {
467 tem = Fmake_string (make_number (spaces_to_insert),
468 make_number (' '));
469 string = concat2 (tem, string);
470 }
471
5f65b1b4 472 replace_range (PT, PT + chars_to_delete, string, 1, 1, 1);
1bf95511 473 Fforward_char (make_number (1 + spaces_to_insert));
e744155a
RS
474 }
475 else
476 insert_and_inherit (str, len);
477
01428933
KH
478 if ((CHAR_TABLE_P (Vauto_fill_chars)
479 ? !NILP (CHAR_TABLE_REF (Vauto_fill_chars, c))
480 : (c == ' ' || c == '\n'))
cd645247 481 && !noautofill
3de15b7a 482 && !NILP (current_buffer->auto_fill_function))
cd645247 483 {
76bb6dbb
KH
484 Lisp_Object tem;
485
9e4fd67b 486 if (c == '\n')
049749e6
RS
487 /* After inserting a newline, move to previous line and fill
488 that. Must have the newline in place already so filling and
489 justification, if any, know where the end is going to be. */
490 SET_PT_BOTH (PT - 1, PT_BYTE - 1);
76bb6dbb 491 tem = call0 (current_buffer->auto_fill_function);
9e4fd67b 492 if (c == '\n')
049749e6 493 SET_PT_BOTH (PT + 1, PT_BYTE + 1);
76bb6dbb
KH
494 if (!NILP (tem))
495 hairy = 2;
cd645247 496 }
189fad68 497
38d404db 498#ifdef HAVE_FACES
189fad68
RS
499 /* If previous command specified a face to use, use it. */
500 if (!NILP (Vself_insert_face)
346e0c2d 501 && EQ (current_kboard->Vlast_command, Vself_insert_face_command))
189fad68 502 {
049749e6
RS
503 Fput_text_property (make_number (PT - 1), make_number (PT),
504 Qface, Vself_insert_face, Qnil);
189fad68
RS
505 Vself_insert_face = Qnil;
506 }
38d404db 507#endif
e744155a 508
cd645247
JB
509 synt = SYNTAX (c);
510 if ((synt == Sclose || synt == Smath)
2718dfa4
RS
511 && !NILP (Vblink_paren_function) && INTERACTIVE
512 && !noautofill)
cd645247
JB
513 {
514 call0 (Vblink_paren_function);
aa52fef9 515 hairy = 2;
cd645247
JB
516 }
517 return hairy;
518}
519\f
520/* module initialization */
521
dfcf069d 522void
cd645247
JB
523syms_of_cmds ()
524{
525 Qkill_backward_chars = intern ("kill-backward-chars");
526 staticpro (&Qkill_backward_chars);
527
528 Qkill_forward_chars = intern ("kill-forward-chars");
529 staticpro (&Qkill_forward_chars);
530
6bbb0d4a
JB
531 Qoverwrite_mode_binary = intern ("overwrite-mode-binary");
532 staticpro (&Qoverwrite_mode_binary);
e686c647 533
189fad68
RS
534 DEFVAR_LISP ("self-insert-face", &Vself_insert_face,
535 "If non-nil, set the face of the next self-inserting character to this.\n\
536See also `self-insert-face-command'.");
537 Vself_insert_face = Qnil;
538
539 DEFVAR_LISP ("self-insert-face-command", &Vself_insert_face_command,
540 "This is the command that set up `self-insert-face'.\n\
541If `last-command' does not equal this value, we ignore `self-insert-face'.");
542 Vself_insert_face_command = Qnil;
543
cd645247
JB
544 DEFVAR_LISP ("blink-paren-function", &Vblink_paren_function,
545 "Function called, if non-nil, whenever a close parenthesis is inserted.\n\
546More precisely, a char with closeparen syntax is self-inserted.");
547 Vblink_paren_function = Qnil;
548
9e4fd67b 549 defsubr (&Sforward_point);
cd645247
JB
550 defsubr (&Sforward_char);
551 defsubr (&Sbackward_char);
552 defsubr (&Sforward_line);
553 defsubr (&Sbeginning_of_line);
554 defsubr (&Send_of_line);
555
556 defsubr (&Sdelete_char);
557 defsubr (&Sdelete_backward_char);
558
559 defsubr (&Sself_insert_command);
cd645247
JB
560}
561
dfcf069d 562void
cd645247
JB
563keys_of_cmds ()
564{
565 int n;
566
cbf65115 567 initial_define_key (global_map, Ctl ('I'), "self-insert-command");
cd645247
JB
568 for (n = 040; n < 0177; n++)
569 initial_define_key (global_map, n, "self-insert-command");
cf9cdc11
RS
570#ifdef MSDOS
571 for (n = 0200; n < 0240; n++)
572 initial_define_key (global_map, n, "self-insert-command");
573#endif
94748cb9 574 for (n = 0240; n < 0400; n++)
eb46da6a 575 initial_define_key (global_map, n, "self-insert-command");
cd645247
JB
576
577 initial_define_key (global_map, Ctl ('A'), "beginning-of-line");
578 initial_define_key (global_map, Ctl ('B'), "backward-char");
579 initial_define_key (global_map, Ctl ('D'), "delete-char");
580 initial_define_key (global_map, Ctl ('E'), "end-of-line");
581 initial_define_key (global_map, Ctl ('F'), "forward-char");
582 initial_define_key (global_map, 0177, "delete-backward-char");
583}