rcmdnk's blog

Amazon | Pager (English Edition) [Kindle edition] by Gerry Garibaldi | Science Fiction | Kindleストア

ターミナル作業中に何かを表示させるとき、 長いと上側が切れてターミナルウィンドウのスクロールなりなんなりで戻らないと行けないので 面倒です。

なので長い出力は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)で表示するようになります。

優先順位

いろいろと設定がありますが、優先順位は

  1. --no-pager/--patinateのコマンドラインオプション
  2. pager.XXXの各サブコマンドへの指定
  3. GIT_PAGERの指定
  4. core.pagerの指定
  5. PAGERの指定
  6. 全て指定が無ければless

となります。

ただし、最初のオプションはページャーを使うか使わないか、という設定で 実際使うページャーは下で決められたものを使います。 ただpager.XXXで指定されたものは無視されます。 pager.XXXがbooleanの場合でもコマンドが書かれてる場合でも無視されます。

pager.XXXも基本的には使うか使わないか、という設定に用いる様に設計されている様で 下の3つのものとは役割が少し違います。

下の3つについて、特にGIT_PAGERcore.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'

の様にコマンドを登録することも出来ます。

Sponsored Links
Sponsored Links

« shell-logger:シェルスクリプトでのログ整形、Traceback機能を追加 vim_ahkにjk/sdでNormalモードに入るキーを追加 »

}