Emacs:帮我理解文件/缓冲区管理

30

我已经使用Emacs三年来满足我所有的文本编辑需要。当我在单个文件中编写代码或进行其他工作时,我非常高效。有两个文件时,我可以使用“ C-x b RET”在它们之间切换并且做得很好。然而,当我需要同时处理超过两个文件时,我往往会迷失方向。

以下是我想要解决的一些问题:

  1. 我忘记了一些缓冲区的名称,但我不明白为什么“ C-x C-b”会分割我的窗口成两个缓冲区并退出小缓冲区。当然我可以切换缓冲区并选择要访问的缓冲区,但这感觉不自然,并且留下了两个缓冲区。

  2. 当我访问一个目录而不是一个文件时,我有一个方便的文件和目录列表。我通常希望做以下两件事之一:1)打开单个文件并永远不再看到此缓冲区,或2)打开多个文件并永远不再看到此缓冲区。我不知道如何做到这一点,因为将光标移到文件上并按回车键不会实现这两件事情。

  3. 我知道我的缓冲区不像选项卡,但我倾向于想要滚动查找我想要的内容。我不知道有没有任何键绑定可以实现此功能,但我希望它是M-n / M-p或类似的快捷键。然而,这可能是切换缓冲区的非常低效的方法。

  4. 当我打开任何交互式帮助(例如在ESS中)时,我习惯于切换回我正在工作的缓冲区,使用C-x 1返回单个缓冲区。然而,当我这样做时,帮助缓冲区会留在我的缓冲区列表中,进一步困扰我。我知道我可以切换到那个缓冲区,将其删除,切换回来,然后回到单个缓冲区,但这似乎不对。

到目前为止,我处理这个问题的方式是使用平铺式窗口管理器和几个在不同工作区中的emacs窗口,而不是真正学习在emacs中管理多个文件的最佳方式。我不一定想改变emacs以更好地适应我的需求(尽管如果符合我接下来要说的内容,我可以考虑),相反,我想理解处理文件/缓冲区的思考过程,以及如何更高效地处理它。

任何帮助我理解正确或更高效地管理我的缓冲区或文件的答案都将不胜感激。


1
  1. http://xahlee.org/emacs/file_management.html 查看最后一个问题。
- Yktula
我不知道如何在dired中标记文件。一开始似乎很有用,但后来我就不知道如何同时打开所有标记的文件了。有人知道怎么做吗? - Wilduck
1
这是默认功能中稍微有点奇怪的遗漏。您可以使用 C-o 在另一个窗口中仅为当前行打开文件,并在之后保留在 dired 窗口中,与 C-nC-p 结合使用,可以快速连续打开多个文件(尽管这会隐藏除最近打开的缓冲区之外的所有内容,这可能不是理想的)。要获取更好的答案,请查看此处:https://dev59.com/R3NA5IYBdhLWcg3wC5Xh - phils
6个回答

21
  1. C-x C-b 绑定到 ibuffer。这是一个更好的缓冲区列表工具,具有许多高级功能,其默认行为是将当前缓冲区替换为缓冲区列表,然后在您选择缓冲区时关闭列表(将新选择的缓冲区放在原始缓冲区的位置)。

    当然,您可以使用 C-x b 在 mini-buffer 中输入您的选择; 但是,要使此选项可行,需要使用制表符补全,此时会暂时打开一个新窗口,此时我认为您最好熟悉一些带有更多功能的内容。

  2. 在 dired 中选择时,请使用 a 而不是 RET。这将关闭 dired 缓冲区而不是留下它。您可以在任何缓冲区中使用 C-h m 显示其主要模式的帮助(接着是次要模式的帮助),并可以在其中阅读有关所有可用的 dired 键绑定的信息。

  3. http://www.emacswiki.org/cgi-bin/wiki/TabBarMode?(编辑:对于这个问题,我更喜欢 Rémi 的答案,但是如果您特别喜欢视觉化选项卡元素,则可以使用 TabBarMode。)

  4. 在许多主要模式中,q 绑定到“退出”功能。通常它会关闭缓冲区而不是杀死它,但我觉得这很好。

稍微详细说明一下第1点,ibuffer 有许多不错的功能,使用 M-x customize-group ibuffer RET 将为您提供如何自定义其外观的一些想法。

此外,您可以通过许多标准对缓冲区列表进行过滤(同样,使用 C-h m 可以查看其帮助页面),然后从当前过滤器生成 'group' 定义,并保存自定义的过滤器和分组以供将来使用。

例如:

  • / f ^/var/www/ RET: 过滤缓冲列表,只显示以/var/www/开头的文件名。
  • / s Web filters RET:将当前的过滤器设置命名并保存到您的init文件中。
  • / g Web development RET:从当前的过滤器创建一个命名组。
  • / S My groups RET:将组定义命名并保存到您的init文件中。
  • / r Web filters RET:调用名为“Web filters”的过滤器。
  • / R My groups RET:调用名为“My groups”的组。
  • RET在组名上可以折叠或展开它。
  • C-kC-y杀死和粘贴组来重新排列它们。
  • C-h m获取更多信息...

