第 14, 15回 (2004.07.23, 30) -- Emacs の習熟およびカスタマイズ

最終更新日 … $Date: 2004-07-27 21:53:19+09 $
Valid CSS! Valid XHTML 1.1!

今回の授業では,Emacs の習熟およびカスタマイズについて簡単に学習する.
エディタとしての Emacs については以前の授業(エディタ Emacs) でごく簡単に学習したが, あれは Emacs の能力のほんの一部分である.
Emacs は実は単なるエディタではなく,シェルそのもの以上の能力を持つ, 総合環境であるとも UI(ユーザインターフェイス)であるとも言われる非常に機能の高いソフトウェアである.
cui 環境では Emacs のこの高い機能がとても助けになる場面が少なくない.

そこで,Emacs の真の実力を引き出して使うことを目指すべく, 今回は Emacs について学習することにする.

Emacs 入門のための資料

emacs の基本操作に関しては,参考文献 もしくは適切な web (適宜 google 等で"Emacs 入門"等のキーワードで検索せよ)をあたるのがよいだろう.
ざっと見てみたところでは,

あたりを見ておけば入門としては十分すぎる内容だろうと思う. Emacs が良くわからないという場合は,まずはこれらの資料にあたるとよい.

Emacs について詳しい資料

先に述べたように,Emacs の機能やそのカスタマイズ性はあまりに広い. Emacs についてそうした知識を紹介している web が多数存在しているので, 適宜それらを参照するのが Emacs を使いこなすにはとても役に立つだろう.
以下にそうした web などを紹介するので,少しずつでも目を通していくとよいだろう.

なお,Windows 用 Emacs である Meadow に関する資料に特に優れているものが多いようなので, ネットワークで検索する際は "meadow" というキーワードで検索するとよいだろう.

阪大教育用計算機での注意点

阪大教育用計算機では,「素の」Emacs (/usr/bin/emacs: Emacs20) と XEmacs (/usr/bin/xemacs : XEmacs21) の二種類の emacs が使えるが, どちらを使うかによって少々話が変わってくる.
この授業では,本家である素の Emacs を対象として話を進めるが,XEmacs の方が融通の効く面があるので,XEmacs を使いたいという者もいるだろう. 逆に,素の Emacs を使うつもりであるが,阪大教育用計算機システムが 素の Emacs に対してあまり親切に設定してないので困るという者もいるだろう. さらに,どちらも使い分けたいが,設定が混ざって困るという者もいるだろう.
そこで,Emacs と XEmacs のある程度の使い分けの方法や注意点についてここでおおざっぱに記しておこう.

Emacs と XEmacs の両方を使う場合に, .emacs はどう書けばよいか.

設定が異なる部分がどうしてもあるので, 無理に1ファイルに内容を共通に書こうとしないほうがよい. 設定ファイルを別々にして, .emacs で emacs の種類を見分けて読み込むファイルを分ければよい.
具体的には,Emacs 用の設定ファイル名を .emacs.original, XEmacs 用の設定ファイル名を .xemacs (既に存在する) などとして,

