* [BUG] Hard-coded begin/end in org-insert-structure-template [9.5.2 (release_9.5.2-24-g668205 @ /Users/salutis/src/emacs/nextstep/Emacs.app/Contents/Resources/lisp/org/)]
@ 2022-03-20 11:43 Rudolf Adamkovič
2022-03-20 12:25 ` [PATCH] " Ihor Radchenko
0 siblings, 1 reply; 6+ messages in thread
From: Rudolf Adamkovič @ 2022-03-20 11:43 UTC (permalink / raw)
To: emacs-orgmode
Remember to cover the basics, that is, what you expected to happen and
what in fact did happen. You don't know how to make a good report? See
https://orgmode.org/manual/Feedback.html#Feedback
Your bug report will be posted to the Org mailing list.
------------------------------------------------------------------------
Hello smart people!
Inspired by Protesilaos Stavrou, I started using uppercase Org keywords.
I like the results so far, but I also noticed some inflexibility in the
Org mode. Specifically, the `org-insert-structure-template' procedure
hard-codes lowercase "begin_" and "end_". Thus, even if one customizes
the `org-structure-template-alist' with uppercase keywords, Org still
inserts them as "begin_SRC". Given that Org lets the user pick their
preferred style, I consider this a bug.
Rudy
Emacs : GNU Emacs 29.0.50 (build 14, x86_64-apple-darwin21.2.0, NS appkit-2113.20 Version 12.1 (Build 21C52))
of 2022-03-15
Package: Org mode version 9.5.2 (release_9.5.2-24-g668205 @ /Users/salutis/src/emacs/nextstep/Emacs.app/Contents/Resources/lisp/org/)
--
"Thinking is a momentary dismissal of irrelevancies."
-- Richard Buckminster Fuller, 1969
Rudolf Adamkovič <salutis@me.com> [he/him]
Studenohorská 25
84103 Bratislava
Slovakia
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH] Re: [BUG] Hard-coded begin/end in org-insert-structure-template [9.5.2 (release_9.5.2-24-g668205 @ /Users/salutis/src/emacs/nextstep/Emacs.app/Contents/Resources/lisp/org/)]
2022-03-20 11:43 [BUG] Hard-coded begin/end in org-insert-structure-template [9.5.2 (release_9.5.2-24-g668205 @ /Users/salutis/src/emacs/nextstep/Emacs.app/Contents/Resources/lisp/org/)] Rudolf Adamkovič
@ 2022-03-20 12:25 ` Ihor Radchenko
2022-03-22 20:44 ` Rudolf Adamkovič
0 siblings, 1 reply; 6+ messages in thread
From: Ihor Radchenko @ 2022-03-20 12:25 UTC (permalink / raw)
To: Rudolf Adamkovič; +Cc: emacs-orgmode
[-- Attachment #1: Type: text/plain, Size: 761 bytes --]
Rudolf Adamkovič <salutis@me.com> writes:
> Inspired by Protesilaos Stavrou, I started using uppercase Org keywords.
> I like the results so far, but I also noticed some inflexibility in the
> Org mode. Specifically, the `org-insert-structure-template' procedure
> hard-codes lowercase "begin_" and "end_". Thus, even if one customizes
> the `org-structure-template-alist' with uppercase keywords, Org still
> inserts them as "begin_SRC". Given that Org lets the user pick their
> preferred style, I consider this a bug.
I would not call it a bug, but the situation can certainly be improved.
We can auto-magically determine whether to use BEGIN_ or begin_
depending on the case in template type. Tentative patch attached.
Best,
Ihor
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Auto-Upcase-downcase-begin-end-in-structure-template.patch --]
[-- Type: text/x-patch, Size: 4808 bytes --]
From bdf8340ab8b41f0c9f26f5b0bdadbf079b8f6d66 Mon Sep 17 00:00:00 2001
Message-Id: <bdf8340ab8b41f0c9f26f5b0bdadbf079b8f6d66.1647778844.git.yantar92@gmail.com>
From: Ihor Radchenko <yantar92@gmail.com>
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 | 19 +++++++++++++------
2 files changed, 23 insertions(+), 9 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..26617d7c8 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -9492,7 +9492,9 @@ (defcustom org-structure-template-alist
"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.
+with \"#+begin_\" and \"#+end_\" added automatically. If the block
+type is written using upper case letter, \"#+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-insnsitive.
+ (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
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH] Re: [BUG] Hard-coded begin/end in org-insert-structure-template [9.5.2 (release_9.5.2-24-g668205 @ /Users/salutis/src/emacs/nextstep/Emacs.app/Contents/Resources/lisp/org/)]
2022-03-20 12:25 ` [PATCH] " Ihor Radchenko
@ 2022-03-22 20:44 ` Rudolf Adamkovič
2022-03-23 11:59 ` Ihor Radchenko
0 siblings, 1 reply; 6+ messages in thread
From: Rudolf Adamkovič @ 2022-03-22 20:44 UTC (permalink / raw)
To: Ihor Radchenko; +Cc: emacs-orgmode
Ihor Radchenko <yantar92@gmail.com> writes:
> We can auto-magically determine whether to use BEGIN_ or begin_
> depending on the case in template type. Tentative patch attached.
Interesting!
> +with \"#+begin_\" and \"#+end_\" added automatically. If the block
> +type is written using upper case letter, \"#+BEGIN_\" and \"#+END_\"
> +are added instead.
FYI: A typo in "letter" (expected "letters")
(We could also simplify to: "if the block type consists of just
uppercase letter".)
> + (let* ((case-fold-search t) ; Make sure that matches are case-insnsitive.
> + (region? (use-region-p))
FYI: A typo in "case-insnsitive" (expected "case-insensitive")
Looking forward to seeing this merged!
Rudy
--
"I love deadlines. I love the whooshing noise they make as they go by."
-- Douglas Adams, The Salmon of Doubt, 2002
Rudolf Adamkovič <salutis@me.com> [he/him]
Studenohorská 25
84103 Bratislava
Slovakia
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] Re: [BUG] Hard-coded begin/end in org-insert-structure-template [9.5.2 (release_9.5.2-24-g668205 @ /Users/salutis/src/emacs/nextstep/Emacs.app/Contents/Resources/lisp/org/)]
2022-03-22 20:44 ` Rudolf Adamkovič
@ 2022-03-23 11:59 ` Ihor Radchenko
2022-03-25 6:34 ` Rudolf Adamkovič
0 siblings, 1 reply; 6+ messages in thread
From: Ihor Radchenko @ 2022-03-23 11:59 UTC (permalink / raw)
To: Rudolf Adamkovič; +Cc: emacs-orgmode
[-- Attachment #1: Type: text/plain, Size: 640 bytes --]
Rudolf Adamkovič <salutis@me.com> writes:
>> +with \"#+begin_\" and \"#+end_\" added automatically. If the block
>> +type is written using upper case letter, \"#+BEGIN_\" and \"#+END_\"
>> +are added instead.
>
> FYI: A typo in "letter" (expected "letters")
>
> (We could also simplify to: "if the block type consists of just
> uppercase letter".)
>
>> + (let* ((case-fold-search t) ; Make sure that matches are case-insnsitive.
>> + (region? (use-region-p))
>
> FYI: A typo in "case-insnsitive" (expected "case-insensitive")
Thanks for proofreading! Attaching the fixed version of the patch.
Best,
Ihor
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Auto-Upcase-downcase-begin-end-in-structure-template.patch --]
[-- Type: text/x-patch, Size: 4983 bytes --]
From b39925decd0e5ee5a0ce88b3fcea3a9647d35001 Mon Sep 17 00:00:00 2001
Message-Id: <b39925decd0e5ee5a0ce88b3fcea3a9647d35001.1648036699.git.yantar92@gmail.com>
From: Ihor Radchenko <yantar92@gmail.com>
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
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH] Re: [BUG] Hard-coded begin/end in org-insert-structure-template [9.5.2 (release_9.5.2-24-g668205 @ /Users/salutis/src/emacs/nextstep/Emacs.app/Contents/Resources/lisp/org/)]
2022-03-23 11:59 ` Ihor Radchenko
@ 2022-03-25 6:34 ` Rudolf Adamkovič
2022-06-18 6:28 ` Ihor Radchenko
0 siblings, 1 reply; 6+ messages in thread
From: Rudolf Adamkovič @ 2022-03-25 6:34 UTC (permalink / raw)
To: Ihor Radchenko; +Cc: emacs-orgmode
Ihor Radchenko <yantar92@gmail.com> writes:
I patched a local checkout of the main branch, and I can confirm that
your works well here. I also added [1] to my configuration file to
upcase all the structure templates automatically. I hope we will have
this bundled with Org proper. Fantastic work!
[1] Code that upcases the structure templates:
(setq org-structure-template-alist
(mapcar
(lambda (pair)
(cons (car pair)
(upcase (cdr pair))))
org-structure-template-alist))
Rudy
--
"Strange as it may sound, the power of mathematics rests on its evasion
of all unnecessary thought and on its wonderful saving of mental
operations."
-- Ernst Mach, 1838-1916
Rudolf Adamkovic <salutis@me.com> [he/him]
Studenohorska 25
84103 Bratislava
Slovakia
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] Re: [BUG] Hard-coded begin/end in org-insert-structure-template [9.5.2 (release_9.5.2-24-g668205 @ /Users/salutis/src/emacs/nextstep/Emacs.app/Contents/Resources/lisp/org/)]
2022-03-25 6:34 ` Rudolf Adamkovič
@ 2022-06-18 6:28 ` Ihor Radchenko
0 siblings, 0 replies; 6+ messages in thread
From: Ihor Radchenko @ 2022-06-18 6:28 UTC (permalink / raw)
To: Rudolf Adamkovič; +Cc: emacs-orgmode
Rudolf Adamkovič <salutis@me.com> writes:
> Ihor Radchenko <yantar92@gmail.com> writes:
>
> I patched a local checkout of the main branch, and I can confirm that
> your works well here. I also added [1] to my configuration file to
> upcase all the structure templates automatically. I hope we will have
> this bundled with Org proper. Fantastic work!
Applied onto main via 9632401dc also adding NEWS entry.
Best,
Ihor
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2022-06-18 6:34 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-03-20 11:43 [BUG] Hard-coded begin/end in org-insert-structure-template [9.5.2 (release_9.5.2-24-g668205 @ /Users/salutis/src/emacs/nextstep/Emacs.app/Contents/Resources/lisp/org/)] Rudolf Adamkovič
2022-03-20 12:25 ` [PATCH] " Ihor Radchenko
2022-03-22 20:44 ` Rudolf Adamkovič
2022-03-23 11:59 ` Ihor Radchenko
2022-03-25 6:34 ` Rudolf Adamkovič
2022-06-18 6:28 ` Ihor Radchenko
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).