From b39925decd0e5ee5a0ce88b3fcea3a9647d35001 Mon Sep 17 00:00:00 2001 Message-Id: From: Ihor Radchenko Date: Sun, 20 Mar 2022 20:15:21 +0800 Subject: [PATCH] Auto-Upcase/downcase #+begin/#+end in structure templates * lisp/org-tempo.el (org-tempo-add-block): * lisp/org.el (org-insert-structure-template): When inserting #+begin_type/#+end_type, follow type's case. TYPE will become #+BEGIN_TYPE and type will become #+bein_type. (org-insert-structure-template): Make sure that we use case-insensitive match even when user changes case-fold-search value. (org-structure-template-alist): Clarify selection of #+BEGIN/END vs. #+begin/end in the docstring. --- lisp/org-tempo.el | 13 ++++++++++--- lisp/org.el | 23 +++++++++++++++-------- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/lisp/org-tempo.el b/lisp/org-tempo.el index b34007bf7..cd5ef9e8e 100644 --- a/lisp/org-tempo.el +++ b/lisp/org-tempo.el @@ -119,11 +119,18 @@ (defun org-tempo-add-block (entry) "Add block entry from `org-structure-template-alist'." (let* ((key (format "<%s" (car entry))) (name (cdr entry)) - (special (member name '("src" "export")))) + (special (member name '("src" "export"))) + (upcase? (string= (car (split-string name)) + (upcase (car (split-string name)))))) (tempo-define-template (format "org-%s" (replace-regexp-in-string " " "-" name)) - `(,(format "#+begin_%s%s" name (if special " " "")) + `(,(format "#+%s_%s%s" + (if upcase? "BEGIN" "begin") + name + (if special " " "")) ,(when special 'p) '> n ,(unless special 'p) n - ,(format "#+end_%s" (car (split-string name " "))) + ,(format "#+%s_%s" + (if upcase? "END" "end") + (car (split-string name " "))) >) key (format "Insert a %s block" name) diff --git a/lisp/org.el b/lisp/org.el index 9455c15c8..529146097 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -9490,9 +9490,11 @@ (defcustom org-structure-template-alist ("s" . "src") ("v" . "verse")) "An alist of keys and block types. -`org-insert-structure-template' will display a menu with this -list of templates to choose from. The block type is inserted, -with \"#+BEGIN_\" and \"#+END_\" added automatically. +`org-insert-structure-template' will display a menu with this list of +templates to choose from. The block type is inserted, with +\"#+begin_\" and \"#+end_\" added automatically. If the block type +consists of just uppercase letters, \"#+BEGIN_\" and \"#+END_\" are +added instead. The menu keys are defined by the car of each entry in this alist. If two entries have the keys \"a\" and \"aa\" respectively, the @@ -9624,18 +9626,23 @@ (defun org-insert-structure-template (type) Select a block from `org-structure-template-alist' then type either RET, TAB or SPC to write the block type. With an active region, wrap the region in the block. Otherwise, insert an empty -block." +block. + +When foo is written as FOO, upcase the #+BEGIN/END as well." (interactive (list (pcase (org--insert-structure-template-mks) (`("\t" . ,_) (read-string "Structure type: ")) (`(,_ ,choice . ,_) choice)))) - (let* ((region? (use-region-p)) + (let* ((case-fold-search t) ; Make sure that matches are case-insensitive. + (region? (use-region-p)) (region-start (and region? (region-beginning))) (region-end (and region? (copy-marker (region-end)))) (extended? (string-match-p "\\`\\(src\\|export\\)\\'" type)) (verbatim? (string-match-p (concat "\\`" (regexp-opt '("example" "export" "src"))) - type))) + type)) + (upcase? (string= (car (split-string type)) + (upcase (car (split-string type)))))) (when region? (goto-char region-start)) (let ((column (current-indentation))) (if (save-excursion (skip-chars-backward " \t") (bolp)) @@ -9643,7 +9650,7 @@ (defun org-insert-structure-template (type) (insert "\n")) (save-excursion (indent-to column) - (insert (format "#+begin_%s%s\n" type (if extended? " " ""))) + (insert (format "#+%s_%s%s\n" (if upcase? "BEGIN" "begin") type (if extended? " " ""))) (when region? (when verbatim? (org-escape-code-in-region (point) region-end)) (goto-char region-end) @@ -9652,7 +9659,7 @@ (defun org-insert-structure-template (type) (end-of-line)) (unless (bolp) (insert "\n")) (indent-to column) - (insert (format "#+end_%s" (car (split-string type)))) + (insert (format "#+%s_%s" (if upcase? "END" "end") (car (split-string type)))) (if (looking-at "[ \t]*$") (replace-match "") (insert "\n")) (when (and (eobp) (not (bolp))) (insert "\n"))) -- 2.34.1