私の .emacs で設定している項目

Last Updated at $Date: 2005/12/04 03:36:05 $.

このページの内容は,Emacs-21.3 で動作確認しています. version によっては変数名や関数名の変更などにより動作しないことが有り得ますので, ご注意下さい.バグレポートや感想などは tsuchiya@namazu.org までお願いします.


日本語環境の設定

日本語 EUC のファイルと端末を使う場合, 少なくとも以下の設定を ~/.emacs に書く必要があります.

(set-language-environment "Japanese")
(set-default-coding-systems 'euc-japan)
(set-terminal-coding-system 'euc-japan)

改行キーでオートインデントさせる

次のようなコードを,~/.emacs に加えてください.

(global-set-key "\C-m" 'newline-and-indent)
(global-set-key "\C-j" 'newline)

好みによって,関数 newline-and-indent は,関数 reindent-then-newline-and-indent にしておくほうが良いかもしれません.

関数 newline-and-indent 及び reindent-then-newline-and-indent は, 変数 indent-line-function で指定された関数を呼び出しているので, 適宜,この変数を設定しておく必要があります. (Cf. yahtml-mode を便利に使う)


BS キーを有効にする

Window mode で利用する場合は Del キーを1文字削除に bind し, 端末上で利用する場合は,BSキーと Delキーを入れ換えています.

(if window-system
    (global-set-key [delete] 'delete-char)
  (load "term/keyswap"))

また,日本語入力フロントエンドとして egg を利用している場合は, フェンスモードのキーバインドも調整しておくと良いでしょう.

(if window-system
    (progn
      (global-set-key [delete] 'delete-char)
      (define-key fence-mode-map [delete] 'fence-delete-char))
  (load "term/keyswap"))

マシン毎に設定を切り替える

マシン毎に設定を切り替える場合,関数 system-name を利用して実行中のマシンの名前を調べることが出来ます.以下の例では, system-name の返り値が,host.domain.or.jp となる場合と,単に host となる場合があるので,どちらにも対応させるために正規表現を使っています.

(let ((system-name (system-name)))
  (cond
   ;; systemA または systemB で実行中の場合
   ((string-match "^\\(systemA\\|systemB\\)\\(\\..+\\)*$" system-name)
    (load "~/.emacs-AorB"))
   ;; systemC で実行中の場合
   ((string-match "^systemC\\(\\..+\\)*$" system-name)
    (load "~/.emacs-C"))
   ;; 指定されていないマシンで実行中の場合
   (t
    (message (concat "Unknown Host: " system-name)))))

system-name の他,system-typesystem-configuration を用いることもできます.


ファイルの拡張子によってメジャーモードを切り替える

ファイルの拡張子とメジャーモードとの対応関係は,変数 auto-mode-alist に格納されています.例えば,.tex という拡張子のファイルを yatex-mode で開くようにするには,次のような設定を加えて下さい.

(setq auto-mode-alist
      (cons (cons "\\.tex$" 'yatex-mode) auto-mode-alist))

複数の拡張子に対する指定を同時に加えるには,次のようにすれば良いでしょう.

(setq auto-mode-alist
      (append '(("\\.sh$" . fundamental-mode)
                ("\\.perl$\\|\\.p[hlm]$\\|/perl/" . perl-mode))
              auto-mode-alist))

スクリプトを編集するメジャーモードの設定

ファイルの先頭に #! で始まる行があった場合, そのファイルをスクリプトのソースと判断して,指定されている interpreter によってメジャーモードを決定します.この対応関係は,変数 interpreter-mode-alist に格納されているので, 次のようなコードを ~/.emacs に加えて下さい.

(setq interpreter-mode-alist
      (append '(("jperl" . perl-mode)
                ("sh" . fundamental-mode)
                ("bash" . fundamental-mode))
              interpreter-mode-alist))

スクリプトを保存する時,自動的に chmod +x を行なうようにする

次のようなコード~/.emacs に加えておくと,

の場合,実行用のスクリプトファイルであると見なして,保存時に実行許可属性を自動的に設定します.

(defun make-file-executable ()
  "Make the file of this buffer executable, when it is a script source."
  (save-restriction
    (widen)
    (if (string= "#!" (buffer-substring-no-properties 1 (min 3 (point-max))))
        (let ((name (buffer-file-name)))
          (or (equal ?. (string-to-char (file-name-nondirectory name)))
              (let ((mode (file-modes name)))
                (set-file-modes name (logior mode (logand (/ mode 4) 73)))
                (message (concat "Wrote " name " (+x)"))))))))
(add-hook 'after-save-hook 'make-file-executable)

強調表示付き動的略称展開

通常,M-/ に登録されている dabbrev-expand は非常に便利なコマンドです. 例えば,別のバッファに print という単語がある時に pr M-/ と入力すると, 残りの int が展開入力されて print という語が完成します. dabbrev-highlight.el は,動的略称展開の対象となった文字列を強調表示する拡張で, オリジナル白井さんによって作成されました. このページで配布している版は,ミニバッファ内部で略称展開を行った時に1行表示を行わない, という点が異なっています.

強調表示付き動的略称展開

dabbrev-highlight.el を適当な場所にコピーしてから,次の設定を ~/.emacs に追加してください.

(require 'dabbrev-highlight)

なお,Emacs20 以降の環境では日本語を含む動的略称展開がうまく動かないので, 追加設定が必要です.


概略表示付き yank-pop

kill-ring の過去の内容を参照するための yank-pop (M-y) というコマンドは頻繁に利用するにも関わらず,使いづらいコマンドです. どうしてかなあと思ったのですが,それは, 「次にどのような文字列が挿入されるのか, 実行してみないと分からない」という点が原因なのではないかと考えました. この問題を解決するため, yank-pop が呼び出されると,以下のように自動的に kill-ring の概略を表示する拡張を作成しました.

概略表示付き yank-pop の動作例

このファイルを適当な場所にコピーしてから, 以下の設定を ~/.emacs に追加してください.

(autoload 'yank-pop-forward "yank-pop-summary" nil t)
(autoload 'yank-pop-backward "yank-pop-summary" nil t)
(global-set-key "\M-y" 'yank-pop-forward)
(global-set-key "\C-\M-y" 'yank-pop-backward)

yank-pop を使いやすくしようとする拡張としては,他に kill-summary.elbrowse-kill-ring.el などが知られているので,使い比べてみると面白いのではないでしょうか.


shell-command のコマンド入力に補完が効くようにする

Emacs 上からシェルのコマンドを実行するには幾つかの方法があります.

  1. M-x shell として,shell-mode のバッファに移動してから実行する.
  2. M-x shell-command または M-! としてその場で実行する.

後者の方法によるシェルコマンドの実行は, コマンドの出力を編集中のバッファに挿入したい場合に特に便利です. 例えば,適当なバッファで C-u M-! ls RET としてみると,ls の結果がカレントバッファに挿入されます.

この方法では,ミニバッファにコマンド文字列を入力するわけですが, その際にコマンド名やファイル名などの補完が行われるようにする拡張を作成しました.

このファイルを適当な場所にコピーしてから, 次の設定を ~/.emacs に追加してください.

(require 'shell-command)
(shell-command-completion-mode)

shell-mode を使う

shell-mode を利用する場合の Tips を紹介します.

パスワードの入力を隠す

sudosu などのコマンドを shell-mode のバッファ内で実行すると,パスワードが見えてしまって困ったことはありませんか? そのような場合は,以下の設定を ~/.emacs に加えてください.

(add-hook 'comint-output-filter-functions
          'comint-watch-for-password-prompt)

エスケープシーケンスを処理する

kterm などの端末上で ls --color を実行すると, ファイルの種別毎に色分けをしてくれるので,視認性が上がって便利です. しかし,同じことを shell-mode のバッファ内で行っても, 変な文字列(= エスケープシーケンス)が表示されるだけで, 期待したようには色がついてくれません. そのような場合は,以下の設定を ~/.emacs に加えてください.

(autoload 'ansi-color-for-comint-mode-on "ansi-color"
          "Set `ansi-color-for-comint-mode' to t." t)
(add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on)

C のソースのインデント幅を変更する

Emacs で C のソースを編集する時,デフォルトではインデント幅が2になります. これを変更するには,以下のように変数 c-default-style を変更してください.

(setq c-default-style "user")

変数 c-style-alist に,様々な設定が登録されているので, その中から好みのものを選ぶことができます.


RCS で漢字を含んだファイルを扱うための設定

RCS は,ソースコードなどの履歴管理のためのツールです.

source.c
source.c.1998-Oct-30
source.c.1998-Nov-12

などのように,ファイル名に日付を入れたりしてファイルの履歴を管理するのに苦労している人は,是非とも RCS を使いましょう.RCS については, 河邉岳人さんの「RCS 超入門」が参考になります.

ところが,漢字を含むファイルを RCS で管理しようとする場合は,少しだけ注意が必要です. ファイルを登録( check-in )する時に,作業記録をつけることができるのですが, そのための漢字コードをきちんと統一しておかないと,作業記録が文字化けしてしまいます. 以下の例は,作業記録を日本語 EUC で登録するための設定です.

(modify-coding-system-alist 'process "^rlog" '(undecided . euc-jp-unix))
(modify-coding-system-alist 'process "^ci" '(undecided . euc-jp-unix))
(modify-coding-system-alist 'process "diff" '(undecided . euc-jp-unix))
(modify-coding-system-alist 'process "^cvs" '(undecided . euc-jp-unix))

Perl スクリプトを編集するための設定

この項目は別のページになっています.


HTML 形式のファイルを編集するための設定

この項目は,別のページになっています.


英和辞書を組み込む

この項目は,別のページになっています.


Emacs 上で w3m を使う

この項目は, emacs-w3m 公式ページに移管されました.


関数・変数の説明文を参照するコマンド

mode-info は,メジャーモードに対応して適切な関数・変数の説明を表示するように describe-function / describe-variable を拡張するプログラムです.


個人用の Info を追加する方法

この項目は,別のページになっています.


締め切りまでの時間をモード行に表示する

display-deadline.el を適当な場所にコピーしてから,次の指定を ~/.emacs に付け加えてください.

(require 'display-deadline)
(display-deadline "卒論提出まであと%d日%h時間%m分" (encode-time 0 30 11 15 2 2002))

この例の締切時間は「2002年2月15日11時30分」ですが, この時刻を Emacs-Lisp の時間関数が利用する形式に変換するために encode-time 関数を利用しています. 詳しくは,encode-time 関数の関数説明文を参照してください.


dired を使う

dired は,Emacs-Lisp で記述されたファイラーです. 初期設定の状態では,diredls コマンドの実行結果を利用しています. そのため,ls コマンドの出力に日本語が含まれていると,dired が正しく動かないことがあります.

そのような場合は,以下の設定を ~/.emacs に追加して,Emacs-Lisp で記述された insert-directory 関数を利用するようにすれば, ls コマンドの出力形式に左右されないようになります.

(require 'ls-lisp)
(let (current-load-list)
  (defadvice insert-directory
    (around reset-locale activate compile)
    (let ((system-time-locale "C"))
      ad-do-it)))

Emacs-Lisp をいじろうとする時に覚えておくと便利なコマンド

M-x apropos

どんな関数,変数があるのかを調べるときに使うコマンドです.例えば, Info 関係の変数を調べている場合は,M-x apropos Info とすると, Info を名前に含む関数及び変数が表示されます. (デフォルトで C-h a にバインドされている command-apropos とは,表示される情報が異なりますので,混同しないよう注意してください)

M-x describe-function (C-h f)

関数の機能を表示するコマンドです.「GNU Emacs Lisp リファレンス・マニュアル」と「関数・変数の説明文を参照するコマンド」も参照して下さい.

M-x describe-variable (C-h v)

変数の値とその意味を表示するコマンドです.~/.emacs で設定した値が反映されているか,チェックしたい場合は,~/.emacs を開いて,調べたい変数にカーソルを合わせて C-h v RET とすれば,変数の値を表示してくれます. また,mule のバージョンを確認したい場合は,C-h v mule-version としてください.「GNU Emacs Lisp リファレンス・マニュアル」と「関数・変数の説明文を参照するコマンド」も参照して下さい.


Emacs Lisp の参考書籍

和文のテキストを紹介しています.これ以外にも知ってるよ,という方は,是非, tsuchiya@namazu.org まで連絡してください.

GNU Emacs Lisp リファレンス・マニュアル

Emacs Lisp リファレンス・マニュアルには2つの大きく異なる版があります.

・原作2.4版

Emacs-19.29対応の原作2.4版の翻訳は,透土社から1995年に出版されました.

・原作2.5版

Emacs-20.3 対応の原作 2.5 版の翻訳が,ASCII から発売されています.

この Info は Emacs Lisp でプログラミングする時にとても役に立つので,頻繁に参照します. しかし,その度に Info に移動してから検索するのは面倒になったので, 関数名や変数名を指定すると Info の該当部分を表示するコマンドを作成しました.

Emacs Lisp によるプログラミング - 初心者のための入門

GNU の配布に含まれている『Programming in Emacs Lisp: A simple introduction』の翻訳です.

Emacs20.6 日本語マニュアル

Emacs-20.6 に対応した翻訳が,ASCII から発売されています.


[Top] / [Emacs Lisp Tips]