* lib-src/fakemail.c (action): Convert function definitions to standard C.
[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
JB
34
35Lisp_Object Qkill_forward_chars, Qkill_backward_chars, Vblink_paren_function;
36
6bbb0d4a
JB
37/* A possible value for a buffer's overwrite-mode variable. */
38Lisp_Object Qoverwrite_mode_binary;
39
189fad68
RS
40/* Non-nil means put this face on the next self-inserting character. */
41Lisp_Object Vself_insert_face;
42
43/* This is the command that set up Vself_insert_face. */
44Lisp_Object Vself_insert_face_command;
45
189fad68 46extern Lisp_Object Qface;
867d5263 47extern Lisp_Object Vtranslation_table_for_input;
cd645247 48\f
9e4fd67b 49DEFUN ("forward-point", Fforward_point, Sforward_point, 1, 1, 0,
335c5470
PJ
50 doc: /* Return buffer position N characters after (before if N negative) point. */)
51 (n)
9e4fd67b
KH
52 Lisp_Object n;
53{
b7826503 54 CHECK_NUMBER (n);
9e4fd67b 55
049749e6 56 return make_number (PT + XINT (n));
9e4fd67b
KH
57}
58
9ae750f0 59DEFUN ("forward-char", Fforward_char, Sforward_char, 0, 1, "^p",
d20e1419
EZ
60 doc: /* Move point N characters forward (backward if N is negative).
61On reaching end or beginning of buffer, stop and signal error.
62
63Depending on the bidirectional context, the movement may be to the
64right or to the left on the screen. This is in contrast with
5220357f 65\\[right-char], which see. */)
335c5470 66 (n)
72d5f589 67 Lisp_Object n;
cd645247 68{
72d5f589
EN
69 if (NILP (n))
70 XSETFASTINT (n, 1);
cd645247 71 else
b7826503 72 CHECK_NUMBER (n);
cd645247 73
72d5f589 74 /* This used to just set point to point + XINT (n), and then check
7b502dc3
JB
75 to see if it was within boundaries. But now that SET_PT can
76 potentially do a lot of stuff (calling entering and exiting
77 hooks, etcetera), that's not a good approach. So we validate the
78 proposed position, then set point. */
79 {
049749e6 80 int new_point = PT + XINT (n);
7b502dc3
JB
81
82 if (new_point < BEGV)
83 {
84 SET_PT (BEGV);
aaf769f1 85 xsignal0 (Qbeginning_of_buffer);
7b502dc3
JB
86 }
87 if (new_point > ZV)
88 {
89 SET_PT (ZV);
aaf769f1 90 xsignal0 (Qend_of_buffer);
7b502dc3
JB
91 }
92
93 SET_PT (new_point);
94 }
95
cd645247
JB
96 return Qnil;
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.
102
103Depending on the bidirectional context, the movement may be to the
104right or to the left on the screen. This is in contrast with
5220357f 105\\[left-char], which see. */)
335c5470 106 (n)
72d5f589 107 Lisp_Object n;
cd645247 108{
72d5f589
EN
109 if (NILP (n))
110 XSETFASTINT (n, 1);
cd645247 111 else
b7826503 112 CHECK_NUMBER (n);
cd645247 113
72d5f589
EN
114 XSETINT (n, - XINT (n));
115 return Fforward_char (n);
cd645247
JB
116}
117
9ae750f0 118DEFUN ("forward-line", Fforward_line, Sforward_line, 0, 1, "^p",
335c5470
PJ
119 doc: /* Move N lines forward (backward if N is negative).
120Precisely, if point is on line I, move to the start of line I + N.
121If there isn't room, go as far as possible (no error).
122Returns the count of lines left to move. If moving forward,
123that is N - number of lines moved; if backward, N + number moved.
124With positive N, a non-empty line at the end counts as one line
5220357f 125successfully moved (for the return value). */)
335c5470 126 (n)
cd645247
JB
127 Lisp_Object n;
128{
049749e6
RS
129 int opoint = PT, opoint_byte = PT_BYTE;
130 int pos, pos_byte;
131 int count, shortage;
cd645247 132
265a9e55 133 if (NILP (n))
cd645247
JB
134 count = 1;
135 else
136 {
b7826503 137 CHECK_NUMBER (n);
cd645247
JB
138 count = XINT (n);
139 }
140
049749e6
RS
141 if (count <= 0)
142 shortage = scan_newline (PT, PT_BYTE, BEGV, BEGV_BYTE, count - 1, 1);
143 else
144 shortage = scan_newline (PT, PT_BYTE, ZV, ZV_BYTE, count, 1);
145
146 /* Since scan_newline does TEMP_SET_PT_BOTH,
147 and we want to set PT "for real",
148 go back to the old point and then come back here. */
149 pos = PT;
150 pos_byte = PT_BYTE;
151 TEMP_SET_PT_BOTH (opoint, opoint_byte);
152 SET_PT_BOTH (pos, pos_byte);
153
cd645247 154 if (shortage > 0
049749e6 155 && (count <= 0
502ddf23 156 || (ZV > BEGV
049749e6
RS
157 && PT != opoint
158 && (FETCH_BYTE (PT_BYTE - 1) != '\n'))))
cd645247 159 shortage--;
049749e6
RS
160
161 return make_number (count <= 0 ? - shortage : shortage);
cd645247
JB
162}
163
9ae750f0 164DEFUN ("beginning-of-line", Fbeginning_of_line, Sbeginning_of_line, 0, 1, "^p",
8abc9869
MB
165 doc: /* Move point to beginning of current line.
166With argument N not nil or 1, move forward N - 1 lines first.
167If point reaches the beginning or end of buffer, it stops there.
168
13c42cc5 169This function constrains point to the current field unless this moves
5220357f
JB
170point to a different line than the original, unconstrained result.
171If N is nil or 1, and a front-sticky field starts at point, the point
13c42cc5 172does not move. To ignore field boundaries bind
27806b20
KL
173`inhibit-field-text-motion' to t, or use the `forward-line' function
174instead. For instance, `(forward-line 0)' does the same thing as
175`(beginning-of-line)', except that it ignores field boundaries. */)
8abc9869 176 (n)
cd645247
JB
177 Lisp_Object n;
178{
265a9e55 179 if (NILP (n))
48c7cef2 180 XSETFASTINT (n, 1);
cd645247 181 else
b7826503 182 CHECK_NUMBER (n);
cd645247 183
0aee588d 184 SET_PT (XINT (Fline_beginning_position (n)));
a731cae2 185
cd645247
JB
186 return Qnil;
187}
188
9ae750f0 189DEFUN ("end-of-line", Fend_of_line, Send_of_line, 0, 1, "^p",
8abc9869
MB
190 doc: /* Move point to end of current line.
191With argument N not nil or 1, move forward N - 1 lines first.
192If point reaches the beginning or end of buffer, it stops there.
6b61353c 193To ignore intangibility, bind `inhibit-point-motion-hooks' to t.
8abc9869 194
13c42cc5
KL
195This function constrains point to the current field unless this moves
196point to a different line than the original, unconstrained result. If
197N is nil or 1, and a rear-sticky field ends at point, the point does
198not move. To ignore field boundaries bind `inhibit-field-text-motion'
199to t. */)
8abc9869 200 (n)
cd645247
JB
201 Lisp_Object n;
202{
fda3de70
RS
203 int newpos;
204
265a9e55 205 if (NILP (n))
48c7cef2 206 XSETFASTINT (n, 1);
cd645247 207 else
b7826503 208 CHECK_NUMBER (n);
cd645247 209
fda3de70
RS
210 while (1)
211 {
212 newpos = XINT (Fline_end_position (n));
213 SET_PT (newpos);
214
215 if (PT > newpos
216 && FETCH_CHAR (PT - 1) == '\n')
217 {
218 /* If we skipped over a newline that follows
219 an invisible intangible run,
220 move back to the last tangible position
221 within the line. */
222
223 SET_PT (PT - 1);
224 break;
225 }
226 else if (PT > newpos && PT < ZV
227 && FETCH_CHAR (PT) != '\n')
228 /* If we skipped something intangible
229 and now we're not really at eol,
230 keep going. */
231 n = make_number (1);
232 else
233 break;
234 }
cd645247
JB
235
236 return Qnil;
237}
238
239DEFUN ("delete-char", Fdelete_char, Sdelete_char, 1, 2, "p\nP",
335c5470
PJ
240 doc: /* Delete the following N characters (previous if N is negative).
241Optional second arg KILLFLAG non-nil means kill instead (save in kill ring).
242Interactively, N is the prefix arg, and KILLFLAG is set if
b9229673
CY
243N was explicitly specified.
244
245The command `delete-forward' is preferable for interactive use. */)
335c5470 246 (n, killflag)
cd645247
JB
247 Lisp_Object n, killflag;
248{
9e4fd67b
KH
249 int pos;
250
b7826503 251 CHECK_NUMBER (n);
cd645247 252
049749e6 253 pos = PT + XINT (n);
265a9e55 254 if (NILP (killflag))
cd645247
JB
255 {
256 if (XINT (n) < 0)
257 {
9e4fd67b 258 if (pos < BEGV)
aaf769f1 259 xsignal0 (Qbeginning_of_buffer);
cd645247 260 else
9e4fd67b 261 del_range (pos, PT);
cd645247
JB
262 }
263 else
264 {
9e4fd67b 265 if (pos > ZV)
aaf769f1 266 xsignal0 (Qend_of_buffer);
cd645247 267 else
9e4fd67b 268 del_range (PT, pos);
cd645247
JB
269 }
270 }
271 else
272 {
273 call1 (Qkill_forward_chars, n);
274 }
275 return Qnil;
276}
277
855a0da7 278static int nonundocount;
1ac9108a 279
867d5263
DL
280/* Note that there's code in command_loop_1 which typically avoids
281 calling this. */
cd645247 282DEFUN ("self-insert-command", Fself_insert_command, Sself_insert_command, 1, 1, "p",
335c5470 283 doc: /* Insert the character you type.
1ac9108a
SM
284Whichever character you type to run this command is inserted.
285Before insertion, `expand-abbrev' is executed if the inserted character does
286not have word syntax and the previous character in the buffer does.
287After insertion, the value of `auto-fill-function' is called if the
288`auto-fill-chars' table has a non-nil value for the inserted character. */)
335c5470 289 (n)
72d5f589 290 Lisp_Object n;
cd645247 291{
1ac9108a 292 int remove_boundary = 1;
b0ca0f33 293 CHECK_NUMBER (n);
1ac9108a
SM
294
295 if (!EQ (Vthis_command, current_kboard->Vlast_command))
296 nonundocount = 0;
297
298 if (NILP (Vexecuting_kbd_macro)
299 && !EQ (minibuf_window, selected_window))
300 {
301 if (nonundocount <= 0 || nonundocount >= 20)
302 {
303 remove_boundary = 0;
304 nonundocount = 0;
305 }
306 nonundocount++;
307 }
308
309 if (remove_boundary
310 && CONSP (current_buffer->undo_list)
311 && NILP (XCAR (current_buffer->undo_list)))
312 /* Remove the undo_boundary that was just pushed. */
313 current_buffer->undo_list = XCDR (current_buffer->undo_list);
cd645247
JB
314
315 /* Barf if the key that invoked this was not a character. */
a31e445e 316 if (!CHARACTERP (last_command_event))
cd645247 317 bitch_at_user ();
867d5263
DL
318 {
319 int character = translate_char (Vtranslation_table_for_input,
a31e445e 320 XINT (last_command_event));
867d5263 321 if (XINT (n) >= 2 && NILP (current_buffer->overwrite_mode))
cd645247 322 {
867d5263
DL
323 XSETFASTINT (n, XFASTINT (n) - 2);
324 /* The first one might want to expand an abbrev. */
325 internal_self_insert (character, 1);
326 /* The bulk of the copies of this char can be inserted simply.
327 We don't have to handle a user-specified face specially
328 because it will get inherited from the first char inserted. */
ef73e7be 329 Finsert_char (make_number (character), n, Qt);
867d5263
DL
330 /* The last one might want to auto-fill. */
331 internal_self_insert (character, 0);
cd645247 332 }
867d5263
DL
333 else
334 while (XINT (n) > 0)
335 {
1ac9108a 336 int val;
867d5263
DL
337 /* Ok since old and new vals both nonneg */
338 XSETFASTINT (n, XFASTINT (n) - 1);
1ac9108a
SM
339 val = internal_self_insert (character, XFASTINT (n) != 0);
340 if (val == 2)
341 nonundocount = 0;
342 frame_make_pointer_invisible ();
867d5263
DL
343 }
344 }
cd645247
JB
345
346 return Qnil;
347}
348
9e4fd67b 349/* Insert character C. If NOAUTOFILL is nonzero, don't do autofill
4c6e656f
RS
350 even if it is enabled.
351
352 If this insertion is suitable for direct output (completely simple),
aa52fef9
RS
353 return 0. A value of 1 indicates this *might* not have been simple.
354 A value of 2 means this did things that call for an undo boundary. */
4c6e656f 355
53abaf54
SM
356static Lisp_Object Qexpand_abbrev;
357
dfcf069d 358int
9e4fd67b
KH
359internal_self_insert (c, noautofill)
360 int c;
cd645247
JB
361 int noautofill;
362{
cd645247
JB
363 int hairy = 0;
364 Lisp_Object tem;
365 register enum syntaxcode synt;
e744155a 366 Lisp_Object overwrite, string;
9e4fd67b
KH
367 /* Length of multi-byte form of C. */
368 int len;
369 /* Working buffer and pointer for multi-byte form of C. */
e55d9cfd 370 unsigned char str[MAX_MULTIBYTE_LENGTH];
049749e6 371 int chars_to_delete = 0;
e744155a 372 int spaces_to_insert = 0;
cd645247 373
e7aacab7 374 overwrite = current_buffer->overwrite_mode;
ad44dffe 375 if (!NILP (Vbefore_change_functions) || !NILP (Vafter_change_functions))
cd645247
JB
376 hairy = 1;
377
9e4fd67b
KH
378 /* At first, get multi-byte form of C in STR. */
379 if (!NILP (current_buffer->enable_multibyte_characters))
b9859007 380 {
e55d9cfd 381 len = CHAR_STRING (c, str);
741263c2
KH
382 if (len == 1)
383 /* If C has modifier bits, this makes C an appropriate
384 one-byte char. */
385 c = *str;
b9859007 386 }
9e4fd67b 387 else
38b62842 388 {
e55d9cfd
KH
389 str[0] = (SINGLE_BYTE_CHAR_P (c)
390 ? c
391 : multibyte_char_to_unibyte (c, Qnil));
38b62842
KH
392 len = 1;
393 }
6bbb0d4a 394 if (!NILP (overwrite)
9e4fd67b 395 && PT < ZV)
cd645247 396 {
9e4fd67b
KH
397 /* In overwrite-mode, we substitute a character at point (C2,
398 hereafter) by C. For that, we delete C2 in advance. But,
399 just substituting C2 by C may move a remaining text in the
400 line to the right or to the left, which is not preferable.
401 So we insert more spaces or delete more characters in the
402 following cases: if C is narrower than C2, after deleting C2,
403 we fill columns with spaces, if C is wider than C2, we delete
404 C2 and several characters following C2. */
405
216b9443
RS
406 /* This is the character after point. */
407 int c2 = FETCH_CHAR (PT_BYTE);
408
409 /* Column the cursor should be placed at after this insertion.
9e4fd67b
KH
410 The correct value should be calculated only when necessary. */
411 int target_clm = 0;
412
37c0ed09
RS
413 /* Overwriting in binary-mode always replaces C2 by C.
414 Overwriting in textual-mode doesn't always do that.
415 It inserts newlines in the usual way,
416 and inserts any character at end of line
417 or before a tab if it doesn't use the whole width of the tab. */
9e4fd67b
KH
418 if (EQ (overwrite, Qoverwrite_mode_binary)
419 || (c != '\n'
420 && c2 != '\n'
37c0ed09
RS
421 && ! (c2 == '\t'
422 && XINT (current_buffer->tab_width) > 0
423 && XFASTINT (current_buffer->tab_width) < 20
a731cae2 424 && (target_clm = ((int) current_column () /* iftc */
06d74a65 425 + XINT (Fchar_width (make_number (c)))),
37c0ed09 426 target_clm % XFASTINT (current_buffer->tab_width)))))
9e4fd67b 427 {
e744155a 428 int pos = PT;
049749e6 429 int pos_byte = PT_BYTE;
e744155a 430
9e4fd67b 431 if (target_clm == 0)
049749e6 432 chars_to_delete = 1;
9e4fd67b
KH
433 else
434 {
9e4fd67b
KH
435 /* The actual cursor position after the trial of moving
436 to column TARGET_CLM. It is greater than TARGET_CLM
437 if the TARGET_CLM is middle of multi-column
438 character. In that case, the new point is set after
439 that character. */
cac55749
RS
440 int actual_clm
441 = XFASTINT (Fmove_to_column (make_number (target_clm), Qnil));
9e4fd67b 442
049749e6 443 chars_to_delete = PT - pos;
e744155a 444
9e4fd67b
KH
445 if (actual_clm > target_clm)
446 {
e744155a 447 /* We will delete too many columns. Let's fill columns
9e4fd67b 448 by spaces so that the remaining text won't move. */
e744155a 449 spaces_to_insert = actual_clm - target_clm;
9e4fd67b
KH
450 }
451 }
049749e6 452 SET_PT_BOTH (pos, pos_byte);
9e4fd67b
KH
453 hairy = 2;
454 }
aa52fef9 455 hairy = 2;
cd645247 456 }
9ad8bfb0 457
9ad8bfb0
KH
458 synt = SYNTAX (c);
459
265a9e55 460 if (!NILP (current_buffer->abbrev_mode)
9ad8bfb0 461 && synt != Sword
265a9e55 462 && NILP (current_buffer->read_only)
9ad8bfb0
KH
463 && PT > BEGV
464 && (!NILP (current_buffer->enable_multibyte_characters)
465 ? SYNTAX (XFASTINT (Fprevious_char ())) == Sword
4c0354d7 466 : (SYNTAX (UNIBYTE_TO_CHAR (XFASTINT (Fprevious_char ())))
9ad8bfb0 467 == Sword)))
cd645247 468 {
ee8caabb 469 int modiff = MODIFF;
e57640c0
RS
470 Lisp_Object sym;
471
53abaf54 472 sym = call0 (Qexpand_abbrev);
e57640c0 473
c87dbfd0 474 /* If we expanded an abbrev which has a hook,
9317a902 475 and the hook has a non-nil `no-self-insert' property,
e57640c0 476 return right away--don't really self-insert. */
fb6b6049 477 if (SYMBOLP (sym) && ! NILP (sym) && ! NILP (XSYMBOL (sym)->function)
9317a902 478 && SYMBOLP (XSYMBOL (sym)->function))
e57640c0
RS
479 {
480 Lisp_Object prop;
9317a902 481 prop = Fget (XSYMBOL (sym)->function, intern ("no-self-insert"));
e57640c0 482 if (! NILP (prop))
6787d111 483 return 1;
e57640c0
RS
484 }
485
ee8caabb 486 if (MODIFF != modiff)
aa52fef9 487 hairy = 2;
cd645247 488 }
e744155a 489
049749e6 490 if (chars_to_delete)
e744155a 491 {
f34206b4 492 string = make_string_from_bytes (str, 1, len);
e744155a
RS
493 if (spaces_to_insert)
494 {
495 tem = Fmake_string (make_number (spaces_to_insert),
496 make_number (' '));
497 string = concat2 (tem, string);
498 }
499
5f65b1b4 500 replace_range (PT, PT + chars_to_delete, string, 1, 1, 1);
1bf95511 501 Fforward_char (make_number (1 + spaces_to_insert));
e744155a
RS
502 }
503 else
504 insert_and_inherit (str, len);
505
01428933
KH
506 if ((CHAR_TABLE_P (Vauto_fill_chars)
507 ? !NILP (CHAR_TABLE_REF (Vauto_fill_chars, c))
508 : (c == ' ' || c == '\n'))
cd645247 509 && !noautofill
3de15b7a 510 && !NILP (current_buffer->auto_fill_function))
cd645247 511 {
76bb6dbb
KH
512 Lisp_Object tem;
513
9e4fd67b 514 if (c == '\n')
049749e6
RS
515 /* After inserting a newline, move to previous line and fill
516 that. Must have the newline in place already so filling and
517 justification, if any, know where the end is going to be. */
518 SET_PT_BOTH (PT - 1, PT_BYTE - 1);
76bb6dbb 519 tem = call0 (current_buffer->auto_fill_function);
4d94dd9a
RS
520 /* Test PT < ZV in case the auto-fill-function is strange. */
521 if (c == '\n' && PT < ZV)
049749e6 522 SET_PT_BOTH (PT + 1, PT_BYTE + 1);
76bb6dbb
KH
523 if (!NILP (tem))
524 hairy = 2;
cd645247 525 }
189fad68
RS
526
527 /* If previous command specified a face to use, use it. */
528 if (!NILP (Vself_insert_face)
346e0c2d 529 && EQ (current_kboard->Vlast_command, Vself_insert_face_command))
189fad68 530 {
049749e6
RS
531 Fput_text_property (make_number (PT - 1), make_number (PT),
532 Qface, Vself_insert_face, Qnil);
189fad68
RS
533 Vself_insert_face = Qnil;
534 }
e744155a 535
cd645247 536 if ((synt == Sclose || synt == Smath)
2718dfa4
RS
537 && !NILP (Vblink_paren_function) && INTERACTIVE
538 && !noautofill)
cd645247
JB
539 {
540 call0 (Vblink_paren_function);
aa52fef9 541 hairy = 2;
cd645247
JB
542 }
543 return hairy;
544}
545\f
546/* module initialization */
547
dfcf069d 548void
cd645247
JB
549syms_of_cmds ()
550{
d67b4f80 551 Qkill_backward_chars = intern_c_string ("kill-backward-chars");
cd645247
JB
552 staticpro (&Qkill_backward_chars);
553
d67b4f80 554 Qkill_forward_chars = intern_c_string ("kill-forward-chars");
cd645247
JB
555 staticpro (&Qkill_forward_chars);
556
d67b4f80 557 Qoverwrite_mode_binary = intern_c_string ("overwrite-mode-binary");
6bbb0d4a 558 staticpro (&Qoverwrite_mode_binary);
e686c647 559
d67b4f80 560 Qexpand_abbrev = intern_c_string ("expand-abbrev");
53abaf54
SM
561 staticpro (&Qexpand_abbrev);
562
189fad68 563 DEFVAR_LISP ("self-insert-face", &Vself_insert_face,
335c5470
PJ
564 doc: /* If non-nil, set the face of the next self-inserting character to this.
565See also `self-insert-face-command'. */);
189fad68
RS
566 Vself_insert_face = Qnil;
567
568 DEFVAR_LISP ("self-insert-face-command", &Vself_insert_face_command,
335c5470
PJ
569 doc: /* This is the command that set up `self-insert-face'.
570If `last-command' does not equal this value, we ignore `self-insert-face'. */);
189fad68
RS
571 Vself_insert_face_command = Qnil;
572
cd645247 573 DEFVAR_LISP ("blink-paren-function", &Vblink_paren_function,
335c5470
PJ
574 doc: /* Function called, if non-nil, whenever a close parenthesis is inserted.
575More precisely, a char with closeparen syntax is self-inserted. */);
cd645247
JB
576 Vblink_paren_function = Qnil;
577
9e4fd67b 578 defsubr (&Sforward_point);
cd645247
JB
579 defsubr (&Sforward_char);
580 defsubr (&Sbackward_char);
581 defsubr (&Sforward_line);
582 defsubr (&Sbeginning_of_line);
583 defsubr (&Send_of_line);
584
585 defsubr (&Sdelete_char);
cd645247 586 defsubr (&Sself_insert_command);
cd645247
JB
587}
588
dfcf069d 589void
cd645247
JB
590keys_of_cmds ()
591{
592 int n;
593
1ac9108a 594 nonundocount = 0;
cbf65115 595 initial_define_key (global_map, Ctl ('I'), "self-insert-command");
cd645247
JB
596 for (n = 040; n < 0177; n++)
597 initial_define_key (global_map, n, "self-insert-command");
cf9cdc11
RS
598#ifdef MSDOS
599 for (n = 0200; n < 0240; n++)
600 initial_define_key (global_map, n, "self-insert-command");
601#endif
94748cb9 602 for (n = 0240; n < 0400; n++)
eb46da6a 603 initial_define_key (global_map, n, "self-insert-command");
cd645247
JB
604
605 initial_define_key (global_map, Ctl ('A'), "beginning-of-line");
606 initial_define_key (global_map, Ctl ('B'), "backward-char");
cd645247
JB
607 initial_define_key (global_map, Ctl ('E'), "end-of-line");
608 initial_define_key (global_map, Ctl ('F'), "forward-char");
cd645247 609}
6b61353c
KH
610
611/* arch-tag: 022ba3cd-67f9-4978-9c5d-7d2b18d8644e
612 (do not change this comment) */