mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-05 22:20:24 -08:00
electric-layout-mode kicks in before electric-pair-mode
This aims to solve problems with indentation. Previously in, say, a
js-mode buffer with electric-layout-rules set to
(?\{ before after)
(?\} before)
would produce an intended:
function ()
{
<indented point>
}
The initial state
function () {
Would go immediately to the following by e-p-m
function () {}
Only then would e-l-m be applied to } first, and then again to {.
This makes lines indent in the wrong order, which can be a problem in
some modes.
The way we fix this is by reversing the order of e-p-m and e-l-m in
the post-self-insert-hook (and also fixing a number of details that
this uncovered). In the end this changes the sequence from
function () {
By way of e-l-m becomes:
function () <newline>
{
<newline>
The e-p-m inserts the pair
function () <newline>
{
<newline>}
And then e-l-m kicks in for the pair again, yielding the desired result
function () <newline>
{
<indented point>
}
* lisp/elec-pair.el (electric-pair--insert): Bind
electric-layout-no-duplicate-newlines.
(electric-pair-inhibit-if-helps-balance)
(electric-pair-skip-if-helps-balance): Use insert-before-markers,
playing nice with save-excurion.
(electric-pair-post-self-insert-function): Go to correct position
before checking electric-pair-inhibit-predicate and
electric-pair-skip-self predicate.
(electric-pair-post-self-insert-function): Increase priority to
50.
* lisp/electric.el (electric-indent-post-self-insert-function):
Delete trailing space in reindented line only if line was
really reindented. Rewrite comment.
(electric-layout-allow-duplicate-newlines): New variable.
(electric-layout-post-self-insert-function-1): Rewrite comments.
Honours electric-layout-allow-duplicate-newlines. Don't reindent
previous line because racecar.
* test/lisp/electric-tests.el: New test.
(plainer-c-mode): Move up.
(electric-modes-int-main-allman-style)
(electric-layout-int-main-kernel-style): Simplify
electric-layout-rules.
(electric-layout-for-c-style-du-jour): New helper.
(electric-layout-plainer-c-mode-use-c-style): New test.
This commit is contained in:
parent
6ca4626c9f
commit
fd94312443
3 changed files with 113 additions and 40 deletions
|
|
@ -227,7 +227,8 @@ inside a comment or string."
|
|||
(defun electric-pair--insert (char)
|
||||
(let ((last-command-event char)
|
||||
(blink-matching-paren nil)
|
||||
(electric-pair-mode nil))
|
||||
(electric-pair-mode nil)
|
||||
(electric-layout-allow-duplicate-newlines t))
|
||||
(self-insert-command 1)))
|
||||
|
||||
(cl-defmacro electric-pair--with-uncached-syntax ((table &optional start) &rest body)
|
||||
|
|
@ -426,11 +427,10 @@ happened."
|
|||
(eq (cdr outermost) pair)))))
|
||||
((eq syntax ?\")
|
||||
(electric-pair--unbalanced-strings-p char))))
|
||||
(insert-char char)))))
|
||||
(insert-before-markers char)))))
|
||||
|
||||
(defun electric-pair-skip-if-helps-balance (char)
|
||||
"Return non-nil if skipping CHAR would benefit parentheses' balance.
|
||||
|
||||
Works by first removing the character from the buffer, then doing
|
||||
some list calculations, finally restoring the situation as if nothing
|
||||
happened."
|
||||
|
|
@ -452,7 +452,7 @@ happened."
|
|||
(not (eq (cdr outermost) pair)))))))
|
||||
((eq syntax ?\")
|
||||
(electric-pair--inside-string-p char))))
|
||||
(insert-char char)))))
|
||||
(insert-before-markers char)))))
|
||||
|
||||
(defun electric-pair-default-skip-self (char)
|
||||
(if electric-pair-preserve-balance
|
||||
|
|
@ -498,7 +498,9 @@ happened."
|
|||
((and (memq syntax '(?\) ?\" ?\$))
|
||||
(and (or unconditional
|
||||
(if (functionp electric-pair-skip-self)
|
||||
(funcall electric-pair-skip-self last-command-event)
|
||||
(save-excursion
|
||||
(goto-char pos)
|
||||
(funcall electric-pair-skip-self last-command-event))
|
||||
electric-pair-skip-self))
|
||||
(save-excursion
|
||||
(when (and (not (and unconditional
|
||||
|
|
@ -525,8 +527,10 @@ happened."
|
|||
((and (memq syntax '(?\( ?\" ?\$))
|
||||
(not overwrite-mode)
|
||||
(or unconditional
|
||||
(not (funcall electric-pair-inhibit-predicate
|
||||
last-command-event))))
|
||||
(not (save-excursion
|
||||
(goto-char pos)
|
||||
(funcall electric-pair-inhibit-predicate
|
||||
last-command-event)))))
|
||||
(save-excursion (electric-pair--insert pair)))))
|
||||
(_
|
||||
(when (and (if (functionp electric-pair-open-newline-between-pairs)
|
||||
|
|
@ -540,7 +544,7 @@ happened."
|
|||
(matching-paren (char-after))))
|
||||
(save-excursion (newline 1 t)))))))
|
||||
|
||||
(put 'electric-pair-post-self-insert-function 'priority 20)
|
||||
(put 'electric-pair-post-self-insert-function 'priority 50)
|
||||
|
||||
(defun electric-pair-will-use-region ()
|
||||
(and (use-region-p)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue