スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
Prev.    Category    Next 

ファイルのロードとホック - 環境設定のための Emacs Lisp 入門

Emacs Lisp 入門の第 5 回です。
今回はファイルのロードとホック等のロードに関連する機能について解説します。

ファイルのロード

ライブラリーなどの elisp ファイルをロードする場合は require を使います。
(require FEATURE &optional FILENAME NOERROR)
                 &optional 以降は省略可
(require 'tabbar)
ロードするファイルはファイル名(FILENAME)で指定するのですが、 機能名(FEATURE)と同じ場合は省略できます。 たいていは同じ名前にしてあるので、ほぼ省略できると思ってもらって構いません。

この require には単にロードするだけでなく、次のような特徴があります。
ただし、 require の場合は呼び出される側のファイルにも少し仕掛けが必要です。
設定ファイルを分割するなど自分で作成したファイルをロードする場合には load を使います。 load はリロードの抑制がない以外は require と同じです。
(load "custom_file")

必要になってからファイルをロード

使いたい機能があった場合に init.el で全てロードしようとすると起動が重くなりますし、 余分なメモリーを使用することになります。 Emacs では使う場合に初めてロードする autoload の機能が用意されてます。
(autoload FUNCTION FILE &optional DOCSTRING INTERACTIVE TYPE)
(autoload 'htmlize-file "htmlize" 
  "Load FILE, fontify it, convert it to HTML, and save the result." t)
上記のように記述していれば、 htmlize-file というコマンドが使えるようになりますが、 コマンドの定義が記述されているファイル(htmlize.elc, htmlize.el) がロードされるのは実際に使われる場合です。

autoload の引数をまとめると次表のようになります。 なお、TYPE の引数はあまり使わないので、省略しています。
引数 意味
FUNCTION 関数(コマンド)
FILE ロードするファイル
DOCSTRING 関数の説明
INTERACTIVE インタラクティブ(ユーザーが呼び出せるか)どうか

ファイルのロード前に設定できる仕組み

変数の設定は setq を使うという説明を以前行いました。 この他に defvar キーワードでも変数の宣言ができます。 これは拡張 elisp などの方で使用するものなので、使えるようになる必要はありませんが、 仕組みは知っておいた方がいいと思います。
(defvar 変数 &optional 初期値 説明)
defvar は変数に説明が付けられる以外は setq とほとんど形式は一緒ですが、 大きな違いが一つあります。 それは defvar の場合には変数が既に定義済みならばそのままその値を使用し、 未定義の場合だけ初期値を使う ようになっている点です。
これにより、 autoload で後からロードしても、 init.el で設定された値が上書きされるということがなくなります。

なお、 defvar と似たものに defcustom キーワードがあります。 こちらは変数がカスタマイズで設定できるようになる以外は基本的に defvar と同じです。

ファイルのロード後に設定

前章の defvar のおかげでファイルのロード前に変数に値を設定できるようになり、 init.el で値を設定できるようになっています。
しかし、 変数がリストの場合は注意が必要です。 変数がリストの場合には新規に値を設定したいのではなく、 初期値に追加したいということが多いです。 このため、リストの変数の場合は初期値が定義されたファイルをロードした後に リストに追加する必要があります。


手っ取り早いのはリストの変数の場合は require でロードしてから設定する方法です。 ただし、それだと最初にいった無駄なロードになってしまいます。 そういった時には eval-after-load を使うとファイルのロード後に設定をすることができます。
なお、ロード済みの場合は即座に実行されます。
(eval-after-load FILE FORM)
(例) compile 用のエラー判別のパターンを追加
(eval-after-load "compile"
  (setq compilation-error-regexp-alist
        (append '(;; エラー E2451 hellow.cpp 31:
                  ("^\\(エラー\\|警告\\) \\([A-Z0-9_]+\\) \\([^ ]+\\) \\([0-9]+\\):"
                   3 4 1))
                compilation-error-regexp-alist)))

