ฉันจะรับเค้าร่างโหมดองค์กรในบัฟเฟอร์ที่ 2 เป็นสารบัญแบบไดนามิกได้อย่างไร


25

เมื่อฉันแก้ไขเอกสารขนาดใหญ่ฉันต้องการดูว่าฉันอยู่ที่ไหนโดยดูโครงร่าง (ที่ไม่มีเนื้อหา) ในบัฟเฟอร์แยกต่างหาก เช่นเดียวกับเมื่อคุณอ่านไฟล์ PDF จะมี TOC ทางด้านซ้าย (ดูด้านล่าง)

ในโหมด org เป็นไปได้ที่จะขยาย / ยุบเค้าร่าง แต่เป็นไปได้หรือไม่ที่จะมีโครงร่างแบบคงที่ในด้านซ้าย (หรือขวา) ในบัฟเฟอร์แยกต่างหากดังนั้นเมื่อคุณคลิกที่ส่วนหัวบัฟเฟอร์อื่นจะย้ายไปยังตำแหน่งนั้นหรือไม่?

เป็นเช่นนี้ แต่สำหรับโหมดองค์กรหรือไม่ ป้อนคำอธิบายรูปภาพที่นี่

[แก้ไข]อยู่ใกล้กับสิ่งที่ฉันต้องการ ชิ้นส่วนปริศนาที่ขาดหายไปคือการข้ามไปยังตำแหน่งเดียวกันเมื่อคลิกส่วนหัว / (หรือจุดใด ๆ จริงๆ)
clone-indirect-buffer

สำหรับตอนนี้ฉันได้ลองเขียนโค้ดบางส่วนแล้ว: ย้ายไปยังบัฟเฟอร์ที่โคลนแล้วไปยังจุดเดียวกัน (ซิงค์ตำแหน่งของบัฟเฟอร์ทางอ้อม) (โหมดองค์กร)

แต่จะไม่ทำงานหากเนื้อหาถูกยุบ หากสามารถทำให้ทำงานได้ clone-inderect-buffer เป็นคำตอบที่สมบูรณ์สำหรับสิ่งนี้

[โซลูชันการแก้ไข 2]
รหัสในลิงก์ด้านบนและในคำตอบด้านล่างรวม niceley เพื่อแก้ปัญหาการกระโดดไปมา

;first call 'clone-indirect-buffer'. Then...

;This function works between buffer and it's clone.
(defun my/goto-same-spot-in-other-buffer () 
  "Go to the same location in the other buffer. Useful for when you have cloned indirect buffers"
  (interactive)
  (let ((my/goto-current-point (point)))
       (other-window 1)
       (goto-char my/goto-current-point)
       (when (invisible-p (point))
        (org-reveal)))
)

;This function is a clone-to-buffer jump only:
; It does find the other buffer first thou instead of just jumping to the other 
; window as does the function above.
(defun my/jump-to-point-and-show ()
  "Switch to a cloned buffer's base buffer and move point to the
cursor position in the clone."
  (interactive)
  (let ((buf (buffer-base-buffer)))
    (unless buf
      (error "You need to be in a cloned buffer!"))
    (let ((pos (point))
          (win (car (get-buffer-window-list buf))))
      (if win
          (select-window win)
        (other-window 1)
        (switch-to-buffer buf))
      (goto-char pos)
      (when (invisible-p (point))
        (show-branches)))))


