在 tmux 中时,在 .zshrc 中运行的 bindkey 命令似乎被忽略

在 tmux 中时,在 .zshrc 中运行的 bindkey 命令似乎被忽略
  • bindkey我的文件中有一些命令.zshrc,它们的行为符合预期。
  • 我开始tmux;运行相同的.zshrc操作,包括bindkeys 但它们不起作用。
  • 但是如果我在 tmux 内的命令提示符下手动输入它们,它们再次工作。

我尝试过使用空的 tmux.conf ( tmux -L test -f /dev/null),所以我知道这不是我的 tmux conf。

  • zsh 5.8.1 (x86_64-ubuntu-linux-gnu)
  • 多路复用器3.2a
  • Gnome shell(默认 TERM=xterm-256color)

就像 tmux 以某种方式重置绑定键运行我的 .zshrc?

经过一些测试,我发现如果我从我的 中删除这一行.zshrc,问题就会消失:

export EDITOR=`which vim`

为什么?

答案1

与其他几种流行的 shell 一样,zsh 提供两种命令行编辑模式:类 Emacs(无模式)和类 Vi(具有插入和命令模式)。与其他流行的贝壳不同,zsh 以类似 Vi 的模式启动如果zsh 启动时环境变量VISUALEDITOR包含。vi

EDITOR您正在设置环境变量.zshrc。当您打开终端并且终端仿真器程序启动 zsh 时,EDITOR未设置,因此 zsh 以 Emacs 模式启动。当您从该 shell 内部启动 tmux 会话时,它被设置为包含tmux 环境中的EDITOR字符串,因此当 zsh 在 tmux 窗口中启动时它已经设置。vi因此,在 tmux 窗口内,zsh 以类似 Vi 的模式运行。

在类似Vi的操作模式下,有两种编辑模式:插入和命令。每个都有自己的键绑定,并且bindkey没有选项仅适用于插入模式。因此,您的自定义绑定在命令模式下不起作用,即按 后Escape。大多数默认绑定也不起作用。

为了避免这种情况,由于您似乎不想要类似 Vi 的模式,请通过在bindkey您的 中的任何其他调用之前放置以下命令来显式选择类似 Emacs 的模式.zshrc

bindkey -e

真正的问题是你设置EDITOR在错误的地方。一般来说,不要在 shell 初始化文件(.bashrc.zshrc)中设置环境变量,因为它们仅在从该 shell 运行的程序中生效。直接从 GUI 启动器启动的程序不会继承这些变量,因此不会调用您首选的编辑器。相反,请在登录会话启动时读取的文件中设置环境变量,例如~/.profile(对于经典的类 Unix 会话,包括大多数基于 X11 的设置)。

答案2

好吧,我认为这最终会成为一个地方性问题,但这是我发现的情况:

  • 我的 .zshrc 包含行
    export EDITOR=`which vim`
    
  • 该命令会生成可执行 Neovim AppImage 的文件路径。
  • 将 EDITOR 设置为该文件后,一切都不起作用。
  • 删除export没有影响的事情
  • 对其进行编码,以便仅在以下情况下设置 var不是在 tmux 中也没有帮助。

我觉得我没有必要试图弄清楚这是否是一个错误或是什么(tmux?zsh?我使用的自动完成功能?gnome-terminal?neovim?有关应用程序图像的深层和内核?)...

但为了防止其他人受到影响,以及问题中的详细信息,我正在使用

https://github.com/marlonrichert/zsh-autocomplete/

以及不起作用的绑定键(可能还有其他;不确定)

bindkey '\t' menu-select "$terminfo[kcbt]" menu-select
bindkey -M menuselect '\t' menu-complete "$terminfo[kcbt]" reverse-menu-complete

相关内容