X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/430d2ee2919b2d4693780f2474ba40148442d206..74f53697495eeb2caaa73d100d19591c0ee7bfaf:/lisp/ses.el diff --git a/lisp/ses.el b/lisp/ses.el index ced4994c9f..b52d3e23c7 100644 --- a/lisp/ses.el +++ b/lisp/ses.el @@ -1,6 +1,6 @@ ;;; ses.el -- Simple Emacs Spreadsheet -*- coding: utf-8 -*- -;; Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +;; Copyright (C) 2002-2011 Free Software Foundation, Inc. ;; Author: Jonathan Yavner ;; Maintainer: Jonathan Yavner @@ -8,10 +8,10 @@ ;; This file is part of GNU Emacs. -;; GNU Emacs is free software; you can redistribute it and/or modify +;; GNU Emacs is free software: you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. ;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -19,9 +19,7 @@ ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -;; Boston, MA 02110-1301, USA. +;; along with GNU Emacs. If not, see . ;;; Commentary: @@ -728,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 @@ -808,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 @@ -836,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 @@ -857,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"))) @@ -1445,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 @@ -1468,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 @@ -1521,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 @@ -2940,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)) @@ -2985,15 +3006,9 @@ current column and continues until the next nonblank column." (dolist (fun '(copy-region-as-kill yank)) (ad-remove-advice fun 'around (intern (concat "ses-" (symbol-name fun)))) (ad-update fun)) - (save-current-buffer - (dolist (buf (buffer-list)) - (set-buffer buf) - (when (eq major-mode 'ses-mode) - (funcall (or default-major-mode 'fundamental-mode))))) ;; continue standard unloading nil) (provide 'ses) -;; arch-tag: 88c1ccf0-4293-4824-8c5d-0757b52217f3 ;;; ses.el ends here