захват в режиме орг с sexp - PullRequest
8 голосов
/ 13 июля 2011

Я пытаюсь создать шаблон захвата, который преобразует URL в ссылку в режиме org с <title> в качестве имени ссылки.

Моя функция преобразования выглядит следующим образом:

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

При вызове из обычного lisp-кода emacs возвращает правильный результат. Но при использовании в этом org-capture-template он возвращает только bad url.

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

Отличается ли порядок расширения? Нужно ли избегать строки по-другому? Магия? Первый %c предназначен только для отладки строки и действительно печатается как "url".

Пожалуйста, даже не указывайте, что синтаксический анализ XML с помощью регулярного выражения является неправильным подходом. Ктулху уже уже преследует меня, и это не сделает его хуже.

Ответы [ 3 ]

7 голосов
/ 16 июля 2011

Проблема в порядке расширения параметров шаблона.Простые шаблоны % раскрываются после оценки пола.Исходное сообщение об ошибке по-прежнему содержит шаблон и, таким образом, раскрывается в содержимое буфера обмена, поэтому сообщение об ошибке не содержит строку, которая была первоначально передана в get-page-title.

. Решение состоит в том, чтобы получить доступ к списку уничтожений.из пола:

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

РЕДАКТИРОВАТЬ Это поведение теперь задокументировано в режиме org.

6 голосов
/ 05 августа 2011

Не будет ли решение использовать org-protocol.el? http://orgmode.org/worg/org-contrib/org-protocol.html

Я только что протестировал его с помощью следующего шаблона (добавив подзаголовок для желаемого заголовка в качестве заголовка).

Шаблон:

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

Затем, используя привязку клавиш на основе браузера (в моем случае с Opera, хотя также приведены примеры для Firefox, Uzbl, Acrobat и Conkeror), я смог захватить следующее:

** 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.

(я разорвал org-ссылку просто, чтобы свести прокрутку к минимуму, изначально она была не на двух строках)

2 голосов
/ 13 января 2014

@ aboabo поделился недокументированной переменной в https://stackoverflow.com/a/21080770/255961, которая предоставляет более общее решение для вопроса о том, как использовать sexp со значениями ключевых слов в шаблоне (за пределами списка уничтожений).Переменная org-store-link-plist хранит всю информацию, передаваемую в перехват.Таким образом, вы можете получить доступ к его значениям напрямую из функции, подобной этой:

(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, согласно странице справочника (цитата ниже), мне кажется, что ваш подход в вопросе долженработать такжеНо я согласен с тем, что вы описываете то, что, по-видимому, действительно происходит - это похоже на ошибку по отношению к руководству.

% (sexp) Оцените Elisp sexp и замените его результатом.Для удобства заполнители%: ключевого слова (см. Ниже) в выражении будут расширены до этого.

...