sentaku
でlsなどでファイル一覧を渡して選ぶ時に
現在カーソルがある行のファイルの中身を見れるようにしました。
sentaku
シェルスクリプトで作った対話的な選択ができるツールです。
pecoだとかfzfと言ったツールと似たような事が出来ます。
sentakuのデフォルトは一覧を表示してVimっぽくjやkなどで上下選択する様になっています。
pecoやfzfっぽくしたい場合はsentaku -Eとしてemacsモードで立ち上げると
C-n/C-pで上下選択すると同時に、適当なキーを打てばそれで絞り込み検索が出来るので
pecoやfzfっぽくなります。
シェルスクリプトなのでちょっともっさり感は出てしまいますが、 中にある関数を直接流用して対話的な選択ができるツールの拡張が 簡単に?できる様にしてある点が特徴です。 その辺はほとんど使われてないとは思いますが。。。
ファイルの中身を常に表示する
今回新たに以下の様なオプションを加えました。
-C Show the file content at the list view
-R Show the file content in the right (default: right)
-U Show the file content under the list (default: right)
-L Number of lines to show the file content under the list (default: 10)
-S Show the file content of the colleslponding line at s
instead of full line of the selected one
-Uは以前は選択行をハイライトする代わりにアンダーラインを引く、
というためのオプションでしたが上みたいに揃えるために-Uは上で使って
元々あったアンダーライン用オプションは-uにしました。
(なぜ元々大文字を使っていたのか思い出せない。。。)
-u Use underline to show selected line, instead of highlighting.
このうち-C/-R/-Uを使うとファイルを選択項目としてリストしている時
選択行がファイルの場合に右側や下側にその内容を表示できる様になります。

こんな感じ。
デフォルトが右側表示なので何も設定してなければ-Cと-Rは同じです。
export SENTAKU_CONTENT_SHOW_UNDER=1
の様に環境変数を設定しておくとデフォルト表示が下側表示でになって-Cと-Uが同じ動作になります。
-Lは下側に表示する時に内容表示に使う行数です。
デフォルトは10で-Lで変更できる他、
export SENTAKU_CONTENT_LINES=20
という環境変数の設定でも変更可能です。
下側表示の場合には十分なスペースが確保出来ない場合には表示されません。
なのであまり-LやSENTAKU_CONTENT_LINESで大きな数字を指定してしまうと
表示されない様になってしまうので気をつけてください。
ちなみに中身を表示できるものはテキストファイルのみです。
チェックはfile <file>|grep -q textで行っています。
sによる内容表示
もともと選択画面でsを押すとその行の文字列を表示する、という機能がありました。
これは長いファイル名だったり文章を選択する際に 画面に収まる様に切って表示しているので、そういったものの全部を確認するための機能です。
このsを押した際に、文字列を表示する代わりにテキストファイル出あった場合には
中身を${VISUAL:-less}で開いて確認できるようになります。
上のgifではVISUALがvimに設定されてるのでvimで開いています。 閉じれば元の選択画面に戻ります。
表示内容を変更する
選択中に表示するものもsで表示するものも_sf_get_contentという関数で取得しています。
1 2 3 4 5 6 7 | |
こんな感じ。
なのでこれを変更してやると該当する行のものに対する好きな情報を表示させることも出来ます。
例えば、ls -lの内容を表示させたいのであれば
1 2 3 4 5 6 7 8 9 | |
みたいなスクリプトを作って
$ ./file_detail
と実行すれば現在いるディレクトリのファイル一覧を表示して、
カーソル下のファイルのls -lの結果を一番下に表示するようなツールが作れます。
もしくは.bashrcなどで
1 2 3 4 5 6 7 8 9 10 11 | |
の様に関数として定義したほうが便利かもしれません。
. sentaku -nで関数を読み込んでロードするので、
現環境を汚さないために()で囲ってサブシェルの中で実行する様にしています。
他のツールでの状況
元々これをちゃんとsentakuに入れようと思ったのは以下のエントリーを見てから。
fzfだと--previewというオプションにコマンドを指定すると
そのコマンドを選択中の行に対して適用して結果を表示する、というもの。
実はこの様な機能はsentaku自身には入ってませんでしたが、
拡張例としてfile_selectorというスクリプトで似たようなことができる様にしていました。
また、sによる内容確認の変更は
ゴミ箱ツールのtrashの中でも行っていて、
これだとファイルの中身や削除した日、元々の場所、現在の実体の位置、
などが表示される様になっています。
このゴミ箱ツールもシェルスクリプトで、LinuxでもMacでもどこでも動くので便利です(宣伝)。
というわけで、fzfにpreview機能があってpecoより便利だよ、という話があったので sentakuもできるよ、ということにしたかったので本体の方に組み込んでみました。
fzfの--previewオプションの様に表示の内容を変更したい場合には
上の例の様にスクリプトや関数を作って使って貰えればsentakuでも同じ様な設定が出来ます。
まとめ
sentakuでファイルの中身を確認しながら選択できる機能を追加しました。
関数などを作って確認する内容を自分で設定することも可能です。
sentakuに関してはシェルスクリプトで作る、ということにこだわってやっていくので、 もし何か別の面白そうな機能などがありましたら Issues とかで提案していただけたら嬉しいです。