为什么要使用间接缓冲区?


Answers:


16

查看和编辑同一缓冲区的多个位置。因此,您不必滚动长缓冲区,只需将窗口切换到可见区域即可。每个克隆的缓冲区还具有不同的标记环,变窄和其他缓冲区属性。如果您不使用间接缓冲区,而是创建同一缓冲区的另一个窗口,则所有内容都是共享的,您将无法执行其他高级功能,而无法查看和编辑不同的位置。例如,使用间接缓冲区,您可以折叠所有代码块,有效创建“标签树”,而不会影响原始缓冲区。使用窗口,由于两个缓冲区相同,因此两个窗口中的两个缓冲区都被折叠。

总而言之,间接缓冲区是一个完全不同的缓冲区,碰巧在原始缓冲区中共享相同的文本和文件,因此,在保存克隆的缓冲区时,它也保存了原始文件。


3
我同意间接缓冲区有好处。但是您的第一点不需要缓冲区是间接的。即使在两个窗口中简单地打开了同一缓冲区,也可以查看和编辑同一缓冲区的多个位置。但是,是的,在我看来,独立的缩小,折叠等是间接缓冲区的强大功能。
Kaushal Modi

5
还可以使用多种模式编辑相同的缓冲区(结合使用变窄的间接缓冲区)。您可以使用markdown模式编辑缓冲区的某些部分,使用python模式编辑另一部分,使用json模式
编辑

您可以单独使用多个窗口看到多个位置,但是由于在这种情况下只有一个point值,所以切换缓冲区不会在两个窗口中都保留位置,而是仅保留一个。
2015年

9

一种用例是在文件的一部分上使用另一种主要模式。

例如,我一次使用某些元素中包含代码的xml文档。我希望能够像编辑XML一样编辑整个文档,但仍将编程语言的所有主要模式功能嵌入到某些元素中,因此我将这些元素的范围缩小到运行该脚本的间接缓冲区中。适当的主要模式。

这是我用来执行此操作的配置中的一个函数:

(defun indirect-region (start end)
  "Edit the current region in another indirect buffer.
    Prompt for a major mode to activate."
  (interactive "r")
  (let ((buffer-name (generate-new-buffer-name "*indirect*"))
        (mode (intern
               (completing-read
                "Mode: "
                (mapcar (lambda (e)
                          (list (symbol-name e)))
                        (apropos-internal "-mode$" 'commandp))
                nil t))))
    (pop-to-buffer (make-indirect-buffer (current-buffer) buffer-name))
    (funcall mode)
    (narrow-to-region start end)
    (goto-char (point-min))
    (shrink-window-if-larger-than-buffer)))

注意:这并不完美,在这种情况下,诸如字体锁定之类的操作需要特殊的额外工作。


3

间接缓冲区为您提供同一个缓冲区的多个视图,尤其是多个范围,每个范围在很多方面都像一个单独的缓冲区。

正如图书馆评论narrow-indirect.el说:

您可以使用间接缓冲区超出您的想象。例如,您可以使用从Dired缓冲区的一部分中获取的克隆,以将有用的(活动的)视图提供给目录列表。只有很少的键/命令(例如g更新列表)不起作用,因为它们依赖于整个Dired缓冲区的视图。做实验,毫无疑问,您会发现间接缓冲区的有趣新用途。

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.