如何在第二个缓冲区中获取组织模式大纲作为动态目录?


25

当我编辑大型文档时,我想通过在单独的缓冲区中看到轮廓(没有内容)来查看我的位置。就像您阅读PDF文件时一样,左侧有一个目录。(见下文)

在组织模式下,可以展开/折叠轮廓。但是是否有可能在单独的缓冲区的左侧(或右侧)具有静态轮廓,以便当您单击标题时,另一个缓冲区移至该位置?

有点像这样,但对于组织模式? 在此处输入图片说明

[编辑]
clone-indirect-buffer是非常接近我想要的东西。难题的缺失部分是单击标题/(或实际上是任何一点)时跳转到相同的位置。

为此,我尝试编写一些代码:移动到其他克隆的缓冲区到同一点?(间接缓冲区的同步位置)(组织模式)

但是,如果内容被折叠,它将不起作用。如果可以做到这一点,那么clone-inderect-buffer就是一个完整的解决方案。

[Edit2解决方案]
上方链接和下方答案中的代码结合了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例如,我们需要的是一个函数,但是它似乎不存在。
T. Verron

进一步查看后,尝试按照组织架构进行操作
Samuel Flint 2015年

我认为值得一提的是imenu-list。它缺少一些要求,但可以满足其他要求。
白炽灯2015年

org-tree-to-indirect-buffer很棒。
ninrod

Answers:


9

我想到了一些选择。前两个是speedbar,据称可以与org-mode和一起使用minimap,尽管我没有使用过它们,所以不能亲自为其提供担保。

最简单的选择(也是最灵活的选择)可能是使用间接缓冲区

在实践中,您将转到需要org轮廓的缓冲区,然后单击M-x clone-indirect-bufferC-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)))))

我尝试了speedbar / Sr-Speedbar。很好,但只显示前两个级别。我问这里是否可能有更多级别:emacs.stackexchange.com/questions/9533 / ...间接缓冲区是一个不错的选择。我不知道是否有可能以某种方式移动光标在其他缓冲区,以相同的位置,在克隆的缓冲..
狮子座Ufimtsev

我试图编写将跳转到另一个缓冲区中相同位置的代码,但只有在所有内容都扩展后才能起作用。如果可以使其工作以使其自动扩展,则克隆缓冲区是一个理想的解决方案。邮编:emacs.stackexchange.com/questions/9536/...
狮子座Ufimtsev

感谢您提供上述代码段。非常感谢^ _ ^。
Leo Ufimtsev

16

怎么样:(M-x occur RET ^*+ RET请注意,regexp的末尾有一个空格)。


我不知道为什么有人不赞成这个答案,我认为这实际上是一个非常简洁的内置无忧解决方案。唯一的问题是它不会跟着您走。也就是说,它在您所在的出现缓冲区中并不明显(例如,突出显示当前标题),并且不会滚动显示较长的文档。但是对于小文件却可以。
Leo Ufimtsev

我喜欢这个简单的内置解决方案。如果需要突出显示,请使用helm-occur代替出现。另一个好处是可以通过使用多次出现来对多个组织文件缓冲区使用单个导航。最后,使用事件编辑,可以同时编辑两个视图,即大纲视图和展开视图。无论如何,我对此表示赞成。
Emacs用户

要赞扬它,因为它很棒,简单且有效
Gambo

很简单。好聪明。太黑了。好棒。
dangom '18年

7

在阅读完Dan的答案以及基于该答案的解决方案之后,我将其合并在一起。它在当前缓冲区的左侧打开一个新的,狭窄的只读克隆,并在克隆中本地绑定<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-modeoutline-minor-mode以及基于它们的模式一起使用,例如org-mode。我找到了一些有关获取本地密钥映射的信息,但是我不知道如何选择要复制的密钥映射。还有这个页面具有功能自动进行缓冲,具体设置缓冲区局部键小调,但这个问题似乎外的范围。


1
感谢您分享这一点。通过使用outline-mode-map代替,org-mode-map我设法使其AUCTeX与一起使用outline-minor-mode,这很好。
奥列格·多马诺夫

顺便说一句,outline-mode的功能hide-body隐藏了除标题以外的所有内容。
奥列格·多马诺夫

@OlegDomanov感谢您提供的信息!我改进了代码,以使用outline-mode-maphide-body和其他一些小的改进。
blujay 2015年


0

来自喜欢使用aquamacs进行文本编辑的非程序员的两个低租金建议(我该怎么做):

  1. 使用缓冲区内命令来回切换:

STARTUP:缩进(以显示瀑布类型轮廓更易于整体查看)

这是用于选项卡驱动的缓冲区查看

+ OPTIONS:H:N,其中N = =您希望在html导出中看到的级别数,这是建议2

参见:https : //emacsclub.github.io/html/org_tutorial.html

  1. 导出为html(CC CE hh)以查看目录。我找不到能轻易缩进html或text(CC CE ta)文本输出的人

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.