Làm cách nào tôi có thể lấy phác thảo chế độ org trong bộ đệm thứ 2 dưới dạng mục lục động?


25

Khi tôi chỉnh sửa các tài liệu lớn, tôi muốn xem tôi đang ở đâu bằng cách xem phác thảo (không có nội dung) trong một bộ đệm riêng. Giống như khi bạn đọc một tệp PDF có TOC ở bên trái. (xem bên dưới)

Trong chế độ org, nó có thể mở rộng / thu gọn phác thảo. Nhưng có thể có một phác thảo tĩnh ở bên trái (hoặc phải) trong một bộ đệm riêng để khi bạn nhấp vào tiêu đề, bộ đệm khác di chuyển đến vị trí đó?

Kiểu như thế này nhưng cho chế độ org? nhập mô tả hình ảnh ở đây

[Chỉnh sửa]
Các clone-indirect-bufferrất gần với những gì tôi muốn. Phần còn thiếu của câu đố là nhảy đến cùng một vị trí khi nhấp vào tiêu đề / (hoặc bất kỳ điểm nào thực sự).

Đối với điều này, tôi đã cố gắng viết một số mã: Di chuyển đến bộ đệm nhân bản khác đến cùng một điểm? (vị trí đồng bộ của bộ đệm gián tiếp) (chế độ org)

Nhưng nó không hoạt động nếu nội dung bị sụp đổ. Nếu điều đó có thể được thực hiện để làm việc, thì bộ đệm nhân bản là một giải pháp hoàn chỉnh cho việc này.

[Giải pháp Edit2]
Mã trong liên kết ở trên và trong câu trả lời bên dưới kết hợp niceley để giải quyết việc nhảy qua lại.

;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ó thể thử C-c C-x b, hoặc org-tree-to-indirect-buffer.
Samuel Flint

@SWFlint Sau một thử nghiệm ngắn, có vẻ như nó làm một cái gì đó khác với những gì OP muốn: nó sao chép cây con hiện tại vào một bộ đệm gián tiếp. Những gì chúng ta cần sẽ là một org-sparse-tree-to-indirect-bufferchức năng, ví dụ, nhưng nó dường như không tồn tại.
T. Verron

Sau khi nhìn xa hơn một chút, hãy thử một cái gì đó dọc theo dòng của org-pan
Samuel Flint

Tôi nghĩ rằng nó cũng đáng đề cập đến danh sách imothy . Nó thiếu một số yêu cầu nhưng giải quyết những người khác.
sợi đốt

org-tree-to-gián tiếp-đệm là tuyệt vời.
ninrod

Câu trả lời:


9

Một vài lựa chọn đến với tâm trí. Hai cái đầu tiên speedbar, được cho là chơi tốt với org-mode, và minimapmặc dù tôi chưa sử dụng chúng nên không thể bảo đảm cho cá nhân họ.

Điều có thể là tùy chọn đơn giản nhất (và cũng linh hoạt nhất), sẽ là sử dụng bộ đệm gián tiếp .

Trong thực tế, bạn sẽ đi đến orgbộ đệm mà bạn muốn phác thảo, nhấn M-x clone-indirect-buffer(sử dụng C-u M-x clone-indirect-buffernếu bạn muốn kiểm soát bản sao được gọi là gì), và sau đó bùng nổ, có một bản sao khác của bộ đệm để bạn sử dụng. Đặt bản sao đó trong một cửa sổ hoặc khung cạnh nhau với bộ đệm ban đầu và, trong bản sao, điều chỉnh phác thảo theo sở thích của bạn.

Nó không giúp bạn có chức năng "nhấp vào tiêu đề trong phác thảo" mà bạn đã đề cập, nhưng mang lại cho bạn tinh thần của thanh bên.

Chỉnh sửa: để phản hồi nhận xét của bạn, đây là một lệnh đơn giản, khi được gọi từ bản sao bộ đệm , sẽ chuyển sang bộ đệm cơ sở và di chuyển điểm đến bất cứ nơi nào con trỏ nằm trong bản sao bộ đệm:

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

Tôi đã thử thanh tốc độ / Sr-Speedbar. Nó rất đẹp nhưng nó chỉ hiển thị 2 cấp độ đầu tiên. Tôi đã hỏi liệu có thể có nhiều cấp độ hơn ở đây không: emacs.stackexchange.com/questions/9533/NH Bộ đệm gián tiếp là một lựa chọn tốt. Tôi tự hỏi liệu bằng cách nào đó có thể di chuyển con trỏ trong bộ đệm khác đến cùng vị trí như trong bộ đệm nhân bản ..
Leo Ufimtsev

