dirs-stack
viaで選択できる単純な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
て区切られた空のリスト(ここでprint
olumnに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番目のフィールドとして表示されることがあります。-1
cd
$dirstack
dirs -lv
cd $'foo\nx\t+1\twhatever'