Commit e4ef7a2e authored by João Távora's avatar João Távora

Handle entries of multiple symbols in electric-layout-rules

Instead of allowing multiple rules in electric-layout-rules, allow
rules to specify multiple symbols.  This should be entirely
backward-compatible to existing customizations of that variable.

* lisp/electric.el (electric-layout-rules):  a single entry can
specify multiple symbols.
(electric-layout-post-self-insert-function-1):  rework.

* test/lisp/electric-tests.el: Update tests to work with new semantics
  of electric-layout-rules.
parent e02256cf
......@@ -365,15 +365,21 @@ use `electric-indent-local-mode'."
Each rule has the form (CHAR . WHERE) where CHAR is the char that
was just inserted and WHERE specifies where to insert newlines
and can be: nil, `before', `after', `around', `after-stay', or a
function of no arguments that returns one of those symbols.
and can be:
The symbols specify where in relation to CHAR the newline
character(s) should be inserted. `after-stay' means insert a
* one of the symbols `before', `after', `around' and `after-stay';
* a list of the preceding symbols, processed in order of
appearance to insert multiple newlines;
* a function of no arguments that returns one of the previous
values.
Each symbol specifies where in relation to CHAR the newline
character(s) should be inserted. `after-stay' means insert a
newline after CHAR but stay in the same place.
If multiple rules match, they are all executed in order of
appearance.")
If multiple rules match, only first one is executed.")
(defun electric-layout-post-self-insert-function ()
(when electric-layout-mode
......@@ -381,25 +387,24 @@ appearance.")
;; for edebug's sake, a separate function
(defun electric-layout-post-self-insert-function-1 ()
(let (pos end)
(when (and (setq pos (electric--after-char-pos))
(let (pos
(rule (cdr (assq last-command-event electric-layout-rules))))
(when (and rule
(setq pos (electric--after-char-pos))
;; Not in a string or comment.
(not (nth 8 (save-excursion (syntax-ppss pos)))))
(goto-char pos)
(setq end (point-marker))
(dolist (rule electric-layout-rules)
(when (eq last-command-event (car rule))
(let* ((rule (cdr rule))
(sym (if (functionp rule) (funcall rule) rule))
(nl-after
(when (functionp rule) (setq rule (funcall rule)))
(dolist (sym (if (symbolp rule) (list rule) rule))
(let* ((nl-after
(lambda ()
;; FIXME: we use `newline'which calls
;; self-insert-command and ran
;; post-self-insert-hook recursively. It
;; happened to make electric-indent-mode work
;; automatically with electric-layout-mode (at
;; the cost of re-indenting lines multiple
;; times), but I'm not sure it's what we want.
;; FIXME: we use `newline', which calls
;; `self-insert-command' and ran
;; `post-self-insert-hook' recursively. It
;; happened to make `electric-indent-mode' work
;; automatically with `electric-layout-mode' (at
;; the cost of re-indenting lines multiple times),
;; but I'm not sure it's what we want.
;;
;; FIXME: when `newline'ing, we exceptionally
;; prevent a specific behaviour of
......@@ -422,7 +427,7 @@ appearance.")
('before (funcall nl-before))
('after (funcall nl-after))
('after-stay (save-excursion (funcall nl-after)))
('around (funcall nl-before) (funcall nl-after)))))))))
('around (funcall nl-before) (funcall nl-after))))))))
(put 'electric-layout-post-self-insert-function 'priority 40)
......
......@@ -823,8 +823,7 @@ baz\"\""
(electric-pair-local-mode 1)
(electric-indent-local-mode 1)
(setq-local electric-layout-rules
'((?\{ . after)
(?\{ . after-stay)))
'((?\{ . (after after-stay))))
(insert "int main () ")
(let ((last-command-event ?\{))
(call-interactively (key-binding `[,last-command-event])))
......@@ -838,9 +837,7 @@ baz\"\""
(electric-pair-local-mode 1)
(electric-indent-local-mode 1)
(setq-local electric-layout-rules
'((?\{ . before)
(?\{ . after)
(?\{ . after-stay)))
'((?\{ . (before after after-stay))))
(insert "int main () ")
(let ((last-command-event ?\{))
(call-interactively (key-binding `[,last-command-event])))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment