Function: ses-rename-cell

ses-rename-cell is an interactive and byte-compiled function defined in ses.el.gz.

Signature

(ses-rename-cell NEW-NAME &optional CELL)

Documentation

Rename current cell.

Probably introduced at or before Emacs version 24.4.

Key Bindings

Source Code

;; Defined in /usr/src/emacs/lisp/ses.el.gz
(defun ses-rename-cell (new-name &optional cell)
  "Rename current cell."
  (interactive "*SEnter new name: ")
  (or
   (and (ses-is-cell-sym-p new-name)
	(error "Already a cell name"))
   (and (boundp new-name)
	(null (yes-or-no-p
	       (format-message
		"`%S' is already bound outside this buffer, continue? "
		new-name)))
	(error "Already a bound cell name")))
  (let* (curcell
	 (sym (if (ses-cell-p cell)
		  (ses-cell-symbol cell)
		(setq cell nil
		      curcell t)
		(ses-check-curcell)
		ses--curcell))
	 (rowcol (ses-sym-rowcol sym))
	 (row (car rowcol))
	 (col (cdr rowcol))
	 new-rowcol old-name old-value)
    (setq cell (or cell (ses-get-cell row col))
	  old-name (ses-cell-symbol cell)
          old-value (symbol-value old-name)
	  new-rowcol (ses-decode-cell-symbol (symbol-name new-name)))
    ;; when ses-rename-cell is called interactively, then 'sym' is the
    ;; 'cursor-intangible' property of text at cursor position, while
    ;; 'old-name' is the symbol stored in array cell at coordinate
    ;; 'rowcol' corresponding to 'ses-cell' property of symbol
    ;; 'sym'. Both must be the same.
    (unless (eq sym old-name)
      (error "Spreadsheet is broken, both symbols %S and %S referring to cell (%d,%d)" sym old-name row col))
    (if new-rowcol
        ;; the new name is of A1 type, so we test that the coordinate
        ;; inferred from new name
	(if (equal new-rowcol rowcol)
            (put new-name 'ses-cell rowcol)
	  (error "Not a valid name for this cell location"))
      (setq ses--named-cell-hashmap
            (or ses--named-cell-hashmap (make-hash-table :test 'eq)))
      (put new-name 'ses-cell :ses-named)
      (puthash new-name rowcol ses--named-cell-hashmap))
    (push `(ses-rename-cell ,old-name ,cell) buffer-undo-list)
    (cl-pushnew rowcol ses--deferred-write :test #'equal)
    ;; Replace name by new name in formula of cells referring to renamed cell.
    (dolist (ref (ses-cell-references cell))
      (let* ((x (ses-sym-rowcol ref))
	     (xcell  (ses-get-cell (car x) (cdr x))))
        (cl-pushnew x ses--deferred-write :test #'equal)
	(setf (ses-cell-formula xcell)
              (ses-replace-name-in-formula
               (ses-cell-formula xcell)
               old-name
               new-name))))
    ;; Replace name by new name in reference list of cells to which renamed
    ;; cell refers to.
    (dolist (ref (ses-formula-references (ses-cell-formula cell)))
      (let* ((x (ses-sym-rowcol ref))
	     (xcell (ses-get-cell (car x) (cdr x))))
        (cl-pushnew x ses--deferred-write :test #'equal)
	(setf (ses-cell-references xcell)
              (cons new-name (delq old-name
                                   (ses-cell-references xcell))))))
    (set (make-local-variable new-name) (symbol-value sym))
    (setf (ses-cell--symbol cell) new-name)
    ;; set new name to value
    (set new-name old-value)
    ;; Unbind old name
    (if (eq (get old-name 'ses-cell) :ses-named)
        (ses--unbind-cell-name old-name)
      (kill-local-variable old-name))
    (and curcell (setq ses--curcell new-name))
    (save-excursion
      (or curcell (ses-goto-print row col))
      (let* ((pos (point))
             (inhibit-read-only t)
             (end  (next-single-property-change pos 'cursor-intangible)))
        (put-text-property pos end 'cursor-intangible new-name)))
    ;; Update the cell name in the mode-line.
    (force-mode-line-update)))