rcmdnk's blog

20190930_sentakucontentview

sentakulsなどでファイル一覧を渡して選ぶ時に 現在カーソルがある行のファイルの中身を見れるようにしました。

sentaku

シェルスクリプトで作った対話的な選択ができるツールです。

pecoだとかfzfと言ったツールと似たような事が出来ます。

sentakuのデフォルトは一覧を表示してVimっぽくjkなどで上下選択する様になっています。

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を使うとファイルを選択項目としてリストしている時 選択行がファイルの場合に右側や下側にその内容を表示できる様になります。

20190930_sentakucontentview.gif

こんな感じ。

デフォルトが右側表示なので何も設定してなければ-C-Rは同じです。

export SENTAKU_CONTENT_SHOW_UNDER=1

の様に環境変数を設定しておくとデフォルト表示が下側表示でになって-C-Uが同じ動作になります。

-Lは下側に表示する時に内容表示に使う行数です。 デフォルトは10で-Lで変更できる他、

export SENTAKU_CONTENT_LINES=20

という環境変数の設定でも変更可能です。

下側表示の場合には十分なスペースが確保出来ない場合には表示されません。 なのであまり-LSENTAKU_CONTENT_LINESで大きな数字を指定してしまうと 表示されない様になってしまうので気をつけてください。

ちなみに中身を表示できるものはテキストファイルのみです。

チェックはfile <file>|grep -q textで行っています。

sによる内容表示

もともと選択画面でsを押すとその行の文字列を表示する、という機能がありました。

これは長いファイル名だったり文章を選択する際に 画面に収まる様に切って表示しているので、そういったものの全部を確認するための機能です。

このsを押した際に、文字列を表示する代わりにテキストファイル出あった場合には 中身を${VISUAL:-less}で開いて確認できるようになります。

上のgifではVISUALがvimに設定されてるのでvimで開いています。 閉じれば元の選択画面に戻ります。

表示内容を変更する

選択中に表示するものもsで表示するものも_sf_get_contentという関数で取得しています。

sentaku
1
2
3
4
5
6
7
_sf_get_content () {
  if ! file "${_s_inputs[$_s_current_n]}"|grep -q text;then
    echo "Not a text file"
  else
    cat "${_s_inputs[$_s_current_n]}"
  fi
}

こんな感じ。

なのでこれを変更してやると該当する行のものに対する好きな情報を表示させることも出来ます。

例えば、ls -lの内容を表示させたいのであれば

file_detail
1
2
3
4
5
6
7
8
9
#!/usr/bin/env bash

. sentaku -n

_sf_get_content () {
  ls -l "${_s_inputs[$_s_current_n]}"
}

ls | _sf_main -U -L 1

みたいなスクリプトを作って

$ ./file_detail

と実行すれば現在いるディレクトリのファイル一覧を表示して、 カーソル下のファイルのls -lの結果を一番下に表示するようなツールが作れます。

もしくは.bashrcなどで

.bashrc
1
2
3
4
5
6
7
8
9
10
11
file_detail () {
  (
    . sentaku -n

    _sf_get_content () {
        ls -l "${_s_inputs[$_s_current_n]}"
      }

    ls | _sf_main -U -L 1
  )
}

の様に関数として定義したほうが便利かもしれません。

. sentaku -nで関数を読み込んでロードするので、 現環境を汚さないために()で囲ってサブシェルの中で実行する様にしています。

他のツールでの状況

元々これをちゃんとsentakuに入れようと思ったのは以下のエントリーを見てから。

fzfで快適なターミナルライフ - petitviolet_blog

fzfだと--previewというオプションにコマンドを指定すると そのコマンドを選択中の行に対して適用して結果を表示する、というもの。

実はこの様な機能はsentaku自身には入ってませんでしたが、 拡張例としてfile_selectorというスクリプトで似たようなことができる様にしていました。

sentaku/file_selector at master · rcmdnk/sentaku

また、sによる内容確認の変更は ゴミ箱ツールのtrashの中でも行っていて、 これだとファイルの中身や削除した日、元々の場所、現在の実体の位置、 などが表示される様になっています。

このゴミ箱ツールもシェルスクリプトで、LinuxでもMacでもどこでも動くので便利です(宣伝)。

というわけで、fzfにpreview機能があってpecoより便利だよ、という話があったので sentakuもできるよ、ということにしたかったので本体の方に組み込んでみました。

fzfの--previewオプションの様に表示の内容を変更したい場合には 上の例の様にスクリプトや関数を作って使って貰えればsentakuでも同じ様な設定が出来ます。

まとめ

sentakuでファイルの中身を確認しながら選択できる機能を追加しました。

関数などを作って確認する内容を自分で設定することも可能です。

sentakuに関してはシェルスクリプトで作る、ということにこだわってやっていくので、 もし何か別の面白そうな機能などがありましたら Issues とかで提案していただけたら嬉しいです。

Sponsored Links
Sponsored Links

« AppVeyorでGitHubのリリースにビルドしたファイルを追加する Google Driveの100GB トライアルに申し込んでいた件 »

}