org-refile ไปยังตำแหน่งคงที่ที่รู้จัก


11

ฉันกำลังพยายามเขียนฟังก์ชั่นที่จะมุ่งหน้าและ refile มันไปยังสถานที่หนึ่งที่เฉพาะเจาะจง เอกสารสำหรับ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 ควรเป็นรายการที่ประกอบด้วย:

  • หัวข้อ
  • ไฟล์
  • อีกครั้ง (การแสดงออกปกติ)
  • pos (ตำแหน่งของส่วนหัวเป้าหมาย)

ฉันไม่ได้ทดลองกับreองค์ประกอบ แต่นี่เป็นฟังก์ชั่นง่าย ๆ ที่จะเรียกใช้org-refileด้วย RFLOC ที่สร้างขึ้นจากไฟล์และส่วนหัวที่ให้มา:

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

นี้จะเปิดแฟ้มเป้าหมายและการใช้ฟังก์ชั่นขององค์กรที่จะหาตำแหน่งของพาดหัวเป้าหมายแล้วสร้างรายการ 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-torefile-to-bookmark

เวิร์กโฟลว์ที่มีไว้สำหรับฉันเริ่มต้นด้วยรายการลิงก์ HTML ที่มาจากสคริปต์ของฉันสำหรับการอ่านฟีด RSS ตอนแรกฉันมีสคริปต์ที่สร้างไฟล์ maildir สำหรับ mu4e แต่พบว่าตัวเองเพิ่งตามลิงก์ไปยังเบราว์เซอร์แล้วทำบุ๊กมาร์กไฟล์ที่น่าสนใจดังนั้นตอนนี้ฉันเพิ่งสร้างรายการ** [[uri][title]]บรรทัด หลังจากที่ฉันติดตามลิงก์จาก emacs ไปยังเบราว์เซอร์ uzbl แทนที่จะทำบุ๊กมาร์ก (ซึ่งสร้างรูปแบบบรรทัดเดียวกัน) ฉันใช้คำสั่งนี้เพื่อย้ายลิงก์ไปยัง bookmarks.org ของฉันหลังจากตั้งค่าแท็ก เร็วขึ้นเล็กน้อยตั้งแต่ฉันยังใช้คำสั่ง org ความเร็วtเพื่อแท็กและbสำหรับคำสั่งนี้ ตอนนี้ฉันมีความสุขและรักที่จะเรียนรู้เพิ่มเติมที่เอลิซ!


รายละเอียดคู่ไม่เกี่ยวข้องโดยตรงกับสิ่งที่คุณทำที่นี่องค์ประกอบแรกของ RFLOC สามารถเป็นสตริงได้จริง ๆ มันถูกใช้เป็นชื่อโลจิคัลสำหรับตำแหน่งเป้าหมายที่แสดงในข้อความ "refiled to xxx" เท่านั้น ตำแหน่งถูกกำหนดโดยไฟล์และเครื่องหมายระบุตำแหน่งจริงๆ reองค์ประกอบของ RFLOC จะถูกละเว้นไกลที่สุดเท่าที่ผมสามารถบอกได้ มันถูกใช้ในฟังก์ชั่นอื่น ๆ ไม่กี่ในใน org.el ที่จัดการกับสถานที่เป้าหมาย
ลูกัส

1
สำหรับเหตุผลที่ผมไม่เข้าใจผมก็สามารถที่จะได้รับของrefile-toฟังก์ชั่นที่จะกลับไปยังตำแหน่งเดิมโดยการเพิ่มนี้ในตอนท้ายหลังจากที่:let (switch-to-buffer (current-buffer))ดูเหมือนว่ามันไม่ควรทำอะไร แต่มันได้ผลสำหรับฉัน
ลูกัส

ขอบคุณอีกครั้ง @glucas ใช่ที่ดูเหมือนว่าจะทำงานได้และฉันได้แทนที่ของฉัน-pushและ-gotoด้วย ดูเหมือนจะแปลกที่คุณถูกทิ้งให้อยู่ในบัฟเฟอร์อีกอัน แต่ก็ถือว่าบัฟเฟอร์ปัจจุบันเป็นบัฟเฟอร์ก่อนหน้า
jtgd
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.