Emacs Lisp によるプログラミング -- 個人用設定ファイル.emacs --

昔どっかで見つけてきて印刷した1.0.4版の日本語訳や,
Emacs電子書棚さんにある1.0.5版の翻訳
ここにあるPDF版(1.0.5版)を参考にまたやっていこうと思う.
また,実行環境は,Meadow(バージョンはたぶん,3.0)の*scratch*バッファ上で行う.


今回の内容は大体知ってたかな?

defcustomを使って変数を定義

dufcustomを使って変数を定義すると,
値を設定するために,Emacsのcustomize機能が使える.
defcustomの引数.

  • 一番目の引数は,変数の名前.
  • 二番目の引数は,変数の初期値.
  • 三番目の引数は,ドキュメント.
  • 四番目以降の引数は,タイプとオプションの定義(任意の引数となる).
;; カスタマイズ可能なユーザ変数text-mode-hookによる例.
(defcustom text-mode-hook nil
  "Normal hook run when entering Text mode and many related modes."
  ;; キーワードtext-mode-hookにどのような値が設定れるべきなのか,
  ;; カスタマイズの画面で値をどのように表示すべきかを示す.
  :type 'hook
  ;; 変数の値として簡単に設定できるように提案するリスト.
  ;; これで設定しておくと,ユーザが簡単に設定できるようにチェックボックスなどを表示する.
  :options '(turn-on-auto-fill flyspell-mode)
  ;; Emacsのカスタマイズコマンドがどのグループに属するかを伝える.
  :group 'data)

;; この変数をカスタマイズする方法は大きく2つ.
;; - カスタマイズコマンド( M-x customize )を使うこと.
;; - 自分で適当な式を書くこと.

ファイル「.emacs」入門

emacs起動時にコマンドライン引数に-qを指定しない限り,.emacsファイルが読み込まれる.
セミコロン(;)以降は全て注釈(コメント)となる.

TextモードとAuto Fillモード

;;; Text mode and Auto Fill mode
; The next three lines put Emacs into Text mode
; and Auto Fill mode, and are for writers who
; want to start writing prose rather than code.

(setq default-major-mode 'text-mode)
(add-hook 'text-mode-hook 'text-mode-hook-identify)
(add-hook 'text-mode-hook 'turn-on-auto-fill)       ;; Auto Fillモードを有効にする.

;; .emacsファイルで,詰め込み時にコロン(.)の後に2つスペースを挿入するようにする.
(setq colon-double-space t)

Indent Tabsモード(タブによる字下げ)

;; Indent Tabsモードを無効にする(タブの代わりに空白を挿入?)
(setq-default indent-tabs-mode nil)

キーバインドの例

;; compare windowsをC-c wに割り当て.
;; カレントウィンドウと次のウィンドウのテキストを比較するコマンド.
(global-set-key "\C-cw" 'compare-windows)

;; occurをC-c oに割り当て.
;; 正規表現に一致するカレントバッファの行,全てを表示するコマンド.
(global-set-key "\C-co" 'occur)

;; C-xfへの割り当てを解除する.
(global-unset-key "\C-xf")


;; 既存のキーバインドをリネームする.
(global-set-key "\C-x\C-b" 'buffer-menu)

キーマップ

Emacs全体で有効となるキーバインドを設定するコマンドが,global-set-key.
これを使うと,current-global-mapのキーバインドを変更する.
モード固有のキーバインドには,define-keyを使う.
引数に,キーとコマンドに加えて,モード固有のキーマップを取る.

;; Texinfoモードの割り当てを少し拡張.
;; @groupとタイプする代わりに,C-cC-c gとタイプする.
(define-key texinfo-mode-map "\C-c\C-cg" 'texinfo-insert-@group)

ファイルのロード

コマンドloadを使えば,ファイル全体を評価してファイル内の関数や変数をEmacsにインストールできる.
また,多数の拡張をロードする場合,
拡張ファイルの場所を正確に指定するよりもload-pathに加え,そのディレクトリを指定した方が良い.

;; slowsplit.elをホームディレクトリ以下のemacsディレクトリからロードするというもの.
;; また,バイトコンパイルしたファイル,slowsplit.elcがあれば,そっちが優先.
(load "~/emacs/slowsplit")

;; slowsplit.el
;; ウィンドウを最小の再表示で分割するコマンド(よく分からん).
(global-unset-key "\C-x2")                     ;; 現在の分割コマンドを解除.
(global-set-key "\C-x2" 'split-window-quietly) ;; 新に割り当て.

;; ロードパスにホームディレクトリにあるemacsディレクトリを加える.
(setq load-path (cons "~/emacs" load-path))

オートロード

関数を収めたファイルをロードしたり,
関数定義を評価したりして関数をインストールする代わりに,関数を利用できるようにはする.
しかし,最初に呼び出すまでは実際にインストールはしない.
これをオートロードと言う.

;; 関数html-helper-modeをオートロードする.
;; html-helper-mode.elを読み込む.
(autoload 'html-helper-mode "html-helper-mode" "Edit HTML documents" t)

簡単な拡張:line-to-top-of-window

ウィンドウの先頭行にポイントを移動する簡単な拡張.

;; 以下を.emacsに直接書いてもいいし,別ファイルに書き,.emacsからロードしても良い.
;; Line to top of window;
;; replace three keystroke sequence  C-u 0 C-l
(defun line-to-top-of-window ()
  "Move the line point is on to top of window."
  (interactive)
  (recenter 0))

;; キーバインド
(global-set-key [f6] 'line-to-top-of-window)