zsh機能とfzfの選択にはEnterが必要です。

zsh機能とfzfの選択にはEnterが必要です。

dirs-stackviaで選択できる単純なzsh関数を作成しましたfzf

私の.zshrc姿

DIRSTACKSIZE='99'    
setopt PUSHD_IGNORE_DUPS

# change to directory from the dirs stack
fzf-change-dirstack () {
    cd "$(dirs -lv | cut -f2 | fzf )" 
}

zle -N fzf-change-dirstack
bindkey '^[p' fzf-change-dirstack   # shortcut ALT+P

少し改善が必要な場合でもうまく機能します。私にとって非常に迷惑な唯一のことは、キーバインディングを使用するときにEnterディレクトリに変更するには2回入力する必要があることです。

cdスクリプトを2回入力せずにすぐに変更するにはどうすればよいですかEnter

ベストアンサー1

fzf-change-dirstack () {
  local dir
  print -rNC1 -- $dirstack |
    fzf --read0 --print0 |
    IFS= read -rd '' dir &&
    cd -- $dir &&
    zle -I
}

zle -N fzf-change-dirstack
bindkey '^[p' fzf-change-dirstack  # shortcut ALT+P

主なポイントは、現在の作業ディレクトリが変更されたときにプロンプ​​トをzle -I無効にIし、残りは任意のディレクトリ名を使用できるようにコードの他の問題を修正することです。

特に:

  • dirs -lv | cut -f2これらのディレクトリ名に改行またはタブが含まれていると失敗します。より一般的には、ファイルパスは空でないバイトシーケンスです。したがって、に渡すには、fzfそれを使用し--read0て区切られた空のリスト(ここでprintolumnにullrで区切られているN)を提供する必要があります。1 C
  • を忘れた場合、--次に始まるすべてのディレクトリに問題が発生します-(通常、以前のエラーなしでは発生しません)。これを忘れると、printコマンド注入の脆弱性が発生する可能性があります。
  • エラー処理を忘れないでください!

cd +Tab また、zshには、~+Tabdirstack要素をすべてのコマンドの引数として完了または完了するときに既に独自のdirstack補完子があることに注意してください(cd/だけでなく)。pushd

たとえば、cd +TabTab次のことを試してみてください。

zstyle ':completion:*' format 'Completing %d'
zstyle ':completion:*' menu select=2
autoload compinit
compinit

ナビゲートするには矢印キーを使用してください。

(通常はこの設定に調整しますcompinstall。)


cd残念ながら、Forは--すべての問題を解決しません。-、依然として特別待遇を受けている+1など。これはの要素としては表示されませんが、like after出力のタブ区切りの2番目のフィールドとして表示されることがあります。-1cd$dirstackdirs -lvcd $'foo\nx\t+1\twhatever'

おすすめ記事