ターミナル作業中に何かを表示させるとき、 長いと上側が切れてターミナルウィンドウのスクロールなりなんなりで戻らないと行けないので 面倒です。
なので長い出力は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
: 一行が長い場合に折り返さないで表示する。(全部見るには横スクロールが必要。)
これを設定すると画面以上に長い列があると-F
をしておいても
less
は即座に終了しないようになります。
ただこれはデフォルトで入れておくのは良くない、ということで削られ、必要な場合には ユーザーが設定すれば良い、という形になっています。
これらのオプションは環境変数のLESS
という値が設定されてない時に使われ、
設定されているときにはLESS
のオプションを使います。
もし、LESS
オプションとは別のGit特有のものを指定したければ、
$ git config --global core.pager 'less -S'
の様にコマンドを登録することも出来ます。