(obj): Add character.o and chartab.o.
[bpt/emacs.git] / src / cmds.c
CommitLineData
cd645247 1/* Simple built-in editing commands.
8abc9869 2 Copyright (C) 1985, 93, 94, 95, 96, 97, 1998, 2001 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 46DEFUN ("forward-point", Fforward_point, Sforward_point, 1, 1, 0,
335c5470
PJ
47 doc: /* Return buffer position N characters after (before if N negative) point. */)
48 (n)
9e4fd67b
KH
49 Lisp_Object n;
50{
b7826503 51 CHECK_NUMBER (n);
9e4fd67b 52
049749e6 53 return make_number (PT + XINT (n));
9e4fd67b
KH
54}
55
cd645247 56DEFUN ("forward-char", Fforward_char, Sforward_char, 0, 1, "p",
335c5470
PJ
57 doc: /* Move point right N characters (left if N is negative).
58On reaching end of buffer, stop and signal error. */)
59 (n)
72d5f589 60 Lisp_Object n;
cd645247 61{
72d5f589
EN
62 if (NILP (n))
63 XSETFASTINT (n, 1);
cd645247 64 else
b7826503 65 CHECK_NUMBER (n);
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",
335c5470
PJ
93 doc: /* Move point left N characters (right if N is negative).
94On attempt to pass beginning or end of buffer, stop and signal error. */)
95 (n)
72d5f589 96 Lisp_Object n;
cd645247 97{
72d5f589
EN
98 if (NILP (n))
99 XSETFASTINT (n, 1);
cd645247 100 else
b7826503 101 CHECK_NUMBER (n);
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",
335c5470
PJ
108 doc: /* Move N lines forward (backward if N is negative).
109Precisely, if point is on line I, move to the start of line I + N.
110If there isn't room, go as far as possible (no error).
111Returns the count of lines left to move. If moving forward,
112that is N - number of lines moved; if backward, N + number moved.
113With positive N, a non-empty line at the end counts as one line
114 successfully moved (for the return value). */)
115 (n)
cd645247
JB
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 {
b7826503 126 CHECK_NUMBER (n);
cd645247
JB
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
8abc9869
MB
153DEFUN ("beginning-of-line", Fbeginning_of_line, Sbeginning_of_line, 0, 1, "p",
154 doc: /* Move point to beginning of current line.
155With argument N not nil or 1, move forward N - 1 lines first.
156If point reaches the beginning or end of buffer, it stops there.
157
158This command does not move point across a field boundary unless doing so
159would move beyond there to a different line; If N is nil or 1, and point
160starts at a field boundary, point does not move. To ignore field
161boundaries, either bind `inhibit-field-text-motion' to t, or use the
162`forward-line' function instead. For instance, `(forward-line 0)' does
163the same thing as `(beginning-of-line)', except that it ignores field
164boundaries. */)
165 (n)
cd645247
JB
166 Lisp_Object n;
167{
265a9e55 168 if (NILP (n))
48c7cef2 169 XSETFASTINT (n, 1);
cd645247 170 else
b7826503 171 CHECK_NUMBER (n);
cd645247 172
0aee588d 173 SET_PT (XINT (Fline_beginning_position (n)));
4f13cc99 174
cd645247
JB
175 return Qnil;
176}
177
8abc9869
MB
178DEFUN ("end-of-line", Fend_of_line, Send_of_line, 0, 1, "p",
179 doc: /* Move point to end of current line.
180With argument N not nil or 1, move forward N - 1 lines first.
181If point reaches the beginning or end of buffer, it stops there.
182
183This command does not move point across a field boundary unless doing so
184would move beyond there to a different line; if N is nil or 1, and
185point starts at a field boundary, point does not move. To ignore field
186boundaries bind `inhibit-field-text-motion' to t. */)
187 (n)
cd645247
JB
188 Lisp_Object n;
189{
265a9e55 190 if (NILP (n))
48c7cef2 191 XSETFASTINT (n, 1);
cd645247 192 else
b7826503 193 CHECK_NUMBER (n);
cd645247 194
38b294ca 195 SET_PT (XINT (Fline_end_position (n)));
cd645247
JB
196
197 return Qnil;
198}
199
200DEFUN ("delete-char", Fdelete_char, Sdelete_char, 1, 2, "p\nP",
335c5470
PJ
201 doc: /* Delete the following N characters (previous if N is negative).
202Optional second arg KILLFLAG non-nil means kill instead (save in kill ring).
203Interactively, N is the prefix arg, and KILLFLAG is set if
204N was explicitly specified. */)
205 (n, killflag)
cd645247
JB
206 Lisp_Object n, killflag;
207{
9e4fd67b
KH
208 int pos;
209
b7826503 210 CHECK_NUMBER (n);
cd645247 211
049749e6 212 pos = PT + XINT (n);
265a9e55 213 if (NILP (killflag))
cd645247
JB
214 {
215 if (XINT (n) < 0)
216 {
9e4fd67b 217 if (pos < BEGV)
cd645247
JB
218 Fsignal (Qbeginning_of_buffer, Qnil);
219 else
9e4fd67b 220 del_range (pos, PT);
cd645247
JB
221 }
222 else
223 {
9e4fd67b 224 if (pos > ZV)
cd645247
JB
225 Fsignal (Qend_of_buffer, Qnil);
226 else
9e4fd67b 227 del_range (PT, pos);
cd645247
JB
228 }
229 }
230 else
231 {
232 call1 (Qkill_forward_chars, n);
233 }
234 return Qnil;
235}
236
237DEFUN ("delete-backward-char", Fdelete_backward_char, Sdelete_backward_char,
335c5470
PJ
238 1, 2, "p\nP",
239 doc: /* Delete the previous N characters (following if N is negative).
240Optional second arg KILLFLAG non-nil means kill instead (save in kill ring).
241Interactively, N is the prefix arg, and KILLFLAG is set if
242N was explicitly specified. */)
243 (n, killflag)
cd645247
JB
244 Lisp_Object n, killflag;
245{
aa970069 246 Lisp_Object value;
7c983171 247 int deleted_special = 0;
ceb7e4f8 248 int pos, pos_byte, i;
aa970069 249
b7826503 250 CHECK_NUMBER (n);
aa970069 251
7c983171 252 /* See if we are about to delete a tab or newline backwards. */
ceb7e4f8
KH
253 pos = PT;
254 pos_byte = PT_BYTE;
255 for (i = 0; i < XINT (n) && pos_byte > BEGV_BYTE; i++)
aa970069 256 {
9e4fd67b
KH
257 int c;
258
ceb7e4f8
KH
259 DEC_BOTH (pos, pos_byte);
260 c = FETCH_BYTE (pos_byte);
9e4fd67b 261 if (c == '\t' || c == '\n')
aa970069 262 {
7c983171 263 deleted_special = 1;
aa970069
RS
264 break;
265 }
266 }
267
aa970069
RS
268 /* In overwrite mode, back over columns while clearing them out,
269 unless at end of line. */
270 if (XINT (n) > 0
271 && ! NILP (current_buffer->overwrite_mode)
7c983171 272 && ! deleted_special
049749e6 273 && ! (PT == ZV || FETCH_BYTE (PT_BYTE) == '\n'))
aa970069 274 {
9e4fd67b
KH
275 int column = current_column ();
276
277 value = Fdelete_char (make_number (-XINT (n)), killflag);
278 i = column - current_column ();
cac55749 279 Finsert_char (make_number (' '), make_number (i), Qnil);
049749e6
RS
280 /* Whitespace chars are ASCII chars, so we can simply subtract. */
281 SET_PT_BOTH (PT - i, PT_BYTE - i);
aa970069 282 }
9e4fd67b
KH
283 else
284 value = Fdelete_char (make_number (-XINT (n)), killflag);
aa970069
RS
285
286 return value;
cd645247
JB
287}
288
289DEFUN ("self-insert-command", Fself_insert_command, Sself_insert_command, 1, 1, "p",
335c5470
PJ
290 doc: /* Insert the character you type.
291Whichever character you type to run this command is inserted. */)
292 (n)
72d5f589 293 Lisp_Object n;
cd645247 294{
a22ca1e0
RS
295 int character = XINT (last_command_char);
296
b7826503 297 CHECK_NUMBER (n);
cd645247
JB
298
299 /* Barf if the key that invoked this was not a character. */
ed76f667 300 if (!INTEGERP (last_command_char))
cd645247 301 bitch_at_user ();
72d5f589 302 else if (XINT (n) >= 2 && NILP (current_buffer->overwrite_mode))
2718dfa4 303 {
a22ca1e0
RS
304 int modified_char = character;
305 /* Add the offset to the character, for Finsert_char.
306 We pass internal_self_insert the unmodified character
307 because it itself does this offsetting. */
49bc32b0
RS
308 if (! NILP (current_buffer->enable_multibyte_characters))
309 modified_char = unibyte_char_to_multibyte (modified_char);
a22ca1e0 310
72d5f589 311 XSETFASTINT (n, XFASTINT (n) - 2);
2718dfa4 312 /* The first one might want to expand an abbrev. */
a22ca1e0 313 internal_self_insert (character, 1);
2718dfa4
RS
314 /* The bulk of the copies of this char can be inserted simply.
315 We don't have to handle a user-specified face specially
316 because it will get inherited from the first char inserted. */
a22ca1e0 317 Finsert_char (make_number (modified_char), n, Qt);
2718dfa4 318 /* The last one might want to auto-fill. */
a22ca1e0 319 internal_self_insert (character, 0);
2718dfa4 320 }
cd645247 321 else
72d5f589 322 while (XINT (n) > 0)
cd645247 323 {
f58dd69b 324 /* Ok since old and new vals both nonneg */
72d5f589 325 XSETFASTINT (n, XFASTINT (n) - 1);
a22ca1e0 326 internal_self_insert (character, XFASTINT (n) != 0);
cd645247
JB
327 }
328
329 return Qnil;
330}
331
9e4fd67b 332/* Insert character C. If NOAUTOFILL is nonzero, don't do autofill
4c6e656f
RS
333 even if it is enabled.
334
335 If this insertion is suitable for direct output (completely simple),
aa52fef9
RS
336 return 0. A value of 1 indicates this *might* not have been simple.
337 A value of 2 means this did things that call for an undo boundary. */
4c6e656f 338
dfcf069d 339int
9e4fd67b
KH
340internal_self_insert (c, noautofill)
341 int c;
cd645247
JB
342 int noautofill;
343{
344 extern Lisp_Object Fexpand_abbrev ();
345 int hairy = 0;
346 Lisp_Object tem;
347 register enum syntaxcode synt;
e744155a 348 Lisp_Object overwrite, string;
9e4fd67b
KH
349 /* Length of multi-byte form of C. */
350 int len;
351 /* Working buffer and pointer for multi-byte form of C. */
e55d9cfd 352 unsigned char str[MAX_MULTIBYTE_LENGTH];
049749e6 353 int chars_to_delete = 0;
e744155a 354 int spaces_to_insert = 0;
cd645247 355
e7aacab7 356 overwrite = current_buffer->overwrite_mode;
ad44dffe 357 if (!NILP (Vbefore_change_functions) || !NILP (Vafter_change_functions))
cd645247
JB
358 hairy = 1;
359
9e4fd67b
KH
360 /* At first, get multi-byte form of C in STR. */
361 if (!NILP (current_buffer->enable_multibyte_characters))
b9859007
KH
362 {
363 c = unibyte_char_to_multibyte (c);
e55d9cfd 364 len = CHAR_STRING (c, str);
741263c2
KH
365 if (len == 1)
366 /* If C has modifier bits, this makes C an appropriate
367 one-byte char. */
368 c = *str;
b9859007 369 }
9e4fd67b 370 else
38b62842 371 {
e55d9cfd
KH
372 str[0] = (SINGLE_BYTE_CHAR_P (c)
373 ? c
374 : multibyte_char_to_unibyte (c, Qnil));
38b62842
KH
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
c87dbfd0 450 /* If we expanded an abbrev which has 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
RS
501
502 /* If previous command specified a face to use, use it. */
503 if (!NILP (Vself_insert_face)
346e0c2d 504 && EQ (current_kboard->Vlast_command, Vself_insert_face_command))
189fad68 505 {
049749e6
RS
506 Fput_text_property (make_number (PT - 1), make_number (PT),
507 Qface, Vself_insert_face, Qnil);
189fad68
RS
508 Vself_insert_face = Qnil;
509 }
e744155a 510
cd645247
JB
511 synt = SYNTAX (c);
512 if ((synt == Sclose || synt == Smath)
2718dfa4
RS
513 && !NILP (Vblink_paren_function) && INTERACTIVE
514 && !noautofill)
cd645247
JB
515 {
516 call0 (Vblink_paren_function);
aa52fef9 517 hairy = 2;
cd645247
JB
518 }
519 return hairy;
520}
521\f
522/* module initialization */
523
dfcf069d 524void
cd645247
JB
525syms_of_cmds ()
526{
527 Qkill_backward_chars = intern ("kill-backward-chars");
528 staticpro (&Qkill_backward_chars);
529
530 Qkill_forward_chars = intern ("kill-forward-chars");
531 staticpro (&Qkill_forward_chars);
532
6bbb0d4a
JB
533 Qoverwrite_mode_binary = intern ("overwrite-mode-binary");
534 staticpro (&Qoverwrite_mode_binary);
e686c647 535
189fad68 536 DEFVAR_LISP ("self-insert-face", &Vself_insert_face,
335c5470
PJ
537 doc: /* If non-nil, set the face of the next self-inserting character to this.
538See also `self-insert-face-command'. */);
189fad68
RS
539 Vself_insert_face = Qnil;
540
541 DEFVAR_LISP ("self-insert-face-command", &Vself_insert_face_command,
335c5470
PJ
542 doc: /* This is the command that set up `self-insert-face'.
543If `last-command' does not equal this value, we ignore `self-insert-face'. */);
189fad68
RS
544 Vself_insert_face_command = Qnil;
545
cd645247 546 DEFVAR_LISP ("blink-paren-function", &Vblink_paren_function,
335c5470
PJ
547 doc: /* Function called, if non-nil, whenever a close parenthesis is inserted.
548More precisely, a char with closeparen syntax is self-inserted. */);
cd645247
JB
549 Vblink_paren_function = Qnil;
550
9e4fd67b 551 defsubr (&Sforward_point);
cd645247
JB
552 defsubr (&Sforward_char);
553 defsubr (&Sbackward_char);
554 defsubr (&Sforward_line);
555 defsubr (&Sbeginning_of_line);
556 defsubr (&Send_of_line);
557
558 defsubr (&Sdelete_char);
559 defsubr (&Sdelete_backward_char);
560
561 defsubr (&Sself_insert_command);
cd645247
JB
562}
563
dfcf069d 564void
cd645247
JB
565keys_of_cmds ()
566{
567 int n;
568
cbf65115 569 initial_define_key (global_map, Ctl ('I'), "self-insert-command");
cd645247
JB
570 for (n = 040; n < 0177; n++)
571 initial_define_key (global_map, n, "self-insert-command");
cf9cdc11
RS
572#ifdef MSDOS
573 for (n = 0200; n < 0240; n++)
574 initial_define_key (global_map, n, "self-insert-command");
575#endif
94748cb9 576 for (n = 0240; n < 0400; n++)
eb46da6a 577 initial_define_key (global_map, n, "self-insert-command");
cd645247
JB
578
579 initial_define_key (global_map, Ctl ('A'), "beginning-of-line");
580 initial_define_key (global_map, Ctl ('B'), "backward-char");
581 initial_define_key (global_map, Ctl ('D'), "delete-char");
582 initial_define_key (global_map, Ctl ('E'), "end-of-line");
583 initial_define_key (global_map, Ctl ('F'), "forward-char");
584 initial_define_key (global_map, 0177, "delete-backward-char");
585}