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

blu*_*e10 3 keyboard-shortcuts zsh ranger zle

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

run_ranger () { echo; ranger; zle redisplay }
zle -N run_ranger
bindkey '^f' run_ranger
Run Code Online (Sandbox Code Playgroud)

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

blu*_*e10 5

@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
Run Code Online (Sandbox Code Playgroud)

  • `$(&lt; ~/.rangerdir)` 应该避免 fork 和 exec 以及 `cat` 的读写 (2认同)