From c0c30dd15f9f66e5d5422eb9d04d22329187fc20 Mon Sep 17 00:00:00 2001 From: Jonathan Yavner Date: Thu, 15 May 2008 19:24:57 +0000 Subject: [PATCH] * ses.el (ses-goto-print): Use move-to-column rather than forward-char. (ses-print-cell): Use string-width, truncate-string-to-width, delete-region rather than length, substring, delete-char. (ses-setup): Set inhibit-point-motion-hooks to t. Calculate position by actually moving point rather than just using unibyte character length. (ses-mode): Set indent-tabs-mode to nil. (ses-center): Use string-width rather than length. --- lisp/ChangeLog | 12 ++++++++++++ lisp/ses.el | 39 +++++++++++++++++++++++++++++++-------- 2 files changed, 43 insertions(+), 8 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 6504f1cfdbf..bec5c389e1c 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,15 @@ +2008-05-15 Shigeru Fukaya + + * ses.el (ses-goto-print): Use move-to-column rather than + forward-char. + (ses-print-cell): Use string-width, truncate-string-to-width, + delete-region rather than length, substring, delete-char. + (ses-setup): Set inhibit-point-motion-hooks to t. Calculate + position by actually moving point rather than just using unibyte + character length. + (ses-mode): Set indent-tabs-mode to nil. + (ses-center): Use string-width rather than length. + 2008-05-15 Eric S. Raymond * vc-cvs.el, vc-git.el, vc-hg.el, vc-hooks.el, vc-mcvs.el, diff --git a/lisp/ses.el b/lisp/ses.el index 64b966bfa91..4bd88975c58 100644 --- a/lisp/ses.el +++ b/lisp/ses.el @@ -726,11 +726,18 @@ if the cell's value is unchanged and FORCE is nil." ;;ses-goto-print is called during a recursive ses-print-cell). (defun ses-goto-print (row col) "Move point to print area for cell (ROW,COL)." - (let ((inhibit-point-motion-hooks t)) + (let ((inhibit-point-motion-hooks t) + (n 0)) (goto-char (point-min)) (forward-line row) + ;; calculate column position (dotimes (c col) - (forward-char (1+ (ses-col-width c)))))) + (setq n (+ n (ses-col-width c) 1))) + ;; move to the position + (and (> n (move-to-column n)) + (eolp) + ;; move point to the bol of next line (for TAB at the last cell) + (forward-char)))) (defun ses-set-curcell () "Sets `ses--curcell' to the current cell symbol, or a cons (BEG,END) for a @@ -806,7 +813,7 @@ preceding cell has spilled over." (setq sig ses-call-printer-return)))) ;;Adjust print width to match column width (let ((width (ses-col-width col)) - (len (length text))) + (len (string-width text))) (cond ((< len width) ;;Fill field to length with spaces @@ -834,7 +841,7 @@ preceding cell has spilled over." (setq sig `(error "Too wide" ,text)) (cond ((stringp value) - (setq text (substring text 0 maxwidth))) + (setq text (truncate-string-to-width text maxwidth 0 ?\s))) ((and (numberp value) (string-match "\\.[0-9]+" text) (>= 0 (setq width @@ -855,7 +862,11 @@ preceding cell has spilled over." ;;Install the printed result. This is not interruptible. (let ((inhibit-read-only t) (inhibit-quit t)) - (delete-char (1+ (length text))) + (let ((inhibit-point-motion-hooks t)) + (delete-region (point) (progn + (move-to-column (+ (current-column) + (string-width text))) + (1+ (point))))) ;;We use concat instead of inserting separate strings in order to ;;reduce the number of cells in the undo list. (setq x (concat text (if (< maxcol ses--numcols) " " "\n"))) @@ -1443,6 +1454,7 @@ Narrows the buffer to show only the print area. Gives it `read-only' and (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 @@ -1466,7 +1478,14 @@ Narrows the buffer to show only the print area. Gives it `read-only' and (eq (ses-cell-value row (1+ col)) '*skip*)) (setq end (+ end (ses-col-width col) 1) col (1+ col))) - (setq end (+ end (ses-col-width col) 1)) + (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 @@ -1519,7 +1538,10 @@ These are active only in the minibuffer, when entering or editing a formula: ;;SES deliberately puts lots of trailing whitespace in its buffer show-trailing-whitespace nil ;;Cell ranges do not work reasonably without this - transient-mark-mode t) + transient-mark-mode t + ;;not to use tab characters for safe + ;;(tabs may do bad for column calculation) + indent-tabs-mode nil) (1value (add-hook 'change-major-mode-hook 'ses-cleanup nil t)) (1value (add-hook 'before-revert-hook 'ses-cleanup nil t)) (setq ses--curcell nil @@ -2938,7 +2960,8 @@ columns to include in width (default = 0)." (setq value (ses-call-printer printer value)) (dotimes (x span) (setq width (+ width 1 (ses-col-width (+ col span (- x)))))) - (setq width (- width (length value))) + ;; set column width + (setq width (- width (string-width value))) (if (<= width 0) value ;Too large for field, anyway (setq half (make-string (/ width 2) fill)) -- 2.39.2