这样,您就可以运行单个Emacs实例,并为不同类型的任务创建过滤器和组,并轻松地在它们之间切换。


重新阅读问题,我应该强调ibuffer的过滤和分组能力。我已经相应地更新了我的答案。 - phils
谢谢你的回答!我不知道在dired中可以使用a。但是,对于我的第四个问题,你的回答让我有点困惑。只有'q'吗?在ESS帮助缓冲区中,这会将我移动到另一个缓冲区,当我的窗口被分割时,或者分割我的窗口。也许我做错了什么,但那似乎并不那么有用... - Wilduck
1
抱歉,我不熟悉ESS。我原以为你是指使用Emacs **Help**缓冲区/模式的交互式帮助,在其中'q'被绑定为这种方式(事实上在dired、buffer-menu、ibuffer、bs-show和至少大部分(可能是大多数)绑定字母数字字符到命令的内置主要模式中都是如此)。 (如果ESS帮助符合此描述,也许您可以建议他们改进?)如另一条评论中所提到的,C-x 4 0运行kill-buffer-and-window,这使得成为一个不错的通用解决方案。 - phils
谢谢,那完美地澄清了事情。 - Wilduck

17

我认为您会非常喜欢Ido,它可以处理您无法完全记住名称的多个缓冲区。当您键入C-x b时,它会按最常用的顺序显示打开的缓冲区列表。输入缓冲区名称中的一些字符时,列表将被过滤。您输入的字符不必在名称的开头或连续位置。使用C-fC-b或左/右箭头键可以循环浏览缓冲区选择。

还可以参考Smex来获得类似于Ido的M-x功能。

关闭窗口可以使用C-x 0。故意拆分窗口可以使用C-x 2进行水平拆分,C-x 3进行垂直拆分。我喜欢此功能,因为它使我可以同时查看测试和生产代码。C-x o可以切换到其他窗口。


4
当然还有 C-x 1,它关闭帧中的任何其他窗口,最大化当前窗口。 还有 C-x 4 0,绑定到 kill-buffer-and-window,可能是解决原始问题的适当解决方案。 - phils
1
虽然还有其他很好的答案,但我将这个标记为已接受的,因为Ido相当优雅地解决了我最令人沮丧的问题,即忘记我的缓冲区名称。 - Wilduck
5
我刚刚意识到我可以使用Ido从minibuffer中关闭buffers。按C-b,然后选择我想要关闭的那个,接着按C-k即可。太好了。 - Wilduck

4

我使用C-x right(或者C-x C-right)和C-x left(或者C-x C-left)来切换到下一个和上一个缓存区。虽然在Emacs中有一些不常用的缓存区,但现在我已经不在意了。你可以在缓存区列表中使用k来关闭你不再需要的缓存区。


除了默认的list-buffers之外,还有一个变体bsbs-show(或bs-show-sorted)基本上是list-buffers的更流畅版本,没有像ibuffer这样的花哨功能。 它还提供了bs-cycle-nextbs-cycle-previous,您可以使用它们来切换缓冲区,就像Rémi提到的命令一样。 这些还在迷你缓冲区中指示序列中的下几个缓冲区,增加了一些额外的价值。 请查看“cycle”函数的文档,因为您可以配置它将循环遍历的缓冲区类型。 - phils
bs并没有提供自己的按键绑定,但如果你更喜欢它的功能而不是其他替代品,我可以根据需要重新绑定C-x C-leftC-x C-rightC-x C-b到bs函数。另请参见M-x customize-group bs RET - phils
这太棒了。我肯定可以通过谷歌搜索找到答案,但由于一些原因,我被M-n和M-p困扰住了。C-x right同样有效。谢谢。 - Wilduck

4
您也可以尝试使用Iswitchb模式,当您通过C-x b切换缓冲区时,它会为缓冲区名称提供自动完成。
激活方式如下:
M-x iswitchb-mode

或者将以下内容添加到您的.emacs文件中:

(iswitchb-mode)

这个功能类似于Ido模式,但更加轻量级。

此外,如果您想要更自定义的缓冲区列表,则可以使用M-x bs-show代替C-x C-b。在该缓冲区中键入?以获取您可以执行的操作列表。


2

我认为用于翻阅缓冲区最有用的扩展是Anything。它能让你开始输入缓冲区(或文件!)名称的一部分,然后它会弄清楚你想要什么。我已经将C-x b重新绑定到anything-for-buffers。这使得生活变得更美好。


1
我会看一下这个。但是通常我知道我的电脑上的文件在哪里。只是在emacs中不知道。 - Wilduck

2

像往常一样,有许多方法可以帮助您完成此操作;这在某种程度上取决于个人偏好,以下是一些带有说明的链接:

  • ibuffer;这是一个更新的缓冲区菜单(C-x C-b)
  • ido,它可以让您更强大地自动完成缓冲区切换。这是一种“更好的iswitchb”。

这两个对我来说已经足够了;但您可能还会对tabbar-mode感兴趣,它提供了基本的选项卡(就像Firefox一样)。


感谢提供emacs-fu链接。 - Wilduck

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