ghqで移動した先でsshなどに入力が反映されない
tl;dr
しかもbindした時だけの問題
これはなに
ghq get <url> で取得したリポジトリにghq lookで移動すると、新しく起動したshellでsshでつないだ先とかvagrant destroy <id>のような途中で入力を求められるコマンドを実行した際に、入力した内容がターミナルに表示されなくなる
表示されないだけなので、正しい内容をタイプしてEnterを押せば動きはする
npm initみたいに普通に動くコマンドもある
不具合の発見状態
どのような場合に起こるのか?
ghqが悪い説もあるし、fishが悪い説もあるし、ghqとfishの組み合わせが悪い説もあった
不具合の最小構成の探査
不具合発生せず
peco_select_ghq_repositoryはpeco_select_ghq_repositoryというfunctionを定義するものであり、この呼出をbindでショートカットキーとして登録している。なので、peco_select_ghq_repositoryをfish shellから直接呼び出してみる 不具合発生せず
bind経由で呼び出してみる(不具合を発見したのと同じ条件)
不具合発生
ghqのソースコードを見る限り、ghq look <repo>の動作は repositoryのフルパスを取得
repositoryに移動
shellを新しく起動
前者2つでなにか悪いことが起こるということは無い気がするため、shellを新しく起動に問題があるか?
下記functionを作成
code:fish_function
function shell_test
exec fish -l
end
bind \ct shell_testをconfig.fishに追記し、bind
Ctrl+tでfunctionを呼び出し
不具合発生
functionを直接呼び出し
不具合発生せず
つまり
bindしたfunctionからshellを新しく起動した場合にのみ不具合が発生する
人生は厳しい
ghq無罪
issue
すでにありましたね
ワークアラウンドとしてはbind <key> '<command>'をbind <key> 'stty sane; <command>'にしろとのこと
pull request
fish-peco_select_ghq_repository側にプルリクは出しとこう、英語はクソ雑だけどfish側のissue読んだらわかるでしょ
stty saneを入れたらESC時に特殊文字が入れられなくなる……
ということがわかったので、
code:sh
ghq look $line
commandline -f repaint
else
fish
end
という感じでelse時にはfishを呼んでしまうことで強引に解決
つまり新しくセッションを始めてしまえば問題ないということ(ghq lookもセッションが始まるやつなので)