最近Ubuntuを使い始めることにしました。
GUI環境でLinuxを使うのは初めてで、今回のお題であるgitも使うのは初めてです。
今回は、git環境を整えるために色々触ってみた際に遭遇した不具合の対処方法を書きます。
今回遭遇した不具合というのは、
“git log”や”git diff”で表示されるテキストに文字化けしたような変な文字列が挿入されてしまう
というものです。
具体的には、Ubuntuにgitを入れて使ってみると、Ubuntuの初期状態には問題無かったのですが、多国語化ファイルビューア(ページャ)であるlvをインストールしてみた途端に、”git log”や”git diff”などのコマンド実行時に“^[["という文字列が行頭などに大量に挿入されて視認性が著しく悪くなるという不具合です。
この不具合の原因と解決方法は以下のようになっています。
原因
今回、大量に挿入されていた"^[["という文字列ですが、
"^[[数字m" + gitの出力する文字列 + "^[[m"
という形式で書かれています。
これらの"^[[数字m"や"^[[m"は恐らくANSIエスケープシーケンス、もしくはそれに準拠した何かかと思います。
断言できない理由は、僕が調べた限りANSIエスケープシーケンスに"^[["という記述方法が見つからないからです。(調査不足?)
けれど、ここの Set Graphics Mode を参照する限りでは、"^[[数字m"の数字部分が文字列の装飾の効果と一致します。
"git diff"では各ヘッダ行の行頭部分に"^[[1m"と指定されており、うまく表示されている場合には、ANSIエスケープシーケンスの値[1:Bold on]となっているように太字表示になります。
また、”git log”では各コミットオブジェクトの行が”^[[33m"で始まっています。
これもうまく表示されている場合には[33:Yellow]と同じく黄色で表示されます。
そして後に出てくる”^[[m"はHTMLでいう閉じタグの役目を果たし、[0:All attributes off]である”^[[0m”の省略形ではないかと思います。
ちなみにこのANSIエスケープシーケンスはBashのプロンプト(PS1変数)に色などの効果を付与したい場合に使います。
(つい先日にBashのプロンプトを弄る記事を書いてる途中で放置したままなので知ってました)
では、この文字列の装飾のための文字列が何故挿入されるのでしょうか?
それはgitの設定で、
$ git config --global color.ui auto
としているからでした。
試しに、
$ git config --global color.ui never
とすると、これらの文字列は一切挿入されなくなります。
解決方法
“color.ui never”とすれば不具合は発生しませんが、視認性という点では装飾されたテキストの方が良いですよね。
解決方法は至って簡単でした。
lvに”-cオプション”を指定するだけです。
“-cオプション”は、ここによると「文字の属性を指定するANSIエスケープシーケンスを通す」となっています。
lvに”-cオプション”をつけて、”git diff”や”git log”を実行するには2通りの方法があります。
まずは一つ目の指定方法です。
$ git config --global core.pager "lv -c"
として直接オプションを指定する方法です。
そして、もう一つは
$ cd ~ $ cat << EOF > .lv > -c > EOF
としてホームディレクトリに”.lvファイル”を作成することです。
(ヒアドキュメントを使って書いたらちょっと出来る人に見えますよね)
“.lvファイル”はmanによると、lv実行時にファイルに書かれたオプションを常に付与する効果があります。
上記の例ですと、
$ alias lv='lv -c'
のようなイメージですね。
もし、gitの表示時のみに”-cオプション”を付与したいのなら、前者の方法を使うべきですね。
これで、ページャにlvを使った場合にgitの出力に変な文字列が挿入されてしまう問題が解決できました。
補足
lvインストール直後にこの不具合が発生する理由は、lvインストール時に自動でデフォルトのページャがlvに切り替わるからみたいです。
これは以下のコマンドで確認できます。
$ update-alternatives --config pager
では、何故lvインストール前は正常に表示できていたのでしょうか。
入門Gitによると、gitは特にページャの設定がされていない場合(Ubuntuのデフォルトのページャはless)には、lessに”-FRSXオプション”をつけて実行するとなっています。
lessの”-Rオプション”がlvの”-cオプション”のような役目を持っていることが、Manpage of LESSを見れば分かります。
なるほどね。
参考
使用したソフトウェアのバージョン
| Ubuntu | 9.10 |
|---|---|
| Git | 1.6.3.3-2 |
| lv | 4.51-2 |
秀和システム
売り上げランキング: 15825

美しいワークフローのための入門書
内部に詳しいが故に…
- Newer: 2009年の振り返りと2010年の目標(@kuboma)
- Older: Windows 7のコマンドプロンプトのフォントを変更する
Comments:0
Trackbacks:0
- Trackback URL for this entry
- http://www.sakuttoly.com/blog/2009/12/git_pager_lv.html/trackback
- Listed below are links to weblogs that reference
- ページャに lv を使用すると”git log”や”git diff”で表示されるテキストに変な文字列が挿入されてしまう from サクっとly.com

