如何将 stty lnext 重新绑定到 ^q?

Spa*_*awk 4 zsh stty

您可以使用

tty 驱动程序中的“lnext”功能(默认情况下通常为 ^V)

但是,我将Ctrl+绑定v到终端模拟器中的“粘贴”。(因为我不使用控制流)我想重新绑定lnextCtrl+ q。我尝试了以下~/.zshrc

setopt noflowcontrol  # Don't use ^s and ^q for control flow
bindkey -r "^Q"       # Unbind ^q from push-line
stty lnext '^Q'       # Bind ^q to lnext
Run Code Online (Sandbox Code Playgroud)

但是,它似乎不起作用。有没有办法重新绑定lnextCtrl+ q

编辑

我已经做了更多的故障排除,似乎无法重新绑定其他 stty 键。我删除setopt noflowcontrol进行测试,然后尝试stty start '^A'stty start '^B'。两者都没有任何影响;start仍然绑定到Ctrl+ q。(FWIW 我尝试了文字^Aor^Blnext前面的字符本身。)

Sté*_*las 5

stty lnext仅影响终端设备行规范内部编辑器(运行cat此类应用程序时获得的非常有限的编辑器没有自己的行编辑器)。对于 zsh 的编辑器,您需要使用bindkey(zle不喜欢readline(bash的行编辑器) 查询 tty LD 设置以在其自己的编辑器中执行相同操作)。

stty lnext '^Q' start '' -ixon # for tty LD editor
bindkey '^Q' quoted-insert     # for zle
Run Code Online (Sandbox Code Playgroud)

请注意,您需要stty为每个终端执行该部分,并在 tty LD 设置恢复为默认值(如 after )时再次执行此操作stty sane

某些系统允许您使用stty lnext '^Q' < /dev/ttyconf.

^V在 zsh 行编辑器中将 X11 CLIPBOARD 选择的内容粘贴到光标处:

get-clipboard() {
  local clip
  clip=$(xclip -sel c -o 2> /dev/null && echo .) || return
  LBUFFER+=${clip%.}
}
zle -N get-clipboard
bindkey '^V' get-clipboard
Run Code Online (Sandbox Code Playgroud)