;; 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
;; 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))))
: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.