org-mode – Invocar función interactiva desde org-capture-templates

Pregunta:

Tengo una función llamada create-org-link que crea un enlace de archivo basado en una cadena arbitraria que le paso. Me gustaría poder invocar esta función cuando invoco la captura de organización.

Esto es lo que he probado:

(setq org-capture-templates
  '(("w" "Work Log" entry (file+headline "c:/td/gtd/org/WorkLogs.org" "Today") "** %(create-org-link) %?")
))

Sé que la función funciona porque puedo usarla fuera de esta plantilla. Sin embargo, cuando ejecuto si desde aquí obtengo el siguiente resultado:

** %![Error: (wrong-number-of-arguments (lambda (title) Foobar de roobarb (interactive sPlease enter a title: ) (insert (format [[file:%s-%s.org][%s - %s]] (format-time-string org-link-date-stamp-format (current-time)) (replace-regexp-in-string    title) (format-time-string org-link-date-stamp-format (current-time)) title))) 0)] 

¿Hay algún elemento de plantilla diferente que deba usar?

Editar – 5/5/2014 @ 12:48

Aquí está la función que se llama:

(defun create-org-link (title)
  "Foobar de roobarb"
  (interactive "sPlease enter a title: ")
  (insert (format "[[file:%s-%s.org][%s - %s]]" (format-time-string org-link-date-stamp-format(current-time)) (replace-regexp-in-string " " "" title) (format-time-string org-link-date-stamp-format(current-time)) title)))

(defvar org-link-date-stamp-format "%y%m%d"
  "Format of date stamps to use in Org links")

Ja, ja – Supongo que debería eliminar mis comentarios de marcador de posición antes de hacer preguntas al respecto en un foro 🙂

Respuesta:

Puede utilizar lo siguiente:

(defun create-org-link (&optional title)
  "Foobar de roobarb"
  (interactive)
  (unless title
    (setq title
          (read-string "Please enter a title: ")))
  (let ((out (format "[[file:%s-%s.org][%s - %s]]"
                     (format-time-string
                      org-link-date-stamp-format(current-time))
                     (replace-regexp-in-string " " "" title)
                     (format-time-string
                      org-link-date-stamp-format(current-time))
                     title)))
    (if (called-interactively-p)
        (insert out)
      out)))

En lugar de solicitar el título como parte de la llamada interactiva, solicítelo manualmente si no se aprobó. org-capture no es interactive forma predeterminada cuando se llama a la función.

Envolverlo como (call-interactively #'create-org-link) también funcionaría, sin embargo, deberá eliminar la insert para que solo se pase la llamada de formato. De lo contrario, los datos se insertan en el búfer incorrecto (como parte de la solicitud / análisis en lugar de pasar a la plantilla final).

La instrucción if al final de la función se encarga de insertarla (cuando es interactiva) frente a devolver la cadena (cuando se llama desde la plantilla).

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım