ターミナルの、あるディレクトリの中で同じ接頭辞のならんだファイル群をvimで編集しようとするとき、ターミナルの予測(タブキー)を叩きまくるのが面倒です。
具体的にはこんな状態
_hoge_hoge
_hoge_fuga
_hoge_piyo
_hoge_piyo_hage
この場合、タブを押す回数は2〜3度でよいのですが、もっと名前が重複する場合もあるし、そういったファイルに何度もアクセスする場合、面倒になります。
特に括弧とかスペースを含むファイル名を選ぶのは面倒くさくてしょうがねえっていう。
(まあvim内部のヒストリー使ったりとか、シェルのヒストリー使ったりしたらって話にもなるかと思いますが、それはおいといて)
ということで、フィルタリングソフトウェアのfzyによってインクリメンタルサーチを使って開きたいファイルを指定する方法を思いついたところ、かなり使い勝手が良かったのでお知らせします。
これはenhancdを使ってるといに思いつきました。
GitHub – b4b4r07/enhancd: A next-generation cd command with an interactive filter
まず、fzyをインストールします。
GitHub – jhawthorn/fzy: A better fuzzy finder
あとは
vi `ls | fzy`
とするだけで、その階層のファイル群がリストされるので、そのままタイプするとインクリメンタルサーチが出来て、選択したものが自動的にvimに渡されます。
.zshrc(.bashrc)には
alias vi='vim `ls | fzy`'
と書いておけばviと入力するだけでfzyを使ったファイルの選択画面に入ることができます。
こんな感じ
mvとかcpとかのファイル操作系のコマンドも、全部フィルタリングを使って実行できるようになるといいのになーと思うんだけど、対話的になると意味がない(面倒くさい)し…
と思いつつ作ってみた
#!/bin/bash
file=$(ls | fzy)
read -p "destination?:" dest
cp $file $dest
動くけど使える気がしない
ってなるとせいぜいこんな感じか
cp `ls | fzy` dest
※dest:保存場所
まあ括弧とかスペースとか混ざった日本語ファイルに対しては有効そうな。
と思ってスペース付きのファイルでやってみたら、ファイルネームのスペースがデリミタと認識されて動きませんでした。IFSでデリミタを変更してもいいのかも知れませんが、ちょっとそれはどうかと
色々試した結果、一旦ファイル名を変数に保存してやれば動きました
file=$(ls | fzy);echo $file | xargs -I@ cp @ dest
なんだこれっていうw
追記
このことを
dyama’s pageの管理人のdyama氏に話したところ
こういうのどうかなってことで下記のスクリプトをご提案いただきました。
$ cp "$(ls | fzy)" $(cat)
このスクリプトを実行すると、最初にカレントディレクトリのリストを選択画面に入って、その後入力待ちの状態のときに新しく設定するファイル名を入力してC-d(ctrl+d)で抜けるとそのファイル名でコピーがなされます。
catの標準入力をそのまま標準出力とする機能を用いて実現している方法なので、ディレクトリの予測補完などが使えないのが玉にキズであるとはいえ、十分にシンプルで使えそうなものになりました。ありがとうdyama氏。
これをcpe(cp-extended)コマンドとかで登録しとくと、便利なときもあるかも知れないね!
この記事へのコメントはありません。