前面我们了解了buffer、window相关的机制,并且学习了操作它们的一些api函数。现在我们继续更深入的探索有关buffer和window的内容。
背景知识
Indirect Buffer 就像它的名字一样是一个间接的东西,它的本源是原始的buffer,但是它却拥有独立的buffer状态,像point、marker、narrowing、major mode等等。它与真实buffer的关系让我想起七龙珠中的天神和比克大魔王,二者本是是同源,因为天神剥离邪恶人格而诞生比克大魔王,二者虽然同源但是有不同的行为、不同的性格。二者一个的死亡也会牵扯到另一个。Indirect Buffer 就是从源buffer中诞生出来的,并且Indirect Buffer 内容的变化会影响到源buffer。
在Emacs 中创建 Indirect Buffer 的方法是 make-indirect-buffer
``emacs-lisp
(make-indirect-buffer BUFFER NAME &optional CLONE)
参数中的 `BUFFER` 表示源buffer对象,而 `NAME` 是 Indirect Buffer 的名称,`CLONE` 表示是否需要克隆当前buffer的状态。
如果你想克隆这些状态,我们可以 `clone-indirect-buffer` 它会将当前buffer作为一个源buffer,创建一个新的 indirect buffer,并且将源buffer的一些状态信息拷贝到新的buffer中。
另外,在引入indirect buffer 之后,我们获取到的buffer可能是 indirect buffer,如果我们想要获取源buffer可以使用 `buffer-base-buffer`。
## 练习
我们来实现一个小型的代码查看器,它会创建一个 indirect buffer 只显示用户选中区域,这样用户在新的buffer中修改也会直接同步到源buffer中
(defun my/region-view-scratch()
(interactive)
(if (use-region-p)
(let* ((begin (region-beginning))
(end (region-end))
(base-buffer (current-buffer))
(view-buffer-name (format "Indirect: %s" (buffer-name base-buffer)))
(view-buffer (make-indirect-buffer base-buffer view-buffer-name t)))
(pop-to-buffer view-buffer)
(narrow-to-region begin end)
(goto-char (point-min)))))
## 小结
本篇的内容到此就结束了,本篇我们介绍了 indirect buffer 的机制,本篇介绍的函数如下:
- `make-indirect-buffer`
- `buffer-base-buffer`
评论 (0)