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