Tôi đã cố gắng viết mã sẽ nhảy đến cùng một vị trí trong bộ đệm khác, nhưng nó chỉ hoạt động nếu mọi thứ được mở rộng. Nếu nó có thể được thực hiện để hoạt động để nó tự động mở rộng, thì bộ đệm nhân bản là một giải pháp hoàn hảo. Bài đăng: emacs.stackexchange.com/questions/9536/ Khăn
Leo Ufimtsev

Cảm ơn bạn cho đoạn mã ở trên. Được đánh giá cao ^ _ ^.
Leo Ufimtsev 24/2/2015

16

Làm thế nào về: M-x occur RET ^*+ RET(lưu ý rằng có một khoảng trống ở cuối regrec).


Tôi không biết tại sao ai đó đánh giá thấp câu trả lời này, tôi nghĩ rằng đây thực sự là một giải pháp rắc rối tích hợp khá gọn gàng. Quirck duy nhất là nó không theo bạn xung quanh. Tức là không rõ ràng trong bộ đệm xảy ra ở nơi bạn đang ở (ví dụ: làm nổi bật tiêu đề hiện tại) và nó không cuộn cho các tài liệu dài. Nhưng đối với các tài liệu nhỏ, nó hoạt động.
Leo Ufimtsev

Tôi thích giải pháp đơn giản, tích hợp này. Nếu một người cần làm nổi bật, sử dụng helm-xảy ra thay vì xảy ra. Một lợi ích bổ sung là có thể sử dụng một điều hướng duy nhất cho nhiều bộ đệm tệp org bằng cách sử dụng đa xảy ra. Cuối cùng, với chỉnh sửa xảy ra, người ta có thể chỉnh sửa cả hai chế độ xem, chế độ xem phác thảo và chế độ xem mở rộng. Trong mọi trường hợp, tôi đang bỏ phiếu này.
Người dùng Emacs

Sẽ nâng cấp điều này bởi vì nó tuyệt vời, đơn giản và hiệu quả
Gambo

Quá dễ. Thật thông minh. Vì vậy, hackish. Rất tuyệt vời.
dangom

7

Sau khi đọc câu trả lời của Dan và giải pháp của bạn dựa trên nó, tôi kết hợp nó lại với nhau. Nó mở một bản sao mới, hẹp, chỉ đọc ở bên trái của bộ đệm hiện tại, và nó liên kết <mouse-1>RETcục bộ trong bản sao để nhảy đến vị trí đó trong bộ đệm cơ sở.

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

Điều này sẽ làm việc với outline-modeoutline-minor-mode, cũng như các chế độ xây dựng trên chúng, chẳng hạn như org-mode. Tôi đã tìm thấy một số thông tin về việc lấy bản đồ khóa địa phương, nhưng tôi không biết cách chọn bản đồ nào để sao chép. Ngoài ra còn có trang này có chức năng tự động tạo các chế độ nhỏ dành riêng cho bộ đệm để đặt các khóa cục bộ của bộ đệm, nhưng điều đó dường như nằm ngoài phạm vi của vấn đề này.


1
Cảm ơn vì đã chia sẻ. Bằng cách sử dụng outline-mode-mapthay vì org-mode-maptôi quản lý để làm cho nó hoạt động AUCTeXvới outline-minor-mode, đó là tốt đẹp.
Oleg Domanov

Nhân tiện, outline-modechức năng của nó hide-bodyche giấu mọi thứ trừ các tiêu đề.
Oleg Domanov 3/11/2015

@OlegDomanov Cảm ơn thông tin đó! Tôi đã cải thiện mã để sử dụng outline-mode-maphide-body, và một vài cải tiến nhỏ khác.
blujay

2

Cuối cùng, điều này đã được thực hiện trong gói org-sidebar:

bản demo org-sidebar-cây


1
Hoooray! Tôi có một thiết lập run rẩy mà đôi khi chỉ dừng hoạt động, nó hoàn toàn HẤP DẪN nếu bây giờ là một gói!
Phát triển

0

hai đề xuất thuê thấp (những gì tôi làm) từ một người không lập trình viên thích sử dụng aquamacs cho trình soạn thảo văn bản:

  1. chuyển đổi qua lại với các lệnh trong bộ đệm:

STARTUP: thụt lề (để hiển thị phác thảo loại thác dễ nhìn hơn)

cái này dùng để xem bộ đệm

+ TÙY CHỌN: H: N, trong đó N = = số cấp độ bạn muốn thấy trong xuất html, đó là đề xuất # 2

xem: https://emacsclub.github.io/html/org_tutorial.html

  1. xuất dưới dạng html (CC CE hh) để xem TOC. tôi không thể tìm thấy ai có thể dễ dàng lấy đầu ra văn bản của html hoặc văn bản (CC CE ta) để thụt lề

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.