Function: ses-define-local-printer

ses-define-local-printer is an interactive and byte-compiled function defined in ses.el.gz.

Signature

(ses-define-local-printer NAME DEFINITION)

Documentation

Define a local printer with name NAME and definition DEFINITION.

NAME shall be a symbol. Use TAB to complete over existing local printer names.

DEFINITION shall be either a string formatter, e.g.:

  "%.2f" or ("%.2f") for left alignment.

or a lambda expression, e.g. for formatting in ISO format dates created with a (calcFunc-date YEAR MONTH DAY) formula:

  (lambda (x)
     (cond
      ((null val) "")
      ((eq (car-safe x) 'date)
       (let ((calc-format-date '(X YYYY "-" MM "-" DD)))
         (math-format-date x)))
      (t (ses-center-span val ?# 'ses-prin1))))

If NAME is already used to name a local printer function, then the current definition is proposed as default value, and the function is redefined.

Probably introduced at or before Emacs version 25.1.

Key Bindings

Source Code

;; Defined in /usr/src/emacs/lisp/ses.el.gz
(defun ses-define-local-printer (name definition)
  "Define a local printer with name NAME and definition DEFINITION.

NAME shall be a symbol.  Use TAB to complete over existing local
printer names.

DEFINITION shall be either a string formatter, e.g.:

  \"%.2f\" or (\"%.2f\")  for left alignment.

or a lambda expression, e.g. for formatting in ISO format dates
created with a `(calcFunc-date YEAR MONTH DAY)' formula:

  (lambda (x)
     (cond
      ((null val) \"\")
      ((eq (car-safe x) \\='date)
       (let ((calc-format-date \\='(X YYYY \"-\" MM \"-\" DD)))
         (math-format-date x)))
      (t (ses-center-span val ?# \\='ses-prin1))))

If NAME is already used to name a local printer function, then
the current definition is proposed as default value, and the
function is redefined."
  (interactive
   (let (name def already-defined-names)
     (maphash (lambda (key _val) (push (symbol-name key) already-defined-names))
              ses--local-printer-hashmap)
     (setq name (completing-read    "Enter printer name: " already-defined-names))
     (when (string= name "")
       (error "Invalid printer name"))
     (setq name (intern name))
     (let* ((cur-printer (gethash name ses--local-printer-hashmap))
            (default (and cur-printer (ses--locprn-def cur-printer))))
            (setq def (ses-read-printer (format-prompt
                                         "Enter definition of printer %S"
                                         default name)
                                        default)))
            (list name def)))

  (let* ((cur-printer (gethash name ses--local-printer-hashmap))
	 (default (and cur-printer (ses--locprn-def cur-printer)))
	 create-printer)
    (cond
     ;; canceled operation => do nothing
     ((eq definition t))
     ;; no change => do nothing
     ((and cur-printer (equal definition default)))
     ;; re-defined printer
     (cur-printer
      (setq create-printer 0)
      (setf (ses--locprn-def cur-printer) definition)
      (ses-refresh-local-printer
       name
       (setf (ses--locprn-compiled cur-printer)
             (ses-local-printer-compile definition))))
     ;; new definition
     (t
      (setq create-printer 1)
      (puthash name
	       (setq cur-printer
		     (ses-make-local-printer-info definition))
	       ses--local-printer-hashmap)))
    (when create-printer
      (let ((printer-def-text
             (concat
              "(ses-local-printer "
              (symbol-name name)
              " "
              (prin1-to-string (ses--locprn-def cur-printer))
              ")")))
        (save-excursion
          (ses-goto-data ses--numrows
                         (ses--locprn-number cur-printer))
          (let ((inhibit-read-only t))
            ;; Special undo since it's outside the narrowed buffer.
            (let (buffer-undo-list)
              (if (= create-printer 0)
                  (delete-region (point) (line-end-position))
                (insert ?\n)
                (backward-char))
              (insert printer-def-text)
              (when (= create-printer 1)
                (ses-file-format-extend-parameter-list 3)
                (ses-set-parameter 'ses--numlocprn
                                   (1+ ses--numlocprn))))))))))