如何将 zsh 中的键盘快捷键绑定到需要 stdin 的程序?

如何将 zsh 中的键盘快捷键绑定到需要 stdin 的程序?

这是后续这个问题:我正在尝试为终端文件管理器创建键盘快捷键护林员,以便通过一次按键从 zsh 提示符跳转到文件管理器。我正在关注链接的答案,并将其添加到我的.zshrc

run_ranger () { echo; ranger; zle redisplay }
zle -N run_ranger
bindkey '^f' run_ranger

键绑定本身可以工作,但是 Ranger 无法启动Error: Must run ranger from terminal。我看了一下游侠代码 (Python)它执行常见检查sys.stdin.isatty()以验证是否具有 TTY 标准输入。如何修改 zle 小部件以便正确设置 stdin?

答案1

@llua 的评论确实是解决 stdin 问题的技巧,谢谢!

我的用例需要另一个偏离链接问题的偏差。我正在使用 Ranger 来更改工作目录(使用这个伎俩)。在这种情况下zle redisplay必须替换为zle reset-prompt正确更改提示(看到这个问题)。完整的解决方案变为:

run_ranger () {
    echo
    ranger --choosedir=$HOME/.rangerdir < $TTY
    LASTDIR=`cat $HOME/.rangerdir`
    cd "$LASTDIR"
    zle reset-prompt
}
zle -N run_ranger
bindkey '^f' run_ranger

答案2

这可能并不适用于所有人。但我正在使用tmux,我只是采取以下措施:

tmux send-keys "ranger" Enter

它用于tmux发送单词ranger,然后按Enter。我知道很难看,但它有效。

相关内容