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.

* etc/ORG-NEWS (Structure templates now respect case used in
~org-structure-template-alist~): Document the change.
This commit is contained in:
Ihor Radchenko 2022-03-20 20:15:21 +08:00
parent 65e19a0812
commit 9632401dc6
No known key found for this signature in database
GPG Key ID: 6470762A7DA11D8B
3 changed files with 30 additions and 11 deletions

View File

@ -222,6 +222,11 @@ produce results superior to Minted or Listings.
*** Support for =#+include=-ing URLs
=#+include: FILE= will now accept URLs as the file.
*** Structure templates now respect case used in ~org-structure-template-alist~
The block type in ~org-structure-template-alist~ is not case-sensitive.
When the block type starts from the upper case, structure template
will now insert =#+BEGIN_TYPE=. Previously, lower-case =#+begin_type= was inserted unconditionally.
** New functions and changes in function arguments

View File

@ -118,11 +118,18 @@ Go through `org-structure-template-alist' and
"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)

View File

@ -8601,9 +8601,11 @@ keywords relative to each registered export back-end."
("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
@ -8735,18 +8737,23 @@ If an element cannot be made unique, an error is raised."
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))
@ -8754,7 +8761,7 @@ block."
(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)
@ -8763,7 +8770,7 @@ block."
(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")))