¿Es posible agregar plantillas que no sean # + BEGIN_ # + END_ a org-structure-template-alist?

9

He notado que org-structure-template-alist cambió (estoy usando org-mode versión 9.2) para expandirme automáticamente #+BEGIN_<some block tag> #+END_<some block tag>. Me pregunto si es posible agregar diferentes tipos de plantillas. Por ejemplo una :PROPERTIES:<some properties>:END:plantilla.

¿Es posible o debería recurrir a otro paquete como yasnippets?

PierreB
fuente

Respuestas:

9

ACTUALIZAR:

No me he dado cuenta de que Org Mode 9.2 cambió el mecanismo de expansión de la plantilla, donde org-structure-template-alistes solo para bloques definidos por "#+BEGIN_"y "#+END_". Y la entrada como ("p" ":PROPERTIES:?:END:")ya no se acepta.

Como se menciona en el enlace anterior, se puede definir otra plantilla "compleja" por función tempo-define-template, y se debe cargar org-tempo ( (require 'org-tempo)). En realidad, las entradas de org-structure-template-alist se convierten en org-tempo-tagsvia tempo-define-templateby org-tempoy su valor org-tempo-tagspredeterminado es:

(("<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))

Para su caso, puede definir una plantilla de la siguiente manera:

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

La siguiente respuesta solo funciona para la versión del modo Org anterior a 9.2

Sí, podría agregarle una entrada como esta:

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

Luego, en el archivo de organización, escriba <py TAB, se expandirá a la propiedad y dejará el punto en la posición de ?.

Y puede encontrar más detalles en la documentación de la variable escribiendo C-h v org-structure-template-alist RET.

whatacold
fuente
Respuesta muy útil, gracias. Por cierto, ¿es el >símbolo en tempo-define-templateun error tipográfico? Si no ... ¿Cuál es el papel de esto en la definición?
Dox
1
Me alegro de que ayude :) No es un error tipográfico, significa que la línea se sangrará, tempo-define-templateestá defun incorporada, vea la cadena de documentación para más detalles.
Whatacold
2

La frecuencia con la que introducen cambios incompatibles en la personalización del modo org es realmente una pena.

El siguiente código le brinda las viejas plantillas de estructura del modo org antes de la versión 9.2. La función org-complete-expand-structure-templatees una copia pura de la versión 9.1 y org-try-structure-completiones una versión ligeramente modificada de la de 9.1. (Agregué una verificación de tipo allí).

Después de instalar ese código, puede
(add-to-list 'org-structure-template-alist '("p" ":PROPERTIES:?:END:"))
volver a usar su plantilla anterior .

(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
fuente