+(defun ses-plist-delq (plist prop)
+ "Return PLIST after deleting the first pair (if any) with symbol PROP.
+This can alter PLIST."
+ (cond
+ ((null plist) nil)
+ ((eq (car plist) prop) (cddr plist))
+ (t (let* ((plist-1 (cdr plist))
+ (plist-2 (cdr plist-1)))
+ (setcdr plist-1 (ses-plist-delq plist-2 prop))
+ plist))))
+
+(defvar ses--ses-buffer-list nil "A list of buffers containing a SES spreadsheet.")
+
+(defun ses--unbind-cell-name (name)
+ "Make NAME non longer a renamed cell name."
+ (remhash name ses--named-cell-hashmap)
+ (kill-local-variable name)
+ ;; remove symbol property 'ses-cell from symbol NAME, unless this
+ ;; symbol is also a renamed cell name in another SES buffer.
+ (let (used-elsewhere (buffer-list ses--ses-buffer-list) buf)
+ (while buffer-list
+ (setq buf (pop buffer-list))
+ (cond
+ ((eq buf (current-buffer)))
+ ;; This case should not happen, some SES buffer has been
+ ;; killed without the ses-killbuffer-hook being called.
+ ((null (buffer-live-p buf))
+ ;; Silently repair ses--ses-buffer-list
+ (setq ses--ses-buffer-list (delq buf ses--ses-buffer-list)))
+ (t
+ (with-current-buffer buf
+ (when (gethash name ses--named-cell-hashmap)
+ (setq used-elsewhere t
+ buffer-list nil))))))
+ (unless used-elsewhere
+ (setplist name (ses-plist-delq (symbol-plist name) 'ses-cell))) ))