MarkdownとBullet Journal

いわゆるプログラマーのつぶやき

【Linux】lessのススメ

UNIX/Linuxコマンド:less

lessは簡単に言えばテキストファイルを閲覧するためのコマンド。エディターから編集機能を抜いたものと考えれば大体イメージは一致する。一見低機能に見えるlessは何のために存在するのだろうか。実はこれがとても役立つのだ。

編集不可の強み

編集機能が無いということはlessでfileを閲覧している間は、fileを誤って編集してしまう事故が起きない。

「普段から十分注意して編集しているしGitで更新内容を確認出来るので別に必要と思わない」

確かにそうかもしれない。しかしlessとエディターでは同じfileを開いても開発者の心理状態が変わることにお気付きだろうか。例えばプログラマーがエディターを開いている時は主観的な編集(戦闘)モードの心理状態になっている。それに対してwebなどで参考情報等を探索している時は傍観的な閲覧(休止)モードの心理状態だ。

同様に自分のコードを見る際にlessを使うと自然に閲覧(休止)モードの心理状態になって自分のコードを客観的に見ることが出来る。そしてbugを見つけたら「v」を押すと直ちにその場所でVim等のエディターが立ち上がって編集出来る。そしてエディターを終わるとlessに戻る。これならうっかり誤編集する様な事故も避けられる。VSCodeにもread onlyモードがあれば・・といつも思うが残念ながら実装されていないため、VSCodeのターミナル画面を最大化した上でlessで閲覧している。

catやtail, Viewでは?

閲覧可能なコマンドにcatやtailがある。catは一気に全行を表示するし画面をスクロールすれば全容も確認出来るので閲覧用に使えなくはない。tailもlogや追記を主とするfileでは利用が可能かもしれない。

しかしそれらはfile閲覧を目的としたコマンドではないため使い勝手は圧倒的にlessに軍配が上がる。何と行っても移動関連の操作系がほぼVimと同じコマンドが使えるので、エディター感覚で閲覧が行える。

だったらViewでよいのでは?との声は聞こえそうだが、まずviewは全行を読み込むため起動に時間がかかる。lessは現在表示されている画面分だけをメモリに読み込むので軽量で動作を待つことがない。またviewはVimのread onlyモードに過ぎないので画面がviと同じだ。編集も警告表示はされるがVim同様に出来てしまう。これではエディターを使っている状態と変わらないため、lessを使っている時の様な安心感や開放感が得られない。

lessコマンド一覧表

起動オプション

lessでは起動オプションを起動時でも編集中でも使用出来る。例えば検索時に大文字小文字を区別しない"-i"、長い行を折り返さない"-S"、行番号表示"-N"はよく利用するオプションなので、

$ less -iSN hoge.txt

と起動時に付けてもいいし、編集中に"-iSN"と打っても良い。常に有効にしたい場合は.bashrcの中に記載すればよい。

.bashrc file
---
alias less='less -iSN'
  • 通常のオプション
+行数           指定した行から表示する
+/文字列         指定文字列を検索し、見つけた行から表示する(正規表現可能)
-p文字列         指定文字列を検索し、見つけた行から表示する(正規表現可能)
-oファイル       パイプ(|)などで標準入力から入力した内容を表示する際、指定したファイルにコピーを保存する。既存ファイルを指定した場合は、上書きするか、追加するかを確認するメッセージが表示される
-Oファイル      「-o」と同じだが、既存ファイルを指定した場合は、確認せずに上書きする
-kファイル名     lesskeyファイル(キー定義ファイル、「lesskey」コマンドで生成)を指定する
-L               環境変数LESSOPEN(lessコマンド用のオプションを定義した環境変数)を無視する
  • スクロール、表示方法関係のオプション
