如果你需要頻繁在兩三個常用 buffer 之間切換,可以試試 next-buffer/previous-buffer

原文:Switch buffers in the next window.

next-buffer, previous-buffer 是內置的,默認綁定在 C-x <Left> ,C-x <Right>,作者增加了在其他 window 切換,以及開啟了 repeat-mode 方便多次切換。

相關代碼:

(defun my/next-buffer (&optional arg)
  "Switch to the next ARGth buffer.

With a universal prefix arg, run in the next window."
  (interactive "P")
  (if-let (((equal arg '(4)))
           (win (other-window-for-scrolling)))
      (with-selected-window win
        (next-buffer)
        (setq prefix-arg current-prefix-arg))
    (next-buffer arg)))

(defun my/previous-buffer (&optional arg)
  "Switch to the previous ARGth buffer.

With a universal prefix arg, run in the next window."
  (interactive "P")
  (if-let (((equal arg '(4)))
           (win (other-window-for-scrolling)))
      (with-selected-window win
        (previous-buffer)
        (setq prefix-arg current-prefix-arg))
    (previous-buffer arg)))

;; switch-to-buffer, but possibly in the next window
(defun my/switch-buffer (&optional arg)
  (interactive "P")
  (run-at-time
   0 nil
   (lambda (&optional arg)
     (if-let (((equal arg '(4)))
              (win (other-window-for-scrolling)))
         (with-selected-window win
           (switch-to-buffer
            (read-buffer-to-switch
             (format "Switch to buffer (%S)" win))))
       (call-interactively #'switch-to-buffer)))
   arg))

(defvar-keymap buffer-cycle-map
  :doc "Keymap for cycling through buffers, intended for `repeat-mode'."
  :repeat t
  "n" 'my/next-buffer
  "p" 'my/previous-buffer
  "b" 'my/switch-buffer)

my/next-buffer ,my/previous-buffer 綁定到方便的快捷鍵,例如 C-x C-nC-x C-p

需要切換時:C-x C-n 喚起 my/next-buffer, 由於開啟了 repeat-mode,之後可以用 n,p,b 快速切換 buffer。 對於切換常用 buffer 挺方便的。

5 个赞

同时可以打开 tab-line-mode,这样比较容易确定 prev/next buffer 是什么.

好建議,開啟󠄁 tab-line-mode 確實可以通過 tab-line 知道當前的 buffer 是什麼。不過我不太習慣用 tab-line,𣎴喜歡上面一堆 tab。

這個模式更适合在兩三个常用 buffer 之間切換,例如我寫博客時,需要在一個編寫中的 buffer 和一個用於参考的 buffer 之間來回切換 (它們都是一个 fullframe),就比较方便,因為熟悉 buffer 內容,不需要 tab-line 也容易確定 buffer。

當需要切換 4、5 次才能找到 buffer 時,直接用 switch-buffer 更好。

多个文件用 tab-bar-mode 加 ␣1/2/3/… (in evil normal mode) 切换很方便

1 个赞

fullframe的话,直接用桌面wm的快捷键切frame是不是更简单?

是我說得有歧義,我指的 fullframe 是占滿整個 Emacs frame 的 buffer,也就是一個 frame,一個 window,一個 buffer。

我經常需要在這個狀態下切換常用的兩三个 buffer,分享的方法對我來說還挺方便。

绑在 esc 上

escape . mode-line-other-buffer

2 个赞

好用,主要在兩個常用 buffer 之間來回切換時會比较有用。如果超過兩個 buffer 時就没那麼适用了。不過在我的使用场景下很好用。

如果是同一个frame,还有一个有趣的玩法,可以用winner-undo和winner-redo(默认C-c <left>C-c <right>)按最近的使用顺序切换buffer,即使只有一个window,buffer不同也算不同的layout。

1 个赞

我喜欢用 tab-line-mode. 绑定了 s-h, s-ltab-line-switch-to-prev-tab,tab-line-switch-to-next-tab:

3 个赞

移动端左右移动光标是在空格键滑行移动,left-word这些命令绑定感觉没什么用了, C-x Left ,C-x Right,我把x去掉,按一下Ctrl,然后就可以用左右滑动来切换多个buffer,还是很丝滑的,开始发现这点时感觉是找到了移动端的正确打开方式 推荐一款虚拟键盘Unexpected-Keyboard on android emacs gui

1 个赞