branch: elpa/annotate commit 65338aff67b235671b92475bb62642fd69c5bf45 Author: cage <cage@invalid> Commit: cage <cage@invalid>
- improved expansion map to include a swith to enable trimming of commands' output. --- README.org | 7 +++---- annotate.el | 25 ++++++++++++++++--------- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/README.org b/README.org index b8a0b7faf4..036c875cbd 100644 --- a/README.org +++ b/README.org @@ -223,17 +223,16 @@ Whether annotations should be saved after each user action, e.g. new annotation ** annotate-annotation-expansion-map -The Expansion map for the annotation text. If a substring in the annotation text matches the string in the car value of each cons cell of this alist, it is expanded with the results of passing the cdr of each cell to a system shell. Example below. +The expansion map for the annotation text. If a substring in the annotation text matches the string in the first item of each element of this list, it will be expanded with the results of passing the second item — as a command — to a system shell, if the third item is not null, the output string of the command's results will be trimmed (spaces or some others non printable characters will be removed from both ends, see: `string-trim'). Example below. The expression: #+BEGIN_SRC lisp (setf annotate-annotation-expansion-map - '(("%d" . "date +%Y-%m-%d"))) + '((\"%d\" \"date +%Y-%m-%d\" t))) #+END_SRC -Will expand any occurrence of "%d" in the annotation's text with -the current date (format: "YYYY-MM-DD"). +Will expand any occurrence of \"%d\" in the annotation's text with the current date (format: \"YYYY-MM-DD\"), moreover the results will be trimmed. * More documentation diff --git a/annotate.el b/annotate.el index 69176f4656..fbaa32b382 100644 --- a/annotate.el +++ b/annotate.el @@ -257,16 +257,15 @@ e.g. new annotation created, existing one amended or deleted." :type 'boolean) (defcustom annotate-annotation-expansion-map '() - "The expansion map for the annotation text. If a substring in the annotation text matches the string in the car value of each cons cell of this alist, it is expanded with the results of passing the cdr of each cell to a system shell. Example below. + "The expansion map for the annotation text. If a substring in the annotation text matches the string in the first item of each element of this list, it is expanded with the results of passing the second item — as a command — to a system shell, if the third item is not null, the output string of the command's results are trimmed (spaces or some others non printable characters are removed from both ends, see: `string-trim'). Example below. The expression: (setf annotate-annotation-expansion-map - '((\"%d\" . \"date +%Y-%m-%d\"))) + '((\"%d\" \"date +%Y-%m-%d\" t))) -Will expand any occurrence of \"%d\" in the annotation's text with -the current date (format: \"YYYY-MM-DD\")" - :type '(alist :key-type string :value-type string)) +Will expand any occurrence of \"%d\" in the annotation's text with the current date (format: \"YYYY-MM-DD\"), moreover the results will be trimmed" + :type '(repeat (list string string boolean))) (defconst annotate-prop-chain-position 'position) @@ -740,17 +739,25 @@ specified by `FROM' and `TO'." (buffer-substring-no-properties from to))) (defun annotate--expand-annotation-text (annotation-text) + (cl-flet ((regex (expansion-item) + (cl-first expansion-item)) + (trimp (expansion-item) + (cl-third expansion-item)) + (command (expansion-item) + (cl-second expansion-item))) (cl-loop with results = annotation-text for expansion in annotate-annotation-expansion-map - when (string-match-p (car expansion) results) - do (let ((expansion-results (string-trim (shell-command-to-string (cdr expansion))))) + when (string-match-p (regex expansion) results) + do (let ((expansion-results (shell-command-to-string (command expansion)))) + (when (trimp expansion) + (setf expansion-results (string-trim expansion-results))) (setf results - (replace-regexp-in-string (car expansion) + (replace-regexp-in-string (regex expansion) expansion-results results t t))) - finally (return results))) + finally (return results)))) (defun annotate-annotate (&optional color-index) "Create, modify, or delete annotation.