aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Monnier <[email protected]>2011-11-11 10:55:24 -0500
committerStefan Monnier <[email protected]>2011-11-11 10:55:24 -0500
commit65bd19ff8af487f16c55d250967321c0ee3e58a0 (patch)
treeaaca9068680d57d77519b9a579f925baae1fd5dd
parent5e92ca23ec308f2f72736ca2767f5329707ce5f3 (diff)
* lisp/electric.el: Make electric-indent-mode better behaved.
* lisp/electric.el (electric-indent-post-self-insert-function): Make it possible for a char to only indent in some circumstances. (electric-indent-mode): Simplify.
-rw-r--r--lisp/ChangeLog6
-rw-r--r--lisp/electric.el31
2 files changed, 23 insertions, 14 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 0e617e9c66..6cd58cd3d2 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,9 @@
+2011-11-11 Stefan Monnier <[email protected]>
+
+ * electric.el (electric-indent-post-self-insert-function): Make it
+ possible for a char to only indent in some circumstances.
+ (electric-indent-mode): Simplify.
+
2011-11-11 Martin Rudalics <[email protected]>
* window.el (windows-with-parameter): Remove unused function.
diff --git a/lisp/electric.el b/lisp/electric.el
index 3d7c1fd8ac..69acb77364 100644
--- a/lisp/electric.el
+++ b/lisp/electric.el
@@ -197,7 +197,11 @@ Returns nil when we can't find this char."
;; value, which only works well if the variable is preloaded.
;;;###autoload
(defvar electric-indent-chars '(?\n)
- "Characters that should cause automatic reindentation.")
+ "Characters that should cause automatic reindentation.
+Each entry of the list can be either a character or a cons of the
+form (CHAR . PREDICATE) which means that CHAR should cause reindentation
+only if PREDICATE returns non-nil. PREDICATE is called with no arguments
+and with point before the inserted char.")
(defun electric-indent-post-self-insert-function ()
;; FIXME: This reindents the current line, but what we really want instead is
@@ -208,7 +212,12 @@ Returns nil when we can't find this char."
;; There might be a way to get it working by analyzing buffer-undo-list, but
;; it looks challenging.
(let (pos)
- (when (and (memq last-command-event electric-indent-chars)
+ (when (and (or (memq last-command-event electric-indent-chars)
+ (let ((cp (assq last-command-event electric-indent-chars)))
+ (and cp (setq pos (electric--after-char-pos))
+ (save-excursion
+ (goto-char (1- pos))
+ (funcall (cdr cp))))))
;; Don't reindent while inserting spaces at beginning of line.
(or (not (memq last-command-event '(?\s ?\t)))
(save-excursion (skip-chars-backward " \t") (not (bolp))))
@@ -253,19 +262,13 @@ in `electric-indent-chars'."
:group 'electricity
(if electric-indent-mode
(add-hook 'post-self-insert-hook
- #'electric-indent-post-self-insert-function)
+ #'electric-indent-post-self-insert-function
+ ;; post-self-insert-hooks interact in non-trivial ways.
+ ;; It turns out that electric-indent-mode generally works
+ ;; better last.
+ 'append)
(remove-hook 'post-self-insert-hook
- #'electric-indent-post-self-insert-function))
- ;; FIXME: electric-indent-mode and electric-layout-mode interact
- ;; in non-trivial ways. It turns out that electric-indent-mode works
- ;; better if it is run *after* electric-layout-mode's hook.
- (when (memq #'electric-layout-post-self-insert-function
- (memq #'electric-indent-post-self-insert-function
- (default-value 'post-self-insert-hook)))
- (remove-hook 'post-self-insert-hook
- #'electric-layout-post-self-insert-function)
- (add-hook 'post-self-insert-hook
- #'electric-layout-post-self-insert-function)))
+ #'electric-indent-post-self-insert-function)))
;; Electric pairing.