*** 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"
e35f6ff7 30#include "keymap.h"
dfcf069d 31#include "dispextern.h"
cd645247
JB
32
33Lisp_Object Qkill_forward_chars, Qkill_backward_chars, Vblink_paren_function;
34
6bbb0d4a
JB
35/* A possible value for a buffer's overwrite-mode variable. */
36Lisp_Object Qoverwrite_mode_binary;
37
189fad68
RS
38/* Non-nil means put this face on the next self-inserting character. */
39Lisp_Object Vself_insert_face;
40
41/* This is the command that set up Vself_insert_face. */
42Lisp_Object Vself_insert_face_command;
43
189fad68 44extern Lisp_Object Qface;
cd645247 45\f
9e4fd67b
KH
46DEFUN ("forward-point", Fforward_point, Sforward_point, 1, 1, 0,
47 "Return buffer position N characters after (before if N negative) point.")
48 (n)
49 Lisp_Object n;
50{
51 CHECK_NUMBER (n, 0);
52
049749e6 53 return make_number (PT + XINT (n));
9e4fd67b
KH
54}
55
cd645247 56DEFUN ("forward-char", Fforward_char, Sforward_char, 0, 1, "p",
72d5f589 57 "Move point right N characters (left if N is negative).\n\
cd645247 58On reaching end of buffer, stop and signal error.")
72d5f589
EN
59 (n)
60 Lisp_Object n;
cd645247 61{
72d5f589
EN
62 if (NILP (n))
63 XSETFASTINT (n, 1);
cd645247 64 else
72d5f589 65 CHECK_NUMBER (n, 0);
cd645247 66
72d5f589 67 /* This used to just set point to point + XINT (n), and then check
7b502dc3
JB
68 to see if it was within boundaries. But now that SET_PT can
69 potentially do a lot of stuff (calling entering and exiting
70 hooks, etcetera), that's not a good approach. So we validate the
71 proposed position, then set point. */
72 {
049749e6 73 int new_point = PT + XINT (n);
7b502dc3
JB
74
75 if (new_point < BEGV)
76 {
77 SET_PT (BEGV);
78 Fsignal (Qbeginning_of_buffer, Qnil);
79 }
80 if (new_point > ZV)
81 {
82 SET_PT (ZV);
83 Fsignal (Qend_of_buffer, Qnil);
84 }
85
86 SET_PT (new_point);
87 }
88
cd645247
JB
89 return Qnil;
90}
91
92DEFUN ("backward-char", Fbackward_char, Sbackward_char, 0, 1, "p",
72d5f589 93 "Move point left N characters (right if N is negative).\n\
cd645247 94On attempt to pass beginning or end of buffer, stop and signal error.")
72d5f589
EN
95 (n)
96 Lisp_Object n;
cd645247 97{
72d5f589
EN
98 if (NILP (n))
99 XSETFASTINT (n, 1);
cd645247 100 else
72d5f589 101 CHECK_NUMBER (n, 0);
cd645247 102
72d5f589
EN
103 XSETINT (n, - XINT (n));
104 return Fforward_char (n);
cd645247
JB
105}
106
107DEFUN ("forward-line", Fforward_line, Sforward_line, 0, 1, "p",
72d5f589
EN
108 "Move N lines forward (backward if N is negative).\n\
109Precisely, if point is on line I, move to the start of line I + N.\n\
cd645247
JB
110If there isn't room, go as far as possible (no error).\n\
111Returns the count of lines left to move. If moving forward,\n\
72d5f589
EN
112that is N - number of lines moved; if backward, N + number moved.\n\
113With positive N, a non-empty line at the end counts as one line\n\
cd645247
JB
114 successfully moved (for the return value).")
115 (n)
116 Lisp_Object n;
117{
049749e6
RS
118 int opoint = PT, opoint_byte = PT_BYTE;
119 int pos, pos_byte;
120 int count, shortage;
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;
ad44dffe 352 if (!NILP (Vbefore_change_functions) || !NILP (Vafter_change_functions))
cd645247
JB
353 hairy = 1;
354
9e4fd67b
KH
355 /* At first, get multi-byte form of C in STR. */
356 if (!NILP (current_buffer->enable_multibyte_characters))
b9859007
KH
357 {
358 c = unibyte_char_to_multibyte (c);
e55d9cfd 359 len = CHAR_STRING (c, str);
741263c2
KH
360 if (len == 1)
361 /* If C has modifier bits, this makes C an appropriate
362 one-byte char. */
363 c = *str;
b9859007 364 }
9e4fd67b 365 else
38b62842 366 {
e55d9cfd
KH
367 str[0] = (SINGLE_BYTE_CHAR_P (c)
368 ? c
369 : multibyte_char_to_unibyte (c, Qnil));
38b62842
KH
370 len = 1;
371 }
6bbb0d4a 372 if (!NILP (overwrite)
9e4fd67b 373 && PT < ZV)
cd645247 374 {
9e4fd67b
KH
375 /* In overwrite-mode, we substitute a character at point (C2,
376 hereafter) by C. For that, we delete C2 in advance. But,
377 just substituting C2 by C may move a remaining text in the
378 line to the right or to the left, which is not preferable.
379 So we insert more spaces or delete more characters in the
380 following cases: if C is narrower than C2, after deleting C2,
381 we fill columns with spaces, if C is wider than C2, we delete
382 C2 and several characters following C2. */
383
216b9443
RS
384 /* This is the character after point. */
385 int c2 = FETCH_CHAR (PT_BYTE);
386
387 /* Column the cursor should be placed at after this insertion.
9e4fd67b
KH
388 The correct value should be calculated only when necessary. */
389 int target_clm = 0;
390
37c0ed09
RS
391 /* Overwriting in binary-mode always replaces C2 by C.
392 Overwriting in textual-mode doesn't always do that.
393 It inserts newlines in the usual way,
394 and inserts any character at end of line
395 or before a tab if it doesn't use the whole width of the tab. */
9e4fd67b
KH
396 if (EQ (overwrite, Qoverwrite_mode_binary)
397 || (c != '\n'
398 && c2 != '\n'
37c0ed09
RS
399 && ! (c2 == '\t'
400 && XINT (current_buffer->tab_width) > 0
401 && XFASTINT (current_buffer->tab_width) < 20
216b9443 402 && (target_clm = (current_column ()
06d74a65 403 + XINT (Fchar_width (make_number (c)))),
37c0ed09 404 target_clm % XFASTINT (current_buffer->tab_width)))))
9e4fd67b 405 {
e744155a 406 int pos = PT;
049749e6 407 int pos_byte = PT_BYTE;
e744155a 408
9e4fd67b 409 if (target_clm == 0)
049749e6 410 chars_to_delete = 1;
9e4fd67b
KH
411 else
412 {
9e4fd67b
KH
413 /* The actual cursor position after the trial of moving
414 to column TARGET_CLM. It is greater than TARGET_CLM
415 if the TARGET_CLM is middle of multi-column
416 character. In that case, the new point is set after
417 that character. */
cac55749
RS
418 int actual_clm
419 = XFASTINT (Fmove_to_column (make_number (target_clm), Qnil));
9e4fd67b 420
049749e6 421 chars_to_delete = PT - pos;
e744155a 422
9e4fd67b
KH
423 if (actual_clm > target_clm)
424 {
e744155a 425 /* We will delete too many columns. Let's fill columns
9e4fd67b 426 by spaces so that the remaining text won't move. */
e744155a 427 spaces_to_insert = actual_clm - target_clm;
9e4fd67b
KH
428 }
429 }
049749e6 430 SET_PT_BOTH (pos, pos_byte);
9e4fd67b
KH
431 hairy = 2;
432 }
aa52fef9 433 hairy = 2;
cd645247 434 }
265a9e55 435 if (!NILP (current_buffer->abbrev_mode)
cd645247 436 && SYNTAX (c) != Sword
265a9e55 437 && NILP (current_buffer->read_only)
9e4fd67b 438 && PT > BEGV && SYNTAX (XFASTINT (Fprevious_char ())) == Sword)
cd645247 439 {
ee8caabb 440 int modiff = MODIFF;
e57640c0
RS
441 Lisp_Object sym;
442
443 sym = Fexpand_abbrev ();
444
c87dbfd0 445 /* If we expanded an abbrev which has a hook,
9317a902 446 and the hook has a non-nil `no-self-insert' property,
e57640c0 447 return right away--don't really self-insert. */
9317a902
RS
448 if (! NILP (sym) && ! NILP (XSYMBOL (sym)->function)
449 && SYMBOLP (XSYMBOL (sym)->function))
e57640c0
RS
450 {
451 Lisp_Object prop;
9317a902 452 prop = Fget (XSYMBOL (sym)->function, intern ("no-self-insert"));
e57640c0 453 if (! NILP (prop))
6787d111 454 return 1;
e57640c0
RS
455 }
456
ee8caabb 457 if (MODIFF != modiff)
aa52fef9 458 hairy = 2;
cd645247 459 }
e744155a 460
049749e6 461 if (chars_to_delete)
e744155a 462 {
f34206b4 463 string = make_string_from_bytes (str, 1, len);
e744155a
RS
464 if (spaces_to_insert)
465 {
466 tem = Fmake_string (make_number (spaces_to_insert),
467 make_number (' '));
468 string = concat2 (tem, string);
469 }
470
5f65b1b4 471 replace_range (PT, PT + chars_to_delete, string, 1, 1, 1);
1bf95511 472 Fforward_char (make_number (1 + spaces_to_insert));
e744155a
RS
473 }
474 else
475 insert_and_inherit (str, len);
476
01428933
KH
477 if ((CHAR_TABLE_P (Vauto_fill_chars)
478 ? !NILP (CHAR_TABLE_REF (Vauto_fill_chars, c))
479 : (c == ' ' || c == '\n'))
cd645247 480 && !noautofill
3de15b7a 481 && !NILP (current_buffer->auto_fill_function))
cd645247 482 {
76bb6dbb
KH
483 Lisp_Object tem;
484
9e4fd67b 485 if (c == '\n')
049749e6
RS
486 /* After inserting a newline, move to previous line and fill
487 that. Must have the newline in place already so filling and
488 justification, if any, know where the end is going to be. */
489 SET_PT_BOTH (PT - 1, PT_BYTE - 1);
76bb6dbb 490 tem = call0 (current_buffer->auto_fill_function);
9e4fd67b 491 if (c == '\n')
049749e6 492 SET_PT_BOTH (PT + 1, PT_BYTE + 1);
76bb6dbb
KH
493 if (!NILP (tem))
494 hairy = 2;
cd645247 495 }
189fad68
RS
496
497 /* If previous command specified a face to use, use it. */
498 if (!NILP (Vself_insert_face)
346e0c2d 499 && EQ (current_kboard->Vlast_command, Vself_insert_face_command))
189fad68 500 {
049749e6
RS
501 Fput_text_property (make_number (PT - 1), make_number (PT),
502 Qface, Vself_insert_face, Qnil);
189fad68
RS
503 Vself_insert_face = Qnil;
504 }
e744155a 505
cd645247
JB
506 synt = SYNTAX (c);
507 if ((synt == Sclose || synt == Smath)
2718dfa4
RS
508 && !NILP (Vblink_paren_function) && INTERACTIVE
509 && !noautofill)
cd645247
JB
510 {
511 call0 (Vblink_paren_function);
aa52fef9 512 hairy = 2;
cd645247
JB
513 }
514 return hairy;
515}
516\f
517/* module initialization */
518
dfcf069d 519void
cd645247
JB
520syms_of_cmds ()
521{
522 Qkill_backward_chars = intern ("kill-backward-chars");
523 staticpro (&Qkill_backward_chars);
524
525 Qkill_forward_chars = intern ("kill-forward-chars");
526 staticpro (&Qkill_forward_chars);
527
6bbb0d4a
JB
528 Qoverwrite_mode_binary = intern ("overwrite-mode-binary");
529 staticpro (&Qoverwrite_mode_binary);
e686c647 530
189fad68
RS
531 DEFVAR_LISP ("self-insert-face", &Vself_insert_face,
532 "If non-nil, set the face of the next self-inserting character to this.\n\
533See also `self-insert-face-command'.");
534 Vself_insert_face = Qnil;
535
536 DEFVAR_LISP ("self-insert-face-command", &Vself_insert_face_command,
537 "This is the command that set up `self-insert-face'.\n\
538If `last-command' does not equal this value, we ignore `self-insert-face'.");
539 Vself_insert_face_command = Qnil;
540
cd645247
JB
541 DEFVAR_LISP ("blink-paren-function", &Vblink_paren_function,
542 "Function called, if non-nil, whenever a close parenthesis is inserted.\n\
543More precisely, a char with closeparen syntax is self-inserted.");
544 Vblink_paren_function = Qnil;
545
9e4fd67b 546 defsubr (&Sforward_point);
cd645247
JB
547 defsubr (&Sforward_char);
548 defsubr (&Sbackward_char);
549 defsubr (&Sforward_line);
550 defsubr (&Sbeginning_of_line);
551 defsubr (&Send_of_line);
552
553 defsubr (&Sdelete_char);
554 defsubr (&Sdelete_backward_char);
555
556 defsubr (&Sself_insert_command);
cd645247
JB
557}
558
dfcf069d 559void
cd645247
JB
560keys_of_cmds ()
561{
562 int n;
563
cbf65115 564 initial_define_key (global_map, Ctl ('I'), "self-insert-command");
cd645247
JB
565 for (n = 040; n < 0177; n++)
566 initial_define_key (global_map, n, "self-insert-command");
cf9cdc11
RS
567#ifdef MSDOS
568 for (n = 0200; n < 0240; n++)
569 initial_define_key (global_map, n, "self-insert-command");
570#endif
94748cb9 571 for (n = 0240; n < 0400; n++)
eb46da6a 572 initial_define_key (global_map, n, "self-insert-command");
cd645247
JB
573
574 initial_define_key (global_map, Ctl ('A'), "beginning-of-line");
575 initial_define_key (global_map, Ctl ('B'), "backward-char");
576 initial_define_key (global_map, Ctl ('D'), "delete-char");
577 initial_define_key (global_map, Ctl ('E'), "end-of-line");
578 initial_define_key (global_map, Ctl ('F'), "forward-char");
579 initial_define_key (global_map, 0177, "delete-backward-char");
580}