《elisp 每日一练》——Indirect Buffer

《elisp 每日一练》——Indirect Buffer

Masimaro
2026-08-28 / 0 评论 / 0 阅读 / 正在检测是否收录...

前面我们了解了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

评论 (0)

取消