org-перепрофілювати до відомого фіксованого місця


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, і я здогадувався про кожен синтаксис, який я можу придумати. Хтось знає, як це сформулювати?


Тут повинен бути спосіб зробити те, що ви насправді хочете, але якщо ви цього не знайдете, ось такий спосіб пошуку: stackoverflow.com/questions/7681326/…
Brian Z

Я використовую наступний фрагмент, щоб робити те, що ви шукаєте: (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, це повинен бути список, що складається з:

  • заголовок
  • файл
  • re (регулярний вираз)
  • pos (позиція цільової позиції)

Я не експериментував з цим reелементом, але ось проста функція, яка буде викликати org-refileRFLOC, побудований із заданого ФАЙЛУ та 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.


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 speed, tдля позначення тегів і bдля цієї команди. Я щаслива зараз і люблю дізнаватися більше elisp!


Кілька деталей, які не мають безпосереднього відношення до того, що ви робите тут: першим елементом RFLOC насправді може бути будь-який рядок. Він використовується лише як логічне ім'я для цільового розташування, що відображається у повідомленні "refiled to xxx". Місце дійсно просто визначається файлом та маркером позиції. reЕлемент RFLOC буде ігноруватися, наскільки я можу судити. Він використовується в кількох інших функціях в org.el, які стосуються цільових місць.
глюкас

1
З причин , які я не розумію, я був в змозі отримати refile-toфункцію , щоб повернутися в початкове положення, додавши це в кінці, після того , як let: (switch-to-buffer (current-buffer)). Здається, це не повинно нічого робити, але це працює для мене.
глюкас

Ще раз дякую @glucas. Так, це, здається, працює, і я замінив своє -pushі -gotoтим. Це здається дивним, що ви залишаєтесь в іншому буфері, і все ж він вважає поточний буфер попереднім.
jtgd
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.