]> code.delx.au - gnu-emacs/blobdiff - src/cmds.c
*** empty log message ***
[gnu-emacs] / src / cmds.c
index 21706d4ba80a0e0475659edd2f0a5f75c151d029..2e63b2fbb52d8ad6f238a1ced6f8d4bf909f287f 100644 (file)
@@ -1,5 +1,6 @@
 /* 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, 03
+             Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
@@ -42,6 +43,7 @@ Lisp_Object Vself_insert_face;
 Lisp_Object Vself_insert_face_command;
 
 extern Lisp_Object Qface;
+extern Lisp_Object Vtranslation_table_for_input;
 \f
 DEFUN ("forward-point", Fforward_point, Sforward_point, 1, 1, 0,
        doc: /* Return buffer position N characters after (before if N negative) point.  */)
@@ -161,7 +163,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 +173,7 @@ boundaries.  */)
     CHECK_NUMBER (n);
 
   SET_PT (XINT (Fline_beginning_position (n)));
-  
+
   return Qnil;
 }
 
@@ -179,6 +181,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 +190,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 +301,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 +315,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 (!CHARACTERP (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));
+    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;
 }
@@ -336,12 +369,13 @@ Whichever character you type to run this command is inserted.  */)
    return 0.  A value of 1 indicates this *might* not have been simple.
    A value of 2 means this did things that call for an undo boundary.  */
 
+static Lisp_Object Qexpand_abbrev;
+
 int
 internal_self_insert (c, noautofill)
      int c;
      int noautofill;
 {
-  extern Lisp_Object Fexpand_abbrev ();
   int hairy = 0;
   Lisp_Object tem;
   register enum syntaxcode synt;
@@ -403,7 +437,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)))))
        {
@@ -453,7 +487,7 @@ internal_self_insert (c, noautofill)
       int modiff = MODIFF;
       Lisp_Object sym;
 
-      sym = Fexpand_abbrev ();
+      sym = call0 (Qexpand_abbrev);
 
       /* If we expanded an abbrev which has a hook,
         and the hook has a non-nil `no-self-insert' property,
@@ -540,6 +574,9 @@ syms_of_cmds ()
   Qoverwrite_mode_binary = intern ("overwrite-mode-binary");
   staticpro (&Qoverwrite_mode_binary);
 
+  Qexpand_abbrev = intern ("expand-abbrev");
+  staticpro (&Qexpand_abbrev);
+
   DEFVAR_LISP ("self-insert-face", &Vself_insert_face,
               doc: /* If non-nil, set the face of the next self-inserting character to this.
 See also `self-insert-face-command'.  */);