changeset 110160:c32f6ba217a2

* lisp/simple.el (newline): Fix last change to properly remove itself from the hook.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Fri, 03 Sep 2010 13:12:46 +0200
parents 2fe16dc7896c
children eb977e012180
files lisp/ChangeLog lisp/simple.el
diffstat 2 files changed, 42 insertions(+), 32 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Fri Sep 03 06:10:04 2010 +0000
+++ b/lisp/ChangeLog	Fri Sep 03 13:12:46 2010 +0200
@@ -1,3 +1,8 @@
+2010-09-03  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* simple.el (newline): Fix last change to properly remove itself from
+	the hook.
+
 2010-09-02  Stefan Monnier  <monnier@iro.umontreal.ca>
 
 	* simple.el (newline): Eliminate optimization.
--- a/lisp/simple.el	Fri Sep 03 06:10:04 2010 +0000
+++ b/lisp/simple.el	Fri Sep 03 13:12:46 2010 +0200
@@ -457,38 +457,43 @@
 than the value of `fill-column' and ARG is nil."
   (interactive "*P")
   (barf-if-buffer-read-only)
-  (let ((was-page-start (and (bolp)
-			     (looking-at page-delimiter)))
-	(beforepos (point)))
-    ;; Call self-insert so that auto-fill, abbrev expansion etc. happens.
-    ;; Set last-command-event to tell self-insert what to insert.
-    (let ((last-command-event ?\n)
-	  ;; Don't auto-fill if we have a numeric argument.
-	  (auto-fill-function (if arg nil auto-fill-function))
-          (post-self-insert-hook post-self-insert-hook))
-      ;; Do the rest in post-self-insert-hook, because we want to do it
-      ;; *before* other functions on that hook.
-      (add-hook 'post-self-insert-hook
-                (lambda ()
-                  ;; Mark the newline(s) `hard'.
-                  (if use-hard-newlines
-                      (set-hard-newline-properties
-                       (- (point) (prefix-numeric-value arg)) (point)))
-                  ;; If the newline leaves the previous line blank, and we
-                  ;; have a left margin, delete that from the blank line.
-                  (save-excursion
-                    (goto-char beforepos)
-                    (beginning-of-line)
-                    (and (looking-at "[ \t]$")
-                         (> (current-left-margin) 0)
-                         (delete-region (point)
-                                        (line-end-position))))
-                  ;; Indent the line after the newline, except in one case:
-                  ;; when we added the newline at the beginning of a line which
-                  ;; starts a page.
-                  (or was-page-start
-                      (move-to-left-margin nil t))))
-      (self-insert-command (prefix-numeric-value arg))))
+  ;; Call self-insert so that auto-fill, abbrev expansion etc. happens.
+  ;; Set last-command-event to tell self-insert what to insert.
+  (let* ((was-page-start (and (bolp) (looking-at page-delimiter)))
+         (beforepos (point))
+         (last-command-event ?\n)
+         ;; Don't auto-fill if we have a numeric argument.
+         (auto-fill-function (if arg nil auto-fill-function))
+         (postproc
+          ;; Do the rest in post-self-insert-hook, because we want to do it
+          ;; *before* other functions on that hook.
+          (lambda ()
+            ;; Mark the newline(s) `hard'.
+            (if use-hard-newlines
+                (set-hard-newline-properties
+                 (- (point) (prefix-numeric-value arg)) (point)))
+            ;; If the newline leaves the previous line blank, and we
+            ;; have a left margin, delete that from the blank line.
+            (save-excursion
+              (goto-char beforepos)
+              (beginning-of-line)
+              (and (looking-at "[ \t]$")
+                   (> (current-left-margin) 0)
+                   (delete-region (point)
+                                  (line-end-position))))
+            ;; Indent the line after the newline, except in one case:
+            ;; when we added the newline at the beginning of a line which
+            ;; starts a page.
+            (or was-page-start
+                (move-to-left-margin nil t)))))
+    (unwind-protect
+        (progn
+          (add-hook 'post-self-insert-hook postproc)
+          (self-insert-command (prefix-numeric-value arg)))
+      ;; We first used let-binding to protect the hook, but that was naive
+      ;; since add-hook affects the symbol-default value of the variable,
+      ;; whereas the let-binding might only protect the buffer-local value.
+      (remove-hook 'post-self-insert-hook postproc)))
   nil)
 
 (defun set-hard-newline-properties (from to)