2.2 获取缓冲区

buffer-name 函数返回缓冲区的名称;要获取缓冲区本身,则需要另一个函数:current-buffer。在代码中使用此函数时,得到的是缓冲区本身。

名称与名称所指代的对象/实体是不同的。你不是你的名字,而是别人用名字称呼的一个人。如果你要求和 George 说话,有人递给你一张写着字母 ‘G’、‘e’、‘o’、‘r’、‘g’、‘e’ 的卡片,你可能会觉得有趣,但不会满意。你想交谈的不是这个名字,而是这个名字所指的人。缓冲区也是如此:临时缓冲区的名称是 *scratch*,但名称本身不是缓冲区。要获取缓冲区本身,需要使用 current-buffer 这样的函数。

不过,这里有个细微的复杂之处:如果像我们在这里所做的那样,在表达式中单独对 current-buffer 求值,你看到的是缓冲区名称的打印形式,而非缓冲区的内容。Emacs 这样做有两个原因:缓冲区可能有数千行 — 太长而不便显示;并且,另一个缓冲区可能内容相同但名称不同,区分它们很重要。

这是一个包含该函数的表达式:

(current-buffer)

在 Emacs 的 Info 中按常规方式对此表达式求值,回显区会显示 #<buffer *info*>。这种特殊格式表明返回的是缓冲区本身,而不仅仅是其名称。

顺便一提,虽然你可以在程序中输入数字或符号,但不能输入缓冲区的打印形式——获取缓冲区本身的唯一方法是使用 current-buffer 等函数。

相关的函数是 other-buffer。它返回除当前缓冲区之外最近选择的缓冲区,而不是其名称的打印形式。如果你最近在 *scratch* 缓冲区和其他缓冲区之间来回切换,other-buffer 会返回该缓冲区。

对以下表达式求值即可看到效果:

You can see this by evaluating the expression:

(other-buffer)

你应该会在回显区看到 #<buffer *scratch*>,或者你最近从其切换回来的其他缓冲区的名称。6


Footnotes

(6)

实际上,默认情况下,如果你刚从其切换的缓冲区在另一个窗口中可见,other-buffer 会选择你看不到的最近缓冲区——这是一个我常忘记的细节。