Ist es möglich, andere Vorlagen als # + BEGIN_ # + END_ zur Organisationsstruktur-Vorlagenliste hinzuzufügen?

9

Ich habe festgestellt, dass sich der Organisationsstruktur-Vorlagen-Alist geändert hat (ich verwende den Organisationsmodus Version 9.2), um ihn automatisch zu erweitern #+BEGIN_<some block tag> #+END_<some block tag>. Ich frage mich, ob es möglich ist, verschiedene Arten von Vorlagen hinzuzufügen. Zum Beispiel eine :PROPERTIES:<some properties>:END:Vorlage.

Ist es möglich oder sollte ich mich an ein anderes Paket wie yasnippets wenden?

PierreB
quelle

Antworten:

9

AKTUALISIEREN:

Ich habe nicht bemerkt, dass Org Mode 9.2 den Mechanismus der Vorlagenerweiterung geändert hat, wobei dies org-structure-template-alistnur für Blöcke gilt, die durch "#+BEGIN_"und definiert sind "#+END_". Und ein Eintrag wie ("p" ":PROPERTIES:?:END:")wird nicht mehr akzeptiert.

Wie im obigen Link erwähnt, kann eine andere "komplexe" Vorlage durch die Funktion definiert werden tempo-define-template, und das Org-Tempo muss geladen werden ( (require 'org-tempo)). Tatsächlich werden die Einträge von org-structure-template-alist in org-tempo-tagsvia tempo-define-templateby konvertiert org-tempound org-tempo-tagsstandardmäßig in:

(("<i" . tempo-template-org-index)
 ("<A" . tempo-template-org-ascii)
 ("<H" . tempo-template-org-html)
 ("<L" . tempo-template-org-latex)
 ("<v" . tempo-template-org-verse)
 ("<s" . tempo-template-org-src)
 ("<q" . tempo-template-org-quote)
 ("<l" . tempo-template-org-export-latex)
 ("<h" . tempo-template-org-export-html)
 ("<E" . tempo-template-org-export)
 ("<e" . tempo-template-org-example)
 ("<C" . tempo-template-org-comment)
 ("<c" . tempo-template-org-center)
 ("<a" . tempo-template-org-export-ascii)
 ("<I" . tempo-template-org-include))

Für Ihren Fall können Sie eine Vorlage definieren, indem Sie:

(tempo-define-template "my-property"
               '(":PROPERTIES:" p ":END:" >)
               "<p"
               "Insert a property tempate")

Die folgende Antwort funktioniert nur für die Org-Modus-Version vor 9.2

Ja, Sie können einen Eintrag wie folgt hinzufügen:

(add-to-list 'org-structure-template-alist '("p" ":PROPERTIES:?:END:"))

Dann geben Sie in der Organisationsdatei <pund ein TAB, wird zu Eigenschaft erweitert und belässt den Punkt an der Position von ?.

Weitere Details finden Sie in der Dokumentation der Variablen durch Eingabe C-h v org-structure-template-alist RET.

was auch immer
quelle
Sehr hilfreiche Antwort, danke. Übrigens, ist das >Symbol auf dem tempo-define-templateTippfehler? Wenn nicht ... Welche Rolle spielt es in der Definition?
Dox
1
tempo-define-templateIch bin froh, dass es hilft :) Kein Tippfehler, es bedeutet, dass die Zeile eingerückt ist, eingebaut ist, siehe Details. Weitere Informationen finden Sie in der Dokumentzeichenfolge .
Whatacold
2

Die Häufigkeit, mit der sie inkompatible Änderungen bei der Anpassung des Organisationsmodus einführen, ist wirklich schade.

Der folgende Code gibt Ihnen die alten Strukturvorlagen des Organisationsmodus vor Version 9.2 zurück. Die Funktion org-complete-expand-structure-templateist eine reine Kopie von Version 9.1 und org-try-structure-completioneine leicht modifizierte Version von Version 9.1. (Ich habe dort eine Typprüfung hinzugefügt.)

Nach der Installation dieses Codes können Sie einfach Ihre alte Vorlage
(add-to-list 'org-structure-template-alist '("p" ":PROPERTIES:?:END:"))
wieder verwenden.

(defvar org-structure-template-alist)

(defun org+-avoid-old-structure-templates (fun &rest args)
  "Call FUN with ARGS with modified `org-structure-template-alist'.
Use a copy of `org-structure-template-alist' with all
old structure templates removed."
  (let ((org-structure-template-alist
     (cl-remove-if
      (lambda (template)
        (null (stringp (cdr template))))
      org-structure-template-alist)))
    (apply fun args)))

(eval-after-load "org"
  '(when (version<= "9.2" (org-version))
     (defun org-try-structure-completion ()
       "Try to complete a structure template before point.
This looks for strings like \"<e\" on an otherwise empty line and
expands them."
       (let ((l (buffer-substring (point-at-bol) (point)))
         a)
     (when (and (looking-at "[ \t]*$")
            (string-match "^[ \t]*<\\([a-zA-Z]+\\)$" l)
            (setq a (assoc (match-string 1 l) org-structure-template-alist))
            (null (stringp (cdr a))))
       (org-complete-expand-structure-template (+ -1 (point-at-bol)
                              (match-beginning 1)) a)
       t)))

     (defun org-complete-expand-structure-template (start cell)
       "Expand a structure template."
       (let ((rpl (nth 1 cell))
         (ind ""))
     (delete-region start (point))
     (when (string-match "\\`[ \t]*#\\+" rpl)
       (cond
        ((bolp))
        ((not (string-match "\\S-" (buffer-substring (point-at-bol) (point))))
         (setq ind (buffer-substring (point-at-bol) (point))))
        (t (newline))))
     (setq start (point))
     (when (string-match "%file" rpl)
       (setq rpl (replace-match
              (concat
               "\""
               (save-match-data
             (abbreviate-file-name (read-file-name "Include file: ")))
               "\"")
              t t rpl)))
     (setq rpl (mapconcat 'identity (split-string rpl "\n")
                  (concat "\n" ind)))
     (insert rpl)
     (when (re-search-backward "\\?" start t) (delete-char 1))))

     (advice-add 'org-tempo-add-templates :around #'org+-avoid-old-structure-templates)

     (add-hook 'org-tab-after-check-for-cycling-hook #'org-try-structure-completion)

     (require 'org-tempo)
     ))
Tobias
quelle