[Top][All Lists]
[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);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] /srv/bzr/emacs/trunk r101267: * lisp/simple.el (blink-paren-function): Move from C to here.,
Stefan Monnier <=