Skip to main content.

less(1) のカスタマイズ

less(1) は more(1) よりも高機能なページャで、誰でもその存在や使い方位は知っている筈です。 しかし「ページャ」というツールの性格が災いして、その高機能なカスタマイズ能力については知らない人が多いのもまた事実です。 less(1) を応援する立場から(嘘です)、less(1) のカスタマイズ方法について簡単に纏めてみました。

予備知識

less(1) とは何か?

less(1) は UNIX 標準のページャである more(1) よりも高機能なページャとして世界中に多くのファンを持つ、事実上の UNIX 標準ページャです。無論、「less」という名前は「more」に引っ掛けたものです。

less(1) はページャというプログラムの性格上、マニュアルを読まずともそれなりに使えるため、多くの less(1) ユーザがマニュアルを読まずデフォルトのまま使っています。しかし、less(1) には強力なカスタマイズ機能が内蔵されており、およそ我々が目にする部分であればほぼ全てカスタマイズが可能になっています。 本稿では less(1) の強力なカスタマイズ機能について、よく利用されるであろうと思われる部分について解説します。

なお、本稿の内容は less 358 に iso242 パッチを適用したもの(less 358+iso242)を元に確認したものです。

less(1) のカスタマイズ範囲

less(1) でカスタマイズが可能なのは、具体的には次の機能です。

全体動作というのはページャとしての動作、プロンプトとは画面最下段に表示されるコマンド待受部分 (デフォルトではファイル名が表示されている)、行編集とは画面最下段での入力(パターンの検索や、 e: コマンドによるファイルのオープン)に対する編集機能、 キーバインドとは画面スクロールの制御(1 ページ進める / 戻す、検索を行う…など)を指します。

設定ファイル .less について

先に、行編集とキーバインドについては「設定ファイル + lesskey(1) を利用する」と書きましたが、less が利用する設定ファイルは、ホームディレクトリにある .less というファイルになります。このファイルは UNIX 上の「個人設定ファイル」としてはどちらかというと珍しいバイナリ形式になっており、直接このファイルを編集することは出来ません。 別のテキストファイルに書いた設定項目を lesskey(1) というプログラムを利用してバイナリ形式に変換して利用します。

lesskey(1) の使い方

lesskey(1) の使い方はごく簡単です。設定内容をホームディレクトリ直下の .lesskey というファイルに記述し、引数なしで lesskey(1) を実行すれば、ホームディレクトリに .less が作成されます。

厳密に書くならば、lesskey(1) の基本的な構文は以下のようになります。

lesskey [-o output] [input]

output(出力ファイル)は less(1) の設定ファイル、input(入力ファイル)は設定を記述したテキストファイルです。

但し、 output が設定されていないときは出力ファイルとしてホームディレクトリの .less が、input が設定されていないときは入力ファイルとしてホームディレクトリにある .lesskey がそれぞれ指定されたものとして扱われます。 つまり、単純に lesskey を実行することは、

$ lesskey -o ~/.less ~/.lesskey 

を実行したことと同じ意味になっているのです。

なお、環境変数 LESSKEY が設定されており、出力ファイルが設定されていない場合は、出力ファイル名は環境変数 LESSKEY の値となります。が、この変数を利用することは殆どないでしょう。

lesskey(1) 入力ファイルの書式

lesskey の入力ファイルは 3 つのセクションに分かれており、 それぞれのセクションを識別するための特別なキーワードが用意されています。

#command
キーバインドの定義
#line-edit
行編集機能の定義
#env
環境変数の定義

入力ファイルの例を以下に挙げます。

#command
\r  forw-line
\n  forw-line

#line-edit
^P  up
^N  down
^F  right
^B  left

#env
LESS=-Eqx4 -P?f--Less-- (%f\: %pb\%):--Less--
LESSCHARSET=japanese-sjis

キーの記述方法

#command」セクションや「#line-edit」セクションでは、 タイプされるキーと実行されるアクションを対にして記述します。キーを記述する場合、お馴染みの ^ を利用して Ctrl キーを表現出来ます。例えば「^E 」 は「Ctrl-E」(Ctrl キーを押しながら E を押す)を意味します。なお、「^C 」を入力する場合、一文字で「^C」と記述する必要はなく、 「^」と「C」の二つの文字を記述すれば OK です。また、キーの記述については大文字小文字の区別はないようです。

一部の特別なキー(Esc キーやカーソルキーなど)は、以下の書式で指定することが出来ます。

シンボル キー
\b Backspace
\e Esc
\n newline(復帰)
\r Return(改行)
\t Tab
\ku
\kd
\kr
\kl
\kU PageUp
\kD PageDown
\kh Home
\ke End
\kx Delete

#env セクション

#env」セクションには「環境変数名=値」という形式で環境変数を定義出来ます。 #env セクションに記述された環境変数は(シェルなどで定義する)通常の環境変数とは異なり、less(1) の中でしか使われません。

環境変数を .less で設定するメリットは、less(1) に関する設定を全て .less に纏めることが出来るという点です。 この点にメリットが見出せない場合は、通常通りシェルの初期化ファイル(.bashrc.cshrc など)で環境変数を定義したほうが良いでしょう。

全体動作のカスタマイズ

less(1) は豊富なオプションを備えており、これらのオプションを利用することによって less(1) の動作を変更することが出来ます。しかし必要なオプションを毎回指定するのは大変な作業なので、less(1) では環境変数 LESS にオプションを設定しておけば、起動時にそれらが指定されるようになっています。

例えば、常時「-q」オプションを有効にしておきたければ、「less -q 」で less(1) を起動するのではなく、環境変数 LESS に「-q」を設定しておきます。環境変数 LESS は、sh 系では

$ export LESS=-q

csh 系では

$ setenv LESS -q 

で設定します。また、先に書いたように設定ファイル .less を利用して、事前に環境変数 LESS を設定しておくことも可能です。

less(1) のオプションにはある種の特徴があり、 小文字のオプションについては大抵大文字のオプションも用意されています。 小文字のオプションは軽い効果、大文字のオプションは重い効果を齎します。 これは短いオプションでも、長いオプションでも同様です。

以下では、一般的にカスタマイズ対象となるであろう項目についてのみ記述します。 オプションに関する完全な情報はマニュアルを参照して下さい。

less(1) 終了時の動作

less(1) は more(1) と異なり、デフォルトではファイルの最後まで表示した後も q をタイプしない限り終了しません。more(1) の動作に慣れていると、これが鬱陶しく思えることがありますが、終了時の動作は

で変更できます。

-e」又は「--quit-at-eof」はファイルの終りに 2 度目に達した場合(つまり、一度ファイルの終端に達した段階で更にスペースバーを叩いた場合)に、自動的に less(1) を終了させます。

-E」又は「--QUIT-AT-EOF」が指定されている場合、ファイルの終わりに達した時点で less(1) が終了します。つまり、more(1) と同様、ファイルの内容を全て表示し切った段階で less(1) が終了するということです。

反転表示(ハイライト)の制御

通常、less(1) は検索パターンとして指定された文字列にマッチした文字列は全て反転表示させますが、 「-g」又は「--hilite-search」が指定された場合、 指定された検索パターンに最初にマッチした文字列だけが反転表示されます。

例えば、文中に「less」という文字列が山のように出てくる文書があったとしましょう。 less(1) の通常の動作では、「less」を検索すると「less」という文字列が全て反転表示されますが、 -g オプションが指定されている場合、最初に出現する「less」 という文字列だけが反転表示の対象になります。

また、「-G」又は「--HILITE-SEARCH」オプションを指定した場合、 検索コマンドで検索された文字列に対する反転表示が一切行われなくなります。

検索時の大文字小文字の区別

Emacs のインクリメンタルサーチのように、 大文字小文字を区別せずに文字列を検索したいことがあります。「-i」又は「--ignore-case」を指定することにより、検索文字列の大文字小文字が無視されるようになります。 この両オプションを利用した場合、大文字小文字が無視されるのは検索パターンが小文字でのみ構成されている場合です。 Emacs と同様、検索パターンに大文字が含まれていれば大文字小文字を区別して検索を行います。

