読者です 読者をやめる 読者になる 読者になる

彼女からは、おいちゃんと呼ばれています

ウェブ技術や日々考えたことなどを綴っていきます

Emacs のシェルモードで git log を最後まで表示させる

一昨日の Git を Emacs で使うエントリーのつづきです。一応、環境をもう一度書いておきます。例によって Cocoa Emacs じゃなくってごめんなさい。でもおそらく Cocoa Emacs にも共通するハナシです。

一昨日の宿題

さて、宿題をひとつ残していました。


Emacs からだと、git log がログが途中までしか表示されません....

ふむ。たしかに Emacs のシェルモードで git log コマンドを打つと

bash-3.2$ git log
WARNING: terminal is not fully functional
-  (press RETURN)

と表示されて、指示どおりリターンキーを押してもログが途中までしか表示されません。最後の行の「:」が表示された箇所でリターンキーを押すと行送りできるのですが、行が飛び飛びでなんだか不格好です。

:
commit ad876cb4605f9874a32af837fe51fa3830187cfe
:
Author: INOUE Takuya <inouetakuya@example.com>
:
Date:   Fri Jun 3 00:24:58 2011 +0900
:

:
    ビープ音を消した
:
    +(setq visible-bell t)
:

:
commit 8653cac1f69818b92830763242d870bce914c723

原因は何?

Google 先生は、

環境変数 TERM を適切に設定してあげたらいいよ

とのことだったので、

$ export TERM="xxxxxx"

として TERM にいろいろ入れてみたのですが、状況は変わらず。

最後に「vt100」を入れてみると「WARNING: terminal is not fully functional」は表示されなくなるのですが、改行コードが化けるし...

とりあえずパイプで cat に渡す

結局、とりあえず

$ git log | cat

として、git log の出力結果をパイプで cat に渡して表示させて現在に至っています。まぁ、それほど支障はないし(でも本当は心のどこかで引っ掛かっています。解決方法をご存じの方教えてください)。

もしくは、パイプで渡し忘れて、最後の行に「:」が表示されたら、

:10000j(リターンキー)

として最後まで表示させたり(jを10000回を打ったことになります)。

(2011年6月16日 追記)

コメントで教えていただきました。

$ git --no-pager log

でうまくいきます。ありがとうございました!

(2011年6月22日 追記)

いちいち「--no-pager」を打つのが面倒な場合は、

$ git config --global core.pager ''

とすればページャを使わない設定になります(一長一短ですけどね)。下記サイトを参考にさせていただきました。

おまけ - 日本語が文字化けするとき

ところで Carbon Emacs は標準で日本語設定が有効になっています。

日本語の設定はどうすればいいですか?

特に設定する必要はありません。 Mac OS X の日本語環境では、あらかじめ Emacs の日本語設定が有効になっています。

この日本語設定は、Site-Start ディレクトリ((Emacs.app)/Contents/Resources/site-lisp/site-start.d/)の japanese-init.el ファイルで設定されています。不要であれば、このファイルを削除して下さい。なお、メニューバーから "Help > Carbon Emacs Package > Open Site-Start Directory" を選ぶと、Finder で Site-Start ディレクトリを開くことができます。

が、Git のコミットメッセージが文字化けされて表示されるときは、環境変数 LANG をいじってやるとよいです。

一時的に変更したいときは、シェルモードのときに

$ export LANG="ja_JP.UTF-8"

ずっと変更したいときは、Emacs の初期化ファイル(~/.emacs 等)に下記を追記します。

(setenv LANG ja_JP.UTF-8)

おまけ - Emacs のシェルモードでよく使うコマンド

最後に、Emacs のシェルモードでよく使うコマンドをメモしておきます。参考まで。

M-p 直前のコマンドを表示する(繰り返すとさらに以前のコマンドを表示)
M-n 次のコマンドを表示する(繰り返すとさらに最近のコマンドを表示)
C-c C-p 直前のコマンドへ移動する
C-c C-n 次のコマンドへ移動する
C-c C-o 直前のコマンドの実行結果を取り除く
C-c C-r 直前のコマンドの出力の1行目をウィンドウの一番上に表示する
C-c C-e 直前のコマンドの出力の最後の行をウィンドウの一番下に表示する
C-c C-c 現在のジョブを中止する。シェルの C-c に相当

それでは、また。

2011年6月16日 追記 - いろいろなシェル

コメントをいただいたので追記します。

Emacs では M-x shell だけでなく、いろいろなシェルを使うことができます。ただ、僕も過去に下記サイト等を参考にしながらいろいろと試してみようとは思ったのですが、中途半端なまま結局 M-x shell のままでいました。

ちなみに今回紹介していただいた term(ansi-term)も試してみたんですけど、日本語のコミットメッセージが文字化けしちゃうんですよね。日本語環境をいろいろといじってみてたんのですが、力量が足りず、解決に至りませんでした(また機会をみて挑戦してみます)。

(2011年6月22日 追記)

ansi-term の日本語が文字化けしてしまう件は、初期化ファイルに下記の設定を加えて解決しました。

(setq locale-coding-system 'utf-8)

...と思ったら、こんな(↓)ものまで紹介していただいて。スクリーンショットがこわいんですけど(笑)

EmacsWiki: Multi Term

さすが id:tomoya さん、というべきか...