Emacs超入門[2]:基本的なカスタマイズ方法と定番カスタマイズ例

 Emacsの特徴の1つに、柔軟にカスタマイズが可能な点がある。本記事ではフォントの変更や外観の変更、キーバインディングの変更と行った基本的なカスタマイズと、定番のカスタマイズを紹介する。

連載:Emacs超入門

 Emacsは「Editor Macros」の略から命名されたことからも分かるように、柔軟にその動作をカスタマイズすることができる。EmacsのカスタマイズにはEmacs Lisp(elisp)と呼ばれる、Lispベースの専用マクロ言語を利用するのが一般的だが、Emacsに備えられているカスタマイズ機能を用いたカスタマイズも可能だ。elispによるカスタマイズは柔軟性に優れるものの、elispの文法はCなどの手続き型言語とは異なるため、取っつきにくさを感じる人も多いだろう。そのため、まずはカスタマイズメニューを用いたカスタマイズや、定番のカスタマイズ例をコピー&ペーストで利用する方法を覚えておくとよいだろう。

Emacsのコマンドと変数

 カスタマイズの基本を解説する前に、カスタマイズを行う際に必須となる「コマンド(command)」と「変数(variable)」について解説しておこう。Emacsにおけるほとんどの処理は、コマンドとしてその名前が定義されている。たとえば「改行する」という処理は、「newline」コマンドとして定義されている。

 Emacsはショートカットキー入力を含むキーボード入力を受け付けると、それに対応するコマンドを実行する。たとえばEnterキーを入力する、もしくは「C-m」を入力すると改行が行われるが、これはEmacs内部ではEnterキー、もしくは「C-m」の入力に対し、それに割り当てられている「newline」コマンドを実行する、という処理が行われているのである。この割り当ては自由に変更できるため、たとえばEnterキーを押した場合に改行ではなく他の処理を行わせるようにすることもできる。

 ショートカットキーに割り当てられていないコマンドは「M-x」ショートカットキーで呼び出すことができる。M-xを入力するとミニバッファに「M-x 」と表示されるので、実行したいコマンド名を入力してEnterキーを押せばよい。ミニバッファではTabキーで補完/候補一覧表示ができるほか、そのコマンドがショートカットキーに割り当てられている場合はその情報も表示される。

 なお、定義されているコマンド一覧は「apropos-command」コマンドで確認できる。「M-x」を入力後、「apropos-command」と入力してEnterキーを押すと検索キーの入力を促されるので、ここで「.*」(正規表現ですべての文字列を意味する)を指定すればよい(図1)。

図1 Emacsのコマンド一覧表示
図1 Emacsのコマンド一覧表示

 また、Emacsの挙動を設定する役割を果たしているのが「変数」である。Emacsの挙動を変えるには、この変数の値を変えればよい。なお、定義されている変数一覧は「apropos-variables」コマンドで確認できる(図2)。

図2 Emacsの変数一覧表示
図2 Emacsの変数一覧表示

Emacsカスタマイズの基本

 Emacsで行えるカスタマイズは、次の3つである。

  • 変数値の変更
  • キーバインドの変更
  • コマンドの定義

 1つめの「変数値の変更」は、変数の値を変えることでEmacsの挙動を変えるというもの、2つめの「キーバインドの変更」はキー/ショートカットキーにコマンドを割り当てる、もしくはすでにコマンドが割り当てられているキー/ショートカットキーに別のコマンドを割り当てる、というものだ。また、3つめの「コマンドの定義」は自分で新たなコマンドを定義するというものである。

 一見するとカスタマイズの幅が狭いようにも見えるが、Emacsのほとんどの挙動は変数値を変えるだけでカスタマイズできるほか、自分でコマンドを定義し、任意のキー/ショートカットキーなどに割り当てることで複雑な処理を呼び出すこともできる。今回はまず変数の変更およびキーバインドの変更方法について紹介し、コマンドの定義については次回以降に解説することにする。

Emacsのカスタマイズ機能を使ったカスタマイズ

 Emacsには、手軽に設定変更を行うためのカスタマイズ機能が備えられている。たとえばNTEmacsやCarbonEmacsでは、メニューバーの「Option」メニューでツールバーやメニューバーなどの表示のOn/Offや、C-SPC(Ctrl+スペース)でmarkした位置から現在カーソルがある位置までをハイライト表示する設定(Active Region Highlighting)などが設定できる(図1表1)。ここで変更した設定は自動的には保存されないので、Emacsの次回起動以降も設定を反映させたいならメニューの「Save Options」を選択して設定を保存しておく必要がある。なお、設定はEmacsが起動時に読み込む設定ファイル(ホームディレクトリ内の「.emacs」ファイル)に記録される。

図3 Emacsの「Options」メニュー
図3 Emacsの「Options」メニュー
表1 NTEmacsの「Options」メニューで設定できる項目
項目 説明
Active Region Highlighting 選択中のリージョンをハイライト表示する
Paren Match Highlighting カーソルの前後にある括弧に対応する括弧をハイライト表示する
Truncate Long Lines in this Buffer 長い行を折り返さないで表示する
Word Wrap in Text modes ワードラップを行う
Case-Insensitive Search 検索の際に大文字/小文字を区別しない
C-x/C-c/C-v Cut and Paste(CUA) C-xで切り取り/C-cでコピー/C-vで貼り付けを行う
User Directory Names in Buffer Names 異なるディレクトリにある同名ファイルを開いた際にディレクトリ付きのファイル名をバッファ名にする
Save Place in Files between Sessions 以前に編集時のカーソル位置を記憶し、再度開いた際にカーソル位置を復元する
Blinking Cursor カーソルを点滅される
Enter Debugger on Error elispのエラー時にデバッグウィンドウを開く
Enter Debugger on Error on Quit/C-g elispのエラー時、elispの終了/中止時にデバッグウィンドウを開く
Mule(Multilingual Environment) 言語環境やInput Method、テキストエンコーディングなどの設定
Show/Hide ツールバーやメニューバー、行番号などの表示のOn/Off切り替え
Set Font/Fontset… 利用するフォントの指定。プリセットからのみ選択できる
Save Options 変更したオプションを設定ファイルに保存する
Customize Emacs カスタマイズメニューを呼び出す
Windows環境での「ホームディレクトリ」の扱い

 Emacsは、各ユーザーの「ホームディレクトリ」に設定ファイルなどを保存する。Windows XPの場合はシステムドライブの「Documents and Settings\<ユーザー名>」以下がホームディレクトリに相当する。また、Windows Vistaの場合はシステムドライブの「ユーザー\<ユーザー名>」がホームディレクトリである。

 Meadowの場合、Optionsメニューの設定項目がNTEmacsとは異なる。ハイライトやワードラップ/折り返しの設定は可能だが、ツールバーの表示/非表示などはここでは設定できない。もしMeadowでツールバーの表示設定などを変更したい場合は、メニューバーの「Options」-「Customize Emacs」-「Top-level Customization Group」から呼び出せるCustomizeコマンドを利用しよう(M-xで「customize」コマンドを実行しても可能)。

 CustomizeはEmacsの多岐に渡る設定項目をグラフィカルに変更できる機能で、設定項目は種類別にグルーピングされている(図4)。たとえばツールバーの表示/非表示は「Environment」グループ内の「Frames」サブグループ内にある「Tool Bar Mode」で設定できる。設定値の変更は、設定項目横の「Toggle」や「Show」、「Value Menu」ボタンで行える。これらで値を変更した後、「State」をクリックして「Set for Current Session」を選択すると変更が反映され、また「Save for Future Sessions」を選択すると設定が保存されて次回起動時以降にも反映されるようになる(図5)。

図4 詳細なカスタマイズが行えるCustomzie機能。カスタマイズ項目はグルーピングされており、「Go to Group」をクリックする、もしくはカーソルを合わせてEnterキーでそのグループの設定項目を表示できる
図4 詳細なカスタマイズが行えるCustomzie機能。カスタマイズ項目はグルーピングされており、「Go to Group」をクリックする、もしくはカーソルを合わせてEnterキーでそのグループの設定項目を表示できる
図5 設定値は「Toggle」や「Value Menu」ボタンをクリックして変更できる。変更後、「State」をクリックして「Set for Current Session」を選択すると設定が反映される。また、次回起動以降も設定を反映させるには「Save for Future Sessions」をクリックすればよい
図5 設定値は「Toggle」や「Value Menu」ボタンをクリックして変更できる。変更後、「State」をクリックして「Set for Current Session」を選択すると設定が反映される。また、次回起動以降も設定を反映させるには「Save for Future Sessions」をクリックすればよい

