From c44d4581b74b8281ed365cce750713da8ad4a5fa Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Tue, 30 Sep 2014 11:33:03 -0400 Subject: [PATCH] * lisp/ses.el (ses-setup): Don't assume modifying the iteration var of dotimes affects the iteration. Fixes: debbugs:18191 --- lisp/ChangeLog | 5 +++++ lisp/ses.el | 71 ++++++++++++++++++++++++++++------------------------------ 2 files changed, 39 insertions(+), 37 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 42c5df288a0..234a84771f1 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,8 @@ +2014-09-30 Stefan Monnier + + * ses.el (ses-setup): Don't assume modifying the iteration var of + dotimes affects the iteration (bug#18191). + 2014-09-30 Vincent Belaïche * ses.el (ses-calculate-cell): bind row and col dynamically to diff --git a/lisp/ses.el b/lisp/ses.el index 11250ec4097..025c2c45073 100644 --- a/lisp/ses.el +++ b/lisp/ses.el @@ -1870,45 +1870,42 @@ Narrows the buffer to show only the print area. Gives it `read-only' and `intangible' properties. Sets up highlighting for current cell." (interactive) (let ((end (point-min)) - (inhibit-read-only t) (inhibit-point-motion-hooks t) - (was-modified (buffer-modified-p)) pos sym) - (ses-goto-data 0 0) ; Include marker between print-area and data-area. - (set-text-properties (point) (point-max) nil) ; Delete garbage props. - (mapc 'delete-overlay (overlays-in (point-min) (point-max))) - ;; The print area is read-only (except for our special commands) and uses a - ;; special keymap. - (put-text-property (point-min) (1- (point)) 'read-only 'ses) - (put-text-property (point-min) (1- (point)) 'keymap 'ses-mode-print-map) - ;; For the beginning of the buffer, we want the read-only and keymap - ;; attributes to be inherited from the first character. - (put-text-property (point-min) (1+ (point-min)) 'front-sticky t) - ;; Create intangible properties, which also indicate which cell the text - ;; came from. - (dotimes-with-progress-reporter (row ses--numrows) "Finding cells..." - (dotimes (col ses--numcols) - (setq pos end - sym (ses-cell-symbol row col)) - ;; Include skipped cells following this one. - (while (and (< col (1- ses--numcols)) - (eq (ses-cell-value row (1+ col)) '*skip*)) - (setq end (+ end (ses-col-width col) 1) - col (1+ col))) - (setq end (save-excursion - (goto-char pos) - (move-to-column (+ (current-column) (- end pos) - (ses-col-width col))) - (if (eolp) - (+ end (ses-col-width col) 1) - (forward-char) - (point)))) - (put-text-property pos end 'intangible sym))) - ;; Adding these properties did not actually alter the text. - (unless was-modified - (restore-buffer-modified-p nil) - (buffer-disable-undo) - (buffer-enable-undo))) + (with-silent-modifications + (ses-goto-data 0 0) ; Include marker between print-area and data-area. + (set-text-properties (point) (point-max) nil) ; Delete garbage props. + (mapc 'delete-overlay (overlays-in (point-min) (point-max))) + ;; The print area is read-only (except for our special commands) and + ;; uses a special keymap. + (put-text-property (point-min) (1- (point)) 'read-only 'ses) + (put-text-property (point-min) (1- (point)) 'keymap 'ses-mode-print-map) + ;; For the beginning of the buffer, we want the read-only and keymap + ;; attributes to be inherited from the first character. + (put-text-property (point-min) (1+ (point-min)) 'front-sticky t) + ;; Create intangible properties, which also indicate which cell the text + ;; came from. + (dotimes-with-progress-reporter (row ses--numrows) "Finding cells..." + (dotimes (col ses--numcols) + (setq pos end + sym (ses-cell-symbol row col)) + (unless (eq (symbol-value sym) '*skip*) + ;; Include skipped cells following this one. + (while (and (< col (1- ses--numcols)) + (eq (ses-cell-value row (1+ col)) '*skip*)) + (setq end (+ end (ses-col-width col) 1) + ;; Beware: Modifying the iteration variable of `dotimes' + ;; may or may not affect the iteration! + col (1+ col))) + (setq end (save-excursion + (goto-char pos) + (move-to-column (+ (current-column) (- end pos) + (ses-col-width col))) + (if (eolp) + (+ end (ses-col-width col) 1) + (forward-char) + (point)))) + (put-text-property pos end 'intangible sym)))))) ;; Create the underlining overlay. It's impossible for (point) to be 2, ;; because column A must be at least 1 column wide. (setq ses--curcell-overlay (make-overlay (1+ (point-min)) (1+ (point-min)))) -- 2.11.4.GIT