* lisp/term/common-win.el (xw-defined-colors): Simplify the 'ns case.
[bpt/emacs.git] / src / cmds.c
CommitLineData
cd645247 1/* Simple built-in editing commands.
0b5538bd 2 Copyright (C) 1985, 1993, 1994, 1995, 1996, 1997, 1998, 2001, 2002,
114f9c96 3 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
8cabe764 4 Free Software Foundation, Inc.
cd645247
JB
5
6This file is part of GNU Emacs.
7
9ec0b715 8GNU Emacs is free software: you can redistribute it and/or modify
cd645247 9it under the terms of the GNU General Public License as published by
9ec0b715
GM
10the Free Software Foundation, either version 3 of the License, or
11(at your option) any later version.
cd645247
JB
12
13GNU Emacs is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
9ec0b715 19along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
cd645247
JB
20
21
18160b98 22#include <config.h>
d7306fe6 23#include <setjmp.h>
cd645247
JB
24#include "lisp.h"
25#include "commands.h"
26#include "buffer.h"
83be827a 27#include "character.h"
cd645247 28#include "syntax.h"
f109dfa2 29#include "window.h"
346e0c2d 30#include "keyboard.h"
e35f6ff7 31#include "keymap.h"
dfcf069d 32#include "dispextern.h"
2cc7b62f 33#include "frame.h"
cd645247 34
8f4e9110 35Lisp_Object Qkill_forward_chars, Qkill_backward_chars;
cd645247 36
6bbb0d4a
JB
37/* A possible value for a buffer's overwrite-mode variable. */
38Lisp_Object Qoverwrite_mode_binary;
39
ace1712c 40static int internal_self_insert (int, EMACS_INT);
cd645247 41\f
9e4fd67b 42DEFUN ("forward-point", Fforward_point, Sforward_point, 1, 1, 0,
335c5470 43 doc: /* Return buffer position N characters after (before if N negative) point. */)
5842a27b 44 (Lisp_Object n)
9e4fd67b 45{
b7826503 46 CHECK_NUMBER (n);
9e4fd67b 47
049749e6 48 return make_number (PT + XINT (n));
9e4fd67b
KH
49}
50
9ae750f0 51DEFUN ("forward-char", Fforward_char, Sforward_char, 0, 1, "^p",
d20e1419
EZ
52 doc: /* Move point N characters forward (backward if N is negative).
53On reaching end or beginning of buffer, stop and signal error.
54
55Depending on the bidirectional context, the movement may be to the
56right or to the left on the screen. This is in contrast with
5220357f 57\\[right-char], which see. */)
5842a27b 58 (Lisp_Object n)
cd645247 59{
72d5f589
EN
60 if (NILP (n))
61 XSETFASTINT (n, 1);
cd645247 62 else
b7826503 63 CHECK_NUMBER (n);
cd645247 64
72d5f589 65 /* This used to just set point to point + XINT (n), and then check
7b502dc3
JB
66 to see if it was within boundaries. But now that SET_PT can
67 potentially do a lot of stuff (calling entering and exiting
68 hooks, etcetera), that's not a good approach. So we validate the
69 proposed position, then set point. */
70 {
40283062 71 EMACS_INT new_point = PT + XINT (n);
7b502dc3
JB
72
73 if (new_point < BEGV)
74 {
75 SET_PT (BEGV);
aaf769f1 76 xsignal0 (Qbeginning_of_buffer);
7b502dc3
JB
77 }
78 if (new_point > ZV)
79 {
80 SET_PT (ZV);
aaf769f1 81 xsignal0 (Qend_of_buffer);
7b502dc3
JB
82 }
83
84 SET_PT (new_point);
85 }
86
cd645247
JB
87 return Qnil;
88}
89
9ae750f0 90DEFUN ("backward-char", Fbackward_char, Sbackward_char, 0, 1, "^p",
d20e1419
EZ
91 doc: /* Move point N characters backward (forward if N is negative).
92On attempt to pass beginning or end of buffer, stop and signal error.
93
94Depending on the bidirectional context, the movement may be to the
95right or to the left on the screen. This is in contrast with
5220357f 96\\[left-char], which see. */)
5842a27b 97 (Lisp_Object n)
cd645247 98{
72d5f589
EN
99 if (NILP (n))
100 XSETFASTINT (n, 1);
cd645247 101 else
b7826503 102 CHECK_NUMBER (n);
cd645247 103
72d5f589
EN
104 XSETINT (n, - XINT (n));
105 return Fforward_char (n);
cd645247
JB
106}
107
9ae750f0 108DEFUN ("forward-line", Fforward_line, Sforward_line, 0, 1, "^p",
335c5470 109 doc: /* Move N lines forward (backward if N is negative).
cd21226d
EZ
110Precisely, if point is on line I, move to the start of line I + N
111\("start of line" in the logical order).
335c5470
PJ
112If there isn't room, go as far as possible (no error).
113Returns the count of lines left to move. If moving forward,
114that is N - number of lines moved; if backward, N + number moved.
115With positive N, a non-empty line at the end counts as one line
5220357f 116successfully moved (for the return value). */)
5842a27b 117 (Lisp_Object n)
cd645247 118{
40283062
LMI
119 EMACS_INT opoint = PT, opoint_byte = PT_BYTE;
120 EMACS_INT pos, pos_byte;
121 EMACS_INT count, shortage;
cd645247 122
265a9e55 123 if (NILP (n))
cd645247
JB
124 count = 1;
125 else
126 {
b7826503 127 CHECK_NUMBER (n);
cd645247
JB
128 count = XINT (n);
129 }
130
049749e6
RS
131 if (count <= 0)
132 shortage = scan_newline (PT, PT_BYTE, BEGV, BEGV_BYTE, count - 1, 1);
133 else
134 shortage = scan_newline (PT, PT_BYTE, ZV, ZV_BYTE, count, 1);
135
136 /* Since scan_newline does TEMP_SET_PT_BOTH,
137 and we want to set PT "for real",
138 go back to the old point and then come back here. */
139 pos = PT;
140 pos_byte = PT_BYTE;
141 TEMP_SET_PT_BOTH (opoint, opoint_byte);
142 SET_PT_BOTH (pos, pos_byte);
143
cd645247 144 if (shortage > 0
049749e6 145 && (count <= 0
502ddf23 146 || (ZV > BEGV
049749e6
RS
147 && PT != opoint
148 && (FETCH_BYTE (PT_BYTE - 1) != '\n'))))
cd645247 149 shortage--;
049749e6
RS
150
151 return make_number (count <= 0 ? - shortage : shortage);
cd645247
JB
152}
153
9ae750f0 154DEFUN ("beginning-of-line", Fbeginning_of_line, Sbeginning_of_line, 0, 1, "^p",
cd21226d 155 doc: /* Move point to beginning of current line (in the logical order).
8abc9869
MB
156With argument N not nil or 1, move forward N - 1 lines first.
157If point reaches the beginning or end of buffer, it stops there.
158
13c42cc5 159This function constrains point to the current field unless this moves
5220357f
JB
160point to a different line than the original, unconstrained result.
161If N is nil or 1, and a front-sticky field starts at point, the point
13c42cc5 162does not move. To ignore field boundaries bind
27806b20
KL
163`inhibit-field-text-motion' to t, or use the `forward-line' function
164instead. For instance, `(forward-line 0)' does the same thing as
165`(beginning-of-line)', except that it ignores field boundaries. */)
5842a27b 166 (Lisp_Object n)
cd645247 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)));
a731cae2 174
cd645247
JB
175 return Qnil;
176}
177
9ae750f0 178DEFUN ("end-of-line", Fend_of_line, Send_of_line, 0, 1, "^p",
cd21226d 179 doc: /* Move point to end of current line (in the logical order).
8abc9869
MB
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.
6b61353c 182To ignore intangibility, bind `inhibit-point-motion-hooks' to t.
8abc9869 183
13c42cc5
KL
184This function constrains point to the current field unless this moves
185point to a different line than the original, unconstrained result. If
186N is nil or 1, and a rear-sticky field ends at point, the point does
187not move. To ignore field boundaries bind `inhibit-field-text-motion'
188to t. */)
5842a27b 189 (Lisp_Object n)
cd645247 190{
40283062 191 EMACS_INT newpos;
fda3de70 192
265a9e55 193 if (NILP (n))
48c7cef2 194 XSETFASTINT (n, 1);
cd645247 195 else
b7826503 196 CHECK_NUMBER (n);
cd645247 197
fda3de70
RS
198 while (1)
199 {
200 newpos = XINT (Fline_end_position (n));
201 SET_PT (newpos);
202
203 if (PT > newpos
204 && FETCH_CHAR (PT - 1) == '\n')
205 {
206 /* If we skipped over a newline that follows
207 an invisible intangible run,
208 move back to the last tangible position
209 within the line. */
210
211 SET_PT (PT - 1);
212 break;
213 }
214 else if (PT > newpos && PT < ZV
215 && FETCH_CHAR (PT) != '\n')
216 /* If we skipped something intangible
217 and now we're not really at eol,
218 keep going. */
219 n = make_number (1);
220 else
221 break;
222 }
cd645247
JB
223
224 return Qnil;
225}
226
227DEFUN ("delete-char", Fdelete_char, Sdelete_char, 1, 2, "p\nP",
335c5470
PJ
228 doc: /* Delete the following N characters (previous if N is negative).
229Optional second arg KILLFLAG non-nil means kill instead (save in kill ring).
230Interactively, N is the prefix arg, and KILLFLAG is set if
b9229673
CY
231N was explicitly specified.
232
b8a47412 233The command `delete-forward-char' is preferable for interactive use. */)
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
SM
271Whichever character you type to run this command is inserted.
272Before insertion, `expand-abbrev' is executed if the inserted character does
273not have word syntax and the previous character in the buffer does.
274After insertion, the value of `auto-fill-function' is called if the
275`auto-fill-chars' table has a non-nil value for the inserted character. */)
5842a27b 276 (Lisp_Object n)
cd645247 277{
1ac9108a 278 int remove_boundary = 1;
b0ca0f33 279 CHECK_NUMBER (n);
1ac9108a
SM
280
281 if (!EQ (Vthis_command, current_kboard->Vlast_command))
282 nonundocount = 0;
283
284 if (NILP (Vexecuting_kbd_macro)
285 && !EQ (minibuf_window, selected_window))
286 {
287 if (nonundocount <= 0 || nonundocount >= 20)
288 {
289 remove_boundary = 0;
290 nonundocount = 0;
291 }
292 nonundocount++;
293 }
294
295 if (remove_boundary
296 && CONSP (current_buffer->undo_list)
297 && NILP (XCAR (current_buffer->undo_list)))
298 /* Remove the undo_boundary that was just pushed. */
299 current_buffer->undo_list = XCDR (current_buffer->undo_list);
cd645247
JB
300
301 /* Barf if the key that invoked this was not a character. */
a31e445e 302 if (!CHARACTERP (last_command_event))
cd645247 303 bitch_at_user ();
867d5263
DL
304 {
305 int character = translate_char (Vtranslation_table_for_input,
40283062 306 (int) XINT (last_command_event));
ace1712c 307 int val = internal_self_insert (character, XFASTINT (n));
8f4e9110
SM
308 if (val == 2)
309 nonundocount = 0;
310 frame_make_pointer_invisible ();
867d5263 311 }
cd645247
JB
312
313 return Qnil;
314}
315
8f4e9110 316/* Insert N times character C
4c6e656f
RS
317
318 If this insertion is suitable for direct output (completely simple),
aa52fef9
RS
319 return 0. A value of 1 indicates this *might* not have been simple.
320 A value of 2 means this did things that call for an undo boundary. */
4c6e656f 321
53abaf54 322static Lisp_Object Qexpand_abbrev;
a2e5caf7 323static Lisp_Object Qpost_self_insert_hook, Vpost_self_insert_hook;
53abaf54 324
c8197983 325static int
ace1712c 326internal_self_insert (int c, EMACS_INT n)
cd645247 327{
cd645247
JB
328 int hairy = 0;
329 Lisp_Object tem;
330 register enum syntaxcode synt;
8f4e9110 331 Lisp_Object overwrite;
9e4fd67b
KH
332 /* Length of multi-byte form of C. */
333 int len;
334 /* Working buffer and pointer for multi-byte form of C. */
e55d9cfd 335 unsigned char str[MAX_MULTIBYTE_LENGTH];
40283062
LMI
336 EMACS_INT chars_to_delete = 0;
337 EMACS_INT spaces_to_insert = 0;
cd645247 338
e7aacab7 339 overwrite = current_buffer->overwrite_mode;
ad44dffe 340 if (!NILP (Vbefore_change_functions) || !NILP (Vafter_change_functions))
cd645247
JB
341 hairy = 1;
342
9e4fd67b
KH
343 /* At first, get multi-byte form of C in STR. */
344 if (!NILP (current_buffer->enable_multibyte_characters))
b9859007 345 {
e55d9cfd 346 len = CHAR_STRING (c, str);
741263c2
KH
347 if (len == 1)
348 /* If C has modifier bits, this makes C an appropriate
349 one-byte char. */
350 c = *str;
b9859007 351 }
9e4fd67b 352 else
38b62842 353 {
e55d9cfd
KH
354 str[0] = (SINGLE_BYTE_CHAR_P (c)
355 ? c
356 : multibyte_char_to_unibyte (c, Qnil));
38b62842
KH
357 len = 1;
358 }
6bbb0d4a 359 if (!NILP (overwrite)
9e4fd67b 360 && PT < ZV)
cd645247 361 {
9e4fd67b
KH
362 /* In overwrite-mode, we substitute a character at point (C2,
363 hereafter) by C. For that, we delete C2 in advance. But,
364 just substituting C2 by C may move a remaining text in the
365 line to the right or to the left, which is not preferable.
366 So we insert more spaces or delete more characters in the
367 following cases: if C is narrower than C2, after deleting C2,
368 we fill columns with spaces, if C is wider than C2, we delete
369 C2 and several characters following C2. */
370
216b9443
RS
371 /* This is the character after point. */
372 int c2 = FETCH_CHAR (PT_BYTE);
373
37c0ed09
RS
374 /* Overwriting in binary-mode always replaces C2 by C.
375 Overwriting in textual-mode doesn't always do that.
376 It inserts newlines in the usual way,
377 and inserts any character at end of line
378 or before a tab if it doesn't use the whole width of the tab. */
8f4e9110
SM
379 if (EQ (overwrite, Qoverwrite_mode_binary))
380 chars_to_delete = n;
381 else if (c != '\n' && c2 != '\n')
9e4fd67b 382 {
40283062
LMI
383 EMACS_INT pos = PT;
384 EMACS_INT pos_byte = PT_BYTE;
8f4e9110
SM
385 /* Column the cursor should be placed at after this insertion.
386 The correct value should be calculated only when necessary. */
387 int target_clm = ((int) current_column () /* iftc */
40283062 388 + n * (int) XINT (Fchar_width (make_number (c))));
e744155a 389
9e4fd67b
KH
390 /* The actual cursor position after the trial of moving
391 to column TARGET_CLM. It is greater than TARGET_CLM
392 if the TARGET_CLM is middle of multi-column
393 character. In that case, the new point is set after
394 that character. */
cac55749 395 int actual_clm
40283062
LMI
396 = (int) XFASTINT (Fmove_to_column (make_number (target_clm),
397 Qnil));
9e4fd67b 398
049749e6 399 chars_to_delete = PT - pos;
e744155a 400
9e4fd67b 401 if (actual_clm > target_clm)
8f4e9110 402 { /* We will delete too many columns. Let's fill columns
9e4fd67b 403 by spaces so that the remaining text won't move. */
8f4e9110
SM
404 EMACS_INT actual = PT_BYTE;
405 DEC_POS (actual);
406 if (FETCH_CHAR (actual) == '\t')
407 /* Rather than add spaces, let's just keep the tab. */
408 chars_to_delete--;
409 else
e744155a 410 spaces_to_insert = actual_clm - target_clm;
9e4fd67b 411 }
8f4e9110 412
049749e6 413 SET_PT_BOTH (pos, pos_byte);
9e4fd67b 414 }
aa52fef9 415 hairy = 2;
cd645247 416 }
9ad8bfb0 417
9ad8bfb0
KH
418 synt = SYNTAX (c);
419
265a9e55 420 if (!NILP (current_buffer->abbrev_mode)
9ad8bfb0 421 && synt != Sword
265a9e55 422 && NILP (current_buffer->read_only)
9ad8bfb0 423 && PT > BEGV
a2e5caf7
SM
424 && (SYNTAX (!NILP (current_buffer->enable_multibyte_characters)
425 ? XFASTINT (Fprevious_char ())
426 : UNIBYTE_TO_CHAR (XFASTINT (Fprevious_char ())))
427 == Sword))
cd645247 428 {
ee8caabb 429 int modiff = MODIFF;
e57640c0
RS
430 Lisp_Object sym;
431
53abaf54 432 sym = call0 (Qexpand_abbrev);
e57640c0 433
c87dbfd0 434 /* If we expanded an abbrev which has a hook,
9317a902 435 and the hook has a non-nil `no-self-insert' property,
e57640c0 436 return right away--don't really self-insert. */
fb6b6049 437 if (SYMBOLP (sym) && ! NILP (sym) && ! NILP (XSYMBOL (sym)->function)
9317a902 438 && SYMBOLP (XSYMBOL (sym)->function))
e57640c0
RS
439 {
440 Lisp_Object prop;
9317a902 441 prop = Fget (XSYMBOL (sym)->function, intern ("no-self-insert"));
e57640c0 442 if (! NILP (prop))
6787d111 443 return 1;
e57640c0
RS
444 }
445
ee8caabb 446 if (MODIFF != modiff)
aa52fef9 447 hairy = 2;
cd645247 448 }
e744155a 449
049749e6 450 if (chars_to_delete)
e744155a 451 {
8f4e9110
SM
452 int mc = ((NILP (current_buffer->enable_multibyte_characters)
453 && SINGLE_BYTE_CHAR_P (c))
454 ? UNIBYTE_TO_CHAR (c) : c);
455 Lisp_Object string = Fmake_string (make_number (n), make_number (mc));
456
e744155a
RS
457 if (spaces_to_insert)
458 {
459 tem = Fmake_string (make_number (spaces_to_insert),
460 make_number (' '));
8f4e9110 461 string = concat2 (string, tem);
e744155a
RS
462 }
463
5f65b1b4 464 replace_range (PT, PT + chars_to_delete, string, 1, 1, 1);
8f4e9110
SM
465 Fforward_char (make_number (n + spaces_to_insert));
466 }
467 else if (n > 1)
468 {
469 USE_SAFE_ALLOCA;
470 unsigned char *strn, *p;
471 SAFE_ALLOCA (strn, unsigned char*, n * len);
472 for (p = strn; n > 0; n--, p += len)
473 memcpy (p, str, len);
474 insert_and_inherit (strn, p - strn);
475 SAFE_FREE ();
e744155a
RS
476 }
477 else
478 insert_and_inherit (str, len);
479
01428933
KH
480 if ((CHAR_TABLE_P (Vauto_fill_chars)
481 ? !NILP (CHAR_TABLE_REF (Vauto_fill_chars, c))
482 : (c == ' ' || c == '\n'))
3de15b7a 483 && !NILP (current_buffer->auto_fill_function))
cd645247 484 {
76bb6dbb
KH
485 Lisp_Object tem;
486
9e4fd67b 487 if (c == '\n')
049749e6
RS
488 /* After inserting a newline, move to previous line and fill
489 that. Must have the newline in place already so filling and
490 justification, if any, know where the end is going to be. */
491 SET_PT_BOTH (PT - 1, PT_BYTE - 1);
76bb6dbb 492 tem = call0 (current_buffer->auto_fill_function);
4d94dd9a
RS
493 /* Test PT < ZV in case the auto-fill-function is strange. */
494 if (c == '\n' && PT < ZV)
049749e6 495 SET_PT_BOTH (PT + 1, PT_BYTE + 1);
76bb6dbb
KH
496 if (!NILP (tem))
497 hairy = 2;
cd645247 498 }
189fad68 499
a2e5caf7
SM
500 /* Run hooks for electric keys. */
501 call1 (Vrun_hooks, Qpost_self_insert_hook);
502
cd645247
JB
503 return hairy;
504}
505\f
506/* module initialization */
507
dfcf069d 508void
971de7fb 509syms_of_cmds (void)
cd645247 510{
d67b4f80 511 Qkill_backward_chars = intern_c_string ("kill-backward-chars");
cd645247
JB
512 staticpro (&Qkill_backward_chars);
513
d67b4f80 514 Qkill_forward_chars = intern_c_string ("kill-forward-chars");
cd645247
JB
515 staticpro (&Qkill_forward_chars);
516
d67b4f80 517 Qoverwrite_mode_binary = intern_c_string ("overwrite-mode-binary");
6bbb0d4a 518 staticpro (&Qoverwrite_mode_binary);
e686c647 519
d67b4f80 520 Qexpand_abbrev = intern_c_string ("expand-abbrev");
53abaf54
SM
521 staticpro (&Qexpand_abbrev);
522
a2e5caf7
SM
523 Qpost_self_insert_hook = intern_c_string ("post-self-insert-hook");
524 staticpro (&Qpost_self_insert_hook);
189fad68 525
a2e5caf7
SM
526 DEFVAR_LISP ("post-self-insert-hook", &Vpost_self_insert_hook,
527 doc: /* Hook run at the end of `self-insert-command'.
2b5491fa 528This is run after inserting the character. */);
a2e5caf7 529 Vpost_self_insert_hook = Qnil;
189fad68 530
9e4fd67b 531 defsubr (&Sforward_point);
cd645247
JB
532 defsubr (&Sforward_char);
533 defsubr (&Sbackward_char);
534 defsubr (&Sforward_line);
535 defsubr (&Sbeginning_of_line);
536 defsubr (&Send_of_line);
537
538 defsubr (&Sdelete_char);
cd645247 539 defsubr (&Sself_insert_command);
cd645247
JB
540}
541
dfcf069d 542void
971de7fb 543keys_of_cmds (void)
cd645247
JB
544{
545 int n;
546
1ac9108a 547 nonundocount = 0;
cbf65115 548 initial_define_key (global_map, Ctl ('I'), "self-insert-command");
cd645247
JB
549 for (n = 040; n < 0177; n++)
550 initial_define_key (global_map, n, "self-insert-command");
cf9cdc11
RS
551#ifdef MSDOS
552 for (n = 0200; n < 0240; n++)
553 initial_define_key (global_map, n, "self-insert-command");
554#endif
94748cb9 555 for (n = 0240; n < 0400; n++)
eb46da6a 556 initial_define_key (global_map, n, "self-insert-command");
cd645247
JB
557
558 initial_define_key (global_map, Ctl ('A'), "beginning-of-line");
559 initial_define_key (global_map, Ctl ('B'), "backward-char");
cd645247
JB
560 initial_define_key (global_map, Ctl ('E'), "end-of-line");
561 initial_define_key (global_map, Ctl ('F'), "forward-char");
cd645247 562}
6b61353c
KH
563
564/* arch-tag: 022ba3cd-67f9-4978-9c5d-7d2b18d8644e
565 (do not change this comment) */