次: , 前: List Commands, 上: Programs


20.4 関数定義(defun)

Emacsでは、トップレベルの括弧でグループ化したものは 関数定義(defun)と呼ばれます。 この名前は、Lispファイルではトップレベルにあるリストの大半が スペシャルフォームdefunであるという事実に由来します。 しかし、その中身が何であろうとも、また、使用プログラム言語が何であろうとも、 Emacs流には、トップレベルの括弧でグループ化されたものは すべて関数定義(defun)です。 たとえば、Cの関数定義の本体は関数定義(defun)です。

C-M-a
現在の関数定義、あるいは、直前の関数定義の先頭に移動する (beginning-of-defun)。
C-M-e
現在の関数定義、あるいは、つぎの関数定義の末尾に移動する (end-of-defun)。
C-M-h
現在の関数定義、あるいは、つぎの関数定義を囲むリージョンを設定する (mark-defun)。

現在の関数定義の先頭や末尾に移動するコマンドは、 C-M-abeginning-of-defun)と C-M-eend-of-defun)です。

現在の関数定義を操作したいのであれば、 C-M-hmark-defun)を使って、 現在の関数定義かつぎの関数定義の先頭にポイントを置き、 その末尾にマークを設定します。 たとえば、関数定義をテキストの別の位置に移動する準備をするには、 このコマンドを使うのがもっとも簡単な方法です。 Cモードでは、C-M-hc-mark-functionを実行しますが、 mark-defunとほとんど同じです。 違いは、引数宣言、関数名、戻り値の型名と遡って、 Cの関数全体をリージョンに含めることです。 See Marking Objects

Emacsは、もっとも左の桁でみつけた任意の開き括弧を 関数定義の始まりであると仮定します。 したがって、トップレベルのリストの始まりでない限り、 Lispファイルの中では左端に開き括弧を置いてはいけません。 また、関数本体の始まりを表すのでない限り、 Cのコードの行頭に開き中括弧や開き区切りを置いてはいけません。 もっとも起こりやすい場面は、 文字列の途中で、行頭に開き区切りを入れたい場合です。 トラブルを避けるために、開き区切りのまえに エスケープ文字(CやEmacs Lispでは `\'、 その他のLisp方言のいくつかでは`/')を入れてください。 これで文字列の内容が影響を受けることはありません。

大昔のもともとのEmacsでは、関数定義を探すために、 より上位レベルの括弧がなくなるまで遡っていました。 この方法では、たとえ小さな関数であっても、 バッファの先頭まで遡って走査することがつねに必要でした。 これを高速化するために、左端内の任意の`(' (あるいは、開き区切りと宣言された任意の文字)が 関数定義の始まりであると仮定するように、Emacsを変更しました。 この発見的手法で、ほとんど正しく処理できて、時間のかかる走査を回避できます。 しかし、上述の約束事は必要です。