use guile subrs
[bpt/emacs.git] / src / cmds.c
CommitLineData
cd645247 1/* Simple built-in editing commands.
95df8112 2
ba318903 3Copyright (C) 1985, 1993-1998, 2001-2014 Free Software Foundation, Inc.
cd645247
JB
4
5This file is part of GNU Emacs.
6
9ec0b715 7GNU Emacs is free software: you can redistribute it and/or modify
cd645247 8it under the terms of the GNU General Public License as published by
9ec0b715
GM
9the Free Software Foundation, either version 3 of the License, or
10(at your option) any later version.
cd645247
JB
11
12GNU Emacs is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
9ec0b715 18along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
cd645247
JB
19
20
18160b98 21#include <config.h>
0328b6de 22
cd645247
JB
23#include "lisp.h"
24#include "commands.h"
83be827a 25#include "character.h"
e5560ff7 26#include "buffer.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"
2cc7b62f 32#include "frame.h"
cd645247 33
955cbe7b 34static Lisp_Object Qkill_forward_chars, Qkill_backward_chars;
cd645247 35
6bbb0d4a 36/* A possible value for a buffer's overwrite-mode variable. */
955cbe7b 37static Lisp_Object Qoverwrite_mode_binary;
6bbb0d4a 38
ace1712c 39static int internal_self_insert (int, EMACS_INT);
cd645247 40\f
9e4fd67b 41DEFUN ("forward-point", Fforward_point, Sforward_point, 1, 1, 0,
335c5470 42 doc: /* Return buffer position N characters after (before if N negative) point. */)
5842a27b 43 (Lisp_Object n)
9e4fd67b 44{
b7826503 45 CHECK_NUMBER (n);
9e4fd67b 46
049749e6 47 return make_number (PT + XINT (n));
9e4fd67b
KH
48}
49
f10fe38f 50/* Add N to point; or subtract N if FORWARD is false. N defaults to 1.
d311d28c
PE
51 Validate the new location. Return nil. */
52static Lisp_Object
f10fe38f 53move_point (Lisp_Object n, bool forward)
d311d28c
PE
54{
55 /* This used to just set point to point + XINT (n), and then check
56 to see if it was within boundaries. But now that SET_PT can
57 potentially do a lot of stuff (calling entering and exiting
58 hooks, etcetera), that's not a good approach. So we validate the
59 proposed position, then set point. */
60
61 EMACS_INT new_point;
62
63 if (NILP (n))
64 XSETFASTINT (n, 1);
65 else
66 CHECK_NUMBER (n);
67
68 new_point = PT + (forward ? XINT (n) : - XINT (n));
69
70 if (new_point < BEGV)
71 {
72 SET_PT (BEGV);
73 xsignal0 (Qbeginning_of_buffer);
74 }
75 if (new_point > ZV)
76 {
77 SET_PT (ZV);
78 xsignal0 (Qend_of_buffer);
79 }
80
81 SET_PT (new_point);
82 return Qnil;
83}
84
a7ca3326 85DEFUN ("forward-char", Fforward_char, Sforward_char, 0, 1, "^p",
d20e1419
EZ
86 doc: /* Move point N characters forward (backward if N is negative).
87On reaching end or beginning of buffer, stop and signal error.
c88b867f 88Interactively, N is the numeric prefix argument.
956720af 89If N is omitted or nil, move point 1 character forward.
d20e1419
EZ
90
91Depending on the bidirectional context, the movement may be to the
92right or to the left on the screen. This is in contrast with
5220357f 93\\[right-char], which see. */)
5842a27b 94 (Lisp_Object n)
cd645247 95{
d311d28c 96 return move_point (n, 1);
cd645247
JB
97}
98
9ae750f0 99DEFUN ("backward-char", Fbackward_char, Sbackward_char, 0, 1, "^p",
d20e1419
EZ
100 doc: /* Move point N characters backward (forward if N is negative).
101On attempt to pass beginning or end of buffer, stop and signal error.
c88b867f 102Interactively, N is the numeric prefix argument.
956720af 103If N is omitted or nil, move point 1 character backward.
d20e1419
EZ
104
105Depending on the bidirectional context, the movement may be to the
106right or to the left on the screen. This is in contrast with
5220357f 107\\[left-char], which see. */)
5842a27b 108 (Lisp_Object n)
cd645247 109{
d311d28c 110 return move_point (n, 0);
cd645247
JB
111}
112
a7ca3326 113DEFUN ("forward-line", Fforward_line, Sforward_line, 0, 1, "^p",
335c5470 114 doc: /* Move N lines forward (backward if N is negative).
cd21226d
EZ
115Precisely, if point is on line I, move to the start of line I + N
116\("start of line" in the logical order).
335c5470
PJ
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{
d2b36813 124 ptrdiff_t opoint = PT, pos, pos_byte, shortage, count;
cd645247 125
265a9e55 126 if (NILP (n))
cd645247
JB
127 count = 1;
128 else
129 {
b7826503 130 CHECK_NUMBER (n);
cd645247
JB
131 count = XINT (n);
132 }
133
049749e6 134 if (count <= 0)
d2b36813
DA
135 pos = find_newline (PT, PT_BYTE, BEGV, BEGV_BYTE, count - 1,
136 &shortage, &pos_byte, 1);
049749e6 137 else
d2b36813
DA
138 pos = find_newline (PT, PT_BYTE, ZV, ZV_BYTE, count,
139 &shortage, &pos_byte, 1);
140
049749e6
RS
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
9ae750f0 153DEFUN ("beginning-of-line", Fbeginning_of_line, Sbeginning_of_line, 0, 1, "^p",
cd21226d 154 doc: /* Move point to beginning of current line (in the logical order).
8abc9869
MB
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
13c42cc5 158This function constrains point to the current field unless this moves
5220357f
JB
159point to a different line than the original, unconstrained result.
160If N is nil or 1, and a front-sticky field starts at point, the point
13c42cc5 161does not move. To ignore field boundaries bind
27806b20
KL
162`inhibit-field-text-motion' to t, or use the `forward-line' function
163instead. For instance, `(forward-line 0)' does the same thing as
164`(beginning-of-line)', except that it ignores field boundaries. */)
5842a27b 165 (Lisp_Object n)
cd645247 166{
265a9e55 167 if (NILP (n))
48c7cef2 168 XSETFASTINT (n, 1);
cd645247 169 else
b7826503 170 CHECK_NUMBER (n);
cd645247 171
0aee588d 172 SET_PT (XINT (Fline_beginning_position (n)));
a731cae2 173
cd645247
JB
174 return Qnil;
175}
176
a7ca3326 177DEFUN ("end-of-line", Fend_of_line, Send_of_line, 0, 1, "^p",
cd21226d 178 doc: /* Move point to end of current line (in the logical order).
8abc9869
MB
179With argument N not nil or 1, move forward N - 1 lines first.
180If point reaches the beginning or end of buffer, it stops there.
6b61353c 181To ignore intangibility, bind `inhibit-point-motion-hooks' to t.
8abc9869 182
13c42cc5
KL
183This function constrains point to the current field unless this moves
184point to a different line than the original, unconstrained result. If
185N is nil or 1, and a rear-sticky field ends at point, the point does
186not move. To ignore field boundaries bind `inhibit-field-text-motion'
187to t. */)
5842a27b 188 (Lisp_Object n)
cd645247 189{
d311d28c 190 ptrdiff_t newpos;
fda3de70 191
265a9e55 192 if (NILP (n))
48c7cef2 193 XSETFASTINT (n, 1);
cd645247 194 else
b7826503 195 CHECK_NUMBER (n);
cd645247 196
fda3de70
RS
197 while (1)
198 {
199 newpos = XINT (Fline_end_position (n));
200 SET_PT (newpos);
201
202 if (PT > newpos
203 && FETCH_CHAR (PT - 1) == '\n')
204 {
205 /* If we skipped over a newline that follows
206 an invisible intangible run,
207 move back to the last tangible position
208 within the line. */
209
210 SET_PT (PT - 1);
211 break;
212 }
213 else if (PT > newpos && PT < ZV
214 && FETCH_CHAR (PT) != '\n')
215 /* If we skipped something intangible
216 and now we're not really at eol,
217 keep going. */
218 n = make_number (1);
219 else
220 break;
221 }
cd645247
JB
222
223 return Qnil;
224}
225
226DEFUN ("delete-char", Fdelete_char, Sdelete_char, 1, 2, "p\nP",
335c5470
PJ
227 doc: /* Delete the following N characters (previous if N is negative).
228Optional second arg KILLFLAG non-nil means kill instead (save in kill ring).
229Interactively, N is the prefix arg, and KILLFLAG is set if
b9229673
CY
230N was explicitly specified.
231
5b87d0d9
MN
232The command `delete-forward-char' is preferable for interactive use, e.g.
233because it respects values of `delete-active-region' and `overwrite-mode'. */)
5842a27b 234 (Lisp_Object n, Lisp_Object killflag)
cd645247 235{
40283062 236 EMACS_INT pos;
9e4fd67b 237
b7826503 238 CHECK_NUMBER (n);
cd645247 239
049749e6 240 pos = PT + XINT (n);
265a9e55 241 if (NILP (killflag))
cd645247
JB
242 {
243 if (XINT (n) < 0)
244 {
9e4fd67b 245 if (pos < BEGV)
aaf769f1 246 xsignal0 (Qbeginning_of_buffer);
cd645247 247 else
9e4fd67b 248 del_range (pos, PT);
cd645247
JB
249 }
250 else
251 {
9e4fd67b 252 if (pos > ZV)
aaf769f1 253 xsignal0 (Qend_of_buffer);
cd645247 254 else
9e4fd67b 255 del_range (PT, pos);
cd645247
JB
256 }
257 }
258 else
259 {
260 call1 (Qkill_forward_chars, n);
261 }
262 return Qnil;
263}
264
855a0da7 265static int nonundocount;
1ac9108a 266
867d5263
DL
267/* Note that there's code in command_loop_1 which typically avoids
268 calling this. */
cd645247 269DEFUN ("self-insert-command", Fself_insert_command, Sself_insert_command, 1, 1, "p",
335c5470 270 doc: /* Insert the character you type.
1ac9108a 271Whichever character you type to run this command is inserted.
c838bca9 272The numeric prefix argument N says how many times to repeat the insertion.
1ac9108a
SM
273Before insertion, `expand-abbrev' is executed if the inserted character does
274not have word syntax and the previous character in the buffer does.
275After insertion, the value of `auto-fill-function' is called if the
8b76d6f8
SM
276`auto-fill-chars' table has a non-nil value for the inserted character.
277At the end, it runs `post-self-insert-hook'. */)
5842a27b 278 (Lisp_Object n)
cd645247 279{
f10fe38f 280 bool remove_boundary = 1;
c838bca9
LI
281 CHECK_NUMBER (n);
282
5d335d4b
GM
283 if (XFASTINT (n) < 0)
284 error ("Negative repetition argument %"pI"d", XFASTINT (n));
1ac9108a 285
1344aad4 286 if (!EQ (Vthis_command, KVAR (current_kboard, Vlast_command)))
1ac9108a
SM
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
4b4deea2 301 && CONSP (BVAR (current_buffer, undo_list))
464d5a5e
SM
302 && NILP (XCAR (BVAR (current_buffer, undo_list)))
303 /* Only remove auto-added boundaries, not boundaries
304 added be explicit calls to undo-boundary. */
305 && EQ (BVAR (current_buffer, undo_list), last_undo_boundary))
1ac9108a 306 /* Remove the undo_boundary that was just pushed. */
39eb03f1 307 bset_undo_list (current_buffer, XCDR (BVAR (current_buffer, undo_list)));
cd645247
JB
308
309 /* Barf if the key that invoked this was not a character. */
a31e445e 310 if (!CHARACTERP (last_command_event))
cd645247 311 bitch_at_user ();
a7e43722 312 else {
867d5263 313 int character = translate_char (Vtranslation_table_for_input,
d311d28c 314 XINT (last_command_event));
ace1712c 315 int val = internal_self_insert (character, XFASTINT (n));
8f4e9110
SM
316 if (val == 2)
317 nonundocount = 0;
632fd57c 318 frame_make_pointer_invisible (SELECTED_FRAME ());
867d5263 319 }
cd645247
JB
320
321 return Qnil;
322}
323
8f4e9110 324/* Insert N times character C
4c6e656f
RS
325
326 If this insertion is suitable for direct output (completely simple),
aa52fef9
RS
327 return 0. A value of 1 indicates this *might* not have been simple.
328 A value of 2 means this did things that call for an undo boundary. */
4c6e656f 329
53abaf54 330static Lisp_Object Qexpand_abbrev;
29208e82 331static Lisp_Object Qpost_self_insert_hook;
53abaf54 332
c8197983 333static int
ace1712c 334internal_self_insert (int c, EMACS_INT n)
cd645247 335{
cd645247
JB
336 int hairy = 0;
337 Lisp_Object tem;
338 register enum syntaxcode synt;
8f4e9110 339 Lisp_Object overwrite;
9e4fd67b
KH
340 /* Length of multi-byte form of C. */
341 int len;
342 /* Working buffer and pointer for multi-byte form of C. */
e55d9cfd 343 unsigned char str[MAX_MULTIBYTE_LENGTH];
d311d28c
PE
344 ptrdiff_t chars_to_delete = 0;
345 ptrdiff_t spaces_to_insert = 0;
cd645247 346
4b4deea2 347 overwrite = BVAR (current_buffer, overwrite_mode);
ad44dffe 348 if (!NILP (Vbefore_change_functions) || !NILP (Vafter_change_functions))
cd645247
JB
349 hairy = 1;
350
9e4fd67b 351 /* At first, get multi-byte form of C in STR. */
4b4deea2 352 if (!NILP (BVAR (current_buffer, enable_multibyte_characters)))
b9859007 353 {
e55d9cfd 354 len = CHAR_STRING (c, str);
741263c2
KH
355 if (len == 1)
356 /* If C has modifier bits, this makes C an appropriate
357 one-byte char. */
358 c = *str;
b9859007 359 }
9e4fd67b 360 else
38b62842 361 {
200fc949 362 str[0] = SINGLE_BYTE_CHAR_P (c) ? c : CHAR_TO_BYTE8 (c);
38b62842
KH
363 len = 1;
364 }
6bbb0d4a 365 if (!NILP (overwrite)
9e4fd67b 366 && PT < ZV)
cd645247 367 {
9e4fd67b
KH
368 /* In overwrite-mode, we substitute a character at point (C2,
369 hereafter) by C. For that, we delete C2 in advance. But,
370 just substituting C2 by C may move a remaining text in the
371 line to the right or to the left, which is not preferable.
372 So we insert more spaces or delete more characters in the
373 following cases: if C is narrower than C2, after deleting C2,
374 we fill columns with spaces, if C is wider than C2, we delete
375 C2 and several characters following C2. */
376
216b9443
RS
377 /* This is the character after point. */
378 int c2 = FETCH_CHAR (PT_BYTE);
379
d311d28c
PE
380 int cwidth;
381
37c0ed09
RS
382 /* Overwriting in binary-mode always replaces C2 by C.
383 Overwriting in textual-mode doesn't always do that.
384 It inserts newlines in the usual way,
385 and inserts any character at end of line
386 or before a tab if it doesn't use the whole width of the tab. */
8f4e9110 387 if (EQ (overwrite, Qoverwrite_mode_binary))
d311d28c
PE
388 chars_to_delete = min (n, PTRDIFF_MAX);
389 else if (c != '\n' && c2 != '\n'
390 && (cwidth = XFASTINT (Fchar_width (make_number (c)))) != 0)
9e4fd67b 391 {
d311d28c
PE
392 ptrdiff_t pos = PT;
393 ptrdiff_t pos_byte = PT_BYTE;
394 ptrdiff_t curcol = current_column ();
7831777b 395
d311d28c 396 if (n <= (min (MOST_POSITIVE_FIXNUM, PTRDIFF_MAX) - curcol) / cwidth)
1e12733b 397 {
d311d28c
PE
398 /* Column the cursor should be placed at after this insertion.
399 The value should be calculated only when necessary. */
400 ptrdiff_t target_clm = curcol + n * cwidth;
401
402 /* The actual cursor position after the trial of moving
403 to column TARGET_CLM. It is greater than TARGET_CLM
404 if the TARGET_CLM is middle of multi-column
405 character. In that case, the new point is set after
406 that character. */
407 ptrdiff_t actual_clm
408 = XFASTINT (Fmove_to_column (make_number (target_clm), Qnil));
409
410 chars_to_delete = PT - pos;
411
412 if (actual_clm > target_clm)
413 {
414 /* We will delete too many columns. Let's fill columns
415 by spaces so that the remaining text won't move. */
416 ptrdiff_t actual = PT_BYTE;
417 DEC_POS (actual);
418 if (FETCH_CHAR (actual) == '\t')
419 /* Rather than add spaces, let's just keep the tab. */
420 chars_to_delete--;
421 else
422 spaces_to_insert = actual_clm - target_clm;
423 }
424
425 SET_PT_BOTH (pos, pos_byte);
1e12733b 426 }
9e4fd67b 427 }
aa52fef9 428 hairy = 2;
cd645247 429 }
9ad8bfb0 430
9ad8bfb0
KH
431 synt = SYNTAX (c);
432
4b4deea2 433 if (!NILP (BVAR (current_buffer, abbrev_mode))
9ad8bfb0 434 && synt != Sword
4b4deea2 435 && NILP (BVAR (current_buffer, read_only))
9ad8bfb0 436 && PT > BEGV
4b4deea2 437 && (SYNTAX (!NILP (BVAR (current_buffer, enable_multibyte_characters))
a2e5caf7
SM
438 ? XFASTINT (Fprevious_char ())
439 : UNIBYTE_TO_CHAR (XFASTINT (Fprevious_char ())))
440 == Sword))
cd645247 441 {
f10fe38f 442 EMACS_INT modiff = MODIFF;
e57640c0
RS
443 Lisp_Object sym;
444
53abaf54 445 sym = call0 (Qexpand_abbrev);
e57640c0 446
c87dbfd0 447 /* If we expanded an abbrev which has a hook,
9317a902 448 and the hook has a non-nil `no-self-insert' property,
e57640c0 449 return right away--don't really self-insert. */
8271d590 450 if (SYMBOLP (sym) && ! NILP (sym)
1d59fbe3
BT
451 && ! NILP (SYMBOL_FUNCTION (sym))
452 && SYMBOLP (SYMBOL_FUNCTION (sym)))
e57640c0
RS
453 {
454 Lisp_Object prop;
1d59fbe3 455 prop = Fget (SYMBOL_FUNCTION (sym), intern ("no-self-insert"));
e57640c0 456 if (! NILP (prop))
6787d111 457 return 1;
e57640c0
RS
458 }
459
ee8caabb 460 if (MODIFF != modiff)
aa52fef9 461 hairy = 2;
cd645247 462 }
e744155a 463
049749e6 464 if (chars_to_delete)
e744155a 465 {
4b4deea2 466 int mc = ((NILP (BVAR (current_buffer, enable_multibyte_characters))
8f4e9110
SM
467 && SINGLE_BYTE_CHAR_P (c))
468 ? UNIBYTE_TO_CHAR (c) : c);
469 Lisp_Object string = Fmake_string (make_number (n), make_number (mc));
2e35f1a2 470
e744155a
RS
471 if (spaces_to_insert)
472 {
473 tem = Fmake_string (make_number (spaces_to_insert),
474 make_number (' '));
8f4e9110 475 string = concat2 (string, tem);
e744155a
RS
476 }
477
5f65b1b4 478 replace_range (PT, PT + chars_to_delete, string, 1, 1, 1);
c96e5d6a 479 Fforward_char (make_number (n + spaces_to_insert));
8f4e9110
SM
480 }
481 else if (n > 1)
482 {
483 USE_SAFE_ALLOCA;
b68864e5 484 char *strn, *p;
0065d054 485 SAFE_NALLOCA (strn, len, n);
8f4e9110
SM
486 for (p = strn; n > 0; n--, p += len)
487 memcpy (p, str, len);
488 insert_and_inherit (strn, p - strn);
489 SAFE_FREE ();
e744155a 490 }
84b28888 491 else if (n > 0)
b68864e5 492 insert_and_inherit ((char *) str, len);
e744155a 493
01428933
KH
494 if ((CHAR_TABLE_P (Vauto_fill_chars)
495 ? !NILP (CHAR_TABLE_REF (Vauto_fill_chars, c))
496 : (c == ' ' || c == '\n'))
4b4deea2 497 && !NILP (BVAR (current_buffer, auto_fill_function)))
cd645247 498 {
930d429c 499 Lisp_Object auto_fill_result;
76bb6dbb 500
9e4fd67b 501 if (c == '\n')
049749e6
RS
502 /* After inserting a newline, move to previous line and fill
503 that. Must have the newline in place already so filling and
504 justification, if any, know where the end is going to be. */
505 SET_PT_BOTH (PT - 1, PT_BYTE - 1);
930d429c 506 auto_fill_result = call0 (BVAR (current_buffer, auto_fill_function));
4d94dd9a
RS
507 /* Test PT < ZV in case the auto-fill-function is strange. */
508 if (c == '\n' && PT < ZV)
049749e6 509 SET_PT_BOTH (PT + 1, PT_BYTE + 1);
930d429c 510 if (!NILP (auto_fill_result))
76bb6dbb 511 hairy = 2;
cd645247 512 }
189fad68 513
a2e5caf7 514 /* Run hooks for electric keys. */
dee091a3 515 Frun_hooks (1, &Qpost_self_insert_hook);
a2e5caf7 516
cd645247
JB
517 return hairy;
518}
519\f
520/* module initialization */
521
dfcf069d 522void
971de7fb 523syms_of_cmds (void)
cd645247 524{
fe6aa7a1
BT
525#include "cmds.x"
526
cd3520a4
JB
527 DEFSYM (Qkill_backward_chars, "kill-backward-chars");
528 DEFSYM (Qkill_forward_chars, "kill-forward-chars");
529 DEFSYM (Qoverwrite_mode_binary, "overwrite-mode-binary");
530 DEFSYM (Qexpand_abbrev, "expand-abbrev");
531 DEFSYM (Qpost_self_insert_hook, "post-self-insert-hook");
189fad68 532
29208e82 533 DEFVAR_LISP ("post-self-insert-hook", Vpost_self_insert_hook,
a2e5caf7 534 doc: /* Hook run at the end of `self-insert-command'.
2b5491fa 535This is run after inserting the character. */);
a2e5caf7 536 Vpost_self_insert_hook = Qnil;
cd645247
JB
537}
538
dfcf069d 539void
971de7fb 540keys_of_cmds (void)
cd645247
JB
541{
542 int n;
543
1ac9108a 544 nonundocount = 0;
cbf65115 545 initial_define_key (global_map, Ctl ('I'), "self-insert-command");
cd645247
JB
546 for (n = 040; n < 0177; n++)
547 initial_define_key (global_map, n, "self-insert-command");
cf9cdc11
RS
548#ifdef MSDOS
549 for (n = 0200; n < 0240; n++)
550 initial_define_key (global_map, n, "self-insert-command");
551#endif
94748cb9 552 for (n = 0240; n < 0400; n++)
eb46da6a 553 initial_define_key (global_map, n, "self-insert-command");
cd645247
JB
554
555 initial_define_key (global_map, Ctl ('A'), "beginning-of-line");
556 initial_define_key (global_map, Ctl ('B'), "backward-char");
cd645247
JB
557 initial_define_key (global_map, Ctl ('E'), "end-of-line");
558 initial_define_key (global_map, Ctl ('F'), "forward-char");
cd645247 559}