キーバインディングを変更する

 ショートカットキーに割り当てる機能(キーバインディング)の変更については、設定ファイルを直接書き換えるのがスタンダードな方法である。ホームディレクトリ中の.emacsファイルが編集すべき設定ファイルだ。

 キーバインディングを変更するには、.emacsファイル中に下記のような行を追加すればよい。

(global-set-key "<割り当てるキー>" '<実行するコマンド>)

 割り当てるキーは、表2のようなルールで指定する。たとえば「C-h」というショートカットキーにバックスペース(delete-backward-char)コマンドを割り当てるには、次のような行を追加すればよい。

(global-set-key "\C-h" 'delete-backward-char)
表2 割り当てるキーの指定方法
割り当てたいキー 記述
Ctrl+<キー> \C-<キー>
Meta+<キー> \M-<キー>
Ctrl+Meta+<キー> \C-M-<キー>
スペースキー SPC
タブキー \C-i
ESCキー \C-[

 また、2ストロークキー(あるキーを押した後、別のキーを押すという動作)に機能を割り当てたい場合は、押すキーを順番に指定すればよい。たとえば「C-c h」(Ctrl+hキーを押した後、hキーを押す)という動作に「help」コマンドを割り当てるには、次のようにする。

(global-set-key "\C-ch" 'help)

 このとき、順番に押すキーの間にはスペースを入れない点に注意してほしい。また、通常2ストロークキーの1ストローク目としては「C-x」および「C-c」のみを利用するのが慣習である。

設定ファイルで変数値を変更する

 .emacsファイルで変数値を設定してEmacsの挙動を変えることもできる。変数値を設定するには、.emacsファイル中に下記のような行を追加すればよい。

(setq <変数名> <設定する値>)

 たとえば、Emacsにおいてバッファのタブ幅を指定する変数「tab-width」を「4」に設定するには、.emacsファイルに次のような記述を追加すればよい。

(setq tab-width 4)

設定ファイルに起動時に実行するコマンドを記述する

 上記で説明した「global-set-key」や「setq」というのは、すべてEmacsに用意されているコマンドである。実は.emacsファイルはelispのスクリプトファイルであり、Emacsは起動時にこのスクリプトファイルを実行しているのである。.emacsファイルではキーバインディングの設定や変数値の設定だけでなく、コマンドを記述することで起動時に特定の作業を自動実行させることもできる。

 たとえば、「prefer-coding-system」という、ファイルの新規作成時に使用するテキストエンコーディングを指定するコマンドがある。起動時にこのコマンドに「utf-8-unix」という値を与えて実行させるには、次のように記述すればよい。

(prefer-coding-system 'utf-8-unix)

 なお、スクリプト中にコメントを入れるには、「;」を利用する。elispでは「;」から行末までがコメントとして扱われ、その内容を無視する。

 そのほか、一般的によく使われる設定例を下記にまとめている。適宜必要なものを設定するとよいだろう。

;; キーワードのカラー表示を有効化
;; 「t」の部分を「nil」にするとカラー表示をOffにできる
(global-font-lock-mode t)

;; テキストエンコーディングとしてUTF-8を優先的に使用する
;; 「utf-8」の部分を「cp932」とするとCP932(Windows用Shift JIS)優先となる
(prefer-coding-system 'utf-8)

;; 起動時のメッセージを表示しない
;;「t」を「nil」にするとメッセージが表示される
(setq inhibit-startup-message t)

;; 選択範囲をハイライトする
;;「t」を「nil」にするとハイライトなしに
(setq-default transient-mark-mode t)

;;; 行番号・桁番号をモードラインに表示する・しない設定
(line-number-mode t) ; 行番号。tなら表示、nilなら非表示
(column-number-mode t) ; 桁番号。tなら表示、nilなら非表示

;; 対応するカッコをハイライト表示する
(show-paren-mode 1)

;; オートセーブOff
;; 「nil」を「t」にするとOnに
(auto-save-mode nil)

;; バックアップファイルを作る
;; 「nil」を「t」にするとバックアップファイルを作らない
(setq backup-inhibited nil)

;; 下記の「nil」を「t」とすると終了時にオートセーブファイルが削除される
(setq delete-auto-save-files nil)

;; モードラインに現在時刻を表示する
(display-time)

;; CarbonEmacsでIMを利用するための設定(CarbonEmacsのみ必要)
(set-keyboard-coding-system 'sjis-mac)
(set-clipboard-coding-system 'sjis-mac)

;; Meadow向けの日本語環境設定(Meadowのみ必要)
(set-language-environment "Japanese")
(mw32-ime-initialize)
(setq default-input-method "MW32-IME")

;; カレントディレクトリをホームディレクトリに設定
;; ""内は任意のディレクトリを指定可能
(cd "~/")

;; 選択範囲の色を指定
(set-face-background 'region "SkyBlue")
(set-face-foreground 'region "black")

;; 起動時のウィンドウサイズ、色などを設定
(if (boundp 'window-system)
    (setq default-frame-alist
          (append (list
                   '(foreground-color . "black")  ; 文字色
                   '(background-color . "white")  ; 背景色
                   '(border-color     . "white")  ; ボーダー色
                   '(mouse-color      . "black")  ; マウスカーソルの色
                   '(cursor-color     . "black")  ; カーソルの色
                   '(cursor-type      . box)      ; カーソルの形状
                   '(top . 60) ; ウィンドウの表示位置(Y座標)
                   '(left . 140) ; ウィンドウの表示位置(X座標)
                   '(width . 80) ; ウィンドウの幅(文字数)
                   '(height . 40) ; ウィンドウの高さ(文字数)
                   )
                  default-frame-alist)))
(setq initial-frame-alist default-frame-alist )

Emacsのフォントをカスタマイズ

 Emacsで利用するフォントの変更は、若干面倒な手順を踏む必要がある。NTEmacsやMeadowでは、デフォルトではフォントとしてMS明朝が利用されるが、これを変更したい場合は下記のように設定する。

NTEmacsの場合

 NTEmacs JPプロジェクトで配布されている日本語環境向けNTEmacsの場合、あらかじめプリセットとしてMS明朝およびMSゴシックを利用する設定が用意されている。たとえば高さ16ピクセルのMS明朝を使用する場合、.emacsファイルに下記のような内容を追加すればよい。

(if (eq window-system 'w32) (require 'ntemacs-font))
(fixed-width-set-fontset "msmincho" 16)

 ここで「msmincho」ではフォントの種類を指定しており、また続く「16」ではサイズを指定している。フォントとしては「msgothic」および「msmincho」、「lucida」が利用可能で、またサイズは7~10、12、14、16、18、20、24が選択できる。

 また、これ以外のフォントを使用したい場合は、新たに「フォントセット」を定義する必要がある。NTEmacsのフォント設定については、NTEmacs JP ProjectのNTEmacs 22.1のフォント設定が参考になる。

Emacsのフォントセット

 Emacsでは、フォント設定を「フォントセット」という単位で管理する。フォントセットには英数字に使用するフォントと日本語に使用するフォント、およびそれらのサイズなどの情報が含まれている。Emacsのウィンドウ内をShiftキーを押しながら右クリックするとメニューが表示され、使用したいフォントセットを選択して切り替えることができる。

 詳しくは上記のページを参考にしてほしいが、たとえば14ピクセルのメイリオフォントを利用する場合は下記の記述を.emacsファイルに追加すればよい。

; イタリックやボールドフォントを標準フォントから作成する
(setq w32-enable-synthesized-fonts t)

; 使用するフォントを指定 for NTEmacs
; 「myfont」という名前で新たなフォントセットを定義
; 英字フォントとしてメイリオ、14ピクセルを使用
(create-fontset-from-ascii-font
 "-outline-メイリオ-normal-r-normal-normal-14-*-*-*-*-*-iso8859-1"
 nil "myfont")

; myfontの日本語フォントとしてメイリオを使用
; フォントサイズは英字のサイズに合わせる
(set-fontset-font "fontset-myfont"
                  'japanese-jisx0208
				  '("メイリオ" . "jisx0208-sjis"))

; myfontのカタカナフォントとしてメイリオを使用
; フォントサイズは英字のサイズに合わせる
(set-fontset-font "fontset-myfont"
                  'katakana-jisx0201
                  '("メイリオ" . "jisx0201-katakana"))

; 定義したフォントセットを登録
(setcdr (assoc 'font default-frame-alist) "fontset-myfont")

 メイリオ以外のフォントや異なるフォントサイズを利用したい場合は、上記のうちボールドになっている部分を使用したいフォントやサイズに変更すればよい。

Meadowの場合

 Meadowのフォント設定については、Meadow Projectのフォントの設定で詳しく解説されている。基本的にはこちらに従って設定を行えば良い。

 たとえば14ピクセルのメイリオフォントを利用する場合、下記の内容を.emacsファイルに記述する。

; 日本語環境設定
(set-language-environment "Japanese")
(mw32-ime-initialize)
(setq default-input-method "MW32-IME")

; フォントセットを追加
(w32-add-font
     "Meiryo 14"
     '((spec
	((:char-spec ascii :height any)
	 strict
	 (w32-logfont "Meiryo" 0 -14 400 0 nil nil nil 0 1 3 0))
	((:char-spec ascii :height any :weight bold)
	 strict
	 (w32-logfont "Meiryo" 0 -14 700 0 nil nil nil 0 1 3 0)
	 ((spacing . -1)))
	((:char-spec ascii :height any :slant italic)
	 strict
	 (w32-logfont "Meiryo" 0 -14 400 0   t nil nil 0 1 3 0))
	((:char-spec ascii :height any :weight bold :slant italic)
	 strict
	 (w32-logfont "Meiryo" 0 -14 700 0   t nil nil 0 1 3 0)
	 ((spacing . -1)))
	((:char-spec japanese-jisx0208 :height any)
	 strict
	 (w32-logfont "Meiryo" 0 -14 400 0 nil nil nil 128 1 3 0))
	((:char-spec japanese-jisx0208 :height any :weight bold)
	 strict
	 (w32-logfont "Meiryo" 0 -14 700 0 nil nil nil 128 1 3 0)
	 ((spacing . -1)))
	((:char-spec japanese-jisx0208 :height any :slant italic)
	 strict
	 (w32-logfont "Meiryo" 0 -14 400 0   t nil nil 128 1 3 0))
	((:char-spec japanese-jisx0208 :height any :weight bold :slant italic)
	 strict
	 (w32-logfont "Meiryo" 0 -14 700 0   t nil nil 128 1 3 0)
	 ((spacing . -1))))))

; 起動時およびnew-frame時のフレーム(ウィンドウ)の設定。
(add-to-list 'default-frame-alist '(font . "Meiryo 14"))

; IMEのフォントを設定
(let ((logfont '(w32-logfont "Meiryo" 0 -14 400 0 nil nil nil 128 1 3 0)))
  (modify-frame-parameters (selected-frame) (list (cons 'ime-font logfont)))
  (add-to-list 'default-frame-alist (cons 'ime-font logfont))
  )

 メイリオ以外のフォントや異なるフォントサイズを利用したい場合は、上記のうちボールドになっている部分を使用するフォントに応じて変更する。

Carbon Emacsの場合

 Mac OS XのCarbon Emacsの場合、前述のNTEmacsの場合とほぼ同様の手順でフォントの設定が可能だ。詳しくはMacEmacs JP Projectの「Carbon版Emacs 22.1のフォント設定」で解説されているのでそちらを参照してほしい。

 たとえば、下記はOsakaおよびOsaka等幅フォントを使用する場合の設定例である。

; font settings for OS X

; Osakaフォント、14pixelの設定
(create-fontset-from-mac-roman-font
 "-*-osaka-medium-r-normal--14-*-*-*-*-*-iso10646-1"
 nil "osaka")

(set-fontset-font "fontset-osaka"
                 'japanese-jisx0208
                 '("Osaka" . "iso10646-*"))

(set-fontset-font "fontset-osaka"
                 'katakana-jisx0201
                 '("Osaka" . "iso10646-*"))

; Osaka等幅フォント、14pixelの設定
; 「monaco」を指定するとOsaka等幅フォントになる
(create-fontset-from-mac-roman-font
 "-*-monaco-medium-r-normal--14-*-*-*-*-*-iso10646-1"
 nil "monaco")

(set-fontset-font "fontset-monaco"
                 'japanese-jisx0208
                 '("Osaka-等幅" . "iso10646-*"))

(set-fontset-font "fontset-monaco"
                 'katakana-jisx0201
                 '("Osaka-等幅*" . "iso10646-*"))

; Osakaを使用
(add-to-list 'default-frame-alist '(font . "fontset-osaka"))
; Osaka等幅を使用する場合は下記のようにすればよい
; (add-to-list 'default-frame-alist '(font . "fontset-monaco"))