From 65bd19ff8af487f16c55d250967321c0ee3e58a0 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Fri, 11 Nov 2011 10:55:24 -0500 Subject: [PATCH] * 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. --- lisp/ChangeLog | 6 ++++++ lisp/electric.el | 31 +++++++++++++++++-------------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 0e617e9c66d..6cd58cd3d22 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,9 @@ +2011-11-11 Stefan Monnier + + * 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 * window.el (windows-with-parameter): Remove unused function. 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. -- 2.39.2