org-refile в известное фиксированное местоположение

11

Я пытаюсь написать функцию, которая возьмет заголовок и переместит его в одно конкретное место. Документ для org-refileэто

(org-refile &optional GOTO DEFAULT-BUFFER RFLOC MSG)

и RFLOCэто

RFLOC can be a refile location obtained in a different way.

но я понятия не имею, каким будет «другой путь», и я гуглюл полдня и не видел примеров. Я знаю файл и знаю заголовок для цели, но я не знаю синтаксис, чтобы превратить его в то, что он хочет. Самое близкое, что я получил, это:

(org-refile nil #("~/Org/bookmarks.org")

который тогда побудит меня к заголовку, но конечно я не хочу, чтобы он подсказал мне, я хочу предоставить это.

Я новичок в elisp, и я догадался о каждом синтаксисе, который я могу придумать. Кто-нибудь знает, как это сформулировать?

jtgd
источник
Здесь должен быть способ сделать то, что вы действительно хотите, но если вы его не найдете, вот обходной путь: stackoverflow.com/questions/7681326/…
Брайан З,
Я использую следующий фрагмент, чтобы сделать то, что вы ищете: (let* ( (org-archive-location "/path/to/org-file::* NAME_OF_HEADING") (org-archive-save-context-info nil)) (org-archive-subtree)) я, вероятно, не буду помещать это в ответ, так как вы спросили об этом org-refile, но фрагмент делает работу довольно хорошо. Два двоеточия будут необходимы. Я использую это все время, и даже создал собственную версию org-archive-subtreeдля подавления сообщения, чтобы у меня не было сотен их, когда я автоматически реорганизую весь свой файл org.
законник
Спасибо, юрист, это хороший фрагмент, и я, вероятно, буду использовать его в другом контексте. Хорошо, что это задокументировано здесь.
Jtgd

Ответы:

9

Я задавался вопросом, как RFLOC должен выглядеть раньше, но никогда не исследовал. Глядя на исходный код org, это должен быть список, состоящий из:

  • заголовок
  • файл
  • ре (регулярное выражение)
  • pos (позиция целевого заголовка)

Я не экспериментировал с reэлементом, но вот простая функция, которая будет вызываться org-refileс помощью RFLOC, созданного из заданного ФАЙЛА и HEADING:

(defun my/refile (file headline)
  (let ((pos (save-excursion
               (find-file file)
               (org-find-exact-headline-in-buffer headline))))
    (org-refile nil nil (list headline file nil pos))))

Это открывает целевой файл и использует функцию org, чтобы найти позицию целевого заголовка, а затем создает список RFLOC для передачи org-refile.

glucas
источник
5

Большое спасибо @glucas, я разработал твое решение в своем последнем. Ключевой информацией было знание формата RFLOC. Я экспериментировал с предоставлением списка имен файлов и заголовков, но мне не хватало этих других элементов и лишнего ноля. Вот чем я закончил:

(defun jay/refile-to (file headline)
    "Move current headline to specified location"
    (let ((pos (save-excursion
                 (find-file file)
                 (org-find-exact-headline-in-buffer headline))))
      (org-refile nil nil (list headline file nil pos))))

(defun jay/refile-to-bookmarks ()
    "Move current headline to bookmarks"
    (interactive)
    (org-mark-ring-push)
    (jay/refile-to "~/Org/bookmarks.org" "New")
    (org-mark-ring-goto))

В документе save-excursionговорится, что мы вернемся в то место, откуда начали, но, похоже, это не сработает. Это оставляет меня в целевом пункте назначения, что может быть подходящим для генерала refile-to, но я хотел просто заставить его переместить линию и остаться там, где я был, поэтому я сохраняю и восстанавливаю внутри refile-to-bookmark.

Рабочий процесс, для которого это предназначено, состоит в том, что я начинаю со списка HTML-ссылок, которые приходят из моего скрипта для чтения RSS-каналов. Первоначально у меня был скрипт, создающий файлы maildir для mu4e, но я все равно просто следовал ссылкам на браузер, а затем делал закладки на интересующие их, так что теперь я просто генерирую список ** [[uri][title]]строк. После того, как я перешел по ссылке из emacs в браузер uzbl, вместо закладки (которая генерирует те же формы строк) я использую эту команду, чтобы переместить ссылку на мой bookmarks.org после установки тегов. Чуть быстрее, так как я также использую скоростные команды org, tчтобы пометить и bдля этой команды. Я счастлив сейчас и люблю учиться больше elisp!

jtgd
источник
Пара деталей, не имеющих непосредственного отношения к тому, что вы здесь делаете: первым элементом RFLOC может быть любая строка. Он используется только в качестве логического имени для целевого местоположения, показанного в сообщении «refiled to xxx». Местоположение на самом деле просто определяется файлом и маркером положения. reЭлемент RFLOC будет игнорироваться, насколько я могу судить. Он используется в нескольких других функциях в org.el, которые имеют дело с целевыми местоположениями.
glucas
1
По причинам , которые я не понимаю, я был в состоянии получить refile-toфункцию , чтобы вернуться в исходное положение, добавив это в конце, после того , как let: (switch-to-buffer (current-buffer)). Кажется, это ничего не должно делать, но это работает для меня.
glucas
Еще раз спасибо @glucas. Да, это, кажется, работает, и я заменил мой -pushи -gotoэтим. Кажется странным, что вы остались в другом буфере, и все же он считает текущий буфер предыдущим.
jtgd