rcmdnk's blog
Last update

sd_cl_selection_tool

ターミナルで作業する上でディレクトリを移動するcdコマンドは最も多く使われるコマンドだと思います。

ただディレクトリを深く掘ったり多くの作業場があるとすんなり移動出来ずに時間がかかってしまいます。

なのでディレクトリ移動を効率化できればターミナル作業を格段と効率の良いものに出来るはず。

ということで sd_clという移動ツールを作りました。

だいぶ前に作ったものですが、今回のアップデートでディレクトリ選択に pecofzfと言った好きな選択ツールを選べる様になりました。

Sponsored Links

sd_cl

シェルスクリプトで作られたディレクトリ移動支援ツールです。

sd_clという一つのスクリプトからなっていて、これを適当なところに置いて

$ source /path/to/sd_cl

とするとsdclというコマンドが使える様になります。

$ curl -fsSL https://raw.github.com/rcmdnk/sd_cl/install/install.sh|  prefix=~/usr/local/ sh

とすれば自動で~/usr/local/etc/sd_clにインストールされます。

MacならHomebrewで

$ brew install rcmdnk/rcmdnkpac/sd_cl

としてインストールすることも出来ます。

Bash/Zshの両方で使える様になっているので、使ってるシェルの.bashrc/.zshrc

source /path/to/sd_cl

を加えてやればsd/clが常に使える様になります。

基本的な使い方

元々GNU screenを使っていて、あるウィンドウのカレントディレクトリに 他のウィンドウで簡単に移動したい、というのがきっかけで作ったものです。

それを実現するためにはWindow 1でsd(Save directory)として Window 2でcl(Change to the Last directory)とするだけ。 (ただし今は-wオプションでもっと簡単に移動できます。)

sdしたらそのディレクトリは残るので、Window 1でも他のディレクトリに行ったあとに clとすれば元のディレクトリに戻れます。

main functions

保存したディレクトリ一覧から選ぶ

sdで保存したディレクトリはデフォルトで最大20個まで保存されます。

この保存されたディレクトリ一覧から行きたいディレクトリを選ぶ事もできます。

$ cl -l

とすると保存されたディレクトリ一覧が表示され、

$ cl -c

とすれば一覧から選ぶモードに入ります。

この際、もともと sentaku というシェルスクリプトベースの選択ツールが必要でしたが、 今回のアップデートで他の同様のツールも使える様になりました。

また、いずれのツールが入ってない場合でもシンプルなシェルスクリプトベースの選択モードに入ります。

デフォルトでは以下のツールを順に探して見つかったものを使います。

使いたいツールを指定したい場合には

SD_CL_TOOL=peco

と、SD_CL_TOOL.bashrcなどで設定してください。 SD_CL_TOOL=NONEまたはSD_CL_TOOL=shellとすると組み込まれたシンプルな選択モードに入ります。

main functions

絞り込み

$ cl hoge

とするとhogeという文字列の入ったディレクトリのみを抜き出して 選択モードに入ります。

もし該当するディレクトリが一つしか無ければ直接そのディレクトリに移動します。

この絞り込みや次のタブ補完は後で出てくる他のリストにも有効です。 (ランキングリストからの絞り込みならcl -r hoge。)

タブ補完

$ cl [Tab]

とタブを押すとリストにあるディレクトリをタブ補完します。

