emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] /srv/bzr/emacs/trunk r101267: * lisp/simple.el (blink-pare


From: Stefan Monnier
Subject: [Emacs-diffs] /srv/bzr/emacs/trunk r101267: * lisp/simple.el (blink-paren-function): Move from C to here.
Date: Wed, 01 Sep 2010 16:41:17 +0200
User-agent: Bazaar (2.0.3)

------------------------------------------------------------
revno: 101267
committer: Stefan Monnier <address@hidden>
branch nick: trunk
timestamp: Wed 2010-09-01 16:41:17 +0200
message:
  * lisp/simple.el (blink-paren-function): Move from C to here.
  (blink-paren-post-self-insert-function): New function.
  (post-self-insert-hook): Use it.
  * src/cmds.c (Vblink_paren_function): Remove.
  (internal_self_insert): Make it insert N chars at a time.
  Don't call blink-paren-function.
  (Fself_insert_command): Adjust accordingly.
  (syms_of_cmds): Don't declare blink-paren-function.
modified:
  lisp/ChangeLog
  lisp/simple.el
  src/ChangeLog
  src/cmds.c
=== modified file 'lisp/ChangeLog'
--- a/lisp/ChangeLog    2010-09-01 10:03:08 +0000
+++ b/lisp/ChangeLog    2010-09-01 14:41:17 +0000
@@ -1,5 +1,9 @@
 2010-09-01  Stefan Monnier  <address@hidden>
 
+       * simple.el (blink-paren-function): Move from C to here.
+       (blink-paren-post-self-insert-function): New function.
+       (post-self-insert-hook): Use it.
+
        * emacs-lisp/pcase.el (pcase-split-memq):
        Fix overenthusiastic optimisation.
        (pcase-u1): Handle the case of a lambda pred.

=== modified file 'lisp/simple.el'
--- a/lisp/simple.el    2010-08-29 16:17:13 +0000
+++ b/lisp/simple.el    2010-09-01 14:41:17 +0000
@@ -5607,7 +5607,23 @@
             (message "Matches %s"
                      (substring-no-properties open-paren-line-string)))))))))
 