ホック(hook)

Emacs では C++ モード、 ruby モードなどファイルに合わせたモードがあります。 特定のモードでのみ有効な設定をしたい場合にはホック(hook)を使います。

elisp ではホックと表記することが多いですが、表記を変えると"フック"であり、引っ掛けるイメージです。
ホックを使う場合、設定を行う関数作っておき、用意してあるホック変数に登録します。 モードのロード時に、ロード側でその関数を呼び出します。 もちろん設定したモードがホック変数を用意していなければ使えせんが、 まず用意されていますし、なければバグでしょう。

(例) C++ モードでタブ幅を 4 に設定
(defun my-c++-mode-init ()
  (setq tab-width 4))

(add-hook 'c++-mode-hook 'my-c++-mode-init)
上記の例のようにホック変数に関数を追加する場合は add-hook を使います。これはホック変数と実行したい関数を引数に取ります。
変数自体の内容を変更するのでホック変数をクオートする必要があります。 変数の回 で説明したように、関数の方もクオートしていないと変数として評価されます。 シンボルとして渡したいので、こちらもクオートします。


また、サンプルに挙げた程度の処理であれば、いちいち関数定義するのが面倒くさいという気もします。 そういった場合には無名関数(ラムダ式)を使います。
(add-hook 'c++-mode-hook '(lambda () 
                            (setq tab-width 4)))
ホックは前章の eval-after-load と目的は似ています。
ただ、 eval-after-load では elisp ファイルのロード後に 1 回だけ実行すればいいものを書くのに対し、 ホックは毎回実行される必要があるものを書きます。 次章で説明するバッファーローカル変数はホックを使うと覚えておくと 大きく間違うことはないと思います。

バッファーローカル変数

前章でタブ幅(tab-width)を c++ モードだけで変更しました。 これは tab-width 変数がバッファーローカルだからできることです。
バッファーローカル変数とはバッファーごとに別の値をとれる変数ことを言います。 これが通常の変数の場合、設定する状況に関係なく、 Emacs 全体で同じ値を取ります。

バッファーローカル変数への変更

tab-width はもともとバッファーローカルな変数ですが、 make-local-variable 関数を使えば、通常の変数をバッファーローカルにすることができます。
(defun my-c++-mode-init ()
  ;; 変数をバッファーローカルに
  (make-local-variable 'c-tab-always-indent)
  (setq c-tab-always-indent nil)
  )

デフォルト値の変更

各バッファーで独立して値を保持するバッファーローカル変数ですが、 バッファーができた時の最初の値であるデフォルト値を指定することができます。

たいていのバッファーローカル変数では default-xxxx という名前の変数があり、 この値がデフォルト値となります。 例えば tab-width では default-tab-with です。
(setq default-tab-width 4)
同じことを setq-default 関数を使って書くこともできます。
以下の式は default-tab-width に値を設定するのと同じです。
(setq-default tab-width 8)
なお、 カスタマイズでバッファーローカル変数を設定する場合もデフォルト値を設定することになります。

関連記事
スポンサーサイト
Prev.    Category    Next 

Facebook コメント


コメント

コメントの投稿

Font & Icon
非公開コメント

このページをシェア
アクセスカウンター
アクセスランキング
[ジャンルランキング]
コンピュータ
11位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
2位
アクセスランキングを見る>>
カレンダー(アーカイブ)
プルダウン 降順 昇順 年別

07月 | 2017年08月 | 09月
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -


はてな新着記事
はてな人気記事
ブロとも申請フォーム
プロフィール

yohshiy

Author:yohshiy
職業プログラマー。
仕事は主に C++ ですが、軽い言語マニアなので、色々使っています。

はてブ:yohshiy のブックマーク
Twitter:@yohshiy

サイト紹介
プログラミング好きのブログです。プログラミング関連の話題や公開ソフトの開発記などを雑多に書いてます。ただ、たまに英語やネット系の話になることも。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。