org-refile do znanej stałej lokalizacji

11

Próbuję napisać funkcję, która pobierze nagłówek i ponownie umieści go w jednym określonym miejscu. Dokument dla org-refilejest

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

i RFLOCjest

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

ale nie mam pojęcia, jaki byłby „inny sposób”, a od pół dnia googlowałem i nie widziałem żadnych przykładów. Znam plik i znam nagłówek celu, ale nie znam składni, aby sformułować go tak, jak chce. Najbliższe, jakie dostałem, to:

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

która poprosi mnie o nagłówek, ale oczywiście nie chcę, żeby mnie o to pytał, chcę go podać.

Jestem nowy w elisp i zgaduję przy każdej składni, jaką mogę wymyślić. Czy ktoś wie jak to sformułować?

jtgd
źródło
Musi być sposób na zrobienie tego, co naprawdę chcesz tutaj, ale jeśli go nie znajdziesz, oto obejście: stackoverflow.com/questions/7681326/...
Brian Z
Używam następującego fragmentu kodu do robienia tego, czego szukasz: (let* ( (org-archive-location "/path/to/org-file::* NAME_OF_HEADING") (org-archive-save-context-info nil)) (org-archive-subtree)) prawdopodobnie nie dam odpowiedzi na to pytanie, skoro o to pytałeś org-refile, ale fragment ten całkiem nieźle sobie radzi. Potrzebne dwa dwukropki . Korzystam z tego przez cały czas, a nawet stworzyłem niestandardową wersję, org-archive-subtreeaby ukryć wiadomość, tak że nie mam ich setek, gdy automatycznie reorganizuję cały plik org.
prawnik
Dzięki listu prawników, jest to miły fragment i prawdopodobnie użyję go w innym kontekście. Dobrze mieć to tutaj udokumentowane.
jtgd

Odpowiedzi:

9

Zastanawiałem się, jak powinien wyglądać RFLOC wcześniej, ale nigdy nie zbadałem. Patrząc na kod źródłowy organizacji, powinna to być lista składająca się z:

  • nagłówek
  • plik
  • re (wyrażenie regularne)
  • pos (pozycja docelowego kursu)

Nie eksperymentowałem z tym reelementem, ale oto prosta funkcja, która wywoła się org-refilez RFLOC zbudowanym z danego PLIKU i GŁOWY:

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

Spowoduje to otwarcie pliku docelowego i użycie funkcji organizacji w celu znalezienia pozycji docelowego nagłówka, a następnie utworzenie listy RFLOC do przekazania org-refile.

glucas
źródło
5

Dzięki bardzo @glucas, opracowałem twoje rozwiązanie do mojego ostatniego. Kluczową informacją była znajomość formatu RFLOC. Eksperymentowałem z dostarczeniem listy nazw plików i tekstu nagłówka, ale brakowało mi tych innych elementów i dodatkowego zero. Właśnie z tym skończyłem:

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

Dokument dla save-excursionpaństw stwierdza, że ​​wrócimy do miejsca, od którego zaczęliśmy, ale wydaje się, że tak nie działa. Pozostawia mnie w docelowym miejscu docelowym, co może być właściwe dla generała refile-to, ale chciałem, aby przesunęło linię i pozostało tam, gdzie byłem, więc zapisuję i przywracam refile-to-bookmark.

Przepływ pracy, do którego to jest przeznaczone, polega na tym, że zaczynam od listy linków HTML pochodzących z mojego skryptu do czytania kanałów RSS. Początkowo miałem skrypt do tworzenia plików maildir dla mu4e, ale i tak po prostu podążałem za linkami do przeglądarki, a następnie dodawałem do zakładek te, które są interesujące, więc teraz po prostu generuję listę ** [[uri][title]]linii. Po kliknięciu linku z emacsa do przeglądarki uzbl zamiast zakładek (która generuje tę samą formę linii) używam tego polecenia, aby przenieść link do mojego bookmarks.org po ustawieniu tagów. Tylko trochę szybciej, ponieważ używam również org-polecenie prędkości, taby oznaczyć i bdla tego polecenia. Jestem teraz szczęśliwy i uwielbiam uczyć się więcej elisp!

jtgd
źródło
Kilka szczegółów, niezwiązanych bezpośrednio z tym, co tu robisz: pierwszym elementem RFLOC może być dowolny ciąg znaków. Jest on używany tylko jako logiczna nazwa lokalizacji docelowej, pokazany w komunikacie „refiled to xxx”. Lokalizacja jest tak naprawdę zdefiniowana przez znacznik pliku i pozycji. O reile mi wiadomo, element RFLOC zostanie zignorowany. Jest używany w kilku innych funkcjach w org.el, które dotyczą docelowych lokalizacji.
glucas
1
Z powodów, których nie rozumiem, byłem w stanie uzyskać refile-tofunkcji, aby powrócić do pierwotnej pozycji, dodając to na końcu, po let: (switch-to-buffer (current-buffer)). Wydaje się, że to nie powinno nic robić, ale działa dla mnie.
glucas
Jeszcze raz dziękuję @glucas. Tak, to wydaje się działać, a ja zastąpiłem moje -pushi -gototym. Wydaje się dziwne, że zostałeś w innym buforze, a mimo to uważa on bufor za poprzedni.
jtgd