web-dev-qa-db-ja.com

zshのキーボードショートカットをstdinを必要とするプログラムにバインドするにはどうすればよいですか?

これは この質問 のフォローアップです:zshプロンプトからにジャンプするために、ターミナルファイルマネージャーのキーボードショートカットを作成しようとしています レンジャー 1回のキーストロークでファイルマネージャー。私はリンクされた答えに従い、これを私の_.zshrc_に追加しました:

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

キーバインディング自体は機能しますが、レンジャーは_Error: Must run ranger from terminal_で開始できません。 レンジャーコード(Python) を調べたところ、一般的なチェックsys.stdin.isatty()を実行して、TTYstdinがあることを確認しました。 stdinが正しく設定されるようにzleウィジェットを変更するにはどうすればよいですか?

1
bluenote10

@lluaのコメントは、確かにstdinの問題を解決するための秘訣でした。ありがとう!

私のユースケースでは、リンクされた質問からさらに別の逸脱が必要でした。レンジャーを使用して作業ディレクトリを変更しています( このトリック を使用)。この場合、プロンプトを適切に変更するには、zle redisplayzle 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
3
bluenote10