org-refile ke lokasi tetap yang diketahui

11

Saya mencoba menulis fungsi yang akan mengambil tajuk dan refile ke satu lokasi tertentu. Doc untuk org-refileis

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

dan RFLOCadalah

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

tapi saya tidak tahu apa "cara yang berbeda" akan dan saya sudah googling selama setengah hari dan tidak melihat contoh. Saya tahu file dan saya tahu judul untuk target tetapi saya tidak tahu sintaks untuk membentuknya menjadi apa yang diinginkan. Yang paling dekat yang saya dapatkan adalah:

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

yang kemudian akan meminta saya untuk judul, tetapi tentu saja saya tidak ingin itu meminta saya, saya ingin memberikannya.

Saya baru mengenal elisp dan saya sudah menebak setiap sintaks yang bisa saya pikirkan. Adakah yang tahu bagaimana mengucapkan ini?

jtgd
sumber
Pasti ada cara untuk melakukan apa yang sebenarnya Anda inginkan di sini, tetapi jika Anda tidak menemukannya, berikut ini solusinya: stackoverflow.com/questions/7681326/…
Brian Z
Saya menggunakan cuplikan berikut untuk melakukan apa yang Anda cari: (let* ( (org-archive-location "/path/to/org-file::* NAME_OF_HEADING") (org-archive-save-context-info nil)) (org-archive-subtree)) Saya mungkin tidak akan menjawab pertanyaan ini sejak Anda bertanya org-refile, tetapi snipet melakukan pekerjaan dengan cukup baik. Dua titik dua yang sedang dibutuhkan. Saya menggunakan ini sepanjang waktu, dan bahkan telah membuat versi khusus org-archive-subtreeuntuk menekan pesan sehingga saya tidak memilikinya ratusan ketika saya secara otomatis mengatur ulang seluruh file org saya.
lawlist
Terima kasih daftar hukum, ini cuplikan yang bagus dan saya mungkin akan menggunakan ini dalam konteks lain. Bagus untuk didokumentasikan di sini.
jtgd

Jawaban:

9

Saya bertanya-tanya seperti apa rupa RFLOC sebelumnya, tetapi tidak pernah diselidiki. Melihat kode sumber org, itu harus daftar yang terdiri dari:

  • menuju
  • mengajukan
  • re (ekspresi reguler)
  • pos (posisi heading target)

Saya belum bereksperimen dengan reelemen, tetapi di sini adalah fungsi sederhana yang akan memanggil org-refiledengan RFLOC dibangun dari FILE dan HEADING yang diberikan:

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

Ini membuka file target dan menggunakan fungsi org untuk menemukan posisi headline target, kemudian membangun daftar RFLOC untuk diteruskan org-refile.

glukas
sumber
5

Terima kasih banyak @glucas, saya telah mengerjakan solusi Anda menjadi yang terakhir. Informasi kuncinya adalah mengetahui format RFLOC. Saya melakukan percobaan dengan memberikan daftar nama file dan teks judul, tetapi saya kehilangan elemen-elemen lainnya, dan nihil tambahan. Inilah yang akhirnya saya dapatkan:

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

Dokumen untuk save-excursionmenyatakan bahwa kami akan dikembalikan ke lokasi asal kami, tetapi sepertinya tidak berfungsi seperti itu. Itu membuat saya berada di tujuan, yang mungkin cocok untuk jenderal itu refile-to, tetapi saya ingin membuatnya memindahkan garis dan tetap di tempat saya, jadi saya menyimpan dan memulihkannya refile-to-bookmark.

Alur kerja yang dimaksudkan untuk ini adalah saya mulai dengan daftar tautan HTML yang berasal dari skrip saya untuk membaca umpan RSS. Awalnya saya memiliki skrip yang menghasilkan file maildir untuk mu4e, tetapi ternyata saya hanya mengikuti tautan ke browser dan kemudian membooking yang menarik, jadi sekarang saya hanya membuat daftar ** [[uri][title]]baris. Setelah saya mengikuti tautan dari emacs ke browser uzbl, alih-alih bookmark (yang menghasilkan bentuk garis yang sama), saya menggunakan perintah ini untuk memindahkan tautan ke bookmarks.org saya setelah mengatur tag. Hanya sedikit lebih cepat karena saya juga menggunakan perintah kecepatan org, tuntuk menandai dan buntuk perintah ini. Saya senang sekarang dan senang belajar lebih banyak tentang elisp!

jtgd
sumber
Detail pasangan, tidak secara langsung relevan dengan apa yang Anda lakukan di sini: elemen pertama dari RFLOC sebenarnya dapat berupa string apa pun. Ini hanya digunakan sebagai nama logis untuk lokasi target, yang ditampilkan dalam pesan "refiled to xxx". Lokasi benar-benar hanya ditentukan oleh penanda file dan posisi. The reunsur RFLOC akan diabaikan, sejauh yang saya tahu. Ini digunakan dalam beberapa fungsi lain di dalam org.el yang berhubungan dengan lokasi target.
glukas
1
Untuk alasan saya tidak mengerti, saya bisa mendapatkan Anda refile-tofungsi untuk kembali ke posisi semula dengan menambahkan ini di akhir, setelah let: (switch-to-buffer (current-buffer)). Sepertinya ini seharusnya tidak melakukan apa-apa, tetapi itu bekerja untuk saya.
glucas
Terima kasih lagi @glucas. Ya itu sepertinya berfungsi dan saya sudah mengganti saya -pushdan -gotodengan itu. Kelihatannya aneh bahwa Anda dibiarkan di buffer lain dan menganggap buffer saat ini sebagai yang sebelumnya.
jtgd