在 inputrc 映射中运行外部命令,而不修改当前行

在 inputrc 映射中运行外部命令,而不修改当前行

我已经映射了C-hC-jC-kC-m组合键来在窗格之间切换,但是在使用 bash / zsh 时tmux.conf真的很怀念退格键的组合键。C-h

我已经启用vi模式~/.inputrc并正在考虑映射C-hbackward-delete-char模式,并在模式下vi-insert运行。tmux select-pane -Lvi-command

如何在vi-command模式中添加映射以在后台运行命令tmux select-pane -L,而不修改当前行及其光标位置?

答案1

猛击

这是可能的,但不是通过 inputrc 实现的。(此文件属于 Readline 库,尽管它主要以 Bash 而闻名,但它实际上是许多不同程序使用的通用文本输入库,并不真正处理特定于 shell 的事情,例如“运行命令”。)

相反,这是 Bash 本身提供的自定义操作(其他使用 Readline 的程序中不可用),并且必须使用 Bash 的bind内置函数进行定义,具体来说,是以下-x选项:

bind -m vi-command -x '"\C-h": tmux select-pane -L'

扎什

Zsh 的 ZLE 有所不同,因为它特别是实际 zsh shell 的一部分,但它也没有直接的“执行命令”选项。相反,你必须定义一个自定义的 ZLE小部件,它只能调用一个 shell 函数,然后将其绑定到一个键。

  1. 定义一个运行该事物的函数。

    tmux-go-left() { tmux select-pane -L; }
    

    运行交互式程序时,必须重定向其 stdin /dev/tty(否则它将读取 EOF 并立即退出),并且zle -I必须在程序退出时调用以“使”屏幕内容“无效”(否则光标将处于错误的位置)。例如:

    open-htop() { htop </dev/tty; zle -I; }
    
  2. 定义一个调用该函数的小部件。

    zle -N tmux-go-left
    zle -N open-htop
    

    如果没有提供函数名称,则假定它与小部件名称相同。

  3. 将一个键绑定到小部件。

    bindkey -a '\C-h' tmux-go-left
    bindkey -v '\C-p' open-htop
    

    看起来-v选择 Vi 插入模式;-a选择 Vi 命令模式。

资料来源:

相关内容