2.3 切换缓冲区

实际上,当将other-buffer函数用作需要缓冲区参数的函数的参数时,它实际上提供了一个缓冲区。通过使用other-bufferswitch-to-buffer来切换到不同的缓冲区,我们可以看到这一点。

但首先,让我们简要介绍一下switch-to-buffer函数。当你在Info和*scratch*缓冲区之间切换以评估(buffer-name)时,你很可能会输入C-x b,然后在迷你缓冲区中输入*scratch*7 用于切换到所需缓冲区的名称。按下C-x b这些按键会导致Lisp解释器评估交互函数switch-to-buffer。正如我们之前所说,这就是Emacs的工作原理:不同的按键调用或运行不同的函数。例如,C-f调用forward-charM-e调用forward-sentence等等。

通过在表达式中编写switch-to-buffer,并给它一个要切换到的缓冲区,我们可以像C-x b一样切换缓冲区:

(switch-to-buffer (other-buffer))

符号 switch-to-buffer 是列表的第一个元素,因此Lisp解释器将其视为一个函数并执行与其关联的指令。但在执行之前,解释器会注意到 other-buffer 在括号内,并首先处理该符号。other-buffer 是此列表的第一个元素(在这种情况下,也是唯一的元素),因此Lisp解释器调用或运行该函数。它返回另一个缓冲区。接下来,解释器运行 switch-to-buffer,将另一个缓冲区作为参数传递给它,这就是Emacs将要切换到的缓冲区。如果您正在Info中阅读此内容,请立即尝试。评估此表达式。(要返回,请键入 C-x b RET。)8

在本文档后面的编程示例中,您将更频繁地看到函数 set-buffer 而不是 switch-to-buffer。这是因为计算机程序和人类之间存在一个差异:人类有眼睛,并期望在计算机终端上看到他们正在操作的缓冲区。这是如此明显,几乎不言而喻。然而,程序没有眼睛。当计算机程序在缓冲区上工作时,该缓冲区不需要在屏幕上可见。

switch-to-buffer 是为人类设计的,它执行两个不同的操作:它切换Emacs关注的缓冲区,并将窗口显示的缓冲区切换到新的缓冲区。另一方面,set-buffer 只执行一项任务:它将计算机程序的注意力切换到另一个缓冲区。屏幕上的缓冲区保持不变(当然,通常在命令运行完成之前不会发生任何变化)。

此外,我们刚刚介绍了另一个行话术语,即词语 call。当您评估一个列表,其中第一个符号是一个函数时,您正在调用该函数。该术语的使用来自于将函数视为如果您调用它可以为您做一些事情的实体的概念,就像水管工是一个实体,如果您呼叫他或她,他或她可以修理漏水一样。


Footnotes

(7)

或者更确切地说,为了节省输入,如果默认缓冲区是*scratch*,你可能只输入RET,或者如果它不同,则只输入部分名称,如*sc,按下TAB键使其扩展为完整名称,然后输入RET

(8)

请记住,此表达式将将您移动到您无法看到的最近的其他缓冲区。如果您真的想转到最近选择的缓冲区,即使您仍然可以看到它,您需要评估以下更复杂的表达式:

(switch-to-buffer (other-buffer (current-buffer) t))

在这种情况下,other-buffer 的第一个参数告诉它要跳过的缓冲区(当前的缓冲区),第二个参数告诉 other-buffer 可以切换到可见的缓冲区。在常规用法中,switch-to-buffer将您带到窗口中不可见的缓冲区,因为您很可能使用 C-x oother-window)转到另一个可见的缓冲区。