* 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.
This commit is contained in:
parent
4de81ee0d2
commit
8f4e9110ca
4 changed files with 69 additions and 66 deletions
|
@ -1,5 +1,9 @@
|
|||
2010-09-01 Stefan Monnier <monnier@iro.umontreal.ca>
|
||||
|
||||
* 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.
|
||||
|
|
|
@ -5607,7 +5607,23 @@ it skips the contents of comments that end before point."
|
|||
(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;
|
||||
|
|
|
@ -1,3 +1,11 @@
|
|||
2010-09-01 Stefan Monnier <monnier@iro.umontreal.ca>
|
||||
|
||||
* 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 <monnier@iro.umontreal.ca>
|
||||
|
||||
* keyboard.c (Fwindow_system): Fix compilation for USE_LISP_UNION_TYPE.
|
||||
|
|
105
src/cmds.c
105
src/cmds.c
|
@ -32,7 +32,7 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|||
#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 @@ After insertion, the value of `auto-fill-function' is called if the
|
|||
{
|
||||
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 Qexpand_abbrev;
|
|||
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 @@ internal_self_insert (int c, int noautofill)
|
|||
/* 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 @@ internal_self_insert (int c, int noautofill)
|
|||
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 @@ internal_self_insert (int c, int noautofill)
|
|||
|
||||
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 @@ internal_self_insert (int c, int noautofill)
|
|||
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 @@ internal_self_insert (int c, int noautofill)
|
|||
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 @@ syms_of_cmds (void)
|
|||
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);
|
||||
|
|
Loading…
Add table
Reference in a new issue