X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/335c5470b52f0c9a387314a5323c4de57a137fb7..e5a3b7d9690daa0827ca68074c4fa904eb552e63:/src/cmds.c diff --git a/src/cmds.c b/src/cmds.c index 09362a7f5d..6145869117 100644 --- a/src/cmds.c +++ b/src/cmds.c @@ -1,5 +1,5 @@ /* Simple built-in editing commands. - Copyright (C) 1985, 93, 94, 95, 96, 97, 1998, 2001 Free Software Foundation, Inc. + Copyright (C) 1985, 93, 94, 95, 96, 97, 1998, 2001, 02 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -42,6 +42,7 @@ Lisp_Object Vself_insert_face; Lisp_Object Vself_insert_face_command; extern Lisp_Object Qface; +extern Lisp_Object Vtranslation_table_for_input; DEFUN ("forward-point", Fforward_point, Sforward_point, 1, 1, 0, doc: /* Return buffer position N characters after (before if N negative) point. */) @@ -161,7 +162,7 @@ starts at a field boundary, point does not move. To ignore field boundaries, either bind `inhibit-field-text-motion' to t, or use the `forward-line' function instead. For instance, `(forward-line 0)' does the same thing as `(beginning-of-line)', except that it ignores field -boundaries. */) +boundaries. */) (n) Lisp_Object n; { @@ -171,7 +172,7 @@ boundaries. */) CHECK_NUMBER (n); SET_PT (XINT (Fline_beginning_position (n))); - + return Qnil; } @@ -179,6 +180,7 @@ DEFUN ("end-of-line", Fend_of_line, Send_of_line, 0, 1, "p", doc: /* Move point to end of current line. With argument N not nil or 1, move forward N - 1 lines first. If point reaches the beginning or end of buffer, it stops there. +To ignore intangibility, bind `inhibit-text-motion-hooks' to t. This command does not move point across a field boundary unless doing so would move beyond there to a different line; if N is nil or 1, and @@ -187,12 +189,38 @@ boundaries bind `inhibit-field-text-motion' to t. */) (n) Lisp_Object n; { + int newpos; + if (NILP (n)) XSETFASTINT (n, 1); else CHECK_NUMBER (n); - SET_PT (XINT (Fline_end_position (n))); + while (1) + { + newpos = XINT (Fline_end_position (n)); + SET_PT (newpos); + + if (PT > newpos + && FETCH_CHAR (PT - 1) == '\n') + { + /* If we skipped over a newline that follows + an invisible intangible run, + move back to the last tangible position + within the line. */ + + SET_PT (PT - 1); + break; + } + else if (PT > newpos && PT < ZV + && FETCH_CHAR (PT) != '\n') + /* If we skipped something intangible + and now we're not really at eol, + keep going. */ + n = make_number (1); + else + break; + } return Qnil; } @@ -272,10 +300,10 @@ N was explicitly specified. */) && ! deleted_special && ! (PT == ZV || FETCH_BYTE (PT_BYTE) == '\n')) { - int column = current_column (); + int column = (int) current_column (); /* iftc */ value = Fdelete_char (make_number (-XINT (n)), killflag); - i = column - current_column (); + i = column - (int) current_column (); /* iftc */ Finsert_char (make_number (' '), make_number (i), Qnil); /* Whitespace chars are ASCII chars, so we can simply subtract. */ SET_PT_BOTH (PT - i, PT_BYTE - i); @@ -286,45 +314,49 @@ N was explicitly specified. */) return value; } +/* Note that there's code in command_loop_1 which typically avoids + calling this. */ DEFUN ("self-insert-command", Fself_insert_command, Sself_insert_command, 1, 1, "p", doc: /* Insert the character you type. Whichever character you type to run this command is inserted. */) (n) Lisp_Object n; { - int character = XINT (last_command_char); - CHECK_NUMBER (n); /* Barf if the key that invoked this was not a character. */ if (!INTEGERP (last_command_char)) bitch_at_user (); - else if (XINT (n) >= 2 && NILP (current_buffer->overwrite_mode)) - { - int modified_char = character; - /* Add the offset to the character, for Finsert_char. - We pass internal_self_insert the unmodified character - because it itself does this offsetting. */ - if (! NILP (current_buffer->enable_multibyte_characters)) - modified_char = unibyte_char_to_multibyte (modified_char); - - XSETFASTINT (n, XFASTINT (n) - 2); - /* The first one might want to expand an abbrev. */ - internal_self_insert (character, 1); - /* The bulk of the copies of this char can be inserted simply. - We don't have to handle a user-specified face specially - because it will get inherited from the first char inserted. */ - Finsert_char (make_number (modified_char), n, Qt); - /* The last one might want to auto-fill. */ - internal_self_insert (character, 0); - } - else - while (XINT (n) > 0) + { + int character = translate_char (Vtranslation_table_for_input, + XINT (last_command_char), 0, 0, 0); + if (XINT (n) >= 2 && NILP (current_buffer->overwrite_mode)) { - /* Ok since old and new vals both nonneg */ - XSETFASTINT (n, XFASTINT (n) - 1); - internal_self_insert (character, XFASTINT (n) != 0); + int modified_char = character; + /* Add the offset to the character, for Finsert_char. + We pass internal_self_insert the unmodified character + because it itself does this offsetting. */ + if (! NILP (current_buffer->enable_multibyte_characters)) + modified_char = unibyte_char_to_multibyte (modified_char); + + XSETFASTINT (n, XFASTINT (n) - 2); + /* The first one might want to expand an abbrev. */ + internal_self_insert (character, 1); + /* The bulk of the copies of this char can be inserted simply. + We don't have to handle a user-specified face specially + because it will get inherited from the first char inserted. */ + Finsert_char (make_number (modified_char), n, Qt); + /* The last one might want to auto-fill. */ + internal_self_insert (character, 0); } + else + while (XINT (n) > 0) + { + /* Ok since old and new vals both nonneg */ + XSETFASTINT (n, XFASTINT (n) - 1); + internal_self_insert (character, XFASTINT (n) != 0); + } + } return Qnil; } @@ -404,7 +436,7 @@ internal_self_insert (c, noautofill) && ! (c2 == '\t' && XINT (current_buffer->tab_width) > 0 && XFASTINT (current_buffer->tab_width) < 20 - && (target_clm = (current_column () + && (target_clm = ((int) current_column () /* iftc */ + XINT (Fchar_width (make_number (c)))), target_clm % XFASTINT (current_buffer->tab_width))))) {