关于emacs在终端中打开一直想吐槽的一个问题

我比较喜欢用tmux然后经常要打开程序看,然后如果在嵌入终端中,打开emacs浏览程序

emacs-snapshot -nw xxx.c

这样挺好的,但是要编辑的时候,快捷键就和终端的快捷键全部混在一起,以终端的快捷键为准了, 例如我按F12 就会输出24~这个玩意,F10就是21~

感觉终端打开文件不如vim来得方便呀。

这个问题能解决吗。如果tmux其中一个分割窗口打开emacs,这个界面的快捷键以emacs的为准.

设置问题?我在-Q环境下没问题。另外我记得以前设置什么theme还是vertico之类的就会导致F键在nw下乱码,不清楚具体原因。

我的测试:

$ tmux
$ emacs --version | head -n2
GNU Emacs 30.0.50
Development version db7e95531ac3 on makepkg branch; build date 2023-03-25.
$ emacs -nw -Q
    F12
        <f12> is undefined
    C-x C-f /tmp/1.c RET
    F12
        <f12> is undefined

环境:wayland(sway),zsh,alacritty,fcitx,无tmux配置,外部term=xterm-color256,内部term=tmux-color256。试着改下term看有没有用。

你若感兴趣可以筛查一下你的设置,看是加载了哪些包或是设置了哪些值导致了这样的结果。

这是终端模拟器的问题吧, 你换个没什么快捷键的终端.

例如楼上用的,或者 xfc4-terminal/st/kitty 之类的,试试看冲突不.

你应该是因为绑定了 ESC 有关的键位,比如 M-[, M-], 或者是单纯的就是 ESC。因为在终端里面 F-key 的 keycode 的前缀 sequence 就是 escape sequence,所以导致 emacs 无法识别完整的 F-key 的 sequence,首先所有的 ESC 有关的键位绑定最好都改成 <escape>,其次不要绑定 M-[, M-]

一个具体的例子

好像确实是这个原因,我发现太多按键冲突了。屏蔽M-[M-]之后。

M-<left>C-S-a之类的,依然失效。但是M-w又没事,奇奇怪怪的,妥协了。

这个似乎要大改按钮防止冲突。

在终端里面,M+xxx 的 key sequence 就是 escape sequence + xxx,所以在终端里面 M + 数字或者 + 大小写字母或者 + 标点符号(除了 ][ )都是可以正常绑定的。

但是 M-方向键之类的因为没有对应的 keysequence 所以绑不了,然后所有的 C-S-xxx 都绑不了,同样是没有对应的 keysequence。

个人感觉用 emacs 没有必要再用 tumux. emacs 开启 daemon, 然后后续使用 emacsclient 连进来,剩下操作 都是在 Emacs 里面完成,哪怕终端被关闭了也没有关系。

不用 tmux

wayland 中的 emacs daemon 一直有bug,没办法这么用。

Due to a limitation in GTK 3, Emacs built with PGTK will simply exit when a
display connection is closed.  The problem is especially difficult to fix,
such that Emacs on Wayland with multiple displays is unlikely ever to be able
to survive disconnects.

有个很好的解决方案:在emacs里有个包叫kkp,然后再用一个支持kitty keyboard protocol的terminal就行了,比如kitty,wezterm。 这个protocol应该是kitty为社区作出的巨大贡献。

仔细调整快捷键,让他们和谐相处是一个要花点时间,花点心思的事情。

调整好之后,一切都是值得的。

我的i3, konsole, tmux, emacs, bash就相处的很好。

1 个赞

这个bug并不影响终端里的使用吧。我开emacsclient gui窗口是不行,但是终端里用就没这个问题。

1 个赞

我一直拿tmux当emacslcient的tab来用。比emacs自己的layout好使。

:slight_smile: 我是用上 daemon 之后,彻底抛弃了 screen 和 tmux

我一致就是在终端下tmux + emacsclient 用的。已经很久没开过gui的emacs了。在本机也是如此。

daemon不能完全取代tmux吧?

可能的解法 key bindings - Problems with keybindings when using terminal - Emacs Stack Exchange

大致总结一下:

方式1

方式2 tarsius的回复 key bindings - Problems with keybindings when using terminal - Emacs Stack Exchange

方式3 等emacs自己修 bug#54027: Wishlist: Support full CSI u specification for terminal input

这个看个人的使用情况吧,对于我的日常使用来说,是可以替代。

我用 tmux 也就是建多个可以保持的终端而已,这个可以通过在 emacs 里面启动多个 vterm 来替代,无论是 vterm 里面还是 emacs daemon 中跑的程序或者命令,在 emacsclient 断开以后还是可以继续跑,所以对我来说可以替代。