Next: Program Indent, Previous: List Commands, Up: Programs
Emacsでは、トップレベルの括弧でグループ化したものは
関数定義(defun)と呼ばれます。
この名前は、Lispファイルではトップレベルにあるリストの大半が
スペシャルフォームdefun
であるという事実に由来します。
しかし、その中身が何であろうとも、また、使用プログラム言語が何であろうとも、
Emacs流には、トップレベルの括弧でグループ化されたものは
すべて関数定義(defun)です。
たとえば、Cの関数定義の本体は関数定義(defun)です。
beginning-of-defun
)。
end-of-defun
)。
mark-defun
)。
現在の関数定義の先頭や末尾に移動するコマンドは、
C-M-a(beginning-of-defun
)と
C-M-e(end-of-defun
)です。
現在の関数定義を操作したいのであれば、
C-M-h(mark-defun
)を使って、
現在の関数定義かつぎの関数定義の先頭にポイントを置き、
その末尾にマークを設定します。
たとえば、関数定義をテキストの別の位置に移動する準備をするには、
このコマンドを使うのがもっとも簡単な方法です。
Cモードでは、C-M-hはc-mark-function
を実行しますが、
mark-defun
とほとんど同じです。
違いは、引数宣言、関数名、戻り値の型名と遡って、
Cの関数全体をリージョンに含めることです。
See Marking Objects。
Emacsは、もっとも左の桁でみつけた任意の開き括弧を 関数定義の始まりであると仮定します。 したがって、トップレベルのリストの始まりでない限り、 Lispファイルの中では左端に開き括弧を置いてはいけません。 また、関数本体の始まりを表すのでない限り、 Cのコードの行頭に開き中括弧や開き区切りを置いてはいけません。 もっとも起こりやすい場面は、 文字列の途中で、行頭に開き区切りを入れたい場合です。 トラブルを避けるために、開き区切りのまえに エスケープ文字(CやEmacs Lispでは ‘\’、 その他のLisp方言のいくつかでは‘/’)を入れてください。 これで文字列の内容が影響を受けることはありません。
大昔のもともとのEmacsでは、関数定義を探すために、 より上位レベルの括弧がなくなるまで遡っていました。 この方法では、たとえ小さな関数であっても、 バッファの先頭まで遡って走査することがつねに必要でした。 これを高速化するために、左端内の任意の‘(’ (あるいは、開き区切りと宣言された任意の文字)が 関数定義の始まりであると仮定するように、Emacsを変更しました。 この発見的手法で、ほとんど正しく処理できて、時間のかかる走査を回避できます。 しかし、上述の約束事は必要です。