(if (featurep 'xemacs)
(load "$HOME/.xemacs")
(load "$HOME/.emacs.original"))

という設定を .emacs に書けばよいだろう.

Emacs を X で使うと日本語が表示されない場合には.

素の Emacs20 を X 上で使う場合, フォントセットを設定しないと英語以外の言語(日本語もだ)は表示できないことがある. そうした場合には,次のようにするとよい.
# X リソースを設定する方法でもうまくいくが,elisp で設定するこの方法のほうが本筋といえるだろう.

ただし,とりあえず日本語が出るようにしているだけなので, 他の言語の場合はその言語に応じたフォントセットを自分で設定すること.

  1. .emacs に次のように書き込む.

    ;; 日本語フォントの読み込み
    ;; X か端末かで区別している
    (setq japanese-font-file "~/.emacs.jpfont")
    (if window-system (load japanese-font-file))


  2. ホームディレクトリに .emacs.jpfont という名称でファイルを作り,次の内容を書き込む.
    ちなみに,最後の行で用意したフォントセットを選択しているので,そこを変えれば文字の大きさの異なるフォントセットを使用できる. Emacs を起動してから Shift-左クリックでも選択できるので,それを試してみてもよいだろう.
    
    (create-fontset-from-fontset-spec
      "-*-fixed-medium-r-normal--14-*-*-*-*-*-fontset-14,
       ascii:-*-fixed-medium-r-normal--14-*-iso8859-1,
       japanese-jisx0201.1976: -*-fixed-medium-r-normal--14-*-jisx0201.1976-0,
       japanese-jisx0208.1983: -*-fixed-medium-r-normal--14-*-jisx0208.1983-0")
    
    (create-fontset-from-fontset-spec
      "-*-fixed-medium-r-normal--16-*-*-*-*-*-fontset-16,
      ascii:-*-*-medium-r-*--16-*-*-*-*-*-iso8859-1,
      japanese-jisx0201.1976: -*-fixed-medium-r-normal--16-*-jisx0201.1976-0,
      japanese-jisx0208.1983: -*-fixed-medium-r-normal--16-*-jisx0208.1983-0")
    
    (create-fontset-from-fontset-spec
      "-*-fixed-medium-r-normal--18-*-*-*-*-*-fontset-18,
      ascii:-*-fixed-medium-r-normal--18-*-iso8859-1,
      japanese-jisx0201.1976: -*-fixed-medium-r-normal--18-*-jisx0201.1976-0,
      japanese-jisx0208.1983: -*-fixed-medium-r-normal--18-*-jisx0208.1983-0"
      )
    
    (create-fontset-from-fontset-spec
      "-*-fixed-medium-r-normal--20-*-*-*-*-*-fontset-20,
      ascii:-kappa-fixed-*-r-normal--20-*-iso8859-1,
      japanese-jisx0201.1976: -kappa-fixed-*-r-normal--20-*-jisx0201.1976-0,
      japanese-jisx0208.1983: -kappa-fixed-*-r-normal--20-*-jisx0208.1983-0"
      )
    
    (create-fontset-from-fontset-spec
      "-*-fixed-medium-r-normal--24-*-*-*-*-*-fontset-24,
      ascii:-*-fixed-medium-r-normal--24-*-iso8859-1,
      japanese-jisx0201.1976: -*-fixed-medium-r-normal--24-*-jisx0201.1976-0,
      japanese-jisx0208.1983: -*-fixed-medium-r-normal--24-*-jisx0208.1983-0"
      )
    
    (setq default-frame-alist (append
      '((font . "fontset-14"))
      '((font . "fontset-16"))
      '((font . "fontset-18"))
      '((font . "fontset-20"))
      '((font . "fontset-24"))
      ))
    
    (set-frame-font "fontset-14")
          
Emacs を X で使うと日本語入力がおかしくなる(一見文字化けする)場合は.

素の Emacs20 を X 上で使うと,Emacs が xwnmo を(XIM 経由で)使おうとして,日本語入力がおかしくなる. (多分に些細な修正で直ると思われるが)とりあえず emacs を用いるときにだけ 環境変数 XMODIFIERS を修正して xwnmo を使わないようにし,直接 wnn7 を呼び出せば問題を回避できる. 具体的には次のように設定する.

  1. まず,局所的に 環境変数 XMODIFIERS を無効にし,その状態で emacs を起動するように設定する.
    具体的には,csh 系シェルであれば
    alias emacs '( setenv XMODIFIERS "@im=none"; /usr/bin/emacs \!*)'
    と alias を使えば良いし,sh 系シェルであれば適当に関数とするか,シェルスクリプトにしてしまってもよいだろう.

  2. 次に,wnn7 を呼び出せるように設定する. 具体的には, .emacs に次のように書き込む.

    ;; wnn7
    (setq load-path (cons "/usr/share/wnn7/elisp/emacs20" load-path))
    (load "wnn7egg-leim")
    (set-input-method "japanese-egg-wnn7")

    こうすることで,C-\ で日本語入力モードを on/off すると wnn7 が使える.

Emacs の対話的カスタマイズ

実は,Emacs には標準的機能に関して,ごく簡単な設定ならば対話的にカスタマイズできる機能がある. この機能を用いると,いろいろなカスタマイズが楽にできる.
# 慣れた人は使わない傾向にある…というか, この機能はそう古いものではないので,古くから使っている人には不要な存在なのである.

そこで,Emacs のカスタマイズを手動で行う前に,まずはこの簡単なカスタマイズを使ってみよう. これでできる範囲ならばそんなに恐れずに誰でもできるはずだ.

(注意1) この対話的カスタマイズを行なっている間の Emacs の挙動はあまり安定したものではないので, 他の作業を同時に行なおうとしたりしないほうがよい.

(注意2) 対話的に(つまり自動的に)行った設定と, .emacs を編集するなどして手動で行った設定とがかちあうと意味不明な挙動になることがある.
# 具体的には,同じ変数を手で設定し,かつ,対話設定でも設定してしまったような場合が該当する. この時,値が異なるとわけがわからなくなる.
こうならないように,同じ設定をだぶって行わないように注意しよう.

上記の注意のような混乱が生じにくいように,対話的設定で行った設定は .emacs でないファイルに保存するようにしよう. それには,次の内容を .emacs ファイル(のなるべく先頭の方に)に書き込んでおけばよい.

(setq custom-file "~/.emacs.custom")
(if (file-exists-p custom-file)
   (load custom-file))

実習

上の設定を行い,念の為に Emacs をいったん終了させてからもう一度起動せよ.
もちろん,再起動はしなくても済む方法はあるが,慣れていないうちはこれが無難だろう.
# どうしてもという者は, M-x eval-region という機能について調べて使ってみよ.
# 機能について調べるには, M-x describe-function という機能を用いればよい.

M-x customize

では対話的設定を行なう最も素朴な方法を紹介しよう. それは簡単で,Emacs で
M-x customize
としてみればよい.

あとは,適当に気になる項目を選んで設定を変えてみることができる. 実際には,変更した後にページ上部にある "Set for Current Session(今だけ変更を有効にする)" か "Save for Future Sessions(今以降,変更を有効にする)" を選ぶことで変更が有効になる.

実習

この機能を用いて,次のようにして modeline に時間を表示させてみよう.

  1. M-x customize とする.
  2. "Environment group:" "Go to Group" を選択する.
  3. "Modeline group:" "Go to Group" を選択する.
  4. "Display Time group:" "Go to Group" を選択する.
  5. "Display Time Mode:" の "Toggle" を選択して mode を on とする.
  6. ページ上部にある "Set for Current Session(今だけ変更を有効にする)" か "Save for Future Sessions(今以降,変更を有効にする)" を選んで変更を有効にしてみる.

M-x customize-HOGEHOGE

他にも, M-x customize-HOGEHOGE 系のコマンドが数多くあり,各々が便利な機能を持っている. ヘルプを用いて,各々を試してみるとよい.

実習

M-x customize-HOGEHOGE について次のようにして調べ,動かしてみる.

  1. M-x customize- とまで入力して SPACE キーを押し,補完機能によってどんなコマンドがあるのか見てみる.
  2. M-x describe-function RET コマンド名 RET として,各々の説明を見てみよ.
    ただし,RET は Return キーを押すことを意味する.
  3. M-x customize-face についても調べてみてから,実際に動作させて何が起るか,自分の思っていたことと比較せよ.

Emacs のカスタマイズの基本

Emacs の機能のほとんどは Emacs Lisp (elisp)とよばれる言語で記述されており, elisp に堪能であればほとんどあらゆるカスタマイズが可能である. まあ通常は先人による結果を使わせてもらうだけで十分に多くのカスタマイズが可能であるので,この授業でもその範囲で講義を行う.

さて,具体的にどうするかであるが, Emacs はこの elisp でかかれたプログラムや設定を読み込んで動作するという仕組みなので, これを利用してカスタマイズを行う.
具体的には,Emacs は起動時にはおおざっぱには次のように動作する.

  1. 共通設定ファイル(通常は意識する必要はない)を読み込む.
  2. 個人用設定ファイル .emacs を読み込む.
  3. 設定ファイルを読んだときに, 書かれている設定に従い, elisp で書かれたプログラムファイル (.el.elc といった拡張子がついていることが多い) を読み込む.

さらにまた,Emacs はファイルを読み込んだときにそのファイルによって新たに elisp プログラムファイルを読み込んだりして動作を変える. たとえば,C ファイルや TeX ファイルを読み込んだときなどである. この設定も基本的には .emacs で行う.

このような動作の仕組みなので,われわれがカスタマイズを行うには,

  1   elisp プログラム自身のインストール
欲しい機能を実現する elisp プログラムを世の中から探して, 個人環境にインストール.
# ただし,Emacs が標準で持っている機能の場合,この作業は不要.

実際のインストールは,適当に用意したディレクトリの下に elisp ファイル群を「置くだけ」で基本的に終了である.
# より正確には,subdirs.el が効いているディレクトリ以下,ということになる. subdirs.el があるディレクトリより下のディレクトリならばよい,と思っても良いだろう.
このディレクトリの用意に関しては下の「実習」を参照すること.

  2   設定をファイルに書き込む
そのプログラムを適切に使えるように, .emacs を設定.
通常はそのプログラムを読み込む設定と,その他もろもろの設定(キーバインディングなど)を行うことになる.

とすれば良いことになる.
これから Emacs の習熟とカスタマイズの学習を行うにあたり, この手順は繰り返されるので,頭にいれておくとよい.

実習

個人が elisp プログラムのインストールを行うには, elisp ファイル群を置いておくべきディレクトリを作成し, そのディレクトリを Emacs に認識させておく必要が一回だけある. そこで,下の指示に従い,設定を行え.

  1. まず elisp ファイルを置くディレクトリを用意する.

    cd ~
    mkdir elisp


    などとしておけばよいだろう.

  2. 次にこのディレクトリ以下に elisp プログラムがあるよ, と Emacs に認識させるべく, .emacs に次の一行を加える(ライブラリパスの設定).
    なるべく   .emacsの先頭に近い場所に書き込むのがよいだろう.

    (setq load-path (cons "~/elisp" load-path))

.emacs の編集にあたって

.emacs の編集を行う際に共通する「プログラムの読み込み」, 「変数の設定」 の方法と,注意点についてここで記しておこう.

elisp プログラムの読み込み
elisp プログラムの読み込むよう .emacs などで設定するには,次の三種類の方法がある.

(load "拡張子を除去したファイル名")    と書く
その場でプログラムを読み込む. こうしておけばそのプログラムをいつでもすぐに実行できるので便利だが, .emacs に書くと起動時にそのプログラムファイルが必ず読み込まれるので,起動にやや時間がかかることになる.

(autoload 'プログラム名 "拡張子を除去したファイル名" "説明文" フラグ)    と書く
ただし,フラグは,プログラムが対話的に動作する場合は t とし, そうでないときは nil とする.
こうすると,そのプログラムが必要となった時点で初めてプログラムファイルが読み込まれる. メールプログラムなどの大きなプログラムはこうするのがよいだろう.

(require '機能関数名)    と書く
「まだ読み込まれていなければ」プログラムを読み込む. 重複読み込みの可能性がある場合は load ではなく require を用いる. その他の利点,欠点は autoload と同じである.

変数の設定
.emacs などで Emacs 用の(シンプルな)変数を設定するには,おおよそ次のように書く.

(setq 変数名 設定値)

ちなみに,どのような変数があるか,その変数がどのような意味を持つか, は次のようにすると判明する.

変数をみてみる.
M-x describe-variable と打ってから,SPACEキーを押してみると,変数が全てリストアップされる.
変数の機能を調べてみる.
M-x describe-variable RET としてから,気になる変数名を入力して RET すると,解説が記述される.

.emacsを編集する際の注意
.emacs の内容を編集した際に致命的なミスがあると Emacs が起動しなくなる. そういう時は,Emacs に --debug-init というオプションをつけて起動すると,エラーをきちんと表示して起動してくれるので,覚えておくとよい.

実習

"line-number" という文字列を含む変数は何か. また,その機能は何か. 上に述べた方法で調べてみよ.

Emacs の標準機能のカスタマイズ

では,Emacs に標準で用意されている機能を使うカスタマイズを行ってみよう. この機能の多くは先に述べた M-x customize でもカスタマイズできるが,やはり .emacs を直接自分で編集した方が何を変えたのかはっきりして,見通しがよいだろう. そのために,およその方法を記しておこう.

言語環境設定

まずは自分の言語が Emacs で普通に使えるように設定しよう.
そもそも Emacs20 以降は単独で完全な多言語環境を目指しており, 単一のバイナリでほぼあらゆる言語を使えるようになっている. そのため汎用性は高いが,やや使いにくい面も出てくる.
そこで,通常用いる言語をデフォルト言語として設定し, 文字コード等も設定しておくと使いやすくなるだろう.

阪大教育用計算機上の Emacs で日本語を用いる場合は, 次のような設定を .emacs に書き込んでおけばよいだろう.
なお,XEmacs を用いる場合は,センター側で用意した .xemacs に相当する設定が既に書き込まれており,それが追加で読み込まれるのでこれに相当する設定をしなくて済む.

(set-language-environment 'japanese)
(set-buffer-file-coding-system 'euc-jp)
(set-keyboard-coding-system 'euc-jp)
(set-terminal-coding-system 'euc-jp)


ちなみに,文字コードに関して他にどんな設定ができるかは, coding-system という文字列を含む変数を調べて設定すればよい.
また,現状がどうなっているかは,Emacs 上で M-x describe-coding-system とすればよい.

実習

自分の環境で日本語(の表示)が問題なく使えるように設定せよ.
# 日本語入力に関しては技術的にもインターフェイスとしても上に記したようにいろいろな方法があるので, 好みの方法を選ぶと良い.

キーバインディング

Emacs はほとんどの設定を自分で好きなようにできるということは繰り返し述べているが, キーバインディング,つまり,どのキーを押すとどういう機能が働くか,についても 自分の好みに応じて設定できる.
ただし,既に多くのキーの組合わせが様々な機能に割り当てられているので, 一貫性などを考えるとよく調べずに設定することはお勧めできない.

現在のキーバインディングを調べるには.
M-x describe-bindings とすると,「現在使える」キーバインディングのリストが出る. ただし,後で説明する「モード」が変わると変わるキーバインディングがあるので,これで全部ではないことに注意.
また, M-x describe-key を用いると,具体的に「あるキーの組合わせに対して」どのような機能が割り当てられているかを知ることができる. この機能は,使おうとするキーの組合わせが既に使われているかどうかを調べるのに便利だろう.

キーバインディングを設定する.
Emacs には(後述する)モードという「状態」があり, キーバインディングにはモード,つまり,状態に依存するようにする方法と 依存しないで常に一定に有効にする(グローバルマッピング)ようにする方法がある.

まず全体に有効になるような方法であるが, .emacs 中などで,
(global-set-key "キーの組合わせ" '機能関数名)
とすると,その設定が Emasc 全体で有効になる. ただし,キーの組合わせでは M- C- というキーには \ をつけて表現するか, [キー] などとして表現する.

次に,局所的に有効になるキーバインディングの設定方法であるが, これは (local-set-key "キーの組合わせ" '機能関数名) というコマンドを,そのモードのフックに付け加えるという手法になる. フックについては,後述のマイナーモードの部分でのフックの解説を参考にするとよい.

以前良く行なわれた設定として, BS キーおよび C-h を「一文字消去」として使うキーバインディングがあり, (global-set-key "\C-h" 'delete-backward-char) と設定したものである. ただし,BS キーに関しては現在はこうやって設定するよりも良い方法があるのでこれはあまりお勧めしない.
ファンクションキー等の「あまり使われないキー」 について自分の好みの機能を割り付けるのは 悪くない考えであるので,いろいろ試してみるとよい.
# もちろん,既に割り当てられている機能が無いか, あるならばそのキーバインディングを変えても良いか などは事前に検討すること.

(注意) ファンクションキーの [f1] にはヘルプ機能が割り当てられていることが多いので,あまり変えない方が良いだろう.

(注意) BS キーおよび C-h (この二つは同一)はデフォルトではヘルプが呼び出されるように機能が割り当てられている. しかしこれでは何かと不便なので,通常はこのキーには「一文字消去」 機能を割り当てることが多い. 実は Emacs 開発側でもこれは良く分かっていて, そのための機能が既に用意されている. そこで, 上の global-set-key を用いる代りにこれを用いるとよいだろう. 具体的には, .emacs 中などで,
(load "term/keyswap")
としておけばよい.

(注意) C-c アルファベット というキーの組合わせは原則としてユーザ用に解放されており, システム側で設定されていないハズである. ただし,本来はこのキーの組合わせは global-set-key 用ではなく,各種モード内部で個別に設定されるよう意図されていると思われるので, global-set-key で設定するのはあまりお勧めしない.

実習

いくつか適当なキーバインディングを設定してみよ. ただし,あまり他に悪影響を与えないようなキーバインディングにするか, 一時的にだけ用いてすぐコメントアウトせよ.

メジャーモード, マイナーモード

Emacs は優れたエディタであるので,編集するファイルによって動作を様々に変えることができる. このように,編集対象等によって大きく動作を変えた状態を「モード」を変えた状態という. 適切なモードを選択および細かい設定を施して, 各種機能を使いこなせるようになれば生産性は何十倍にもあがることになるので, 各種モードに関してある程度の知識をもつことは非常に有益である. そこで,モードに関してある程度知り,設定して,使えるようになろう.

メジャーモード

メジャーモードとは,編集対象に対して「一つだけ排他的に」選択される編集モードのことである. 例えば, C プログラムを編集するときは C モード, LaTeX ソースを編集するときは LaTeX モードというようになる. こうすると,C ならば C の性質に沿った編集が, LaTeX ならば LaTeX の性質に沿った編集ができ,とても便利なのである.
例えば, M-; と入力するとそのモードに応じた「コメントアウト」が行なえる.

現在,どのモードになっているかはモードラインを見ると分かるようになっている. また, M-x describe-mode とすると現在選択されているモードの説明が出るので,何か分からない部分があればこれを見るのが良いだろう.

このモードを一時的に変更するには, M-x HOGE-mode と入力するだけでよい. 例えば,text-mode や html-mode を試してみるとよいだろう. 元に戻すには, M-x normal-mode とすればよい.
標準でどのようなメジャーモードがあるのかは M-x describe-function RET SPACE として出てくるリストの中で -mode という文字列で終わるものを片っ端から調べてみれば良いだろう. もしくは,Emacs 用にシステムで用意している elisp ディレクトリの progmodes ディレクトリや textmodes ディレクトリを見てみるとよいだろう. ちなみに阪大教育用計算機システムでは, /usr/share/emacs/20.7/lisp の下にそうしたディレクトリがある.

メジャーモードとファイルのバインディング
どういうファイルに対してどういうメジャーモードが選択されるかは ある程度設定されているが,もちろん自分で変更や追加ができる. その方法にはいくつかあるが,シンプルなのは auto-mode-alist という変数を設定するという方法である. この変数は association list というもので少し設定がわかりにくいだろうから, 例を示しておこう. 一般的には

    (setq auto-mode-alist
      (cons '(項目変数 . 値)
            '(項目変数 . 値)
                    …          
            '(項目変数 . 値)
            '(項目変数 . 値)
            auto-mode-alist))
      
とすればよい. 例えば,gnuplot のスクリプトファイルに gp という拡張子をつけ,この拡張子がついたファイルは自動的に gnuplot-mode で編集するようにしたい,としよう. そういう場合は,
(setq auto-mode-alist
   (cons '("\\.gp\\'" . gnuplot-mode)
     auto-mode-alist))

などと設定すれば良いことになる.
# gnuplot-mode というのは実在する. 詳しくは gnuplot-mode などを参照せよ.

実習

この web page をダウンロードし,適当な名前.html というファイル名で保存して Emacs で開き, その際のメジャーモードが何になるか,上の方法で調べてみよ. また,その際に使える便利なキーバインディングに何があるか調べてみよ.
同様に適当な TeX ソースを用意してやはり調べてみよ.
また,picture-mode, artist-mode について調べてみよ.

マイナーモード

マイナーモードとは,メジャーモードと異なり,好きなときに,複数同時に使えるモードのことである. 使ってみて「ちょっと便利」というような機能はこのマイナーモードとして 実装されていることが多いので, 各種メジャーモードの性質をある程度つかんだらマイナーモードについても いろいろ調べてみるとよいだろう.

さて,どのようなマイナーモードがあるかを示す前に, マイナーモードの起動方法を示そう. マイナーモードはメジャーモードと違ってファイルの種類とバインディングされて起動されるわけではないので, その場で直接起動するか .emacs 中などで,適切に設定するかになる.
直接起動するにはメジャーモードと同じく M-x hoge-mode とすればよい.
そして,必要な場面で起動するように設定するには次のように行なう.

常に有効にしておくには.
.emacs 中などで,普通に設定する. どう設定すれば良いかは, M-x describe-function で出てくる解説の 2行目あたりに記されているハズである.

あるメジャーモードの時に有効にしたい(フックの解説).
メジャーモードが起動し終わる瞬間にマイナーモードを起動すればよく, そのための仕組み「モードフック」が Emacs には用意されている. フックとは,モードが起動し終わる最後に呼び出される機能のことである. つまり,これを適宜設定すればよいのである.
で,その設定方法であるが, 例えば, メジャーモードである html-mode では必ず(後述する) outline-minor-mode を使いたい,という場合は次のようにすればよい.
(add-hook 'html-mode-hook 'outline-minor-mode)

マイナーモードの大まかなリストアップ

ではどのようなマイナーモードがあるのかを示そう. あまりにも数が多いので,その一部だけを箇条書きで示そう. 中には,Emacs のバージョンによって使えなかったり,詳細が異なるものもあるかもしれない. そこで,詳細は,例によって M-x describe-function を用いるかネットワーク検索等で調べてもらいたい.

font-lock-mode
フォントロック機能. キーワードに色をつける機能. Emacs20 では端末内では無効だが,Emacs21 以降および XEmacs では有効である.
(global-font-lock-mode t) と設定すると global に有効になる. 局所的に設定したい場合は, (font-lock-mode t) でよいだろう.
また,特定の文字列や行に色を付けたい場合は, hi-lock-mode が使える. このマイナーモードでは色をつける部分を正規表現で指定できる.

auto-revert-mode
編集しているファイルが他のソフト等により更新された場合,それに応じて新しく読み直す. 便利ではあるが,確認ナシで動作するため,かえってマズイ場面もあるだろう. 設定に関しては今までの方法で各自 調べよ.

hl-line-mode
現在カーソルがある行に色をつける.

abbrev-mode
略称展開機能. 入力文字列を(登録しておいた中から)補完してくれる. ただし,あまり使いやすくはないかと思う. むしろ,dabbrev という動的略称展開機能を用いた方がよいだろう.
# 詳しくは自分でネットワークより検索せよ. また,似たような機能をもつマイナーモードに dynamic-completion-mode というものがあるので,こちらを調べても良いだろう.

auto-compression-mode
圧縮されたファイルを自動的に展開して読み,用が済むと自動的に圧縮する機能.

auto-fill-mode
定められた文字数で1行となるように,自動改行する機能.

auto-save-mode
ファイルを自動で保存してくれる機能. 設定しておくと便利だろう.

double-mode
キーを二回続けて押すと,違う入力をしてくれる機能. double-map という変数でキーと入力をバインディングする.

autoarg-mode
本来, C-u 数字 として入力しないといけない場面でも, C-u を省略して入力できるようになる. 例えば,このモードにしてから 3 5 a と入力すると,35個の a が入力される.

overwrite-mode
上書きモード. 通常は Emacs は挿入モードであるが,上書きのほうが便利なときはこれを使おう.

outline-minor-mode
アウトラインモード. 文書の構造上,上位構造だけ表示して下部構造を隠すような表示を適宜切り替えることができる機能. 慣れると非常に便利であるので,TeX や html ファイル,他プログラムファイルの編集などには 是非設定し,習熟するべきである.
ただし,呼び出しの prefix (キーの組合わせの最初の部分)が, C-c@ という非常に使いにくい組合わせであるため,書き換えて使うことが多い. 実際には, M-SPACE などとすることが多いようだ. ちなみに prefix の書き換えは,
(setq outline-minor-mode-prefix "\M- ") などとする.
hs-minor-mode も似たような機能を持つが, きちんと設定した outline-minor-mode の方が使いやすいだろう.

footnote-mode
脚注モード. 脚注を作ったり,元の所へ戻ったり,番号をつけ直したりという機能. なかなか便利かもしれない.

delete-selection-mode, pending-delete-mode (名前が異なるだけで同じ機能)
region が指定されているときに,何か文字を入力すると region を消去して,その文字を入力するモード. windows などのソフトではこういう動作をするので,それに合わせたい場合は良いだろう.

glasses-mode
単語がくっついて書かれているとき,その間に "_"(アンダースコア) などを表示して見易くするモード. 表示が変わるだけでファイルを書き換えるわけではない.
例えば,"ThisIsANote" という文字列は glasses-mode では "This_Is_A_Note" と表示される. プログラム中で変数の名前をつけるルールがややこしい時などは役立つかもしれない.

follow-mode
同じファイルを2画面にわけて表示しているときに, それが仮想的につながっているとしてスクロールするモード. 実は結構便利.
一番簡単な使い方は, C-x 1 で一度フレームを1つにしてから, C-x 3 で左右にバッファを分割.その後, M-x follow-mode としてみる方法である.

highlight-changes-mode
前回保存してから,更新した場所に色を付ける機能. これもなかなか便利である. 設定はいろんなパターンがあるが,最もシンプルなのは (global-highlight-changes 'active) とするだけという方法である.

html-autoview-mode
html ファイルを編集して保存すると,自動的に browser を立ち上げてそのファイルを閲覧する機能. 設定する場合は html-mode のフックに付け加えるとよいだろう.

iswitchb-mode
バッファ切り替えの際の補完機能をより良くしたもの. 該当するバッファの一部分の文字を入れれば補完される上,適当に設定すると C-n, p, ... 等でバッファを選択できるので便利だ.

mouse-avoidance-mode
テキスト編集をしている際,マウスカーソルが邪魔になることが多い. そこで,マウスカーソルが(本物の)カーソルに近づかないようにする.
設定は,
(mouse-avoidance-mode 'HOGE)
とする.HOGE の部分には "banish", "exile", "jump", "animate", "cat-and-mouse", "proteus" などと設定する. 意味は各自調べよ.

mouse-sel-mode
マウスによる region 指定などの機能が拡張される.

mouse-wheel-mode
マウスによる wheel が有効になる.

msb-mode
メニューの Buffers が分類別に表示される.

ispell-minor-mode
スペルチェックを「入力しながら」行なえる.

partial-completion-mode
ミニバッファでの入力の補完が強力になる. 例えば, M-x p-c-m と打ってから TAB を押すと M-x partial-completion-mode と展開される. また,任意の文字列という意味で "*" も使える.

recentf-mode
ファイル履歴機能. 最近読み込んだファイルの履歴が File メニューに "Open Recent" と出るようになる. ただし,Emacs21 以降のみの機能のようだ.

scroll-all-mode
表示されているウィンドウを全て同時にスクロールさせるモード. 似たようなファイルを比較して作業するようなときに便利だろう. On/Off を頻繁にしないといけないだろうから,適切なキーバインディングをしておくとよい.

show-paren-mode
対応する括弧を,カーソルをそこへ持っていくと色付けして表示してくれる. なかなか便利な機能なので,これも設定しておくとよいだろう.

toggle-rot13-mode
rot13 という文字置換(アルファベットを13個ずらすだけ)をそのバッファに作用させる. ん〜,実用性がどれだけあるかは難しいが,ある種の人たちにはとても懐かしい(^-^;)

type-break-mode
休憩をとるように Emacs がお勧めしてくれる機能. ある程度の時間がたつ,ないしはある程度の量をタイプすると「休憩をとってはいかが」と Emacs が聞いてくる. すばらしい機能だ.

winner-mode
ウインドウに関する処理(ウィンドウの分割など)を記録するようにする. これにより,ウィンドウに関する処理の undo などが可能になる.

実習

上のマイナーモードを一通り試すか調べるかせよ.
また,アウトラインマイナーモードを tex や html ファイルで使えるように設定し, ある程度使いこなせるよう,練習せよ.

その他細かい設定

Emacs が標準で持っている機能で, モード等にからまないものの中から, シンプルなものをいくつかをここで紹介しておこう.

デフォルトフレームの設定.
フレームとは要するにウィンドウのことだが(^-^), この設定では他にもカーソル形状や文字の色等多くを決定できる. 具体的には default-frame-alist という変数の中で細かい設定をすればよい.
この変数も association list で少し設定がわかりにくいので,例を示しておく.

    (setq default-frame-alist
      (cons '(項目変数 . 値)
            '(項目変数 . 値)
                    …          
            '(項目変数 . 値)
            '(項目変数 . 値)
            default-frame-alist))
      
この項目変数として設定できるものは具体的には, などがあるが,この辺りの変数は Emacs のバージョンにもよるので, default-frame-alist についてその Emacs で調べてみるとよい. 意外に細かい設定ができるので,楽しめるだろう.
ちなみに,上の色設定に関しては,X window などの環境下の Emacs では M-x list-colors-display とすると実際の色見本が出るのでそれをもとに設定を行なえばよい.

バックアップファイルの数を増やしたりする.
(setq version-control t) とすると,通常は hoge.txt~ となって一つだけ作られるバックアップファイルが 複数作られるようになる. いくつ作られるか,古いものを消すときに確認をするか等は kept-new-version, kept-old-version, delete-old-versions といった変数を適宜 設定すればよい.

カーソル位置再現.
前に編集していたカーソルの位置を記録しておいて, 次にファイルを開いた時にそこへカーソルを移動させる機能.
(require 'saveplace)
(setq-default save-place t)

などとして設定する.

ディレクトリ名を指定しなくてもファイルを指定できる.
Emacs が起動するときに,事前に指定されたディレクトリ以下のファイルリストを内部的に作成する. そのリストに載っているファイル名であれば,ディレクトリ名を指定しなくても済むようにできる.
(require 'filecache)
(file-cache-add-directory-list (list "~" "~/bin" "~/etc"))
(define-key minibuffer-local-completion-map
"\C-ci" 'file-cache-minibuffer-complete)

などとして設定する. 使い方は,ファイル名を入力する場面でファイル名を入力した後に C-c i とすればよい.
ただし,C-c i というキーバインディングが他で使われていなければ,である. 一応,C-c アルファベットというキーバインディングはユーザ用に解放されているはずなので大丈夫なハズではあるが.

カーソル近くのファイル名をデフォルトにしてファイルを開く
ファイル中にファイル名が書いてある場合,そのファイルを開くのにわざわざ入力しなおさなくても,デフォルトをそのファイル名としてくれる機能.
(ffap-bindings)
などとして設定する. あとは普通に使うだけである.かなり便利.

Emacs セッション継承
Emacs の開いていたファイルやモード等を保存しておいて,次に起動したときにもその状態を再現できる機能.
(desktop-load-default)
などとして設定する. あとは,セッションを保存したい時に M-x desktop-save とすれば状態が保存される. 状態を再現するには,セッションを保存したディレクトリかそこにあるファイルを読んでいる状態で M-x desktop-read とすればよい.

dired の拡張
dired をより使いやすいものにする.
(require 'dired-x)
などとして設定する. これにより,dired が拡張される. 例えば,通常の状態でいきなり dired が C-x C-j で呼び出せたりする.

実習

上の設定を一通り試してみよ.

Emacs に機能を加える形のカスタマイズ -- howm を例に

これまで,Emacs に標準でついてくる機能およびそのカスタマイズだけを紹介してきたが, Emacs は elisp を使って柔軟に機能を追加できるため, 第三者による多くの機能追加プログラムが存在し, そして非常に便利に使われている.
こうしたものはあまりに多く,紹介しきれるものではない. そこで,特に参考となる Meadow/Emacs memo などを片っ端から読んでいくことをお勧めしたい.

さらに,ここではこうした第三者により開発されている非常に便利な Emacs 環境の中でまだあまり知られていない howm とよばれるものを紹介しておこう.
これは個人的にメモをとるための Emacs 環境であるが, 雑多かつ多数に及ぶメモを 「いかに気軽に」かつ「有機的にリンクさせる」 ための工夫が非常に巧みにとられている.
日常の様々な記録をとっておく方法はいろいろあるが, 検索性,情報の相互参照性,そして記録をとること自体の容易さを考えるとなかなか良いものは少ない. そうした現状で, この howm は一つの解を与えるものとして注目に値するだろう. 是非使ってみて,気に入ったならばどんどん使いこなしてもらいたい.

情報およびソースの入手先は howm: 一人お手軽 Wiki もどき を参照するのがよい. インストールは本当に簡単であるので,以下にごく簡単に箇条書きにしておこう.

  1. web よりファイルをダウンロードする. 具体的には,lynx で http://howm.sourceforge.jp/a/howm-test.tar.gz を取りに行けばよいだろう.
  2. ファイルを適当に解凍し,出来たディレクトリを howm などという名前で先の ~/elisp ディレクトリの下に置く.
  3. 作成したディレクトリ名に合わせて, (setq load-path (cons "~/elisp/howm" load-path)) などという行を .emacs などに書き込む(なるべくファイルの先頭に近い方がよいだろう).
  4. メモを置いておくディレクトリを ~/howm として作成し,その中にダウンロードして展開したファイル中の ja/*.howm をコピーする.
  5. .emacs などに,howm の設定を書き込む. マニュアルや web を参照してじっくり調べるべきであるが,とりあえずというのであれば最低限

    (setq howm-menu-lang 'ja)
    (global-set-key "\C-c,," 'howm-menu)
    (autoload 'howm-menu "howm-mode" "Hitori Otegaru Wiki Modoki" t)


    と書き込めばよい.
  6. あとは,Emacs 上で C-c , , と打てば howm が起動する.

実習

howm を自らの環境にインストールし,いくつかメモを作成して動作に習熟せよ.

レポート課題

以下に示された課題について

AppliedMath-Report-14

という題名をつけて e-mail にて教官宛にレポートとして提出せよ(教官のメールアドレスは授業中に口頭で伝える).
なお,レポートを e-mail の代わりに TeX で作成した書面にて提出してもよい.

課題内容

  1. モードラインに時間を表示するだけでなく,月,日,曜日も表示できるように, M-x customize を使って実現してみよ.

  2. モードラインにカーソル位置の「行」「列」が表示されるように .emacs を編集して設定せよ.

  3. マイナーモードで,自分の環境で採用したものについていくつか解説せよ.

  4. howm を使ってみて,何が便利か,そして,何があればより便利か考えて報告せよ.

  5. Wanderlust と呼ばれるソフトウェアについて,同様にインストールを行い,使ってみよ.
    ちなみに,阪大教育用計算機の環境でのメールサーバおよびニュースサーバに関しての設定は, 最低限以下のように ~/.wl に書き込めばよいだろう.
    # これで Mozilla mail を使わずともメールの読み書きが出来るというものだ.

    (setq elmo-imap4-default-server "mailserver")
    (setq elmo-imap4-default-authenticate-type 'clear)
    (setq wl-smtp-posting-server "sendmail")
    (setq elmo-nntp-default-server "newsserver")