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 (local-variable-p new-name)
(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)))