これらのコマンドは、defunsとも呼ばれるトップレベルの主要定義に基づいて、ポイントを移動させたり領域を設定したりします。
現在または直前の defun (beginning-of-defun) の先頭に移動する。
現在または次の defun (end-of-defun) の末尾に移動する。
現在の全体、または後続の defun (mark-defun) をリージョンで囲む。
現在のdefunの先頭および末尾へ移動するコマンドは、C-M-a (beginning-of-defun) および C-M-e
(end-of-defun)
です。これらのコマンドのいずれかを繰り返し実行するか、正の数値引数を指定すると、繰り返すたびに移動方向に沿って次のdefunへ移動します。
負の引数を持つ C-M-a −n は、defun の次の先頭まで n 回分前方に移動します。これは、引数 n を持つ C-M-e が移動する位置と完全に一致するわけではありません。通常、この defun の末尾は、後続する defun の先頭と完全に一致するわけではないためです。(空白、コメント、そしておそらく宣言が両者を隔てることがあります。)同様に、負の引数を持つ C-M-e は defun の末尾まで後方に移動しますが、これは正の引数を持つ C-M-a とは完全には一致しません。
現在のデファンに対して操作を行うには、C-M-h (mark-defun)
を使用します。これにより、現在のデファンの末尾にマークが設定され、ポイントがその先頭に配置されます。テキストオブジェクトをマークするコマンドを参照してください。これは、デファンをファイル内の別の場所に移動させるために、デファンをキルする準備を整える最も簡単な方法です。デファンの直前にコメントがある場合(間に空行がない場合)、それらもマークされます。ポイントがデファンの間にあるときにこのコマンドを使用すると、次のデファンが対象となります。マークが既に有効な状態でこのコマンドを使用すると、リージョンの末尾が拡張され、さらに1つのデファンが含まれます。接頭辞引数を指定すると、その数だけデファンをマークするか、または適切な数だけデファン分リージョンを拡張します。負の接頭辞引数を指定すると、逆方向のデファンをマークし、その後の
mark-defun 使用時の選択方向も変更します。
Cモードでは、C-M-h は mark-defun
とほぼ同様の関数 c-mark-function
を実行します。相違点は、引数の宣言、関数名、および戻り値のデータ型をまたいで後方に伸びるため、C関数全体がリージョン内に収まる点です。これは、メジャーモードが標準的なキーバインドを調整し、特定の言語により適した形で標準的な動作を実現させる一例です。他のメジャーモードでも、同様の目的でこれらのキーバインドの一部または全部を置き換える場合があります。
一部のプログラミング言語ではネストされたdefunがサポートされており、これによりdefun(関数、メソッド、クラスなど)を別のdefunの内部(すなわち本体の一部として)で定義することができます。前述のコマンドは、デフォルトではポイント周辺の最内層のdefunの開始位置と終了位置を検出します。Tree-sitterライブラリをベースとしたメジャーモードでは、この動作を制御できます。デフォルトではtreesit-defun-tacticの値がnestedに設定されており、これがtop-levelに設定されている場合、defunコマンドは代わりに最外層のdefunを検出します。値がparent-firstに設定されている場合、defunコマンドはポイント周辺の前後のdefunへ移動するのではなく、常に現在の包含defunから外へ出ようとします。包含defunが存在しない場合は、前後のdefunへ移動します。