-(setq blink-paren-function 'blink-matching-open)
+(defvar blink-paren-function 'blink-matching-open
+  "Function called, if non-nil, whenever a close parenthesis is inserted.
+More precisely, a char with closeparen syntax is self-inserted.")
+
+(defun blink-paren-post-self-insert-function ()
+  (when (and (eq (char-before) last-command-event) ; Sanity check.
+             (memq (char-syntax last-command-event) '(?\) ?\$))
+             blink-paren-function
+             (not executing-kbd-macro)
+             (not noninteractive))
+    (funcall blink-paren-function)))
+
+(add-hook 'post-self-insert-hook #'blink-paren-post-self-insert-function
+          ;; Most likely, this hook is nil, so this arg doesn't matter,
+          ;; but I use it as a reminder that this function usually
+          ;; likes to be run after others since it does `sit-for'.
+          'append)
 
 ;; This executes C-g typed while Emacs is waiting for a command.
 ;; Quitting out of a program does not go through here;

=== modified file 'src/ChangeLog'
--- a/src/ChangeLog     2010-08-31 19:42:39 +0000
+++ b/src/ChangeLog     2010-09-01 14:41:17 +0000
@@ -1,3 +1,11 @@
+2010-09-01  Stefan Monnier  <address@hidden>
+
+       * cmds.c (Vblink_paren_function): Remove.
+       (internal_self_insert): Make it insert N chars at a time.
+       Don't call blink-paren-function.
+       (Fself_insert_command): Adjust accordingly.
+       (syms_of_cmds): Don't declare blink-paren-function.
+
 2010-08-31  Stefan Monnier  <address@hidden>
 
        * keyboard.c (Fwindow_system): Fix compilation for USE_LISP_UNION_TYPE.

=== modified file 'src/cmds.c'
--- a/src/cmds.c        2010-08-19 15:43:45 +0000
+++ b/src/cmds.c        2010-09-01 14:41:17 +0000
@@ -32,7 +32,7 @@
 #include "dispextern.h"
 #include "frame.h"
 
-Lisp_Object Qkill_forward_chars, Qkill_backward_chars, Vblink_paren_function;
+Lisp_Object Qkill_forward_chars, Qkill_backward_chars;
 
 /* A possible value for a buffer's overwrite-mode variable.  */
 Lisp_Object Qoverwrite_mode_binary;
@@ -304,36 +304,16 @@
   {
     int character = translate_char (Vtranslation_table_for_input,
                                    XINT (last_command_event));
-    if (XINT (n) >= 2 && NILP (current_buffer->overwrite_mode))
-      {
-       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 (character), n, Qt);
-       /* The last one might want to auto-fill.  */
-       internal_self_insert (character, 0);
-      }
-    else
-      while (XINT (n) > 0)
-       {
-         int val;
-         /* Ok since old and new vals both nonneg */
-         XSETFASTINT (n, XFASTINT (n) - 1);
-         val = internal_self_insert (character, XFASTINT (n) != 0);
-         if (val == 2)
-           nonundocount = 0;
-         frame_make_pointer_invisible ();
-       }
+    int val = internal_self_insert (character, XFASTINT (n));
+    if (val == 2)
+      nonundocount = 0;
+    frame_make_pointer_invisible ();
   }
 
   return Qnil;
 }
 
-/* Insert character C.  If NOAUTOFILL is nonzero, don't do autofill
-   even if it is enabled.
+/* Insert N times character C
 
    If this insertion is suitable for direct output (completely simple),
    return 0.  A value of 1 indicates this *might* not have been simple.
@@ -343,12 +323,12 @@
 static Lisp_Object Qpost_self_insert_hook, Vpost_self_insert_hook;
 
 static int
-internal_self_insert (int c, int noautofill)
+internal_self_insert (int c, int n)
 {
   int hairy = 0;
   Lisp_Object tem;
   register enum syntaxcode synt;
-  Lisp_Object overwrite, string;
+  Lisp_Object overwrite;
   /* Length of multi-byte form of C.  */
   int len;
   /* Working buffer and pointer for multi-byte form of C.  */
@@ -391,32 +371,22 @@
       /* This is the character after point.  */
       int c2 = FETCH_CHAR (PT_BYTE);
 
-      /* Column the cursor should be placed at after this insertion.
-         The correct value should be calculated only when necessary.  */
-      int target_clm = 0;
-
       /* Overwriting in binary-mode always replaces C2 by C.
         Overwriting in textual-mode doesn't always do that.
         It inserts newlines in the usual way,
         and inserts any character at end of line
         or before a tab if it doesn't use the whole width of the tab.  */
-      if (EQ (overwrite, Qoverwrite_mode_binary)
-         || (c != '\n'
-             && c2 != '\n'
-             && ! (c2 == '\t'
-                   && XINT (current_buffer->tab_width) > 0
-                   && XFASTINT (current_buffer->tab_width) < 20
-                   && (target_clm = ((int) current_column () /* iftc */
-                                     + XINT (Fchar_width (make_number (c)))),
-                       target_clm % XFASTINT (current_buffer->tab_width)))))
+      if (EQ (overwrite, Qoverwrite_mode_binary))
+       chars_to_delete = n;
+      else if (c != '\n' && c2 != '\n')
        {
          int pos = PT;
          int pos_byte = PT_BYTE;
+         /* Column the cursor should be placed at after this insertion.
+            The correct value should be calculated only when necessary.  */
+         int target_clm = ((int) current_column () /* iftc */
+                           + n * XINT (Fchar_width (make_number (c))));
 
-         if (target_clm == 0)
-           chars_to_delete = 1;
-         else
-           {
              /* The actual cursor position after the trial of moving
                 to column TARGET_CLM.  It is greater than TARGET_CLM
                 if the TARGET_CLM is middle of multi-column
@@ -428,14 +398,18 @@
              chars_to_delete = PT - pos;
 
              if (actual_clm > target_clm)
-               {
-                 /* We will delete too many columns.  Let's fill columns
+           { /* We will delete too many columns.  Let's fill columns
                     by spaces so that the remaining text won't move.  */
+             EMACS_INT actual = PT_BYTE;
+             DEC_POS (actual);
+             if (FETCH_CHAR (actual) == '\t')
+               /* Rather than add spaces, let's just keep the tab. */
+               chars_to_delete--;
+             else
                  spaces_to_insert = actual_clm - target_clm;
                }
-           }
+
          SET_PT_BOTH (pos, pos_byte);
-         hairy = 2;
        }
       hairy = 2;
     }
@@ -474,16 +448,30 @@
 
   if (chars_to_delete)
     {
-      string = make_string_from_bytes (str, 1, len);
+      int mc = ((NILP (current_buffer->enable_multibyte_characters)
+                && SINGLE_BYTE_CHAR_P (c))
+               ? UNIBYTE_TO_CHAR (c) : c);
+      Lisp_Object string = Fmake_string (make_number (n), make_number (mc));
+                                         
       if (spaces_to_insert)
        {
          tem = Fmake_string (make_number (spaces_to_insert),
                              make_number (' '));
-         string = concat2 (tem, string);
+         string = concat2 (string, tem);
        }
 
       replace_range (PT, PT + chars_to_delete, string, 1, 1, 1);
-      Fforward_char (make_number (1 + spaces_to_insert));
+      Fforward_char (make_number (n + spaces_to_insert));
+    }
+  else if (n > 1)
+    {
+      USE_SAFE_ALLOCA;
+      unsigned char *strn, *p;
+      SAFE_ALLOCA (strn, unsigned char*, n * len);
+      for (p = strn; n > 0; n--, p += len)
+       memcpy (p, str, len);
+      insert_and_inherit (strn, p - strn);
+      SAFE_FREE ();
     }
   else
     insert_and_inherit (str, len);
@@ -491,7 +479,6 @@
   if ((CHAR_TABLE_P (Vauto_fill_chars)
        ? !NILP (CHAR_TABLE_REF (Vauto_fill_chars, c))
        : (c == ' ' || c == '\n'))
-      && !noautofill
       && !NILP (current_buffer->auto_fill_function))
     {
       Lisp_Object tem;
@@ -509,13 +496,6 @@
        hairy = 2;
     }
 
-  if ((synt == Sclose || synt == Smath)
-      && !NILP (Vblink_paren_function) && INTERACTIVE
-      && !noautofill)
-    {
-      call0 (Vblink_paren_function);
-      hairy = 2;
-    }
   /* Run hooks for electric keys.  */
   call1 (Vrun_hooks, Qpost_self_insert_hook);
 
@@ -547,11 +527,6 @@
 This run is run after inserting the charater.  */);
   Vpost_self_insert_hook = Qnil;
 
-  DEFVAR_LISP ("blink-paren-function", &Vblink_paren_function,
-              doc: /* Function called, if non-nil, whenever a close 
parenthesis is inserted.
-More precisely, a char with closeparen syntax is self-inserted.  */);
-  Vblink_paren_function = Qnil;
-
   defsubr (&Sforward_point);
   defsubr (&Sforward_char);
   defsubr (&Sbackward_char);


reply via email to

[Prev in Thread] Current Thread [Next in Thread]