Emacsには、Lisp、Scheme(Lispの方言の1つ)、Awk、C、C++、Fortran、 Icon、Java、Objective-C、Pascal、Perl、Pike、CORBA IDL、 Tclといった各種プログラム言語向けのメジャーモードがあります。 makefile用のメジャーモード、makefileモードもあります。 Perl向けの別のモードとして、cperlモードもあります。
理想的には、Emacsで編集する可能性のあるすべてのプログラム言語に対して、 それぞれのメジャーモードを実装すべきです。 しかし、ある言語向けのモードが、構文的に類似した他の言語にも 使えることがよくあります。 既存の言語モード群は、誰かがわざわざ書こうと決心したものです。
Lispモードにはいくつか変種がありますが、 Lispを実行する際のインターフェイス方法が異なります。 See Executing Lisp。
各プログラム言語向けメジャーモードでは、
その言語の慣用的な字下げ方法を理解し
現在行をそのように字下げする関数を実行するように
<TAB>キーを定義します。
たとえば、Cモードでは、<TAB>はc-indent-line
にバインドされています。
また、C-jは、<RET>に続けて<TAB>を実行するように
定義されています。
つまり、モードに固有の字下げも行います。
多くのプログラム言語では、行ごとに字下げ量が異なります。
そのため、そのような言語向けのメジャーモードでは、
(コマンドbackward-delete-char-untabify
を使って)
タブ文字を等価な個数の空白と同じに扱うように<DEL>を再定義しています。
その結果、字下げが空白かタブのどちらで構成されているのか気にせずに、
1度に1桁ずつ消去することが可能となります。
そのようなモードでは、ポイントの直前にあるタブ文字を削除するには
C-b C-dを使います。
プログラム言語向けモードでは、段落は空行で分割されると定義するので、 段落コマンドも便利に使えます。 プログラム言語向けメジャーモードで 自動詰め込み(auto-fill)モードがオンのときには、 新たに行を作ると自動的に字下げも行われます。
メジャーモードに入ると、モードフック(mode hook)と
呼ばれるノーマルフックが実行されます。
モードフックは、Lisp変数の値です。
各メジャーモードにはモードフックがあり、
フック名はつねにモードに入るためのコマンド名に`-hook'を付加したものです。
たとえば、Cモードに入るとフックc-mode-hook
が実行され、
Lispモードではフックlisp-mode-hook
が実行されます。
See Hooks。