如何快速切换缓冲区?


67

在香草Emacs中,我必须做C-x b,然后手动键入要切换的缓冲区名称。如果忘记了缓冲区的名称,则必须点击TAB以列出可能的补全。我可以做些什么来加快此过程的速度吗?


10
这应该标记为Community Wiki。但是Emacs已经拥有一个庞大的Wiki。例如,我在Google上获得的最高成绩是此页面上的Switching Buffers。在我看来,CW风格的问题尤其使emacs.SE显得格格不入。
purple_arrows 2014年

1
我喜欢C-x C-<left/right>用来快速切换缓冲区。当需要切换到“更多”缓冲区时,我使用IBuffer
kuanyui 2014年

我使用“ Cx x”来切换缓冲区(带有头盔和映射到控件的大写字母)。输入Cx b令我从未感到舒适。
wdkrnls


1
使用答案中的一种解决方案,不要使用Cx b。3个按键太多,无法进行如此频繁的操作。我个人使用单个键,否则不使用正确的Windows键。
2014年

Answers:


49

有应该帮助的ido模式。

编辑:

将其放入您的init文件中,以默认激活ido模式:

(ido-mode 1)

现在,C-x b将向您显示候选人列表。

如果您希望垂直显示项目,请将其放入您的init文件中:

(setq ido-separator "\n")

人体工程学提供

让我也建议这篇文章谈论切换到上一个/下一个缓冲区。


2
我们可能应该尝试从该帖子中获取大多数重要信息,以回应该问题。这样,未来的用户就不必追踪可能死掉的站点的链接。
nixeagle 2014年

@nixeagle我进行了一些编辑,希望能提供最重要的信息。
Nsukami _

我完成了对您的意见,因为现在已经完成了,但是我要等几天才能接受,以防其他人提出不同或更好的答案。谢谢!
nixeagle 2014年

@nixeagle没什么!
Nsukami _

1
@nixeagle找到了更好的答案吗?
Emacs用户

42

我最近开始使用C-x <left>C-x <right>。这些都是标准的Emacs绑定-无需配置。左移将您带回到上一个缓冲区(最初与相同C-x b RET),但是再次执行该操作会将您带到最近访问的第三个缓冲区。如果您在3个或4个缓冲区之间来回弹出很多,那么我发现它比尝试记住缓冲区名称要容易得多。

我也刚刚发现C-x C-<left>C-x C-<right>绑定到相同的功能,因此您可以按住Control键并在x和箭头之间交替来翻动缓冲区。挺好的!


4
我同意你的看法!我是emacs的新手,也不想被额外的软件包和更多的配置所困扰。这个解决方案对我有用!:D
ankush981

Cx C- <left>和Cx C- <right>获胜!我曾经将上一个/下一个缓冲区绑定到CS- <left> / <right>。但是以某种方式,我发现使用两个meta键甚至更容易键入Cx C-left。CS很难按。
Didier A.

真好!一周前,我学习了这些绑定,想到它们有多棒,然后就忘记了它们。直到现在,他们都无法在网上找到它们。谢谢!
基里尔·尤努索夫

40

您可以使用Helm

在我的设置中,我已切换C-x bM-l。这与helm-buffers-list,至少对于我而言,使处理过程非常快。


这基本上是现在的最佳答案。当然,您仍然可以使用idoor或iswitchbor之类的icicles东西,但是Helm基本上已淘汰了它们。是的,ace-jump-buffer很酷,但是不如Helm快,因为在您知道要按什么键之前,您必须在列表中找到缓冲区。Helm允许您使用一些已知的击键(例如缓冲区的名称)来缩小列表的范围。我C-TAB用来切换缓冲区,加载最近的文件,书签等。没有什么比这更快的了。
blujay 2015年

4
为+1 helm。但我更喜欢使用helm-mini,这也说明你Recentfhelm-buffers-list
2015年

1
也有常春藤ivy-switch-buffer
Oleksii Filonenko

我发现常春藤比头盔快得多,所以我推荐它而不是头盔。
Didier A.

10

只是为了增加我已经提到的Ido使用的调整:

(require 'ido)
(require 'ido-hacks)
(require 'flx-ido)
(require 'ido-vertical-mode)

(ido-mode 1)
(flx-ido-mode 1)
(ido-hacks-mode 1)
(ido-everywhere 1)
(ido-vertical-mode 1)

(setq ido-enable-flex-matching t
      ido-use-filename-at-point 'guess
      ido-vertical-define-keys 'C-n-C-p-up-down-left-right))

我还使用ace-window到缓冲区间切换一起ace-jump-mode可见窗口之间。附带一些习惯但值得尝试。

我将其与之结合使用key-chord-modeso可以快速跳转:

(key-chord-define-global "so" 'ace-window)

所有上述软件包都可以通过Melpa的软件包管理器获得。


我已经编辑你的答案,以取代use-packagerequire防止混淆。在给定的示例中,用户无需特别安装其他软件包即可实施该解决方案。
2014年

1
我建议不要使用英语中频繁出现的字母组合(假设您主要在emacs中输入英语)作为键和弦。以我的观点,当您快速键入诸如“ so”,“ some”,“ personal”等之类的内容时,“ so”很容易无意间触发。
考沙尔·莫迪

10

正如@kuanyui在评论中所说,next-bufferprevious-buffer很快,如果您只有几个缓冲区可以循环。(我使用了不止几个,还有更多的缓冲区选择功能icicle-buffer。)

但是,默认情况下,next-buffer并且previous-buffer位于前缀键上C-x

这意味着它们是不可重复的:你不能只是命中C-x <right> <right> <right>...。相反,您必须将这些命令绑定到不同的可重复键,或者必须使用C-x <right> C-x <right> C-x <right>...,这不是很快。

对于这些命令的可重复版本,请加载库misc-cmds.el并将不可重复的原始版本重新映射到此处定义的可重复版本:

(global-set-key [remap previous-buffer] 'previous-buffer-repeat)
(global-set-key [remap next-buffer]     'next-buffer-repeat)

(类似地,在同一个库中undo,即使在前缀键上也可以找到可重复的版本undo-repeat。)


顺便说一句,您可以使用(from )函数使几乎所有命令可重复(即使在前缀键上也是如此)。这是定义以下可重复版本所需的全部工作:repeat-commandmisc-cmds.elnext-buffer

(defun previous-buffer-repeat ()
  "Switch to the previous buffer in the selected window.
You can repeat this by hitting the last key again..."
  (interactive)
  (require 'repeat nil t) ; Library `repeat.el' is in Emacs 22.1 and later
  (repeat-command 'next-buffer))

3
...或者只是将下一个/上一个缓冲区绑定到C-,C-.以获得可重复性,无论如何,在它上时,将C-x.and 设置C-x,other-windowand (lambda()(interactive)(other-window -1))。骑自行车的窗户可能需要更少的可重复性,并且一分钟之内就可以摆脱多余的包裹。
Andreas Spindler

2
@AndreasSpindler:您当然可以在可重复键上放置任何命令,从而使其可重复。那不是重点。可重复的密钥很少,而未绑定的密钥越来越少。这是关于如何使命令在前缀键上时可重复执行
Drew

1
我对您的帖子不太了解,但是或多或少提到了该主题“如何快速切换缓冲区?”。为此,我找到了独立于任何特定按键绑定的技巧next-bufferprevious-buffer最佳解决方案。因此,我的评论。
Andreas Spindler,2015年

@AndreasSpindler:知道了;谢谢。
2015年

太好了,即使有前缀键,我也经常需要可重复的命令。就是说,我发现上一个/下一个缓冲区默认为Cx C-left和Cx C-right,这使您可以使用旧的C,然后重复按x-left和x-right。默认情况下还不错。
Didier A.

9

我很惊讶没有人提及iswitchb。它可能不如强大ido,但在emacs ido-mode诞生之前iswitchb-mode就已经很早了,如今它仍然有用。尝试一下就放

(iswitchb-mode 1)

进入.emacs或通过激活M-x iswitchb-mode


4
iswitchb从Emacs 24.4开始已过时。ido现在,它的所有功能都可用。
泰勒2014年

4
@Tyler我更喜欢iswitchb的默认外观,因为它更彩色,更漂亮。也许可以将ido配置为看起来一样,但是iswitchb可用时(至少对我而言)没有意义。
2014年


6

其他人则讨论了有助于使缓冲区/窗口/帧切换更轻松的软件包。(我个人helm认为这是惊人的。)我想讨论更简单的更改,这些更改可以使Emacs体验更加愉快。

对我来说,解决缓冲区/帧问题的方法(因为我认为C-x o是最糟糕的)不是一个解决方案。这很简单:

  • 映射C-;other-window(通过Windows循环)
  • 映射C-'other-frame(通过帧循环)。添加此快捷方式后,实际上我开始更多地使用框架了。
  • 将其他简单的单键按键绑定映射到简单的自定义函数,以操纵可见帧中的缓冲区。示例包括:将缓冲区扔到另一个窗口(在2窗口设置中),在给定窗口中的当前缓冲区和最后一个缓冲区之间切换,掩埋另一个缓冲区(这对于替换help弹出窗口非常有用) (在阅读手册页,宣传手册等时),而以前没有看到任何窗口。

我还以为我会分享一些关于键绑定的想法,新手可能会觉得有用。(很抱歉,如果这是错误的地方。)我没有具体的建议,而是一种“哲学”,可以让我为自己保持一套有效的键绑定。

  1. 不常用的命令不应该使用简单的键绑定。

    • 下载keyfreq.el并查看您实际使用的内容。我使用适者生存法来确定哪些命令被授予键盘上最有价值的房地产。
    • 不要害怕摆脱默认的Emacs键盘绑定,其中有些只是荒谬的。 C-\是一个很好的捷径(出于#2中讨论的原因)...并且将其映射到其默认命令:是一种犯罪change-input-method。(也许你们中的一些人经常使用它,我当然不会。)
  2. 以下因素决定了键盘快捷键的简便性和速度(从最重要的开始):

    • 连续按下组合键(无论它可能是,CtrlMeta等)。例如,对我而言,击中C-c C-l C-p要比击中要快得多C-x o。我个人觉得Ctrl在给定键序列的连续两次击键之间必须拔下键非常不方便。仅需不断合并修改器按钮(在本例中为Ctrl)就容易得多。(此特定示例可能受到我重新映射Ctrl密钥和Caps-Lock密钥的影响。)
    • 与你的朋友轮流。对我而言,击中C-c C-l C-p要比击中要快得多C-p C-' C-;。(尝试一下,应该很明显。)通常来说,使用交替使用手(或至少同一只手指交替使用)的击键序列要容易得多。
    • 与标准手位置的偏离度。 这不适用于那里的狩猎和啄食爱好者。但是对于我们其他人来说,我们最常用的键盘快捷键应该可以使我们快速轻松地返回到我们的标准触摸输入位置。

我认为可能仅对新手有用的几点想法。我可能以后再添加一些。


3

我使用windmove.elbs.el快速切换缓冲区。这两种模式都包含在Emacs中。

  • windmove.el- 沿指定的方向(例如,左,右,上,下)切换到窗口(当前显示的缓冲区)。

  • bs.el-我使用bs-cycle-nextbs-cycle-previous切换到窗口中当前未显示的下一个缓冲区。

您可以设置windmove与(windmove-default-keybindings)将结合到适当的命令Shift-Left ArrowShift-Right Arrow等等。

为了进行设置bs.el,类似这样的方法将起作用:

 (global-set-key [(f9)]   'bs-cycle-previous)
 (global-set-key [(f10)]  'bs-cycle-next)

缓冲区不是窗口(框架)!不要混淆他们!
kuanyui 2014年

2
窗户不是框架。无论如何,windmove.el它位于EmacsWiki页面的“切换缓冲区”下,并且可以bs.el在缓冲区而不是Windows上运行。
2014年

我阐明了windmove的作用。
2014年

3

我知道的最快切换缓冲区的方法是使用ace-jump-buffer。一键打开缓冲区菜单,然后选择要使用的缓冲区旁边的字母ace-jump-line-mode。这最适合26个左右的最新缓冲区。要切换到使用历史中更远的缓冲区,ido-switch-buffer始终是一个不错的选择。


3

我更喜欢浏览器样式的标签导航。我分别将Ctrl + Tab和Ctrl + Shift + Tab绑定到下一个和上一个缓冲区:

(global-set-key [C-tab] 'next-buffer)
(global-set-key [C-S-tab] 'previous-buffer)

2

广义地说,有两种切换缓冲区的方法,大多数解决方案都属于其中一种。

  1. 使用迷你缓冲区

这是C-x b默认情况下的功能。Ido为您提供了很好的自动完成功能,因此您不需要那么麻烦。像helm,projectile等项目使您能够使用项目等中的文件,从而使其变得更加容易,并且与ido一起使用时,它们可能非常有用。

  1. 列出了所有项目的整个缓冲区。

当您有太多缓冲区并且想要所有缓冲区列表时,这很有用。您可以上下移动缓冲区,然后按Enter键访问特定文件。Ibuffer对此非常有用。

我同时使用这两种方法,这是设置方法。

 (global-set-key (kbd "C-x C-b") 'ido-switch-buffer)
 (global-set-key (kbd "C-x b") 'ibuffer)`

对于第二个头盔,Helm也是不错的选择
Tom

2

除了ido,我还有以下设置。

  1. 在邪恶模式下,请使用以下按键绑定来切换缓冲区

    (define-key evil-normal-state-map (kbd "C-j") 'next-buffer)
    (define-key evil-normal-state-map (kbd "C-k") 'previous-buffer)
    (define-key evil-normal-state-map (kbd "C-S-h") 'evil-window-left)
    (define-key evil-normal-state-map (kbd "C-S-j") 'evil-window-down)
    (define-key evil-normal-state-map (kbd "C-S-k") 'evil-window-up)
    (define-key evil-normal-state-map (kbd "C-S-l") 'evil-window-right)
    
  2. 将缓冲区名称设置为窗口标题。当使用上述键绑定进行导航时,这将为您提供帮助

    (setq frame-title-format "%b")
    
  3. 如果您使用邪恶模式,则可以尝试evil-leader。将常用密钥绑定到领导者。例如,您可以绑定C-x b<leader>-b

    (global-evil-leader-mode)
    (evil-leader/set-leader ",")
    (evil-leader/set-key
     "b" 'switch-to-buffer)
    
  4. 将Dired模式绑定到C-<f8>。现在,当您要在目录中打开文件时,按C-<f8>,导航到文件名,然后按a代替RET。因此,缓存缓冲区将立即被杀死。

    (global-set-key (kbd "C-<f8>")
            (lambda ()
              (interactive)
              (dired default-directory)))
    (put 'dired-find-alternate-file 'disabled nil)
    
  5. 使用recentf模式浏览最近的文件。C-x C-r

  6. 最后一个要点是-使用符合人体工程学的机械键盘。因此,您可以用手腕轻松快速地按“ ctrl”键,而不会伤及小指。

希望这可以帮助某人。


1

从其他答案中可以看出,有许多方法可以简化此特定任务。我个人使用Lusty Emacs作为缓冲区切换设备,因为它可以很好地处理模糊补全。这样可以最大程度地减少选择新缓冲区所需的击键次数,例如,我只需要键入oxr即可切换到ox-reveal.el,甚至第二次也只需一次,因为它也可以跟踪切换的历史记录。


0

如果您只想不断浏览缓冲区,请将其添加到您的init文件中:

(bind-key* "M-l" 'next-buffer)
(bind-key* "M-k" 'previous-buffer)

您确实需要bind-key程序包,并且可以按自己的意愿更改键绑定,但是我发现这些键绑定最舒适。在添加此代码段之前,您需要通过以下方式要求bind-key:

(require 'bind-key)

0

我像一般应用程序一样使用C-Tab和CS-Tab。

(defun change-buffer-until-normal (change-fn)
  (let (current (buffer-name))
    (funcall change-fn)
    (while (and (string-prefix-p "*" (buffer-name))
        (not (eq current (buffer-name))))
      (funcall change-fn))))

(defun my-next-buffer ()
  (interactive)
  (change-buffer-until-normal 'next-buffer))

(defun my-prev-buffer ()
  (interactive)
  (change-buffer-until-normal 'previous-buffer))

(global-set-key [C-tab] 'my-next-buffer)
(global-set-key [C-S-iso-lefttab] 'my-prev-buffer)

-1

在我的VM上,Cx ALT-RIGHT / LEFT太慢。在执行其他任何操作之前,我必须等待Cx在状态栏中注册。加上太多的键 所以我将C-TAB和CM-TAB映射到next和prev缓冲区,因为无论如何我都是在大多数Windows程序中这样做的。在emacs中很容易做到: M-x将您带到状态栏。然后键入global-set-key,将提示您输入要绑定的键序列(C-TAB),然后输入希望将其绑定到的命令(next-buffer)。而已!


1
欢迎。其他答案似乎已经涵盖将这些命令映射到其他键的问题。
Andrew Swann

不完全是-每个人都在谈论如何更改.emacs配置文件。我已经描述了如何从Emacs会话中做到这一点
SN
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.