という 3 つの文字列で検索を行った場合を考えてみましょう。 最初の「less」の場合は大文字小文字の区別が為されないので、「less」「Less」「LESS」などが検索対象となります。 2 番目の「Less」では、パターン中に大文字の「L」が含まれているので、「Less」だけがマッチします。最後の「LESS」の場合は、全てが大文字なので「LESS」のみにマッチします。

検索パターンに大文字が混じっていた場合でも大文字小文字を無視したい場合は、 代わりに「-I」又は--IGNORE-CASE」を指定します。

タブ幅の指定

タブ幅を変更するには「-xn」又は「--tabs=n」オプションを利用します。 「n」にはタブ幅を指定します。例えば、タブ幅を 4 文字にする場合は「-x4」と指定することになります。

beep 音を消す

エラー時などに beep 音を鳴らさないようにするには、

を指定します。 「-q」「--quiet」又は「--silent」を指定した場合、ファイルの最後を越えてスクロールしようとした場合や、ファイルの先頭より前に移動しようとした場合に発せられる beep 音が鳴らなくなります(エラー時は鳴ります)。「-Q」「--QUIET」又は 「--SILENT」を指定した場合、どのような状況下でも beep 音は鳴らなくなります。

行番号を表示させる

-N」又は「--LINE-NUMBERS」を指定すると、表示ファイルの各行の先頭(左端)に行番号が表示されます。

「ls --color」な人のために

less(1) のデフォルトでは、 各種の制御文字はキャレット表記を利用して表示されます。そのため 「ls --color」の出力を less(1) にパイプすると、 「ESC[」から始まる一連のエスケープシーケンスが混じってしまい、 大変なことになってしまいます。このような場合、 「-r」や「-R」を指定すれば制御文字がそのまま表示されるようになるため、 色表示もそのまま表示されるようになります。

しかし、less(1) に ls(1) の出力を渡すことが考えられる場合、 「-r」オプションを利用するよりも、ls(1) で利用するオプションを「--color」ではなく 「--color=auto」に変更することを考えましょう。「--color=auto」 は標準出力が端末の場合のみ色づけし、 パイプに接続されていたりリダイレクトが指定されている場合は色づけを行わないからです。

プロンプトのカスタマイズ

less(1) が表示するプロンプトの種類

less(1) は以下に挙げる 5 つのプロンプトを表示することが出来、その全てがカスタマイズ可能となっています。

それぞれの表示は、

となります。

-P オプションの利用

プロンプトを変更するためには、「-P」オプションを利用して表示方法を指定します。 プロンプトを指定するための文字列は、通常の文字列、置換用のパラメータそして条件判断用のパラメータから構成されます。

-P オプションを環境変数 LESS を利用して設定する場合、LESS 中の最後のオプションとなっているか、-P オプションがダラー記号($)で終了していなければなりません。 環境変数 LESS の設定が例えば、

-Eq -P--Less--

であった場合、-E オプション、-q オプション、-P オプション(プロンプトに表示する文字列は「--Less--」)の 3 つのオプションが指定されたことになります。しかし、

-P--Less-- -Eq 

であった場合、「--Less-- -Eq」という文字列がプロンプトに表示されることになり、 -E 及び -q を指定したとはみなされません。 これを避けるためには次のように「-P」オプションに指定する文字列の最後に 「$」を入れ、オプションに指定する文字列の終端を明示する必要があります。

-P--Less--$ -Eq 

特殊文字を利用するには

less(1) のプロンプトのカスタマイズでは、以下の文字が「特殊文字」として扱われます。

これらの文字をプロンプトに表示する文字として扱うには、直前にバックスラッシュを置く必要があります。 例えば、「.」を表示するためには「\.」とします。

カスタマイズするプロンプトを指示する

-P」の次に一文字を付与することによって、5 つのプロンプトのうちのどのプロンプトをカスタマイズするかを指定することが出来ます。 何れの文字も指定しなかった場合は、標準のプロンプトに関する指定だと解釈されます。

被置換パラメータ

パーセント記号は、その後に何の文字が続くかによって適切に展開されます。

%b
現在表示しているファイルへのバイトオフセットを示します。単体ではなく、以下のように「%b + 一文字」の形式で利用します。
  • %bt: 画面の先頭行
  • %bm: 真中の行
  • %bB: 最終行のすぐ次の行
  • %bj: -j オプションで指定したターゲット行
%B / %s
現在の入力ファイルの大きさ(単位: バイト)を示します。
%c
画面左端に現れるテキストのカラム番号を示します。右にスクロール(デフォルトの設定では「ESC-)」又は右矢印キー)した場合には画面左端の位置は行の先頭ではなくなりますが、%c の値はそのような場合に変わります。
%d
対象となる行が入力ファイルにおいて何ページ目であるかを示します。 「%b」と同様に一文字(t / m / B / j)を指定することで対象行が決まります。
%D
表示しているファイルのページ数を示します。
%E
「エディタの名称」を示します。「エディタの名称」とは環境変数 VISUAL 或いは EDITOR に指定された値です。どちらも指定されていないときは、(恐らく)「vi」が使われます。
%f
現在表示しているファイル名を示します。パイプからの入力の場合は「-」になります。 例えば、「less /etc/services」を実行した場合、 プロンプトには「/etc/services」という文字列が表示されますが、 「cat /etc/services | less」の場合、プロンプトには「-」という文字列が表示されます。
%i
入力ファイルのリスト中における現在のファイルのインデックスを示します。 例えば、「less a.txt b.txt c.txt」を実行した場合、先頭の a.txt を表示している間は「1」を、次の b.txt を表示している間は「2」を、最後の c.txt を表示している間は「3」を表示します。
%l
表示中のファイルの何行目にいるかを示します。「%b」と同様に一文字(t / m / B / j)を指定することで対象行が決まります。
%L
表示中のファイルの最終行の行番号を示します。
%m
入力ファイルの合計数を示します。「less a.txt b.txt c.txt」を実行した場合なら「3」が表示されます。
%p
表示中のファイルで何パーセントの場所にいるかをバイトオフセットで計算した結果を示します。 「%b」と同様に一文字(t / m / B / j)を指定することで対象行が決まります。
%P
表示中のファイルで何パーセントの場所にいるかを行番号で計算した結果を示します。 「%b」と同様に一文字(t / m / B / j)を指定することで対象行が決まります。
%x
入力ファイルのリストにおいて、現在表示しているファイルの次のファイル名を示します。 「less a.txt b.txt c.txt」を実行した場合、a.txt を表示している間は「b.txt」が表示されます。 最後のファイル(この例では c.txt)を表示している間は、(後で説明するように)「?」が表示されます。
%K
表示中のファイルの中で最も最近現れた非 ASCII 文字セットまたは 非 ASCII コードセットを示します。
%t
何かを示すものではなく、プロンプト文字列を設定する際に「後に続くスペースを取り除く」ということを指示するために使われます。

これらのパラメータが展開される場合、less(1) が利用されている状況によっては展開が不可能な場合があります。 例えば、パイプからの入力を受けている場合はファイルサイズが分からないので、 %B 指定子は展開出来ません。このような場合は、値の代わりに「?」(クエスチョンマーク)が表示されることになります。

条件判断パラメータ

先に説明したように、パラメータは特定の状況によっては置換出来ないことがあります。 また、状況に応じてプロンプトを変更したいということもあるでしょう。 このような要求は、プロンプト設定文字列中で「条件判断」が利用出来れば対応出来ます。

プロンプトの設定では、以下に挙げるように「?」に一文字を続けた形で条件判断を行うことが出来ます。 この「? + 一文字」という形式は

? 条件成立時のプロンプト.

又は

? 条件成立時のプロンプト:条件非成立時のプロンプト.

というように利用します。

具体的には、

という意味になります。C 言語における三項演算子「?」と似ていますが、 注意する必要があるのはこの条件指定を利用する場合は最後に「.」が必要である、というところです。

? + 一文字 」として利用出来る文字には以下のようなものがあります。

?a
プロンプトに既に文字列が含まれているときに真。
?bX
指定した行のバイトオフセットが既知の場合に真。
?B / ?s
現在の入力ファイルの大きさが既知の場合に真。
?c
水平方向にテキストがシフトしている (%c が 0 でない) 場合に真。
?dX
指定された行のページ番号が既知の場合に真。
?e
ファイルの終りに達したときに真。
?f
入力ファイル名があるとき(入力がパイプでないとき)に真。
?lX
指定した行の行番号が既知の場合に真。
?L
ファイルの最終行の行番号が既知の場合に真
?m
2 つ以上の入力ファイルがある場合に真。
?n
新しい入力ファイルの最初のプロンプトのとき真。
?pX
指定した行の現在の入力ファイルでの バイトオフセットで計算したパーセントが既知のとき真。
?PX
指定した行の現在の入力ファイルでの 行番号で計算したパーセントが既知のとき真。
?x
次の入力ファイルがあるとき(現在の入力ファイルが最後のファイルでないとき)真。

カスタマイズの例

less(1) がデフォルトで利用しているプロンプトは、 less(1) のマニュアルによれば以下のようになります。

?n?f%f .?m(file %i of %m) ..?e(END) ?x- Next\: %x..%t

一見するとよく意味がわからない内容ですが、「プロンプトの条件判断では、最後に『. 』が必要となる」ということに気をつけて、落ち着いて読んでいけば理解出来るはずです。

このプロンプトは大きく

の二つの部分から構成されていることが分かるでしょう。

まず、最初の「?n」で「新しい入力ファイルの最初のプロンプトのときかどうか」 を判断し、更にファイル名が分かるのであれば(次の「?f」で判断している)「%f」を使ってファイル名を表示します。

続いて、コマンドラインから二つ以上のファイルが指定されている場合は、 「file m of n」というメッセージを示します。ここで n はコマンドラインから指定されたファイル数、m は「n 中の現在のファイルの順番」を示します。

また、表示しているファイルが終わりに達した時点で「(END)」という文字列が表示され、 続く入力ファイルがある場合(?x によって判定されます)がある場合は、「- Next: 」というプロンプトと共に次のファイル名が表示されます。

なお、less(1) のコマンドプロンプトを more(1) っぽく見せるために利用される

?f--Less-- (%f\: %pb\%):--Less--.

とは「?f」によってファイル名が既に分かっているか否かを判断し、

という意味になります。

行編集機能のカスタマイズ

検索コマンド(「/」や「?」など)を入力した場合、 或いは「:e」コマンドでファイルを開く場合、less(1) は端末の最下段に入力領域を設けます。more(1) ではこのような場合、 バックスペースなどの限られた編集機能しか利用できませんが、 less(1) では GNU の readline を利用したプログラムのように、 行編集機能やヒストリ機能を利用することが出来ます。

デフォルトの行編集機能はカーソルキーや Homeend などのキーをを利用するようになっており、(例えば)Emacs を使っているユーザにはなじみ難いと思われます。 これらのキーバインドを変更するためには設定ファイル .less を利用します。つまり、適切なエントリをテキストファイルで指定した後、lesskey(1) を利用して .less へと変換することになります。

行編集機能のカスタマイズは、lesskey(1) の入力ファイルとなるファイルの「#line-edit」セクションで行います。以下に例として、極力 Emacs のデフォルトキーバインドに近づけるための設定を挙げてみます。

#line-edit
^B    left
^F    right
^D    delete
^A    home
^E    end
\eb   word-left
\ef   word-right
\ed   word-delete
^P    up
^N    down
^K    kill-line

ご覧のように、キーバインドの設定は

キー    アクション

という形で行います。キーとアクションの間は空白又はタブで区切ります。機能の一覧を以下に挙げます。

キー アクション
left カーソルを左へ 1 文字分移動
right カーソルを右へ 1 文字分移動
word-left カーソルを左へ 1 単語分移動
word-right カーソルを右へ 1 単語分移動
home カーソルを行頭へ移動
end カーソルを行末へ移動
end カーソルを行末へ移動
backspace カーソルの左にある文字を削除
delete カーソルの下にある文字を削除
word-backspace カーソルの左にある単語を消去
word-delete カーソルの下にある単語を消去
up ヒストリに残っている前のコマンドラインの呼び出し
down ヒストリに残っている次のコマンドラインの呼び出し
forw-complete ファイル名の補完(複数の候補がある場合、最初にマッチしたファイル名から表示)
back-complete ファイル名の補完(複数の候補がある場合、最後にマッチしたファイル名から表示)
expand ファイル名の補完(複数の候補がある場合、全てのファイル名を表示)
kill-line コマンドライン全体の消去

キーバインドのカスタマイズ

less(1) はファイル表示中に利用されるコマンド(スペースバーや / などの検索コマンド)もカスタマイズ可能です。デフォルトのキーバインドに不満のある人は少ないと思いますが、 カスタマイズする必要があれば lesskey(1) の入力ファイルとなるファイルの 「#command」セクションで設定することが出来ます。

以下に、カスタマイズ対象となる機能の一覧を挙げます(*1)

キー アクション
back-bracket 対応する開き括弧を探す
back-line 1 行戻る
back-line-force 1 行戻るが、ファイル先頭で停止しない
back-screen 1 画面戻る
back-scroll 半画面戻る
back-search 後方に向かって検索
back-window 1 画面戻る(引数 N を指定すると N が新しいウィンドウのサイズになる)
display-option 指定されたコマンドラインオプションの内容表示
end ファイル終端へと移動(?)
examine 新しいファイルを読み込む
firstcmd ファイル読込時に最初に実行するコマンドの指定
forw-bracket 対応する閉じ括弧を探す
forw-forever tail -f」のように新たな入力を読み続ける
forw-line 1 行進む
forw-line-force 1 行戻るが、ファイルの末尾で停止しない
forw-screen 1 画面進む
forw-screen-force 1 画面進むが、ファイルの末尾で停止しない
forw-scroll 半画面進む
forw-search 前方に向かって検索
forw-window 1 画面進む(引数 N を指定すると N が新しいウィンドウのサイズになる)
goto-end ファイルの最終行を表示
goto-line ファイルの 1 行目を表示
goto-mark マークした位置に飛ぶ
help ヘルプを表示
index-file 最初のファイルを読み込む
left-scroll 左にスクロールする
next-file 次のファイルを読み込む
percent ファイルの先頭を表示
pipe 指定領域をコマンドにパイプで渡す
prev-file 前のファイルを読み込む
quit less(1) の終了
repaint 画面の再描画
repaint-flush 画面の再描画(バッファされた入力は破棄)
repeat-search 直前のパターンで前方に検索を繰り返す
repeat-search-all 複数のファイルに対して前方に検索を繰り返す
reverse-search 直前のパターンで後方に検索を繰り返す
reverse-search-all 複数のファイルに対して後方に検索を繰り返す
right-scroll 右にスクロールする
set-mark 現在の行をマークする
shell シェルの起動
status 表示中のファイル名の表示
undo-hilite 検索文字列の高輝度化を変更
version バージョンを表示
visual ファイルの編集

最後に

ここまで延々と less(1) のカスタマイズ機能について説明してきましたが、less(1) のカスタマイズ機能はこれでは全てカバーし切れていません。 興味がある人は是非マニュアルやドキュメントを参照してみて下さい。

なお、ここまで書いておいて今更言うのも何ですが、私自身は普段 less(1) を使わず、低機能で国際化もされておらず、既に古臭い存在になってしまった more(1) のほうを愛用しています。 昔からずっと more(1) を使ってきているので、気分的に less(1) には乗り換えられないだけの話ではあるのですが。

*1: 私自身、less(1) のキーバインドを変更する気がないので、この表については誤りや不正確な点があるかもしれません。