请教:emacs 的窗口管理

大家好,我是一个多年的 Vim 用户。在使用 Emacs 的时候,发现窗口管理很讨厌和 Vim 对比起来,在此请教一下有什么好的方法解决吗?(我查看了文档并尝试上网搜索但是由于我是 Emacs 新手,可能会有遗漏的解决方案没有发现)

这里考虑的是原始的 Emacs 键位,不考虑 evil-mode 插件

窗口管理:

  1. 每次在 compile 或者 grep 等类似的窗口,通过回车或其他方式跳转文件的时候,会打开一个新的窗口。如果是 grep 想多次查看各个文件的匹配行附近内容的时候,会自动打开非常多的窗口非常麻烦。(Vim 会替换进入 quickfix 时的窗口内的缓冲区)
  2. 切换窗口似乎只有 C-x o,如果是多窗口切换会不太方便。我看到一些插件会给窗口打上标号。但是这样每次切换都还要看一眼窗口的编号是多少,就像 vim 的 easymotion 插件一样多一个步骤,尝试过不是很喜欢这种方式。vim 的 c-w hjkl 移动我一直感觉是很不错的。是否是因为 Emacs 的哲学,它不推荐用户使用多窗口?(其实在 Vim 中我也很少会使用超过两个窗口,但是 Emacs 会经常打开 compile 窗口,三个窗口及以上似乎 C-x o 就不方便了)
(setq display-buffer-alist
      '(((lambda (bufname _)
           (memq this-command '(diff-goto-source vmacs-cancel-selection
                                                 vc-annotate-goto-line
                                                 flymake-show-project-diagnostics
                                                 vc-annotate-goto-revision-line
                                                 vc-annotate
                                                 vc-annotate-find-revision-at-line
                                                 log-edit-done
                                                 push-button vc-git-stash-show-at-point
                                                 next-error previous-error compile-goto-error)))
         (display-buffer-same-window )
         (inhibit-same-window . nil))
        )
      )

我是这么做的。

你好,我是一个多年 Emacs + 触控板用户,不太能理解为什么 Vim 用户都拒绝用鼠标点点

谢谢,但好像不是符合我的预期。因为我尝试在 grep 窗口中按 C-o 查看的时候,还是会打开很多窗口。

先不考虑大家常说的手一直在键盘和鼠标切换导致思路切换的问题。因为我这些年以来鼠标用的多,导致手指疼痛,所以是没有办法了。而且可能是我的工作哲学问题,我尝试过 gnome kde xfce 等各个桌面,最后还是切换到了 i3wm 而且用了很多年非常舒适。

我想尽量用键盘而不是鼠标,应该也是 Emacs 的设计哲学吧。如果要频繁使用鼠标,我想这可能是 acme 或 vscode 这样的编辑器的设计哲学。

我认真开始用 GNU Hyperbole 也快五年多了,体验和 acme 已经很像了。

1 个赞

谢谢,我因为手疼,所以想寻找一个不用鼠标的解决方案。如果将来我手疼缓解,可能会去尝试一下主要依赖鼠标的工作流。

那你要看看 C-o 执行的是什么命令,像我那样加入这条命令就行。

虽然我不用解控版,不过触控版和鼠标应该不一样吧,触控版和空格键连在一起的那种,手应该不用离开键盘也可以点来点去

可以用 windmove, Shift + arrow 跳转

display-buffer-alist 这个参数控制 window 的创建逻辑, 比如出现的位置高度重用之前已有的 window 等

1 个赞

我个人的习惯是一个屏幕上只展示一到两个 buffer,需要切换的时候直接搜索 buffer name。
然后我会给不同的 buffer 类型加上特殊的标记/前缀,比如终端是 # 开头,AI Agent 是 @ 开头,telegram 聊天窗口是 { 开头。有些已经有前缀的(比如 magit buffer 都会有 magit 这个词出现)就不需要自己加了。
需要搜索的时候只需要搜索前缀就可以切换。

我没有这个问题?默认配置会复用之前的窗口的,不会一直开新的。

windmove,内建功能。

Emacs 的哲学就是想怎么用就怎么用 :wink:

可以使用 repeat-mode(内建功能),也可以换个绑定,比如 M-o 。

我是一个才4年的Emacs用户,感觉有资格回答这个问题。不谈什么打断心流之类的玄学,我右手使用鼠标(mx master)或者苹果的触摸板手疼,主要表现为中指的关节疼。我试过食指(左键+滚轮)中指(右键)操作,食指(左键)中指(滚动)无名指(右键),都不能缓解疼痛。相对于Emacs用户常说的小拇指疼痛,和这个比起来不值一提。因此我现在倾向于能键盘操作就键盘操作,不能的再用鼠标。

2 个赞

说一下我个人的一些解决方法。

  1. ace-window 跳转窗口(我现在是不需要看编号就知道按什么键跳转到什么窗口了,因为一般也不会超过 4 个窗口,这个时候窗口排序还是很清晰的)
  2. 内置的一个 window-undo(疑似?) 函数,恢复之前的窗口(repeat 可以快速重复)
  3. popper 管理一些需要频繁打开关闭的窗口,比如终端

updated

  1. emacs 窗口顺序的基本逻辑是,从左上角开始逆时针排序。
  2. 恢复之前窗口的布局是 winner-mode, 使用 winner-undo 函数。我个人是绑定到了 C-c w, repeat is bind to C-z
3 个赞

谢谢

  1. 如果是相同的缓冲区,emacs 不会开窗口。如果是另一个文件,emacs 会打开一个新窗口。
  2. windmove 要使用到光标键,这个不太好。hhkb 没有光标键只能组合键去模拟,而且其他键盘光标键感觉也有点远?
  3. repeat-mode 似乎不错,可以缓解一下。但是我之前感觉不方便的意思是,每次按都不知道会去哪里,没法控制只能轮询的跳转到窗口。

谢谢

如果不用脑子过一层,这样切换窗口确实也是一个不错的办法。我之前尝试过,每次切换总要看看窗口 id 然后再按。

要是有办法让 emacs 不要自己打开额外窗口,然后再这样能切换窗口感觉就好了。emacs 的 grep 会自动给我打开一大堆窗口 :joy:

popwin,它可以在你切窗口的时候自动关闭popup窗口。

1 个赞

推荐使用popper,设置下 popper-reference-buffers,把不相关的窗口自动bury了。个人还配置用C-g关闭这些窗口,C-h z还可以找回,这样剩下的就清爽了。

1 个赞

对于 ace-window,我是开启了 (ace-window-display-mode 1), 会在 mode-line 下显示窗口的编号。这个时候切换窗口的思维模式就变成了,先看想要切换到那个窗口,知道编号,按下按键。(而不是要按下按键之后等待数字弹出),这样或许可以帮助你熟悉 emacs 的 window 排布顺序。


至于 grep 会弹出大量的窗口,我是不太理解。我个人使用 consult-rg 是没有遇到过打开一堆窗口的问题的。或许可以举个例子,或者发个截图。

1 个赞

哎呦,糟糕。我好像发现原因了。我最开始用 compile 的时候,发现 emacs 会智能的把 compile-mode 窗口左右上下分屏很烦人。我希望强制上下窗口分屏,就加了这个 (setq split-height-threshold 0),后来就忘了。当前还不了解 emacs 的错误跳转。再后来慢慢发现了这个错误跳转之后,误以为这就是原生行为了… :face_with_medical_mask:

感谢。在你说这个之前,我还以为大家都是这个行为。

1 个赞