diff options
author | Stefan Monnier <monnier@iro.umontreal.ca> | 2011-11-11 10:55:24 -0500 |
---|---|---|
committer | Stefan Monnier <monnier@iro.umontreal.ca> | 2011-11-11 10:55:24 -0500 |
commit | 65bd19ff8af487f16c55d250967321c0ee3e58a0 (patch) | |
tree | aaca9068680d57d77519b9a579f925baae1fd5dd /lisp/electric.el | |
parent | 5e92ca23ec308f2f72736ca2767f5329707ce5f3 (diff) | |
download | emacs-65bd19ff8af487f16c55d250967321c0ee3e58a0.tar.gz |
* 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.
Diffstat (limited to 'lisp/electric.el')
-rw-r--r-- | lisp/electric.el | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/lisp/electric.el b/lisp/electric.el index 3d7c1fd8ac4..69acb773648 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. |