$ cl hoge [[Tab]

とすればhogeという文字列の入ったディレクトリのみを抜き出してタブ補完を開始します。

補完後、一つだけに絞られればそのディレクトリに移動し、 いくつか候補が残っていれば選択モードに入ります。

completion

番号指定

$ cl 3

の様に数字を与えるとリストのなかのその順番にあるディレクトリに移動できます。

保存ディレクトリ以外のリスト

sd_clではsdで保存するディレクトリ以外にもディレクトリリストを使うことが出来ます。

Pre-defined directory list

このリストに関しては

$ sd -p

でリストに現在のディレクトリを追加し、

$ cl -p

でリストから選択出来るモードに入ります。

基本的に通常のリストと同じですが、 通常のリストはsdを使うことでどんどん上書きされてくものだとして、 一方、こちらのリストは良く使うリストを選んで入れておく、という使い方を想定しています。

ディレクトリ数の制限はつけていません。

completion

いちいちディレクトリに行ってsd -pをするのは面倒、という場合には

$ sd -e -p

とするとエディタ(viもしくはEDITORで指定されたもの)でリストが開かれるので それを編集すればOK。

このリストファイルは一行に一つのディレクトリが書いてあるだけのリストなので 必要なディレクトリを一行ごとに書いてあげればOKです。

Window directory list

GNU screenやtmuxを使っている際に各WindowやPaneの今いるディレクトリ一覧を出してくれるリスト。

$ cl -w

で選択モードに入ります。

$ cl -w -l

でリスト表示する際にはディレクトリ名の前にWindow番号とPane番号も表示されます。 (GNU screenの場合はPaneはないのでPane番号は常に0。)

選択モードでもこれらの情報を表示させたい場合には SD_CL_SHOW_MORE_INFO=1を設定しておきます。

Ranking directory list

よく使うディレクトリをランキングして表示してくれるリスト。

$ cl -r

で選択モードに入ります。

$ cl -r -l

でリスト表示する際にはランキングスコアも表示されます。

これも SD_CL_SHOW_MORE_INFO=1を設定することで 選択モードでも表示するようにできます。

ランキングの仕組みや設定については長くなるのでまた別に書こうと思います。

ranking list

Back to the history

cdで移動してきた履歴を使うリスト。

$ cl -b

で選択モードに入ります。

これはpushdをラップして使っています。 実はsd_clを読み込むとcdコマンドをラップして実際にはpushdを使って移動する様になります。

追記: 2018/08/19

アップデートしてpushdなどへの依存をなくしました。

代わりに

$ cl -f

で戻ったディレクトリを逆に進むことも出来る様になりました。

追記ここまで

back to the history

一応通常のcdの使用感と変わらないようにラップしてありますが、 もしcdをラップするのが嫌な場合には SD_CL_ISCDWRAP=0とするとcdのラップをしないようになります。 この設定はsd_clを読み込む前にしてください。

Vim like file explorer

お遊びみたいなものですが、 Vimのファイルエクスプローラー的なものを選択モードを連続して使うことで実現した機能です。

$ cl -v

とするとVimエクスプローラーモードに入ります。

vim mode

.. (一つ上のディレクトリ)を含めたディレクトリ一覧が 出るので、そのなかから選ぶとそのディレクトリに移動し 再びそのディレクトリでディレクトリ一覧を取得し選択モードに入ります。

何も選択しないで終了すれば今いるディレクトリにいる状態で終了、というもの。

sd/cl以外の関数、エイリアス

sd_clを読み込むとsd/cl以外の関数などもロードされます。

  • bd (Back Directory): 一つ前のディレクトリに戻る。cl -b 1と同様。
  • fd (Forward Directory): 一つ先のディレクトリに進む。cl -f 1と同様。
  • up : 一つ上のディレクトリに移動。
  • cdpwd: cd "$(pwd -P)"をします。つまりシンボリックリンクを解決して物理パスへ移動します。
  • cd: cdのラップ関数。ファイルへのパスを指定するとそのファイルのあるディレクトリへ移動。

cdへのラップは上にも書いたように SD_CL_ISCDWRAP=0とするとcdのラップをしないようになります。 この設定はsd_clを読み込む前にしてください。

sd_cl以外の似たようなツール

他にもディレクトリ移動を効率化しようというツールとして以下のものが有名です。

  • pushd/popd/dirs

シェルの組み込みコマンド。pushdで履歴を保持しながら移動でき、popdで前に戻ったりdirsで履歴を表示したり出来ます。

内容だけ見ればcdなんて使わずにこちらを使ったほうが断然便利だと思うわけですが、 やはり頻繁に使うコマンドということでp u s h dなんて押すよりc dのが短い上に 配置も左手で一瞬で押せる位置にあって圧倒的に便利なのでpushdなんて使ってられない、というのが現実です。

cdをラップしてpushdみたいに履歴を保存し

$ - # 一つ前に戻る
$ + # 一つ先に進む
$ = # リスト表示

を出来るようにしてくれるシェルスクリプト。

Python製のautojumpというコマンドでディレクトリ選択を行うツール。

実際に使う際には /usr/local/etc/autojump.shを読み込み この中(で呼ばれてるファイルの中)で定義されているj という関数でautojumpを使ってディレクトリを選択し移動します。

ディレクトリリストはPROMPT_COMMANDの中にautojump_add_to_databaseという関数が加えられ この関数でコマンド終了後にアップデートされます。

使い方は

$ j foo

とするとfooを含むディレクトリに移動できます。

このリストにはkey weightが付けられていて 該当するディレクトリが複数ある場合にはweightの最も高いディレクトリに移動します。 key weightはそのディレクトリでどれだけ作業を行ったか、の度合いです。

$ jc foo

とすると現在のディレクトリより下のディレクトリのみを検索します。

またjoコマンドでファイルエクスプローラーを開いたりも出来ます。

シェルスクリプトで作られたautojumpに似たツール。

z.shというファイルを読み込むことでzというコマンドが使えるようになり、 jの様に

$ z foo

と言った感じで保存されてるディレクトリの中からfooを含むディレクトリを検索して移動します。

zPROMPT_COMMAND_z --addというコマンドを追加し毎回ディレクトリリストをアップデートします。 この際にfrecency(おそらくfrequency+recencyからの造語)という値が各ディレクトリに付けられます。 複数の該当ディレクトリがある場合はこのfrecencyが高いものが選ばれます。

これ以外にもz -t fooとすれば最も最近使われたもの、 z -r fooとすれば使用頻度が最も高いものから選ぶことも出来ます。

シェルスクリプトで作られたcdコマンドのラップツール。

レポジトリにあるファイルをsourceするとcdがラップされます。

$ source ./init.sh

これで

$ cd foo

とするとjzの様にディレクトリリストから検索が行われます。

違うのは複数の候補がある場合はfzyなどの選択ツールを起動し選択モードに入るところです。

enhancdではラップしているcdの中でリストを更新する用になっています。 weightとかランキングとかはなく、 複数あれば選択ツールで選択する、という方針がautojumpやzと違うところです。

また、cd ..とすると今いるディレクトリの上の階層のディレクトリからの選択、 cd -とすると過去の履歴からの選択、といった変化が起こります。

Sponsored Links
Sponsored Links

« Bash/Zshで二重括弧インクリメントを使う時の注意 Bash/Zshで配列のn番目を取得する、を統一する »