-s               連続した空行を1行にする
-S               画面幅より長い行を折り返さない
-#               水平方向にスクロールする際のデフォルトの移動桁数(「0」にするとデフォルト値が画面幅の半分になる)
-数、-z数        スクロールするウィンドウの大きさを指定(1画面より小さくする際は負の数で行数を指定)
-q               ファイル末尾まで表示したときのビープ音を鳴らさない(入力コマンドエラー時は鳴らす)
-Q              「-q」のときも含め、ビープ音を一切鳴らさない
-e               ファイルの末尾に2回達したら表示を終了する(実行例4を参照)
-E               ファイルの末尾に到達したら表示を終了する
-F               1画面で表示できる場合はすぐに終了する
-K              [Ctrl]+[C]キーで終了する
-n               行番号を表示しない
-N               行番号を表示する
-J               画面の左にステータス行を表示する(例えば、検索時に該当する行に「*」記号が表示される)
-m               moreコマンド同様、プロンプトに現在の表示位置をパーセントで表示する
-M              「-m」より詳細なプロンプトを表示する
-f               通常のファイル以外も強制的に表示する
-r               制御文字をそのまま表示する(デフォルトでは「^A」のようにキャレット記号を使って表示する)
-R              「-r」と同様だが、可能な限り画面表示を正しく維持する
-XXX             表示できない誤った文字を表示する際にマーク文字(〓)を使用する(デフォルトではバイナリとして表示)
-u               バックスペースとキャリッジリターンを印刷可能文字として扱う
-U               バックスペース、タブ、キャリッジリターンを制御文字として扱う(「-u」「-U」ともに指定していない場合は、これらの文字を使って重ね打ちによる太字や下線を表示する)
-x数,…           タブストップの位置を設定する。「-x4」の場合4の倍数、「-x9,17」は「9,17,25,33…」となる(デフォルトは8)
-~               ファイル末尾以降のチルダ記号(~)を表示しない
  • 検索関係のオプション
-i                検索時に大小文字を区別しない(ただし、検索文字列に大文字を使用した場合は大小文字を区別する)
-I                検索時、常に大小文字を区別しない
-a                画面に表示されている次の行以降を検索する(デフォルトは画面内の2行目以降、または最後の検索対象が見つかった行以降を検索する)
-g                検索時、最初に見つけた分だけをハイライト表示する(デフォルトでは見つけた箇所を全てハイライト表示)
-G                検索時のハイライト表示をしない
-w                画面単位でスクロールした際、新しく表示された行の先頭部分をハイライト表示する
-W                新しく表示された行の先頭部分を常にハイライト表示する
-tタグ            タグを定義する(タグはソースコードで定義箇所にジャンプしたりする際に使用する)
-Tタグファイル    タグのリストが書かれたファイルを指定する(タグファイルは「ctags」コマンドで生成)

主なコマンド

  • 移動関連
  • 「^v」は[Ctrl]キーを押しながら[v][esc-v]は[ESC]キーを押してから[v]
h/H                         ヘルプを表示(less画面と同様、[Enter]キーで1行、スペースキーで1画面先に進み[q]で終了する)
q/:q/Q/:Q/ZZ             終了する(「:q」は[:]キーを押してから[q]キー)
e/^E/j/^N/return         1行進む(コマンドに続いて数字を入力すると指定行数分進む)
y/^Y/k/^K/^P             1行戻る(コマンドに続いて数字を入力すると指定行数分進む)
f/^F/^V/space/esc-space  1画面進む([esc-space]の場合データの末尾で止まらない)
F                            1画面進み、末尾まで表示しても終了せずにファイルを監視する(「tail -f」同様、データが追加され続けるログファイルなどに使用する)
b/^B/esc-v                 1画面戻る
d/^D                        半画面分進む
u/^U                        半画面分戻る
esc-)/右矢印                半画面分右を表示する
esc-(/左矢印                半画面分左を表示する
g/</esc-<                  先頭行に移動する(コマンドに続いて数字を指定すると指定した行へ移動する)
G/>/esc->                  最終行に移動する(コマンドに続いて数字を指定すると指定した行へ移動する)
v                            表示中のファイルを「vi」コマンドで編集する(使用するエディタは、環境変数VISUALまたはEDITORで変更可能)
!コマンド                    シェルでコマンドを実行する(シェルは環境変数SHELLで変更可能)

:n               次のファイルへ
:p               前のファイルへ
:x               最初のファイルへ
:d               現在のファイルをファイルリストから取り除く
  • 検索関係
/                検索する(「/」続いて検索パターンを入力する)
?                後ろ方向に検索する(「?」に続いて検索パターンを入力する)
n                次を検索する(「n」に続いて数字を入力すると指定回数分先に進む)
N                逆順に次を検索する(「N」に続いて数字を入力すると指定回数分先に進む)
esc-u            検索結果の反転/反転解除を切り替える
&                検索パターンにあっている行だけを表示する(「&」に続いて検索パターンを入力する)