Answers:
查看和编辑同一缓冲区的多个位置。因此,您不必滚动长缓冲区,只需将窗口切换到可见区域即可。每个克隆的缓冲区还具有不同的标记环,变窄和其他缓冲区属性。如果您不使用间接缓冲区,而是创建同一缓冲区的另一个窗口,则所有内容都是共享的,您将无法执行其他高级功能,而无法查看和编辑不同的位置。例如,使用间接缓冲区,您可以折叠所有代码块,有效创建“标签树”,而不会影响原始缓冲区。使用窗口,由于两个缓冲区相同,因此两个窗口中的两个缓冲区都被折叠。
总而言之,间接缓冲区是一个完全不同的缓冲区,碰巧在原始缓冲区中共享相同的文本和文件,因此,在保存克隆的缓冲区时,它也保存了原始文件。
一种用例是在文件的一部分上使用另一种主要模式。
例如,我一次使用某些元素中包含代码的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)))
注意:这并不完美,在这种情况下,诸如字体锁定之类的操作需要特殊的额外工作。
间接缓冲区为您提供同一个缓冲区的多个视图,尤其是多个范围,每个范围在很多方面都像一个单独的缓冲区。
正如图书馆评论narrow-indirect.el
说:
您可以使用间接缓冲区超出您的想象。例如,您可以使用从Dired缓冲区的一部分中获取的克隆,以将有用的(活动的)视图提供给目录列表。只有很少的键/命令(例如
g
更新列表)不起作用,因为它们依赖于整个Dired缓冲区的视图。做实验,毫无疑问,您会发现间接缓冲区的有趣新用途。