2017年6月19日月曜日

peco/fzfをファイラにしたら予想以上に便利だった件

pecofzfという、コマンドライン上でインクリメンタル検索ができるツールがある事を知りました。 cdの替わりに使ってディレクトリ遷移できるファイラにすると便利そうと思っていたら、同じ事を考えている人はたくさん居たみたいです。 ただしっくり来るものがなかったのでスクリプトを書いてみました。 (最終更新: 2018-10-20)
#!/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 件のコメント: