Emacs的list-buffers行为

54
在GNU emacs中,每次我按下Ctrl-x Ctrl-b来查看所有的buffer时,窗口会被分割以显示buffer列表,或者如果我已经将窗口分割为两个(例如,我在较低的窗口中运行shell),则buffer列表将出现在另一个窗口中。
我的期望行为是,在我的活动窗口中出现buffer列表,这样我就可以选择我想要的buffer并继续在同一个窗口中工作,而不必使用Ctrl-x Ctrl-o切换到另一个buffer,然后选择该buffer(使用enter)并在其他窗口中编辑该buffer... 我尝试谷歌搜索,但似乎这不是一个常见的需求?我想知道是否有任何elispy(或其他)解决方案?
9个回答

68

你可能想要重新绑定 C-x C-b,以调用 buffer-menu 而不是 list-buffers

(global-set-key "\C-x\C-b" 'buffer-menu)

2
我想知道是否有一种方法可以使用快捷键,例如1、2...或a、b、c...更快地打开一个缓冲区,我知道ac-jump-buffer可以做到这一点,但它的缓冲区列表太简单了,没有额外的信息,例如模式、大小列在缓冲区菜单中。如果您解决了这个问题,那将不胜感激。@zimbu668 - CodyChan

16

只需自定义变量 same-window-regexps。当缓冲区名称与该变量中的正则表达式匹配时,display-buffer 将在当前选定的窗口中显示该缓冲区。

(您可能需要添加 "[*]Buffer List"。)


2
这是最好的答案,因为它深入到了真正的问题(修改display-buffer行为),而不是提供临时解决方案。 - xyzzyz

14

这并不是一个完美的解决方案,但是ido-mode提供了一种不同而强大的与缓冲区交互的方式。C-x b将显示所有打开的缓冲区列表,您选择的缓冲区将在当前窗口中打开。


1
我不知道为什么你被踩了...知道有选择总是好的! - hatmatrix
如果你回来看的话,感谢你的建议。我现在是ido的粉丝了。 - hatmatrix

7

奇怪的是,这里没有提到ibuffer的答案。

我建议将其作为大多数Emacs用户的标准更改:

(global-set-key (kbd "C-x C-b") 'ibuffer)

ibuffer是默认缓冲列表的一个高级替代品,它提供了准确的功能,并且还提供了许多其他功能。

我在Emacs: help me understand file/buffer management中列出了一些ibuffer过滤和分组的基础知识,但请务必阅读文档以获取详细信息。


5

尝试添加

(ido-mode 1)

将此代码添加到您的 .emacs 文件中,并享受结果 :)

3
如果您喜欢原始缓冲区列表(而不是其他人提出的“buffer-menu”解决方案),则可以使用以下方法:
(global-set-key (kbd "C-x C-b") 'my-list-buffers)
(defun my-list-buffers (&optional files-only)
  "Display a list of names of existing buffers.
The list is displayed in a buffer named `*Buffer List*'.
Note that buffers with names starting with spaces are omitted.
Non-null optional arg FILES-ONLY means mention only file buffers.

For more information, see the function `buffer-menu'."
  (interactive "P")
  (switch-to-buffer (list-buffers-noselect files-only)))

与以前相同的功能,只是在当前窗口中。

我现在正在使用一个变量,其中包含switch-to-buffer-other-window和特殊行为,如果我已经在缓冲区列表中。谢谢。 - mkiever

2

我强烈推荐从http://www.geekware.de/software/emacs/中下载bs.el。安装后,按照以下步骤:

(require 'bs)
(add-hook 'bs-mode-hook 'turn-on-font-lock)
(global-set-key "\C-x\C-b" 'bs-show)

它以正确的方式管理缓冲区和窗口配置,因此一切都需要最少的按键操作。

1

不确定我从哪里得到这个:

;;; Faster buffer switching
(global-set-key [(C tab)] 'buffer-menu) 

这将使Ctrl-Tab在当前窗口中显示所有缓冲区。然后,您可以导航到缓冲区并按Enter键访问它。

谢谢 - 我已经预留了 Ctrl-tab :)。但是 buffer-menu 很重要。 - hatmatrix

0
另一个不是你所要求的解决方案:不要用鼠标选择所需的缓冲区,而是完成输入其名称(使用制表符补全减少按键次数并提高准确性),然后按回车键。缓冲区列表将消失,并且新文件将在先前活动的窗口中打开。

谢谢 - 但我大多数时间都在终端工作,所以没有鼠标...但有时我会困惑一些缓冲区是否以 * 开头,但你说得对,制表符补全甚至可以帮助我解决这个问题。 - hatmatrix
这对我来说并没有移除缓冲区列表窗口? - sandos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接