(make-temp-file): New function.
[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\
cd645247
JB
157If scan reaches end of buffer, stop there without error.")
158 (n)
159 Lisp_Object n;
160{
265a9e55 161 if (NILP (n))
48c7cef2 162 XSETFASTINT (n, 1);
cd645247
JB
163 else
164 CHECK_NUMBER (n, 0);
165
f69f3ee0
GM
166 {
167 int pos = XFASTINT (Fline_beginning_position (n));
168 if (INTEGERP (current_buffer->minibuffer_prompt_length)
169 && pos < XFASTINT (current_buffer->minibuffer_prompt_length))
170 pos = XFASTINT (current_buffer->minibuffer_prompt_length);
171 SET_PT (pos);
172 }
4f13cc99 173
cd645247
JB
174 return Qnil;
175}
176
177DEFUN ("end-of-line", Fend_of_line, Send_of_line,
178 0, 1, "p",
179 "Move point to end of current line.\n\
72d5f589 180With argument N not nil or 1, move forward N - 1 lines first.\n\
cd645247
JB
181If scan reaches end of buffer, stop there without error.")
182 (n)
183 Lisp_Object n;
184{
185 register int pos;
186 register int stop;
187
265a9e55 188 if (NILP (n))
48c7cef2 189 XSETFASTINT (n, 1);
cd645247
JB
190 else
191 CHECK_NUMBER (n, 0);
192
38b294ca 193 SET_PT (XINT (Fline_end_position (n)));
cd645247
JB
194
195 return Qnil;
196}
197
198DEFUN ("delete-char", Fdelete_char, Sdelete_char, 1, 2, "p\nP",
72d5f589 199 "Delete the following N characters (previous if N is negative).\n\
cd645247 200Optional second arg KILLFLAG non-nil means kill instead (save in kill ring).\n\
72d5f589
EN
201Interactively, N is the prefix arg, and KILLFLAG is set if\n\
202N was explicitly specified.")
cd645247
JB
203 (n, killflag)
204 Lisp_Object n, killflag;
205{
9e4fd67b
KH
206 int pos;
207
cd645247
JB
208 CHECK_NUMBER (n, 0);
209
049749e6 210 pos = PT + XINT (n);
265a9e55 211 if (NILP (killflag))
cd645247
JB
212 {
213 if (XINT (n) < 0)
214 {
9e4fd67b 215 if (pos < BEGV)
cd645247
JB
216 Fsignal (Qbeginning_of_buffer, Qnil);
217 else
9e4fd67b 218 del_range (pos, PT);
cd645247
JB
219 }
220 else
221 {
9e4fd67b 222 if (pos > ZV)
cd645247
JB
223 Fsignal (Qend_of_buffer, Qnil);
224 else
9e4fd67b 225 del_range (PT, pos);
cd645247
JB
226 }
227 }
228 else
229 {
230 call1 (Qkill_forward_chars, n);
231 }
232 return Qnil;
233}
234
235DEFUN ("delete-backward-char", Fdelete_backward_char, Sdelete_backward_char,
236 1, 2, "p\nP",
72d5f589 237 "Delete the previous N characters (following if N is negative).\n\
cd645247 238Optional second arg KILLFLAG non-nil means kill instead (save in kill ring).\n\
72d5f589
EN
239Interactively, N is the prefix arg, and KILLFLAG is set if\n\
240N was explicitly specified.")
cd645247
JB
241 (n, killflag)
242 Lisp_Object n, killflag;
243{
aa970069 244 Lisp_Object value;
7c983171 245 int deleted_special = 0;
ceb7e4f8 246 int pos, pos_byte, i;
aa970069 247
cd645247 248 CHECK_NUMBER (n, 0);
aa970069 249
7c983171 250 /* See if we are about to delete a tab or newline backwards. */
ceb7e4f8
KH
251 pos = PT;
252 pos_byte = PT_BYTE;
253 for (i = 0; i < XINT (n) && pos_byte > BEGV_BYTE; i++)
aa970069 254 {
9e4fd67b
KH
255 int c;
256
ceb7e4f8
KH
257 DEC_BOTH (pos, pos_byte);
258 c = FETCH_BYTE (pos_byte);
9e4fd67b 259 if (c == '\t' || c == '\n')
aa970069 260 {
7c983171 261 deleted_special = 1;
aa970069
RS
262 break;
263 }
264 }
265
aa970069
RS
266 /* In overwrite mode, back over columns while clearing them out,
267 unless at end of line. */
268 if (XINT (n) > 0
269 && ! NILP (current_buffer->overwrite_mode)
7c983171 270 && ! deleted_special
049749e6 271 && ! (PT == ZV || FETCH_BYTE (PT_BYTE) == '\n'))
aa970069 272 {
9e4fd67b
KH
273 int column = current_column ();
274
275 value = Fdelete_char (make_number (-XINT (n)), killflag);
276 i = column - current_column ();
cac55749 277 Finsert_char (make_number (' '), make_number (i), Qnil);
049749e6
RS
278 /* Whitespace chars are ASCII chars, so we can simply subtract. */
279 SET_PT_BOTH (PT - i, PT_BYTE - i);
aa970069 280 }
9e4fd67b
KH
281 else
282 value = Fdelete_char (make_number (-XINT (n)), killflag);
aa970069
RS
283
284 return value;
cd645247
JB
285}
286
287DEFUN ("self-insert-command", Fself_insert_command, Sself_insert_command, 1, 1, "p",
288 "Insert the character you type.\n\
289Whichever character you type to run this command is inserted.")
72d5f589
EN
290 (n)
291 Lisp_Object n;
cd645247 292{
a22ca1e0
RS
293 int character = XINT (last_command_char);
294
72d5f589 295 CHECK_NUMBER (n, 0);
cd645247
JB
296
297 /* Barf if the key that invoked this was not a character. */
ed76f667 298 if (!INTEGERP (last_command_char))
cd645247 299 bitch_at_user ();
72d5f589 300 else if (XINT (n) >= 2 && NILP (current_buffer->overwrite_mode))
2718dfa4 301 {
a22ca1e0
RS
302 int modified_char = character;
303 /* Add the offset to the character, for Finsert_char.
304 We pass internal_self_insert the unmodified character
305 because it itself does this offsetting. */
49bc32b0
RS
306 if (! NILP (current_buffer->enable_multibyte_characters))
307 modified_char = unibyte_char_to_multibyte (modified_char);
a22ca1e0 308
72d5f589 309 XSETFASTINT (n, XFASTINT (n) - 2);
2718dfa4 310 /* The first one might want to expand an abbrev. */
a22ca1e0 311 internal_self_insert (character, 1);
2718dfa4
RS
312 /* The bulk of the copies of this char can be inserted simply.
313 We don't have to handle a user-specified face specially
314 because it will get inherited from the first char inserted. */
a22ca1e0 315 Finsert_char (make_number (modified_char), n, Qt);
2718dfa4 316 /* The last one might want to auto-fill. */
a22ca1e0 317 internal_self_insert (character, 0);
2718dfa4 318 }
cd645247 319 else
72d5f589 320 while (XINT (n) > 0)
cd645247 321 {
f58dd69b 322 /* Ok since old and new vals both nonneg */
72d5f589 323 XSETFASTINT (n, XFASTINT (n) - 1);
a22ca1e0 324 internal_self_insert (character, XFASTINT (n) != 0);
cd645247
JB
325 }
326
327 return Qnil;
328}
329
9e4fd67b 330/* Insert character C. If NOAUTOFILL is nonzero, don't do autofill
4c6e656f
RS
331 even if it is enabled.
332
333 If this insertion is suitable for direct output (completely simple),
aa52fef9
RS
334 return 0. A value of 1 indicates this *might* not have been simple.
335 A value of 2 means this did things that call for an undo boundary. */
4c6e656f 336
dfcf069d 337int
9e4fd67b
KH
338internal_self_insert (c, noautofill)
339 int c;
cd645247
JB
340 int noautofill;
341{
342 extern Lisp_Object Fexpand_abbrev ();
343 int hairy = 0;
344 Lisp_Object tem;
345 register enum syntaxcode synt;
e744155a 346 Lisp_Object overwrite, string;
9e4fd67b
KH
347 /* Length of multi-byte form of C. */
348 int len;
349 /* Working buffer and pointer for multi-byte form of C. */
350 unsigned char workbuf[4], *str;
049749e6 351 int chars_to_delete = 0;
e744155a 352 int spaces_to_insert = 0;
cd645247 353
e7aacab7 354 overwrite = current_buffer->overwrite_mode;
166a4263
RS
355 if (!NILP (Vbefore_change_function) || !NILP (Vafter_change_function)
356 || !NILP (Vbefore_change_functions) || !NILP (Vafter_change_functions))
cd645247
JB
357 hairy = 1;
358
9e4fd67b
KH
359 /* At first, get multi-byte form of C in STR. */
360 if (!NILP (current_buffer->enable_multibyte_characters))
b9859007
KH
361 {
362 c = unibyte_char_to_multibyte (c);
363 len = CHAR_STRING (c, workbuf, str);
741263c2
KH
364 if (len == 1)
365 /* If C has modifier bits, this makes C an appropriate
366 one-byte char. */
367 c = *str;
b9859007 368 }
9e4fd67b 369 else
38b62842
KH
370 {
371 workbuf[0] = (SINGLE_BYTE_CHAR_P (c)
372 ? c
373 : multibyte_char_to_unibyte (c, Qnil));
374 str = workbuf;
375 len = 1;
376 }
6bbb0d4a 377 if (!NILP (overwrite)
9e4fd67b 378 && PT < ZV)
cd645247 379 {
9e4fd67b
KH
380 /* In overwrite-mode, we substitute a character at point (C2,
381 hereafter) by C. For that, we delete C2 in advance. But,
382 just substituting C2 by C may move a remaining text in the
383 line to the right or to the left, which is not preferable.
384 So we insert more spaces or delete more characters in the
385 following cases: if C is narrower than C2, after deleting C2,
386 we fill columns with spaces, if C is wider than C2, we delete
387 C2 and several characters following C2. */
388
216b9443
RS
389 /* This is the character after point. */
390 int c2 = FETCH_CHAR (PT_BYTE);
391
392 /* Column the cursor should be placed at after this insertion.
9e4fd67b
KH
393 The correct value should be calculated only when necessary. */
394 int target_clm = 0;
395
37c0ed09
RS
396 /* Overwriting in binary-mode always replaces C2 by C.
397 Overwriting in textual-mode doesn't always do that.
398 It inserts newlines in the usual way,
399 and inserts any character at end of line
400 or before a tab if it doesn't use the whole width of the tab. */
9e4fd67b
KH
401 if (EQ (overwrite, Qoverwrite_mode_binary)
402 || (c != '\n'
403 && c2 != '\n'
37c0ed09
RS
404 && ! (c2 == '\t'
405 && XINT (current_buffer->tab_width) > 0
406 && XFASTINT (current_buffer->tab_width) < 20
216b9443 407 && (target_clm = (current_column ()
06d74a65 408 + XINT (Fchar_width (make_number (c)))),
37c0ed09 409 target_clm % XFASTINT (current_buffer->tab_width)))))
9e4fd67b 410 {
e744155a 411 int pos = PT;
049749e6 412 int pos_byte = PT_BYTE;
e744155a 413
9e4fd67b 414 if (target_clm == 0)
049749e6 415 chars_to_delete = 1;
9e4fd67b
KH
416 else
417 {
9e4fd67b
KH
418 /* The actual cursor position after the trial of moving
419 to column TARGET_CLM. It is greater than TARGET_CLM
420 if the TARGET_CLM is middle of multi-column
421 character. In that case, the new point is set after
422 that character. */
cac55749
RS
423 int actual_clm
424 = XFASTINT (Fmove_to_column (make_number (target_clm), Qnil));
9e4fd67b 425
049749e6 426 chars_to_delete = PT - pos;
e744155a 427
9e4fd67b
KH
428 if (actual_clm > target_clm)
429 {
e744155a 430 /* We will delete too many columns. Let's fill columns
9e4fd67b 431 by spaces so that the remaining text won't move. */
e744155a 432 spaces_to_insert = actual_clm - target_clm;
9e4fd67b
KH
433 }
434 }
049749e6 435 SET_PT_BOTH (pos, pos_byte);
9e4fd67b
KH
436 hairy = 2;
437 }
aa52fef9 438 hairy = 2;
cd645247 439 }
265a9e55 440 if (!NILP (current_buffer->abbrev_mode)
cd645247 441 && SYNTAX (c) != Sword
265a9e55 442 && NILP (current_buffer->read_only)
9e4fd67b 443 && PT > BEGV && SYNTAX (XFASTINT (Fprevious_char ())) == Sword)
cd645247 444 {
ee8caabb 445 int modiff = MODIFF;
e57640c0
RS
446 Lisp_Object sym;
447
448 sym = Fexpand_abbrev ();
449
450 /* If we expanded an abbrev which has only a hook,
9317a902 451 and the hook has a non-nil `no-self-insert' property,
e57640c0 452 return right away--don't really self-insert. */
9317a902
RS
453 if (! NILP (sym) && ! NILP (XSYMBOL (sym)->function)
454 && SYMBOLP (XSYMBOL (sym)->function))
e57640c0
RS
455 {
456 Lisp_Object prop;
9317a902 457 prop = Fget (XSYMBOL (sym)->function, intern ("no-self-insert"));
e57640c0 458 if (! NILP (prop))
6787d111 459 return 1;
e57640c0
RS
460 }
461
ee8caabb 462 if (MODIFF != modiff)
aa52fef9 463 hairy = 2;
cd645247 464 }
e744155a 465
049749e6 466 if (chars_to_delete)
e744155a 467 {
f34206b4 468 string = make_string_from_bytes (str, 1, len);
e744155a
RS
469 if (spaces_to_insert)
470 {
471 tem = Fmake_string (make_number (spaces_to_insert),
472 make_number (' '));
473 string = concat2 (tem, string);
474 }
475
5f65b1b4 476 replace_range (PT, PT + chars_to_delete, string, 1, 1, 1);
1bf95511 477 Fforward_char (make_number (1 + spaces_to_insert));
e744155a
RS
478 }
479 else
480 insert_and_inherit (str, len);
481
01428933
KH
482 if ((CHAR_TABLE_P (Vauto_fill_chars)
483 ? !NILP (CHAR_TABLE_REF (Vauto_fill_chars, c))
484 : (c == ' ' || c == '\n'))
cd645247 485 && !noautofill
3de15b7a 486 && !NILP (current_buffer->auto_fill_function))
cd645247 487 {
76bb6dbb
KH
488 Lisp_Object tem;
489
9e4fd67b 490 if (c == '\n')
049749e6
RS
491 /* After inserting a newline, move to previous line and fill
492 that. Must have the newline in place already so filling and
493 justification, if any, know where the end is going to be. */
494 SET_PT_BOTH (PT - 1, PT_BYTE - 1);
76bb6dbb 495 tem = call0 (current_buffer->auto_fill_function);
9e4fd67b 496 if (c == '\n')
049749e6 497 SET_PT_BOTH (PT + 1, PT_BYTE + 1);
76bb6dbb
KH
498 if (!NILP (tem))
499 hairy = 2;
cd645247 500 }
189fad68 501
38d404db 502#ifdef HAVE_FACES
189fad68
RS
503 /* If previous command specified a face to use, use it. */
504 if (!NILP (Vself_insert_face)
346e0c2d 505 && EQ (current_kboard->Vlast_command, Vself_insert_face_command))
189fad68 506 {
049749e6
RS
507 Fput_text_property (make_number (PT - 1), make_number (PT),
508 Qface, Vself_insert_face, Qnil);
189fad68
RS
509 Vself_insert_face = Qnil;
510 }
38d404db 511#endif
e744155a 512
cd645247
JB
513 synt = SYNTAX (c);
514 if ((synt == Sclose || synt == Smath)
2718dfa4
RS
515 && !NILP (Vblink_paren_function) && INTERACTIVE
516 && !noautofill)
cd645247
JB
517 {
518 call0 (Vblink_paren_function);
aa52fef9 519 hairy = 2;
cd645247
JB
520 }
521 return hairy;
522}
523\f
524/* module initialization */
525
dfcf069d 526void
cd645247
JB
527syms_of_cmds ()
528{
529 Qkill_backward_chars = intern ("kill-backward-chars");
530 staticpro (&Qkill_backward_chars);
531
532 Qkill_forward_chars = intern ("kill-forward-chars");
533 staticpro (&Qkill_forward_chars);
534
6bbb0d4a
JB
535 Qoverwrite_mode_binary = intern ("overwrite-mode-binary");
536 staticpro (&Qoverwrite_mode_binary);
e686c647 537
189fad68
RS
538 DEFVAR_LISP ("self-insert-face", &Vself_insert_face,
539 "If non-nil, set the face of the next self-inserting character to this.\n\
540See also `self-insert-face-command'.");
541 Vself_insert_face = Qnil;
542
543 DEFVAR_LISP ("self-insert-face-command", &Vself_insert_face_command,
544 "This is the command that set up `self-insert-face'.\n\
545If `last-command' does not equal this value, we ignore `self-insert-face'.");
546 Vself_insert_face_command = Qnil;
547
cd645247
JB
548 DEFVAR_LISP ("blink-paren-function", &Vblink_paren_function,
549 "Function called, if non-nil, whenever a close parenthesis is inserted.\n\
550More precisely, a char with closeparen syntax is self-inserted.");
551 Vblink_paren_function = Qnil;
552
9e4fd67b 553 defsubr (&Sforward_point);
cd645247
JB
554 defsubr (&Sforward_char);
555 defsubr (&Sbackward_char);
556 defsubr (&Sforward_line);
557 defsubr (&Sbeginning_of_line);
558 defsubr (&Send_of_line);
559
560 defsubr (&Sdelete_char);
561 defsubr (&Sdelete_backward_char);
562
563 defsubr (&Sself_insert_command);
cd645247
JB
564}
565
dfcf069d 566void
cd645247
JB
567keys_of_cmds ()
568{
569 int n;
570
cbf65115 571 initial_define_key (global_map, Ctl ('I'), "self-insert-command");
cd645247
JB
572 for (n = 040; n < 0177; n++)
573 initial_define_key (global_map, n, "self-insert-command");
cf9cdc11
RS
574#ifdef MSDOS
575 for (n = 0200; n < 0240; n++)
576 initial_define_key (global_map, n, "self-insert-command");
577#endif
94748cb9 578 for (n = 0240; n < 0400; n++)
eb46da6a 579 initial_define_key (global_map, n, "self-insert-command");
cd645247
JB
580
581 initial_define_key (global_map, Ctl ('A'), "beginning-of-line");
582 initial_define_key (global_map, Ctl ('B'), "backward-char");
583 initial_define_key (global_map, Ctl ('D'), "delete-char");
584 initial_define_key (global_map, Ctl ('E'), "end-of-line");
585 initial_define_key (global_map, Ctl ('F'), "forward-char");
586 initial_define_key (global_map, 0177, "delete-backward-char");
587}