bindkey
我的文件中有一些命令.zshrc
,它们的行为符合预期。- 我开始
tmux
;运行相同的.zshrc
操作,包括bindkey
s 但它们不起作用。 - 但是如果我在 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 启动时环境变量VISUAL
或EDITOR
包含。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