2011-07-13 13 views
8

Estoy tratando de crear una plantilla de captura que convierta una URL a un enlace de modo orgánico con el <title> como nombre del enlace.org-mode capture with sexp

Mi función de conversión es el siguiente:

(defun get-page-title (url) 
    "Get title of web page, whose url can be found in the current line" 
    ;; Get title of web page, with the help of functions in url.el 
    (with-current-buffer (url-retrieve-synchronously url) 
    ;; find title by grep the html code 
    (goto-char 0) 
    (re-search-forward "<title>\\([^<]*\\)</title>" nil t 1) 
    (setq web_title_str (match-string 1)) 
    ;; find charset by grep the html code 
    (goto-char 0) 

    ;; find the charset, assume utf-8 otherwise 
    (if (re-search-forward "charset=\\([-0-9a-zA-Z]*\\)" nil t 1) 
     (setq coding_charset (downcase (match-string 1))) 
     (setq coding_charset "utf-8") 
    ;; decode the string of title. 
    (setq web_title_str (decode-coding-string web_title_str (intern 
                  coding_charset))) 
    ) 
    (concat "[[" url "][" web_title_str "]]") 
)) 

cuando se llama desde emacs normales Lisp código devuelve el resultado correcto. Pero cuando se usa en este org-capture-template, solo devuelve bad url.

setq org-capture-templates 
    (quote 
    (("l" "Link" entry (file+headline "" "Links") 
     "* \"%c\" %(get-page-title \"%c\")")))) 

es el orden de expansión diferente? ¿Debo escapar de la cadena de manera diferente? ¿Magia? El primer %c es solo para depurar la cadena y, de hecho, se está imprimiendo como "url".

Por favor, ni se moleste en señalar que analizar XML con expresiones regulares es el enfoque equivocado. Cthulhu es que ya me persigue y esto no va a empeorar las cosas.

Respuesta

7

El problema es el orden de expansión de los parámetros de la plantilla. Las plantillas simples % se expanden después de que se haya evaluado sexp. El mensaje de error original todavía contiene una plantilla y, por lo tanto, se expande en el contenido del portapapeles y, por lo tanto, el mensaje de error no contiene la cadena que originalmente se pasó al get-page-title.

la solución es para acceder al anillo de corte desde dentro de la sexp:

%(get-page-title (current-kill 0)) 

EDITAR Este comportamiento ahora se documenta en org-mode.

+0

¿Por qué no es una respuesta aceptada? –

+0

@LeVieuxGildas Aceptar mis propias respuestas siempre es un poco doloroso. Lo actualicé y lo acepté. – pmr

+0

La forma en que leo la [página del manual] (http://orgmode.org/manual/Template-expansion.html#Template-expansion) dice que debería funcionar al revés: "Evalúe Elisp sexp y reemplácelo por el resultado". conveniencia,%: palabra clave (ver a continuación) los marcadores de posición dentro de la expresión se expandirán antes de esto. " Pero estoy de acuerdo en que lo que describes es lo que parece estar sucediendo. – studgeek

6

¿No sería la solución utilizar org-protocol.el? http://orgmode.org/worg/org-contrib/org-protocol.html

yo sólo probamos con la plantilla siguiente (añadiendo un subtítulo para el título deseado como titular).

Plantilla:

("t" 
"Testing Template" 
entry 
(file+headline "~/org/capture.org" "Testing") 
"* %^{Title}\n** %:description\n\n Source: %u, %c\n\n%i" 
:empty-lines 1) 

Luego, utilizando un keybind basada en navegador (en mi caso con Opera, aunque se proporcionan ejemplos para Firefox, Uzbl, Acrobat y conkeror también) que era capaz de capturar el siguiente:

** Testing for StackExchange 
*** org-protocol.el - Intercept calls from emacsclient to trigger custom actions 

    Source: [2011-08-05 Fri], [[http://orgmode.org/worg/org-contrib/org-protocol.html] 
    [org-protocol.el - Intercept calls from emacsclient to trigger custom actions]] 

    org-protocol intercepts calls from emacsclient to trigger custom actions 
    without external dependencies. 

(partí los org-link simplemente para mantener el desplazamiento a un mínimo, que no estaba en dos líneas, país de origen)

+0

Buena solución. No sabía cómo usar org-protocol de antemano, pero esto ciertamente tiene una usabilidad ligeramente mejor que mi enfoque. – pmr

+0

Revertí lo que dije. Después de tener que tocar gconf y todas esas cosas que no son compatibles con versiones anteriores, volví a mi mundo 'todo emacs'. Aquí es muy acogedor y no tengo que aguantar esta mierda. – pmr

+0

@pmr Quizás valga la pena pedir en la lista de correo para ver si alguien tiene algún método para resolver esto. De lo contrario, lo más cerca que puedo llegar a ver un lugar donde pueda arreglarlo serían las líneas 8487-8498 de org.el que se refieren a cómo capturar desde w3 y w3m (deberían poder agregarse al org-store-link- accesorios para incluir el título) –

2

@aboabo compartió una varia indocumentado ble en https://stackoverflow.com/a/21080770/255961 que proporciona una solución más general al tema de la pregunta sobre cómo usar sexp con los valores de las palabras clave en una plantilla (más allá del círculo asesino). La variable org-store-link-plist almacena toda la información que se pasa a la captura. Para que pueda acceder a sus valores directamente de una función como esta:

(defun url() 
    (plist-get org-store-link-plist :url)) 
("w" "capture" entry (file "~/refile.org") 
    "* [[%:link][%:description]] :NOTE:\n%(url)%U\n" 
    :immediate-finish t) 

PS, según el (cita más adelante) manual page suena a mí como su enfoque en teh cuestión debería funcionar también. Pero estoy de acuerdo en que lo que describes es lo que parece estar sucediendo en realidad: parece una falla relacionada con el manual.

% (sexp) Evaluar Elisp sexp y reemplazar con el resultado. Para mayor comodidad, %: los marcadores de posición de la palabra clave (ver a continuación) dentro de la expresión serán expandidos antes de esto.

+0

Como ya dije en respuesta a su comentario: asegúrese de que su versión de la organización coincida con la del manual en línea. Su enfoque parece funcionar bien, aunque no me gusta manipular las variables no documentadas por razones obvias. – pmr