(global-set-key (kbd "<s-mouse-1>") 'my/goto-same-spot-in-other-buffer)
(global-set-key (kbd "s-m") 'my/goto-same-spot-in-other-buffer)
(global-set-key (kbd "<C-s-mouse-1>") 'my/jump-to-point-and-show)
(global-set-key (kbd "C-s-m") 'my/jump-to-point-and-show)

2
อาจจะลองC-c C-x bหรือorg-tree-to-indirect-buffer.
ซามูเอลฟลินท์

@SWFlint หลังจากการทดสอบสั้น ๆ ดูเหมือนว่ามันแตกต่างจากที่ OP ต้องการ: มันจะคัดลอกทรีย่อยปัจจุบันไปยังบัฟเฟอร์ทางอ้อม สิ่งที่เราต้องการคือorg-sparse-tree-to-indirect-bufferฟังก์ชั่น แต่ดูเหมือนว่ามันจะไม่มีอยู่จริง
ต. Verron

หลังจากมองไปอีกซักหน่อยลองทำอะไรบางอย่างตามแนวของบานกระจก
Samuel Flint

ฉันคิดว่ามันยังมีมูลค่าการกล่าวขวัญimenu รายการ มันขาดข้อกำหนดบางอย่าง แต่ให้ความสำคัญกับคนอื่น
หลอดไส้

บัฟเฟอร์ต้นไม้ถึงทางอ้อมสุดยอด
Ninrod

คำตอบ:


9

ตัวเลือกบางอย่างอยู่ในใจ สองคนแรกนั้นspeedbarถูกกล่าวหาว่าเล่นได้ดีorg-modeและminimapถึงแม้ว่าฉันจะไม่ได้ใช้ก็ตาม แต่ก็ไม่สามารถรับรองได้เป็นการส่วนตัว

สิ่งที่อาจจะเป็นตัวเลือกที่ง่าย (และยังมีความยืดหยุ่นมากที่สุด) จะใช้บัฟเฟอร์ทางอ้อม

ในทางปฏิบัติคุณจะไปที่orgบัฟเฟอร์ที่คุณต้องการร่างตีM-x clone-indirect-buffer(ใช้C-u M-x clone-indirect-bufferถ้าคุณต้องการควบคุมสิ่งที่เรียกว่าโคลน) แล้วบูมมีสำเนาของบัฟเฟอร์ที่คุณจะใช้อีก วางโคลนนั้นในหน้าต่างหรือเฟรมแบบคู่ขนานกับบัฟเฟอร์ดั้งเดิมและในโคลนปรับโครงร่างให้เข้ากับรสนิยมของคุณ

มันไม่ได้รับฟังก์ชั่น "คลิกที่หัวเรื่องในเค้าร่าง" ที่คุณพูดถึง แต่จะทำให้คุณได้รับจิตวิญญาณของแถบด้านข้าง

แก้ไข:เพื่อตอบสนองต่อความคิดเห็นของคุณต่อไปนี้เป็นคำสั่งง่ายๆที่เมื่อเรียกใช้จากบัฟเฟอร์โคลนจะเปลี่ยนเป็นบัฟเฟอร์ฐานและย้ายจุดไปยังตำแหน่งใดก็ตามที่เคอร์เซอร์อยู่ในบัฟเฟอร์โคลน:

(defun jump-to-point-and-show ()
  "Switch to a cloned buffer's base buffer and move point to the
cursor position in the clone."
  (interactive)
  (let ((buf (buffer-base-buffer)))
    (unless buf
      (error "You need to be in a cloned buffer!"))
    (let ((pos (point))
          (win (car (get-buffer-window-list buf))))
      (if win
          (select-window win)
        (other-window 1)
        (switch-to-buffer buf))
      (goto-char pos)
      (when (invisible-p (point))
        (show-branches)))))

ฉันลองใช้สปีดบาร์ / Sr-Speedbar มันเยี่ยมมาก แต่มันแสดงให้เห็นแค่ 2 ระดับแรกเท่านั้น ฉันถามว่าเป็นไปได้ที่จะมีระดับมากขึ้นที่นี่: emacs.stackexchange.com/questions/9533/… บัฟเฟอร์ทางอ้อมเป็นตัวเลือกที่ดี ฉันสงสัยว่ามันเป็นไปได้ที่จะย้ายอย่างใดเคอร์เซอร์ในบัฟเฟอร์อื่น ๆ ให้อยู่ในตำแหน่งเดียวกับในบัฟเฟอร์โคลน ..
สิงห์ Ufimtsev

ฉันพยายามเขียนโค้ดที่จะข้ามไปยังตำแหน่งเดียวกันในบัฟเฟอร์อื่น แต่จะใช้ได้เฉพาะเมื่อทุกอย่างถูกขยาย ถ้ามันสามารถทำงานได้เพื่อที่มันจะขยายโดยอัตโนมัติแล้ว clone-buffer เป็นโซลูชั่นที่สมบูรณ์แบบ โพสต์: emacs.stackexchange.com/questions/9536/ …
Leo Ufimtsev

ขอบคุณสำหรับตัวอย่างโค้ดด้านบน นิยมมาก ^ _ ^
Leo Ufimtsev

16

วิธีการ: M-x occur RET ^*+ RET(โปรดทราบว่ามีที่ว่างในตอนท้ายของ regexp)


ฉันไม่รู้ว่าทำไมมีคนลงคะแนนคำตอบนี้ฉันคิดว่านี่เป็นวิธีแก้ปัญหาที่ไม่ยุ่งยากในตัว สิ่งที่แปลกประหลาดเพียงอย่างเดียวก็คือมันไม่ได้ติดตามคุณไปรอบ ๆ คือมันไม่ชัดเจนในบัฟเฟอร์เกิดขึ้นที่คุณอยู่ (เน้นหัวข้อปัจจุบันเช่น) และไม่เลื่อนเอกสารยาว แต่สำหรับเอกสารขนาดเล็กก็ใช้งานได้
Leo Ufimtsev

ฉันชอบโซลูชันที่เรียบง่ายและมีอยู่ภายใน หากต้องการเน้นให้ใช้หางเสือ - เกิดขึ้นแทนเกิดขึ้น สิทธิประโยชน์เพิ่มเติมคือสามารถใช้การนำทางเดียวสำหรับบัฟเฟอร์ไฟล์หลายองค์กรโดยใช้หลายเกิดขึ้น สุดท้ายด้วยการแก้ไขที่เกิดขึ้นเราสามารถแก้ไขทั้งมุมมองมุมมองเค้าร่างและมุมมองขยาย ไม่ว่าในกรณีใดฉันลงคะแนนนี้
ผู้ใช้ Emacs

จะลงคะแนนเสียงให้กับเรื่องนี้เพราะมันยอดเยี่ยมง่ายและมีประสิทธิภาพ
Gambo

ง่ายมาก ฉลาดมาก. แฮ็คดังนั้น อย่างดีเลิศ.
dangom

7

หลังจากอ่านคำตอบของแดนและคำตอบของคุณจากนั้นฉันก็รวบรวมมันเข้าด้วยกัน มันเปิดใหม่โคลนแคบอ่านอย่างเดียวทางด้านซ้ายของบัฟเฟอร์ปัจจุบันและมันจะผูก<mouse-1>และRETในพื้นที่ในโคลนเพื่อข้ามไปยังตำแหน่งนั้นในบัฟเฟอร์ฐาน

(defun my/open-tree-view ()
  "Open a clone of the current buffer to the left, resize it to 30 columns, and bind <mouse-1> to jump to the same position in the base buffer."
  (interactive)
  (let ((new-buffer-name (concat "<tree>" (buffer-name))))
    ;; Create tree buffer
    (split-window-right 30)
    (if (get-buffer new-buffer-name)
        (switch-to-buffer new-buffer-name)  ; Use existing tree buffer
      ;; Make new tree buffer
      (progn  (clone-indirect-buffer new-buffer-name nil t)
              (switch-to-buffer new-buffer-name)
              (read-only-mode)
              (hide-body)
              (toggle-truncate-lines)

              ;; Do this twice in case the point is in a hidden line
              (dotimes (_ 2 (forward-line 0)))

              ;; Map keys
              (use-local-map (copy-keymap outline-mode-map))
              (local-set-key (kbd "q") 'delete-window)
              (mapc (lambda (key) (local-set-key (kbd key) 'my/jump-to-point-and-show))
                    '("<mouse-1>" "RET"))))))

(defun my/jump-to-point-and-show ()
  "Switch to a cloned buffer's base buffer and move point to the cursor position in the clone."
  (interactive)
  (let ((buf (buffer-base-buffer)))
    (unless buf
      (error "You need to be in a cloned buffer!"))
    (let ((pos (point))
          (win (car (get-buffer-window-list buf))))
      (if win
          (select-window win)
        (other-window 1)
        (switch-to-buffer buf))
      (goto-char pos)
      (when (invisible-p (point))
        (show-branches)))))

นี้จะทำงานร่วมกับoutline-modeและเช่นเดียวกับรูปแบบที่สร้างตามพวกเขาเช่นoutline-minor-mode org-modeฉันพบข้อมูลบางอย่างเกี่ยวกับการรับแผนที่กุญแจในท้องถิ่น แต่ฉันไม่ทราบวิธีการเลือกที่จะคัดลอก นอกจากนี้ยังมีหน้านี้ซึ่งมีฟังก์ชั่นในการสร้างโหมดรองเฉพาะของบัฟเฟอร์โดยอัตโนมัติสำหรับการตั้งค่าคีย์บัฟเฟอร์ในเครื่อง แต่ดูเหมือนจะไม่อยู่ในขอบเขตของปัญหานี้


1
ขอบคุณสำหรับการแบ่งปัน โดยใช้outline-mode-mapแทนorg-mode-mapฉันจัดการเพื่อให้ทำงานAUCTeXด้วยoutline-minor-modeซึ่งเป็นสิ่งที่ดี
Oleg Domanov

โดยวิธีการoutline-modeฟังก์ชั่นของhide-bodyซ่อนทุกอย่างยกเว้นพาดหัว
Oleg Domanov

@OlegDomanov ขอบคุณสำหรับข้อมูลนั้น! ฉันปรับปรุงรหัสเพื่อใช้outline-mode-mapและhide-bodyและการปรับปรุงเล็กน้อยอื่น ๆ
blujay

2

ในที่สุดสิ่งนี้ได้ถูกนำมาใช้ในแพ็คเกจorg-sidebar:

การสาธิต org-sidebar-tree


1
Hoooray! ฉันมีการตั้งค่าแบบสั่นที่บางครั้งก็หยุดทำงานมันเป็นสิ่งที่ยอดเยี่ยมอย่างแน่นอนถ้ามันเป็นแพคเกจในขณะนี้!
เจริญเติบโต

0

คำแนะนำให้เช่าต่ำสองข้อ (สิ่งที่ฉันทำ) จากผู้ที่ไม่ใช่โปรแกรมเมอร์ที่ชอบใช้ aquamacs เพื่อแก้ไขข้อความ:

  1. สลับไปมาด้วยคำสั่งในบัฟเฟอร์:

การเริ่มต้น: เยื้อง (เพื่อแสดงเค้าโครงชนิดน้ำตกให้ดูง่ายขึ้นโดยรวม)

สิ่งนี้ใช้สำหรับการดูบัฟเฟอร์ของแท็บ

และ

+ ตัวเลือก: H: N โดยที่ N = = จำนวนระดับที่คุณต้องการดูในการส่งออก html ซึ่งเป็นข้อเสนอแนะ # 2

เห็น: https://emacsclub.github.io/html/org_tutorial.html

  1. ส่งออกเป็น html (CC CE hh) เพื่อดู TOC ฉันไม่สามารถหาใครที่สามารถเอาท์พุทข้อความของ html หรือ text (CC CE ta) ไปเยื้องได้อย่างง่ายดาย

0

ผมจำเป็นต้องมีสิ่งที่คล้ายกันดังนั้นฉันใส่กันโหมดoutline-toc ควรทำงานกับเอกสารโหมดองค์กร

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