From 6f5e57e773c9a72bce9d8c2f261923d1853b734f Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sat, 3 Dec 2011 00:01:41 -0500 Subject: [PATCH] * lisp/electric.el: Streamline electric-indent's hook. (electric-indent-chars): Revert to simple list. (electric-indent-functions): New var. (electric-indent-post-self-insert-function): Use it. --- lisp/ChangeLog | 5 +++++ lisp/electric.el | 41 +++++++++++++++++++++++------------------ 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 33e20f297a9..8da2c0f5e71 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,10 @@ 2011-12-03 Stefan Monnier + * electric.el: Streamline electric-indent's hook. + (electric-indent-chars): Revert to simple list. + (electric-indent-functions): New var. + (electric-indent-post-self-insert-function): Use it. + * progmodes/prolog.el (prolog-find-value-by-system): Avoid error when there's no inferior buffer (bug#10196). (prolog-consult-compile): Don't use toggle-read-only. diff --git a/lisp/electric.el b/lisp/electric.el index 657b577bb1e..1a8bf9f89ed 100644 --- a/lisp/electric.el +++ b/lisp/electric.el @@ -197,11 +197,13 @@ 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. -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.") + "Characters that should cause automatic reindentation.") + +(defvar electric-indent-functions nil + "Special hook run to decide whether to auto-indent. +Each function is called with one argument (the inserted char), with +point right after that char, and it should return t to cause indentation, +`no-indent' to prevent indentation or nil to let other functions decide.") (defun electric-indent-post-self-insert-function () ;; FIXME: This reindents the current line, but what we really want instead is @@ -212,18 +214,21 @@ and with point before the inserted char.") ;; There might be a way to get it working by analyzing buffer-undo-list, but ;; it looks challenging. (let (pos) - (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)))) - (setq pos (electric--after-char-pos)) - ;; Not in a string or comment. - (not (nth 8 (save-excursion (syntax-ppss pos))))) + (when (and + ;; 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)))) + (setq pos (electric--after-char-pos)) + (save-excursion + (goto-char pos) + (let ((act (or (run-hook-with-args-until-success + 'electric-indent-functions + last-command-event) + (memq last-command-event electric-indent-chars)))) + (not + (or (memq act '(nil no-indent)) + ;; In a string or comment. + (unless (eq act 'do-indent) (nth 8 (syntax-ppss)))))))) ;; For newline, we want to reindent both lines and basically behave like ;; reindent-then-newline-and-indent (whose code we hence copied). (when (< (1- pos) (line-beginning-position)) @@ -231,7 +236,7 @@ and with point before the inserted char.") (save-excursion (unless (memq indent-line-function '(indent-relative indent-to-left-margin - indent-relative-maybe)) + indent-relative-maybe)) ;; Don't reindent the previous line if the indentation function ;; is not a real one. (goto-char before) -- 2.39.2