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将返回该缓冲区。

你可以通过评估以下表达式来看到这一点:

(other-buffer)

你应该在回显区看到#<buffer *scratch*>出现,或者是你最近切换回来的任何其他缓冲区的名称6


Footnotes

(6)

实际上,默认情况下,如果你刚刚从中切换的缓冲区在另一个窗口中可见,other-buffer将选择你无法看到的最近的缓冲区;这是我经常忘记的一个细微之处。