快速切换buffer

VSCode有一个shift-tab键,按住shift可以显示所有的标签,然后按tab在各个标签切换,松开shift切换到选择的标签。我以前用的时候觉得巨方便。不过emacs上没有按住某个键的选项,所以这个方法跟VScode的不完全一样。

我平时用evil,所以快捷键设置到evil的normal mode上了。

演示

buffer-switch

shift+tab: 打开菜单

tab: 下一项

j: 下一项

k: 上一项

enter: 选择

代码

buffer-switch-max: 最多显示的buffer数,我设置到了5。不设置的话会显示所有的buffer

  (define-key evil-normal-state-map (kbd "<S-tab>") 'buffer-switch)
  ;; keymap used in the popup menu
  (setq switch-keymap (make-sparse-keymap))
  (define-key switch-keymap (kbd "<tab>") 'popup-next)
  (define-key switch-keymap (kbd "j") 'popup-next)
  (define-key switch-keymap (kbd "k") 'popup-previous)
  (define-key switch-keymap (kbd "<return>") 'popup-select)
  (setq buffer-switch-max 5)

  (defun buffer-switch ()
    (interactive)
    ;; all the buffers
    (setq full-buffer-list (mapcar (function buffer-name) (buffer-list)))
    (if buffer-switch-max
        (progn
          ;; if max specified, only take n buffers
          (setq buffer-select-list (subseq full-buffer-list 0 (- buffer-switch-max 1)))
          )
      ;; if not specified, take all
      (setq buffer-select-list full-buffer-list)
      )
    (setq dest-buffer (popup-menu* buffer-select-list :keymap switch-keymap))
    (switch-to-buffer dest-buffer)
    )

大家有什么意见建议吗OvO

2 个赞

Spacemacs 有个叫 transient-state 的界面接口,如果你想再增加些功能的话可以它用来实现更复杂的界面。

这个还挺强的,谢谢啦

Space bb, space bi满足不了你了吗。。。:joy:

SPC bb感觉还是麻烦 :thinking:

相信我,肯定还是SPC bb快,毕竟手都不用移动位置

嗯……shift+tab感觉是不好按

经过时间检验的快捷键 当你习惯之后 完全能满足你的要求 不用费心去找其他的 其实也就多点一下少点一下的问题

SPC b b一天要摁几千次,我设为了normal-state下的RET,and never looked back :beer:

伸个手,transient-state比原版hydra有什么更舒服的地方不?

就是个提供更多定制的封装宏啊。有些功能写起來更容易点。

机智啊lol

我是有一个快捷键在最近两个buffer之间切换, 有一个在最近三个之间切换

第一个直接绑定到tab
第二个借助karabiner 按住点号再按tab

emacs里按住某个键切换状态我都是用karabiner完成

兄弟. 机智如你…

normalRET 不用确实浪费了…

这个很强。相当于凭空多了好几倍的按键

快捷键不在多,多了是负担:

<prefix> b b         helm-mini
<prefix> b l         switch-to-latest-buffer
<prefix> b n         switch-to-next-buffer
<prefix> b p         switch-to-prev-buffer

我实际只用到了 bbbl,而 bnbp 几乎是摆设。

所有操作应该分为两大类,一类是确定的,就像 bl,可以闭着眼睛放心地按,另一类是不确定的,就像 bb,需要一点思考或眼睛辅助,楼上说的切换第三、四…项的键在我看来都属于不确定的。

如果有 helm 的话,其实 bb 可以取代 bl 之外的绝大部分键了,按一组快捷键,并不会比搜索 buffer 名称更快/准。虽说如此,我还是把 avy 给加进来了: avy-goto-helm-buffer-line.el

bb 之后再按 C-l 然后选择 asdfghjk... 任意一行:

这组按键顺序是固定的,所以也就相当于有了选择第三、四、五。。。项的快捷键了。

2 个赞

avy的goto-char还好,goto-line总觉得很鸡肋,helm/ivy里面asdf看过来,早把名字输完了,编辑时有相对行号的话也比avy-goto-line快。

我在切换 buffer 的时候其实还是以输入名称为主,比较可能用到的场景就是 buffer 名称相似性太高,才会用 goto-line。

goto-line 其实也可以改成显示数字的,但是我觉得数字键比较远,盲打容易按错。asdf 刚好就是最自然的状态下,手指从左到右 1234 排列。

另外,goto-line/word/char 用在多窗口切换的时候很方便,比 switch-window 之类的方法还好用。

1 个赞

问一下switch-to-latest-buffer是哪个包带的

好像没有哪个包自带这个命令吧,一般是自己写(抄)的。


现在回头看当时写的代码好多问题啊 :smile:

我现在也绑定到RET上了,RET RET就是last buffer,很巧妙 :beer: