ターミナル作業中に何かを表示させるとき、 長いと上側が切れてターミナルウィンドウのスクロールなりなんなりで戻らないと行けないので 面倒です。
なので長い出力はlessにパイプで渡したり、コマンドそのものがlessに渡したりすることがあります。
Gitでもいろいろと長い出力がありますが、
lessに渡されるものとそうでないものがあります。
その辺の設定について調べてみたメモ。
パイプにつなぐ
$ git diff |less
の様にすればlessで見れるわけですが、この場合Gitは標準出力ではない
ところの出力するとして、デフォルトではカラー表示などを止めます。
表示を常に有効にしてこれでもカラー表示出来るようにも出来ますが、 その場合ファイルへの出力等でも色表示用のエスケープ文字が入ってしまうので辞めた方が良いです。
ただ、通常長い出力をしやすいサブコマンドについてはlessなどページャーで表示するように
Git内で処理していて、その場合はカラー出力されます。
また、その場合でも出力先が標準出力でなければページャーを使わずにそのまま出力します。
PAGER: シェルでの設定
プログラムの中で長い記述を表示することがあるときにlessが使われることがあります。
シェルの環境変数でPAGERという変数があり、
多くのプログラムではこれで指定されているものを採用するか、
何も指定がなければ/usr/bin/lessを使う、といった設定になっています。
GitもこのPAGERの値を使いgit logなどの表示方法を決めています。
PAGERの指定がなければlessを使います。
ここで
export PAGER=cat
みたいな設定をしてあればgit logとかがcatで表示されるようになります。
(つまりは全部表示されて次のプロンプトが表示される。)
PAGERには空文字の指定はしてはいけません。
Gitの場合、PAGERが空文字だと/usr/bin/lessを見に行かず、何もなしとして
Gitがそのまま内容を出力します。(catと同じ様なもの)
ただ、他のツールでPAGERを使うもの(manとか)の動作がおかしくなるのでやめたほうが良いです。
GIT_PAGER
Git専用の環境変数としてGIT_PAGERという変数があります。
これもPAGERと同じように設定できますが、
こちらが設定されているとPAGERよりも優先して使われます。
core.pager
~/.gitconfigやレポジトリの.git/configで設定される値です。
環境全体での表示方法を設定するには
$ git config --global core.pager less
のようにcore.pagerを指定します。
これで~/.gitconfigに
[core]
pager = less
の様な設定が追加されているはずです。
この設定があるとPAGERの設定を上書きします。
$ git config --global core.pager ''
のように空文字を指定するとPAGERなどが設定されていてもそのまま出力されるようになります。
(ここで最後の引数は何も書かなくても""でもOK。)
また~.gitconfigを直接書き換える場合には
[core]
pager =
のように=の右側は何も書かないか""と書くようにします。
[core]
pager = ''
とシングルクォートで書くと
$ git log
'': : command not found
と言ったエラーになります。
git configで設定すると''でも""でも何も与えなくてもすべて右辺は何もない状態になります。
pager.XXX
さらにGitでは各コマンドについてページャーを指定することも出来ます。
git logコマンドに対して指定したい場合は
$ git config --global pager.log cat
としてあげればlogコマンドのみに対してページャーを指定することが出来ます。
また、このオプションではtrue/falseのBooleanの指定もでき、
これを指定することでページャーを使うか直接吐き出すか選ぶことも出来ます。
logなど通常ページャーを使うものに対してはtrueを与えても同じで
falseは空白を指定するのと同じになりますが、
statusなど元々ページャーを使わないものに対して、
ページャー自体は全体で統一してcore.pagerで指定してstatusにも有効にする、
と言った場合には
$ git config --global pager.status true
とします。
git –no-pager/–paginate
設定に関わらず、gitに--no-pager(または-P)を与えるとページャーを使わずに直接出力するようになります。
$ git --no-pager log
...
逆に--paginate(または-p)を与えると必ず指定されているページャー(無ければless)で表示するようになります。
優先順位
いろいろと設定がありますが、優先順位は
--no-pager/--patinateのコマンドラインオプションpager.XXXの各サブコマンドへの指定GIT_PAGERの指定core.pagerの指定PAGERの指定- 全て指定が無ければ
less
となります。
ただし、最初のオプションはページャーを使うか使わないか、という設定で
実際使うページャーは下で決められたものを使います。
ただpager.XXXで指定されたものは無視されます。
pager.XXXがbooleanの場合でもコマンドが書かれてる場合でも無視されます。
pager.XXXも基本的には使うか使わないか、という設定に用いる様に設計されている様で
下の3つのものとは役割が少し違います。
下の3つについて、特にGIT_PAGERとcore.pagerに関してはどちらもほとんど同じ様な物ですが、
通常~/.gitconfigの中のcore.pagerで指定しておいて、
環境によって変えたいものがある場合にはGIT_PAGERで上書きして使う、といった使い方が有効だと思います。
lessのオプション
lessはよく使われるページャーですが、
Gitではこれを
less -FRX
というオプション付きで呼ぶ様な形になります。
-F: 単一画面に収まるなら表示して即座に終了-R: カラー表示のサポート-X: 終了時に画面をクリアしない
と言ったオプション。
これで、git branchなどで表示数が少ないときにはcatや空白指定の様に
内容が表示されて次のプロンプトにすぐに移るようになります。
Git 1.9当たりまでは-Sオプションもついていました。
-S: 一行が長い場合に折り返さないで表示する。(全部見るには横スクロールが必要。)
ただこれはデフォルトで入れておくのは良くない、ということで削られ、必要な場合には ユーザーが設定すれば良い、という形になっています。
これらのオプションは環境変数のLESSという値が設定されてない時に使われ、
設定されているときにはLESSのオプションを使います。
もし、LESSオプションとは別のGit特有のものを指定したければ、
$ git config --global core.pager 'less -S'
の様にコマンドを登録することも出来ます。