#!/usr/bin/env ruby
pwd = ARGV[0]
pwd = Dir.pwd if !pwd
pwd = pwd[0..-2] if pwd[-1] =~ /[\\\/]/
pwd = '/' if pwd == ''
if !File.exist?(pwd) || !File.directory?(pwd)
puts "Usage: #{__FILE__} [dir]"
exit
end
if RbConfig::CONFIG['host_os'] =~ /mswin|msys|mingw|cygwin|bccwin|wince|emc/
symbol = '\\'
else
symbol = '/'
end
begin
if File.directory?(pwd)
# # プレビューなし
# # dir = `(echo '../'; echo #{pwd}/; ls -F #{pwd}) | grep / | peco --on-cancel error --select-1`.strip
# dir = `(echo '../'; echo #{pwd}/; ls -F #{pwd}) | grep / | fzf --ansi --select-1`.strip
# プレビュー付
view = "echo #{pwd}#{symbol}{}; echo; ls --color #{pwd}#{symbol}{}"
dir = `(echo '../'; echo './'; ls -F #{pwd}) | grep / | fzf --header=#{pwd} --reverse --preview '#{view}' --select-1`.strip
case dir
when "", "./"
when "../"
pwd = File.dirname(pwd)
else
pwd = "#{pwd}#{symbol}#{dir.chop}"
end
else
pwd = File.dirname(pwd)
end
end while $?.exitstatus == 0
puts pwd
上記をcdpなどという名前でパスの通った場所に保存し、~/.bashrcに以下のような短縮コマンドを登録します。
私はcコマンドとして登録しました。上下どちらの形式でも大丈夫です。
alias c='cd "`cdp ${1}`"; ls'
function c { cd "`cdp $1`"; ls; }
cコマンドの使い方: cコマンドを叩くとpeco/fzfが起動します。 引数にディレクトリを指定すると、そのディレクトリから検索を開始します。何も指定しない場合はカレントディレクトリからです。 ディレクトリを選択するとpeco/fzfが起動し直すので、再帰的に辿れます。 表示中のディレクトリでシェルに戻りたくなったらESCキーでpeco/fzfを終了します(標準設定なら)。
それなりに拡張しやすく作れたと思うので、表示形式を弄ったり、ブックマークを追加したり、動作を変更したり、ご自由に。 pecoとfzfはどちらを使っても良いのですが、fzf --ansiを使うとファイルとディレクトリの色分けができて視認性が良かったり、プレビューができて便利なため、私はfzfを使っています。 Windowsではls, sedコマンドの用意が必要です。
ディレクトリ移動にcd ..を打つ必要が完全になくなったので、予想以上に便利かも。 外部コマンド実行用コマンドを作っておくとさらに便利なので、こちらもおすすめ。
0 件のコメント:
コメントを投稿