Emacs

提供: ArchWiki
Emacs Lispから転送)
ナビゲーションに移動 検索に移動

Emacs は拡張性があり、カスタマイズ可能な、セルフドキュメント方式のリアルタイム表示エディタです。Emacs のコアには、多数の Emacs の内蔵機能や拡張を実装するのに使われている言語である、Emacs Lisp のインタプリタが存在します。GNU Emacs 22 から GTK がデフォルトの X ツールキットとして使われていますが、CLI 環境でも負けず劣らずに機能します。

目次

インストール

次のパッケージのいずれかを インストール して下さい。:

他のバリエーションも検索できます。例として、emacs-gitAUR は GNU Emacs の開発ブランチを提供します。

Emacs の実行

emacs を起動する前に、終了の方法を知っておきましょう (特にターミナルで実行する場合): Ctrl+xCtrl+c キーシーケンスを使って下さい。

Emacs を起動するには次を実行:

$ emacs

また、コンソールから使うには:

$ emacs -nw

(.emacs を使わずに) 高速でロードして CLI で編集するには:

$ emacs -Q -nw

nox バージョンをインストールしている場合、'emacs' と 'emacs -nw' は同じになります。

ファイル名を指定することですぐにファイルを開くこともできます:

$ emacs filename.txt

色無し

デフォルトでは、Emacs はハイパーリンクが濃青で表示されるカラーテーマで起動します。Emacs をカラーテーマやスキームを使わずに起動するには:

$ emacs -nw --color=no

このコマンドでは全てのテキストがターミナルの前景色だけで表示されます。通常は黒背景に白字か、白背景に黒字となります。

デーモンとして

毎回 .emacs ファイルをロードするため Emacs を起動するときには時間が多少かかります。また、別のインスタンスから同じファイルにアクセスしたいと思うときもあるかもしれません。バージョン23から、Emacs はユーザーが接続できるデーモンとして起動することが可能になっています。Emacs をデーモンとして実行するには:

$ emacs --daemon

起動時にデーモンを実行してウィンドウをデーモンに接続すると良いでしょう。さらに、グラフィカル・コンソールクライアント両方を同意時にデーモンに接続して GUI を素早く起動することも可能です。

デーモンに接続したいときは場合は次のコマンドを使って下さい (グラフィカル環境から実行したときはグラフィカルクライアントが、tty などのコンソールから実行したときはコンソールクライアントが起動します):

$ emacsclient

グラフィカル環境にいるときもコンソールクライアントを使いたい場合は次のコマンドを使って下さい:

$ emacsclient -t

さらに、-a "" パラメータを追加することもできます。 これで、最初にコマンドを実行したときは、デーモンとして emacs が起動します。バックグラウンドで動き続けるので後で呼び出した時に起動時間が早くなります (バッファも残り続けます)。

ターミナルや他のプログラムからクライアントを起動した場合、呼び出すプログラムを使うことで Emacs クライアントを閉じなくてもクライアントを使い続けることができます。そのためには、 -n (--no-wait) パラメータを使ってクライアントを起動します:

$ emacsclient -nc

Mutt や Git などのプログラムは (コミットメッセージを読むための) エディタが終了するまで待機するため、-n パラメータを使うことはできません。デフォルトエディタが設定されている場合、他のエディタを指定する必要があるかもしれません (例: emacsclient -a "" -t)。

以下のシェル設定が利用できます:

alias emt='emacsclient -nc -a ""'
alias emc='emacsclient -t -a ""'
EDITOR='emacsclient -a ""'

ただしこれには注意事項があります: コマンドのスペースの関係で多数のプログラムが外部エディタをロードすることはできません。

スクリプトを書くほうがもっと使い勝手が良く信頼性があります:

/usr/local/bin/emc
#!/bin/sh
if [ -z "$DISPLAY" ]; then
    IS_GRAPHICAL=true
else
    IS_GRAPHICAL=$(emacs --batch -Q --eval='(if (fboundp '"'"'tool-bar-mode) (message "true") (message "false"))' 2>&1)
fi

if $IS_GRAPHICAL; then
    emacsclient -a "" -nc "$@"
else
    emacsclient -a "" -t "$@"
fi

スクリプトは実行可能属性を付けて下さい:

# chmod 755 /usr/local/bin/emc

これで 'emc' が期待通りに動作するようになります。このクライアントをデフォルトのエディタにしたいときは上記のスクリプトで EDITOR 環境変数を設定すれば OK です。

systemd ユニットとして

Emacs 26.1 から systemd ユニットが含まれています。Emacs のインストール後に以下のように有効化してください:

 $ systemctl --user enable --now emacs

Emacs サーバーを実行したいユーザーで上記のコマンドを実行してください。サービスの起動後、Emacs の準備ができます。ユニットファイルは /usr/lib/systemd/user/emacs.service に存在します。ユニットファイルの中身は以下のようになっています:

/usr/lib/systemd/user/emacs.service
[Unit]
Description=Emacs text editor
Documentation=info:emacs man:emacs(1) https://gnu.org/software/emacs/

[Service]
Type=simple
ExecStart=/usr/bin/emacs --fg-daemon
ExecStop=/usr/bin/emacsclient --eval "(kill-emacs)"
Environment=SSH_AUTH_SOCK=%t/keyring/ssh
Restart=on-failure

[Install]
WantedBy=default.target

systemd のユーザーユニットはログインシェル (~/.bash_profile など) から環境変数を継承しないため、~/.pam_environment に変数を設定すると良いでしょう。詳しくは Systemd/ユーザーを参照。

emacs をデーモンとして起動する場合、VISUALEDITOR 環境変数を emacsclient に設定することでプログラムからエディタを起動するときにエディタの新しいインスタンスを起動するかわりに emacsclient が使われるようになります。外部エディタを使用するプログラムとしてメールプログラム (メッセージを編集するため) や Git (コミットメッセージを編集するため)、less (v コマンドで表示されたファイルを編集するため) などが存在します。emacsclient の -n (--nowait) オプションは使用しないでください。基本的にプログラムはエディタが終了したときに編集が完了したと認識するためです。

GUI の Emacs のスタートメニューエントリなども emacs ではなく emacsclient が使われるように変更することを推奨します。

ヘルプを見る

Emacs にはチュートリアルが組み込まれており、スプラッシュ画面の最初のリンクをクリックし、メニューから Help->Emacs Tutorial を選択するか、C-h t を押してアクセスすることができます。

Emacsは設計上、セルフ・ドキュメンテーションです。そのため、例えば特定のコマンドの名前やキーバインドを決定するために、非常に多くの情報を利用することができます。C-h C-h ですべてのコンテキスト・ヘルプのバインディングを見ることができます。

Emacs にはリファレンスカードも含まれており、初心者にも上級者にも便利です。/usr/share/emacs/<バージョン>/etc/refcards/ (<バージョン> はあなたの emacs のバージョンに置き換えます) をご覧ください。

マニュアル

Emacsを本当に使いこなしたいのであれば、やはり公式のマニュアルが一番おすすめです。

  • Emacs: コンプリート Emacs ユーザーマニュアル
  • Emacs FAQ
  • Emacs Lisp: イントロ プログラミング言語を使ったことがない人向け
  • Elisp: 既にプログラミング言語に慣れている人向け

GNU.org から PDF としてアクセスすることもできますし、組み込まれた info リーダーのおかげで Emacs 自体から直接アクセスすることも可能です。C-h i を使ってください。 ブックを選ぶには m を押してください。

一部のユーザーは、便利なショートカット、ウィンドウ幅に合わせた段落、現在の画面解像度に合わせたフォントのために、info を使用してブックを読むことを好みます。目に刺激が少ないと感じる人もいます。最後に、本から任意の Emacs バッファーにコンテンツを簡単にコピーでき、例から直接 Lisp コードスニペットを実行することもできます。

詳しくは Info を読むといいかもしれません。C-h i m info <RET> です。 情報モード中に ? を押すと、ショートカットのクイックリストが表示されます。

設定

Emacs の大きな特徴の一つは、その拡張性と設定のしやすさです。Emacs にはカスタマイズエンジンが組み込まれています。カスタマイズのオプションのリストを表示するには、M-x customize を実行します。このインタフェースの使い方については Easy Customization 情報ノードを参照してください。(info "(emacs) Easy Customization") をご覧下さい。カスタマイズを適用したら 1つの Emacs セッションに対してのみ設定することも、設定ファイル に保存して Emacs セッションにまたがって保存することもできます。"適用して保存" を選択した場合、カスタマイズ・インタフェースが適用されることに注意してください。

Emacs を起動するとき、通常は 初期化ファイル 、略して initファイル から Lisp プログラムを読み込もうとします。 このファイルは、もし存在すれば、あなたのために Emacs を初期化する方法を指定します。 Emacs は '~/.emacs', '~/.emacs.el', '~/.emacs.d/init.el', または '~/.config/emacs/init.el' というファイル名であなたの init ファイルを検索します。詳しくは info ノードの 初期化ファイル を見て下さい。参照: (info "(emacs) Init File")

クイックスタート

Emacs は複雑ですが、そのカスタマイズと拡張性のレベルによってもたらされる利益を理解し始めるのにそう時間はかからないでしょう。さらに、幅広い拡張を利用することで Emacs はあらゆる種類の文章編集のための強力な環境に姿を変えることができます。

Emacs には素晴らしいチュートリアルが内蔵されており、スプラッシュ画面の最初のリンクをクリックしてアクセスできます。メニューから Help->Emacs Tutorial を選択するか 'F1' の後に 't' を押して下さい。このページは Emacs を始めるのに追加的なリソースになるように書かれています。

初心者にもエキスパートにも役立つ、リファレンスカードのセットも Emacs に含まれています、/usr/share/emacs/<version>/etc/refcards/ を見て下さい (<version> はあなたの emacs のバージョンに置き換えて下さい)。

基本的な用語と慣習

始めは慣れないと思うかもしれませんが Emacs にはいくつか特別な用語法と約束事があり、必要に応じて紹介していきます。ただ、Emacs を使うにあたって当然知ってるべきとされるような、基本的な用語についてはあらかじめ説明しておいたほうが良いでしょう。

真っ先に知るべきはバッファの概念です。バッファは Emacs の中のデータを表します。例えば、Emacs でファイルを開いたとき、ディスクからファイルから読み込まれてバッファに中身が保存され、バッファを編集して後でディスクに上書き保存することができます。バッファはテキストに限られず、画像やウィジェットなども含めます。作業中でもバッファでアプリケーションを表示することすらできます。こういう考え方もできます: ディスク上のデータは'ファイル'であり、一方、Emacs 上のデータは'バッファ'である。

Emacs におけるキーシーケンスの決まり事も見慣れないかもしれません。即ち:

C-x は Control-x を示します

M-x は Meta-x を示します

ノート: 'Meta' は多くの場合 Alt キーに相当します。また、Esc キーを使うことも可能です。

例えば、Emacs を終了するには次のキーシーケンスを使います: C-x C-c。これは "Control を押しながら 'x' を押す。手を離す。Control を押しながら 'c' を押す" と読み替えることができます。Emacs にはメニューバーが存在しますが、キーシーケンスを使いこなせるように練習することを推奨します。以下から、Emacs で使われるキーバインディングと慣習について説明します。

移動

カーソルの移動は他のグラフィカルエディタとよく似ています。マウスや方向キーを使ってカーソルの位置 (Emacs ではポイントと呼ばれます) を変更することができます。一般的な移動コマンドは方向キーでできますが、Emacs には他にも便利なバインディングが存在します。1文字先に移動するには C-f を使用して、1文字前に移動するには C-b を使用します。C-nC-p でそれぞれ次の行と前の行に移動できます。基本的に、マウスや方向キーを使うよりもこれらのキーシーケンスを使うことが推奨されています。

当然、Emacs には、単語や文単位で移動できる、もっと高度な移動コマンドが用意されています。M-f は1単語先に移動して M-b は1単語前にポイント移動します。同じく、M-e は1文先にポイント移動して M-a は前に戻ります。

ここまでは、紹介した全ての移動コマンドはポイントに関連しています。M-< を使うことでバッファの最初にポイントを移動することができ、逆に、M-> はバッファの最後に移動します。特定の行番号にポイントを移動するには、M-g g を使います。M-g g は移動したい行番号を尋ねます。また、現在の行の先頭と末尾に移動するには、C-a あるいは C-e を使って下さい。

ノート: 上記のコマンドを含む全てのコマンドのキーバインドは、現在有効になっているモードによって多少ながら変わってくる可能性があります。しかしながら、同一の機能を実行するのにコマンドを置き換えることはあまりありません。詳しくはモードを見て下さい。

ファイルとバッファ

Emacs にはファイルを操作するためのコマンドが用意されています。このセクションでは最もよく使われるコマンドを紹介します。ファイルを開くには C-x C-f を使います (Emacs ではこのコマンドを 'find-file' と呼びます)。指定されたファイルが存在しなかった場合、Emacs は空のバッファを開きます。バッファを保存するとバッファの中身が入ったファイルが作成されます。C-x C-s を使うことでバッファを保存できます。別のファイル名でバッファを保存するには、C-x C-w を使って下さい (this is a mnemonic for the command 'write-file')。新しいファイル名が尋ねられ、ディスクにファイルが書き込まれます。C-x s で全てのバッファを保存することも可能です。最後に保存されていた状態からバッファに変更が加えられている場合、保存を実行するかどうか訊くプロンプトが表示されます。

ノート: ファイルに対応するバッファが既に開かれている場合 C-x C-f はディスクからファイルを読み込みません。ディスクからファイルを再度読み込むには、(1) まずバッファを閉じて (C-x k)、それからファイルを開くか (C-x C-f) あるいは (2) M-x revert-buffer を使ってディスク上のデータに戻して下さい。それか (3) C-x C-v でファイルを現在のバッファにロードするか (4) C-x RET r RET で同一コードでファイルを再読み込みしてください。

"find-file" や "write-file" などのインタラクティブなコマンドでは Emacs ウィンドウの一番下の行に入力が求められます。この行のことはミニバッファと呼びます。ミニバッファでは基本的な編集コマンドを使うことができ、多くの *nix シェルで利用できるのと同じようなタブ補完機能があります。<TAB> を2回連続で押すと補完リストが表示され、マウスを使ってリストから補完候補を選択することも可能です。ミニバッファでの補完はコマンドやファイル名など様々な形で使えます。

ミニバッファには履歴機能も存在します。前に入力したコマンドは Up Arrow または M-p を使うことで再呼び出しできます。

ミニバッファは C-g を押すことでいつでも終了できます。

ファイルを複数開いたら、ファイルを切り替える手段が必要です。Emacs 内に既に存在するバッファにファイルを開くと、Emacs はそのバッファに切り替えます。しかしながらこれは効率的とは言えません。Emacs には表示するバッファを選択する C-x b が存在します (タブ補完が使えます)。存在しないバッファの名前を入力すると、その名前で新しいバッファが作成されます。

ノート: 前のバッファに切り替えるには C-x b <RET> を使います。前のバッファがデフォルトだからです。

全てのバッファのリストを C-x C-b で表示することができます。バッファが必要なくなったときは C-x k で削除することが可能です。

編集

Emacs には多数の編集コマンドが存在します。まだ紹介していない最も重要なコマンドはおそらく 'undo' でしょう。C-_ または C-/ で実行することができます。基本的に移動コマンドには対応する削除コマンドが存在します。例えば M-<backspace> で後方の単語を削除することができ、M-d で前方の単語を削除できます。行末または文章の終わりまで削除するにはそれぞれ C-k または M-k を使います。

1行は80文字を超えていはいけないという経験則が存在します。1行の長さを長くしすぎないことで、特にウィンドウの縁で改行してしまうような場合に、可読性を維持することができます。改行の自動挿入 (または削除) は Emacs では詰め込み (filling) と呼ばれます。M-q を使うことでパラグラフを折り返させることができます。

文字列と単語はそれぞれ C-tM-t で置き換えることが可能です。例えば Hello World!World! Hello と置き換えられます。

単語の大文字小文字はすぐに修正できます。M-l は単語を小文字に変換し (HELLOhello)、M-u は単語を大文字に変換します (helloHELLO)。そして M-c は単語の最初の文字を大文字にして他の文字は小文字にします (hElLoHello)。

kill と yank とリージョン

リージョンとは、2点間にあるテキストです。2点のうちの1つは、マーク と呼ばれ、もう1つはポイントです。 C-<SPC> によってマークの位置がセットされ、その後でポイントが移動することでリージョンが作られます。GNU Emacs 23.1 以降、リージョンはデフォルトで可視化されます。リージョン上で動作する多くのコマンドがあり、もっともよく使われるコマンドに killing コマンドがあります。

Emacs では、カット&ペーストはそれぞれ、killyank と呼ばれます。1文字以上の文字を削除するコマンド( C-kM-d といった上で記述したコマンドも含めて)は、実際にテキストをカットし、kill-ring として知られるものに追加します。kill-ring は、単に kill されたテキストのリストです。kill-ring は、デフォルトでは直近60個の kill されたテキストを保存します。kill に成功すると、リストの先頭に接続されて保存されます。

C-wM-w によって、それぞれリージョンの kill とコピーができます。

kill されたテキストをバッファに挿入する('yanking' として知られます)ためには、C-y を使います。 C-y は、複数回使用することで、繰り返しテキストを yank できます。前述の通り、以前の kill は、リストに保存されます。しかし、C-y は、そのうち最初のものしか取得しません。それより前の kill は、M-y によってアクセスすることができます。これによって、'yank' で挿入されたテキストをリストの先頭に移動させます。 M-yC-y に続けて使われなければならず、kill-ring をたどるために何度でも使えます。

検索と置換

文字列を検索することは、テキストの編集において一般的な作業です。検索は、C-s (後方検索) または C-r (前方検索) によって実行されます。これらのコマンドは、検索する文字列を入力するプロンプトを表示します。検索は1文字入力するごとに実行され、タイプごとに次に(あるいは前に)一致した文字列にマッチします。次の検索結果に行くには C-s を、前の検索結果に行くには C-r を押します。 もし探しているものが見つかったのであれば、<RET> を押すことで検索を終了できます。一方、検索を開始した場所に戻りたければ C-g を押します。

いったん検索が完了すると (たとえば C-g 等で中断していない場合)、検索された文字列は、次の検索のデフォルト検索文字となります。検索された文字を使用するには、後方検索なら C-s C-s , 前方検索なら C-r C-r をそれぞれ押します。

I-search には、いくつかの有用なコマンドがあります。 M-e によって、検索文字列の編集が可能です。 M-c によって、大文字小文字を区別するか、しないかを切り替えることができます。

正規表現検索は、検索の開始コマンド以外、上述の検索と同様に動作します。 C-M-s あるいは C-M-r によって、それぞれ正規表現による後方検索、前方検索を開始します。いったん正規表現検索を開始すると、文字列検索と同様に C-sC-r を後方検索、前方検索に使用することができます。

検索に加え、文字列や正規表現を置換することができます(それぞれ M-% および C-M-% によって実行されます)。元のテキストと変換後のテキスト用にプロンプトが表示され、それからハイライトされた一致箇所に対する動作のために別のプロンプトが表示されます。多くのオプションが使用できますが(使用できるオプションの完全なリストは ? を押してください)、もっとも一般的に使われるのは、変換を実行する y と、スキップする n 、そしてハイライトされている文字列を含め、以降すべての一致に対して変換する ! になります。

前置引数

C-u は、'universal-argument' コマンドに対応づけられています。'universal-argument' を渡すことによって、より多くの情報をコマンドに提供できます(この情報を '前置引数' と呼びます)。たとえば

C-u 80 %

は、%記号の行を挿入します。また、

C-u 4 M-d

は4単語を削除します。この場合、M-d によって実行されるコマンドへ、要求する単語の数を渡しています。

universal argument は、M-<数字> によって少し早く入力することができます。

M-80 %

インデント

インデントは、1行をインデントする <TAB> やリージョンをインデントする C-M-\ によって実行されます。リージョンが有効(たとえばハイライトされている)場合、<TAB> はリージョンもインデントします。

テキストがどのようにインデントされるかは、正確には有効になっている メジャーモード に依ります。メジャーモードは、しばしば特定の種類のテキストをインデントするときに特化したインデントスタイルを定義します。(より詳しくは Modes を見てください。)

いくつかの場合、ファイルタイプに対して適したメジャーモードがありません。その場合、手動でのインデントが必要になります。リージョンを作成( kill と yank とリージョン 参照)し、C-u <n> C-x <TAB> でインデントを実行してください。(ここで、'<n>' はリージョンに含まれるテキストがインデントされる列の数です。)例えば、

リージョンのインデントを4列追加する:

C-u 4 C-x <TAB>

リージョンのインデントを2列減らす:

C-u -2 C-x <TAB>

ウィンドウとフレーム

Emacs は、多くのファイルを同時に編集するために便利であるよう設計されています。これは、Emacs のインタフェースを3つの階層にわけることで実現されています。つまり、すでに紹介済みのバッファ、ウィンドウフレーム です。

ウィンドウ とは、Emacsでバッファを表示している場所のことです。1つのウィンドウは、一度に1つのバッファしか表示できません。しかし、1つのバッファは複数のウィンドウに表示できます。それぞれのウィンドウの下には、モードライン があります。モードラインには、そのバッファの情報が表示されています。

フレーム とは、Emacs の"ウィンドウ"(一般的な意味。たとえば最近のデスクトップパラダイムの意味での 'ウィンドウ')です。フレームには、タイトルバー、メニューバー、1つ以上の 'ウィンドウ' (Emacs 的な意味。たとえば上で定義した 'ウィンドウ') が含まれます。

以降では、これらの単語は Emacs に存在するものでの定義として使用します。

ウィンドウを水平あるいは垂直に分割するには、それぞれ C-x 2 あるいは C-x 3 を使います。これは、現在のフレームにもう1つのウィンドウを生成する効果があります。複数のウィンドウ間を巡回するには、C-x o を使用します。

ウィンドウ分割の反対は、ウィンドウを削除することです。現在のウィンドウを削除するには C-x 0 を使い、現在のウィンドウ以外を削除するには C-x 1 を使います。

ウィンドウと同様に、フレームも生成や削除が可能です。 C-x 5 2 によってフレームを生成できます。 C-x 5 0 によって現在のフレームを削除し、C-x 5 1 によってr現在のフレーム以外のすべてのフレームを削除します。

ノート: これらのコマンドはバッファには影響しません。たとえば、ウィンドウを削除しても表示されているバッファは kill されません。

モード

Emacs モードは Emacs Lisp で書かれた拡張であり、接続されているバッファの挙動を制御します。大抵の場合、インデントやシンタックスハイライト、テキストを編集するときのキーバインドを提供します。洗練されたモードは Emacs を完全な IDE (統合開発環境) に変貌させます。Emacs は基本的にファイルの拡張子でモードをロードすべきか判断します。

シェルスクリプトを編集するのに役立つモードとして sh-mode, line-number-mode, column-number-mode が存在します。同時に使用することができ、以下のコマンドで呼び出します:

M-x sh-mode <RET>

M-x column-number-mode <RET>

line-number-mode はデフォルトで有効になっていますが、コマンドを再度実行することでオンとオフを切り替えられます:

M-x line-number-mode <RET>

sh-mode は、メジャーモード の1つです。メジャーモードは Emacs を調整し、時には、特定の種類のテキストの編集用に特別なコマンドを提供します。それぞれのバッファでは、メジャーモードは1つだけが有効です。シンタックスハイライトやインデントサポートに加えて、sh-mode はシェルスクリプトを書く助けになるいくつかのコマンドを定義しています。以下に、それらの内のいくつかを示します。

C-c (	 関数定義を挿入する

C-c C-f	 'for' ループを挿入する

C-c TAB	 'if' 文を挿入する

C-c C-w	 'while' ループを挿入する

C-c C-l	 1 から n までの番号付きループを挿入する

'line-number-mode' と 'column-number-mode' はマイナーモードです。マイナーモードはメジャーモードを拡張することができ、同時に任意の数のマイナーモードを有効にできます。

マニュアル

Emacs を本当にマスターしたいのであれば、一番よく読むべき文章はやはり公式マニュアルです:

  • Emacs: 完全な Emacs ユーザーマニュアル
  • Emacs FAQ
  • Emacs Lisp Intro: プログラミング言語を使用したことがない場合
  • Elisp: プログラミング言語をよく知っている場合

これらは、 GNU.org から PDF として入手できます。あるいは Emacs 自身にて組み込みの 'info' リーダー C-h i を用いて直接読むこともできます。本を選択するには m を押してください。

ユーザーの幾人かは、'info' で読むことを好みます。便利なショートカットであり、段落はウィンドウ幅に調整され、フォントは現在の画面解像度に調整されるためです。何人かは目に優しいと気づいています。最後に、本の内容を任意の Emacs バッファへ簡単にコピーでき、さらに例示されている Lisp コードを直接実行することさえできます。

info 本について、もっとよく知りたいなら、C-h i m info <RET> を実行してください。 info モードで ? を押すと、ショートカットの簡易リストが表示されます。

カスタマイズ

Emacs は ~/.emacs を編集するか M-x customize を使うことで設定をすることができます。このセクションでは手動で ~/.emacs を編集する方に焦点をあて、いくつかのカスタマイズ例を示すことで、一般的な Emacs の設定をデモンストレーションします。customize コマンドは調整を行うためのシンプルなインターフェイスを提供しますが、おそらく Emacs に慣れてくるにつれて制約を感じるようになるでしょう。

ここでの例は、すべて Emacs が動作している間に動作します。Emacs 内で式を評価するには、以下を使います。

C-M-x ポイントがある式を評価する

あるいは、

C-x C-e ポイントの直前の ')' を最後のカッコとする式を評価する

何人かのユーザーは、プロンプトで 'yes' や 'no' をタイプすると、すぐに疲れます。その代わりに 'y' や 'n' を使うために:

(defalias 'yes-or-no-p 'y-or-n-p)

カーソルの点滅を止めるには、次を使用:

(blink-cursor-mode -1)

同じく、前のセクションにある column-number-mode を有効にするには:

(column-number-mode 1)

前の2つのコマンドに類似性があるのは偶然ではありません。blink-cursor-mode と column-number-mode は、共にマイナーモードです。ルールとして、マイナーモードは正の数を引数にとると有効になり、負の数で無効になります。引数が省略された時、マイナーモードは on/off を切り替えます。

マイナーモードのその他いくつかの例を示します。以下はそれぞれ、スクロールバー、メニューバー、ツールバーを無効にします。

(scroll-bar-mode -1)
(menu-bar-mode -1)
(tool-bar-mode -1)

変数 'auto-mode-alist' によって、特定のファイル名に対してデフォルトで使われるメジャーモードを変更することができます。以下の例では、'.tut' および '.req' ファイルのデフォルトのメジャーモードを 'text-mode' にします。

(setq auto-mode-alist
  (append
    '(("\\.tut$" . text-mode)
      ("\\.req$" . text-mode))
    auto-mode-alist))

設定は、基底となるモードごとに適用することもできます。基本的な方法は、hook に関数を追加することです。例えば、text-mode でだけインデントをタブの代わりに強制的にスペースを使用するためには:

(add-hook 'text-mode-hook (lambda () (setq indent-tabs-mode nil)))

同様に、場所によらずインデントにてスペースを使用するには:

(setq-default indent-tabs-mode nil)

キーバインドは、2つの方法で調整できます。1つ目の方法は 'define-key' です。'define-key' は、コマンドに対するキーバインドを作成できますが、1つのモードに対してだけ作成します。以下の例では、F8 に、'text-mode' バッファでは行末のホワイトスペースを除去するよう割り当てます。

(define-key text-mode-map (kbd "<f8>") 'delete-trailing-whitespace)

もう1つの方法は、'global-set-key' です。これによって、場所によらずキーにコマンドを割り当てることができます。'query-replace-regexp' (C-M-%) を '<f7>' に割り当てるには:

(global-set-key (kbd "<f7>") 'query-replace-regexp)

他のキーにコマンドを割り当てることは、既存の割当を入れ替えるわけではありません。たとえば、上記例の後、'query-replace-regexp' は、F7C-M-% の両方に割り当てられます。

Emacs のほとんどすべてがカスタマイズできます。Emacs Wiki を通して見ることが基礎固めに適しています。

マルチ設定

複数の設定を使い、Emacs にどれか一つをロードさせることができます。

例えば、2つの設定ファイルを定義してみましょう。

.emacs
(load "~/.emacs.d/main" nil t)
(load "~/.emacs.d/functions" nil t)
(load "~/.emacs.d/modes" nil t)
(load "~/.emacs.d/plugins" nil t)
(load "~/.emacs.d/theme" nil t)

これによって、デーモンとしての起動用にフルカスタムをロードします。しかし、plugins ファイルは巨大で、ロードが遅いです。plugins 機能が不要な新しい Emacs インスタンスを生成したい場合、plugins を毎回ロードすることは面倒です。

.emacs-light
(load "~/.emacs.d/main" nil t)
(load "~/.emacs.d/functions" nil t)
(load "~/.emacs.d/modes" nil t)
(load "~/.emacs.d/theme" nil t)

Emacs を以下のコマンドで起動します。

emacs -q -l ~/.emacs-light

これによって、エイリアスを生成して、呼び出しを簡単にすることができます。

ローカル・カスタム変数

設定ファイル内で変数を定義することができます。この変数はファイル内でローカルに変更することができます。

(defcustom my-compiler "gcc" "Some documentation")

どんなファイルでもローカル変数を定義するには2つの方法があります。完全な詳細のマニュアル を参照してください

  • M-x add-file-local-variable-prop-line は、ファイルの先頭に以下のようなコメント行を追加します。
// -*- my-compiler:g++; mode:c++ -*-
  • M-x add-file-local-variable は、ファイルの末尾付近に行を追加します。
// Local Variables:
// my-compiler: g++
// mode: c++
// End:

変数の効果を得るためには、M-x revert-buffer を実行する必要あることに注意してください。

カスタム変数は、デフォルトでは安全でないと考えられています。もしカスタム変数によって再定義されたローカル変数を含むファイルを開こうとすると、Emacs は確認するよう通知します。

変数を安全であるとして宣言することもできます。これによって確認のためのプロンプトを除去することができます。新しい変数が安全と考えられるためには検証されなければならない、と述語を指定する必要があります。

(defcustom my-compiler "gcc" "Some documentation" :safe 'stringp)

この例では、文字列以外の何かにセットしようとすると、Emacs は安全でないと考えます。

カスタムカラーとテーマ

face を使うことで簡単に色をカスタマイズすることができます:

(set-face-background  'region                 "color-17")
(set-face-foreground  'region                 "white")
(set-face-bold-p      'font-lock-builtin-face t ) 

ポイントがある場所の face の名前を Emacs に表示させることができます。そのためには customize-face を使います。どのように色、太字、下線、等が設定されているかを示すことができます。

コンソール上の Emacs は、256色を扱うことができます。しかし、それには適したターミナルを使わなければなりません。たとえば URxvt は256色をサポートしています。list-colors-display によって、サポートされる色の包括的なリストが表示できます。これは強くターミナルに依存します。

SyncTeX サポート

Emacs は強力な LaTeX エディタです。LaTeX モードを必要に応じて自由に編集・作成することができます。

SyncTeX サポートといった、まだいくつかの挑戦があります。最初に TeX ディストリビューションに SyncTeX があるかを確認する必要があります。もし TeX Live を手動でインストールした場合、synctex パッケージをインストールする必要があるかもしれません。

# umask 022 && tlmgr install synctex

SyncTeX サポートは、ビューア依存です。ここでは例として Zathura を使用します。他の PDF ビューアを使用する場合、コードを変更する必要があります。

(defcustom tex-my-viewer "zathura --fork -s -x \"emacsclient --eval '(progn (switch-to-buffer  (file-name-nondirectory \"'\"'\"%{input}\"'\"'\")) (goto-line %{line}))'\"" 
  "TeX 文書用 PDF ビューア。
   同じドキュメントを2回起動したこと検出する、または Emacs を
   閉じても表示を継続するためにビューアを fork したい場合、
 
シンプルなコマンド:

  zathura --fork

SyncTex を用いて pdf を逆検索するために以下が使用できる。

  emacsclient --eval '(progn (switch-to-buffer  (file-name-nondirectory \"%{input}\")) (goto-line %{line}))'

引用符および二重引用符は必須で、適切にエスケープされなければならない点に注意。"
:safe 'stringp)

カスタム変数を定義します。もし AucTeX や Emacs 標準の LaTeX-mode を使用しているなら、それに応じてビューアを設定する必要があります。

LaTeX ソースファイルを Emacs で開き、文書をコンパイルし、ビューアを起動します。Zathura が起動します。Ctrl+Left click を押すと、Emacs は対応する位置にポイントを移動させます。

Systemd ファイルのシンタックスハイライト

systemd-mode を使うことができます。

もしくは init ファイルに以下を追加することで、簡単に emacs で systemd のファイル (サービスやタイマーなど) をカラー表示できます:

 (add-to-list 'auto-mode-alist '("\\.service\\'" . conf-unix-mode))
 (add-to-list 'auto-mode-alist '("\\.timer\\'" . conf-unix-mode))
 (add-to-list 'auto-mode-alist '("\\.target\\'" . conf-unix-mode))
 (add-to-list 'auto-mode-alist '("\\.mount\\'" . conf-unix-mode))
 (add-to-list 'auto-mode-alist '("\\.automount\\'" . conf-unix-mode))
 (add-to-list 'auto-mode-alist '("\\.slice\\'" . conf-unix-mode))
 (add-to-list 'auto-mode-alist '("\\.socket\\'" . conf-unix-mode))
 (add-to-list 'auto-mode-alist '("\\.path\\'" . conf-unix-mode))
 (add-to-list 'auto-mode-alist '("\\.netdev\\'" . conf-unix-mode))
 (add-to-list 'auto-mode-alist '("\\.network\\'" . conf-unix-mode))
 (add-to-list 'auto-mode-alist '("\\.link\\'" . conf-unix-mode))

emacs-nox のクリップボードサポート

emacs-nox で Xorg クリップボードを使うには、xclipインストールして以下の関数を ~/.emacs に追加してください [1]:

;; use xclip to copy/paste in emacs-nox
(unless window-system
  (when (getenv "DISPLAY")
    (defun xclip-cut-function (text &optional push)
      (with-temp-buffer
	(insert text)
	(call-process-region (point-min) (point-max) "xclip" nil 0 nil "-i" "-selection" "clipboard")))
    (defun xclip-paste-function()
      (let ((xclip-output (shell-command-to-string "xclip -o -selection clipboard")))
	(unless (string= (car kill-ring) xclip-output)
	  xclip-output )))
    (setq interprogram-cut-function 'xclip-cut-function)
    (setq interprogram-paste-function 'xclip-paste-function)
    ))
ヒント: 以下を追加することでターミナルマウスサポートも有効にできます:
;; xterm mouse support
(require 'mouse)
(xterm-mouse-mode t)
mwheel.el を参照。

ヒントとテクニック

前のセクションでは基本的な編集コマンドを説明していますが、それだけでは Emacs の可能性はわかりません。このセクションではより高度なテクニックや機能を紹介します。

ただし全てを説明するとなると長くなりすぎます。そのためこのセクションはあくまで Emacs の雅やかな機能をいくつかデモするだけにとどめます。

全ての機能の詳細な説明はドキュメントを見て下さい。

TRAMP

TRAMP (Transparent Remote Access, Multiple Protocols) は多数のプロトコルで、リモートファイルに透過的にアクセスすることができる拡張です。ファイル名を入力するときに、特定の形式を入力すると TRAMP が呼びだされます。例:

/etc/hosts を root 権限で開く前に root のパスワードを要求するには:

C-x C-f /sudo::/etc/hosts

SSH で 'myhost' に 'myuser' として接続して ~/example.txt ファイルを開くには:

C-x C-f /ssh:myuser@myhost:~/example.txt

TRAMP のパスは '/[protocol]:[[user@]host]:<file>' という形式で指定します。TRAMP がサポートしているのは上記の例に限りません。詳しくは TRAMP の info マニュアルを参照してください。マニュアルは Emacs に付属しています。

Emacs を git のマージツールとして使う

デフォルトでは、git はマージツールとして Emacs の Emerge モードをサポートしています。しかしながら、Ediff モードの方をより好むかもしれません。不幸にも、このモードは技術的な理由により git によってサポートされていません。Ediff モードを使用する方法はまだあります。emacs call 上で以下の elisp コードを評価します。

.gitconfig
[mergetool.ediff]
    cmd = emacs --eval \" (progn (defun ediff-write-merge-buffer () (let ((file ediff-merge-store-file)) (set-buffer ediff-buffer-C) (write-region (point-min) (point-max) file) (message \\\"Merge buffer saved in: %s\\\" file) (set-buffer-modified-p nil) (sit-for 1))) (setq ediff-quit-hook 'kill-emacs ediff-quit-merge-hook 'ediff-write-merge-buffer) (ediff-merge-files-with-ancestor \\\"$LOCAL\\\" \\\"$REMOTE\\\" \\\"$BASE\\\" nil \\\"$MERGED\\\"))\" 

[merge]
	tool = ediff

コマンドは1行で書かれなければならない点に注意してください。 上の例では、Emacs を新たに起動します。より早く起動するために emacsclient を使いたいかもしれませんが、推奨されていません。なぜなら Ediff 呼び出しは実際にはクリーンではないためで、現在の Emacs セッションを混乱させる可能性があります。

-q オプションを使用して、即席で起動することができます。設定の一部を残したまま Emacs を素早く起動するには、Emacs を以下のように呼び出します。

 emacs -q -l ~/.emacs-light

ここで、Ediff のために必要なことのみを記した軽量な設定ファイルがロードされます。

このトリックおよび Ediff の問題点についての詳細は、kerneltrap.org および stackoverflow を参照してください。

Caps Lock キーを Control キーとして使う

いわゆる 'emacs 小指' にならないようにこちらの挙動を好むユーザーもいます。X で試用してみたいときは、次を実行:

$ setxkbmap -option 'ctrl:nocaps'

また、キーを交換するには、次を実行:

$ setxkbmap -option 'ctrl:swapcaps'

永続的に設定したくなったら、.xinitrc ファイルに上のコマンドを追加してください。

リージョンを小文字から大文字にする必要がある場合は、デフォルトの C-x C-u キーバインディングを使って下さい、upcase-region 関数が呼び出されます。

Caps Lock がない場合は、両方の "Shift" にマッピングしてください:

$ setxkbmap -option "shift:both_capslock"

一部のデスクトップ環境にはキーボードのマッピングを変更するためのグラフィカルなツールが含まれています。例えば Plasma 5 ならシステム設定を開いて入力デバイスをクリックしてください。キーボードを選択して高度な設定タブから Caps Lock を Ctrl として使用するように設定できます。

キーボードマクロとレジスタ

このセクションでは、2, 3の強力な編集機能に対する実用的なデモンストレーションを示します。つまり、keyboard macrosregisters です。

目的は、一連の文字のリストとこのリスト内での対応する位置を作ることです。それらは手動で成形することもできますが、遅く、間違いをおこしやすいです。その代わりに、Emacs のよりパワフルないくつかの編集機能によって、レバレッジを効かせられます。答えの前に、以下で使うテクニックの背景について詳細を示します。

1つ目の機能は レジスタ です。レジスタ は、数字からウィンドウコンフィグまでに及ぶ様々なデータ型を格納し取得するために使われます。それぞれのレジスタには、1文字の名前が与えられます。この文字はレジスタへのアクセスに使われます。

もう1つの機能は、キーボードマクロ です。キーボードマクロは、一連のコマンドを格納します。それによって後で簡単に繰り返すことができます。これらの変化を、ここでステップバイステップで実施してみます。

文字集合を含むバッファから始めます。

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

'number-to-register' コマンド(C-x r n)を呼び出してレジスタを準備します。それから数字 '0' をレジスタ 'k' に保存します。

C-x r n k

バッファの先頭にポイントを移動させ、キーボードマクロ(C-x ()を実行開始し、文字のフォーマットを始めます。

C-x ( C-f M-4 .

レジスタ 'k' に挿入 (C-x r i) とインクリメント (C-x r +) を行います。前置引数 (C-u) によって、テキストを挿入した後でポイント位置を離します。

C-u C-x r i k C-x r + k

改行を入れることでフォーマットを完了させます。残りの文字に対しては、Emacs はキーボードマクロを定義したポイント位置から始まるこのプロセスを繰り返すことができます。C-x e はキーボードマクロを完了して呼び出します。前置引数 M-0 によって、エラーが起きるまでマクロを繰り返します。この場合、バッファの最後に到着すると中断します。

<RET> M-0 C-x e

結果は以下のようになります:

 A....0
 B....1
 C....2
 [...]
 x....49
 y....50
 z....51

もし、後々使うためにマクロを保存したいなら、名前をつけて設定ファイルに保存する必要があります。

name-last-kbd-macro 
insert-kbd-macro

定義したマクロは、すべてマクロリングに格納されます。マクロを巡回するには、

C-x C-k C-n  次のマクロ
C-x C-k C-p  前のマクロ

同様に、仮想的に何でも保存するためにレジスタを使えます。

C-x r SPC 現在のポイント(位置)をレジスタにコピーする
C-x r w   現在のウィンドウ設定をレジスタにコピーする
C-x r j   レジスタに再保存する。

しばしば異なるプロジェクトごとにウィンドウを行ったり来たりして作業をするなら、別のプロジェクトのために設定を保存し、ある画角から別の画角へ簡単に切り替えることができます。

list-registers コマンドによって、使用したレジスタをリストにして表示することができます。

正規表現

Emacs Manual より: "正規表現 (regexp と略す) とは、一致する可能性がある一連の (無限個でもよい) 文字列を表現するパターンである"。このセクションでは正規表現自体には深くは立ち入りません (単純に説明しきれない)。そのかわり正規表現のパワーを簡単にデモンストレーションします。詳しい説明は Emacs Manual の Regular Expressions セクションを見て下さい。

上と同じシナリオが与えられた場合、つまり複数文字のリストがあり、そのリスト内に複数文字の相対位置を持つリストを考えます。(参照 キーボードマクロとレジスタ) 再度、以下を含むバッファから開始します。

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

バッファの最初に C-M-% を使用します。(もしキー列が実行するには難しいなら、M-x query-replace-regexp を使う方がより快適かもしれません。)プロンプトには以下を入力します:

\(.\)

これは、単に1文字にマッチします。それから置換先のプロンプトには:

\1....\#^J
ノート: '^J' は、改行を配置することを意味します。改行は、プロンプト内で入力できません。改行記号は、その他に C-q C-j を使って入力することもできます。

置換先の表現は、以下のように読みます: "最初のカッコに囲まれた部分にマッチするテキストを挿入しなさい (今回は1文字)。次にピリオドを4文字挿入し、それから自動的にインクリメントされた数を挿入し、改行が続きます。"

最後に、! を押すことで、バッファ全体に渡って適用します。前のセクションで実行したすべてのフォーマットが、1つの正規表現置換で実行できます。

矩形選択

先進的なテキストエディタが当然備えているべき強力な機能として、テキストを矩形で選択・編集できるというのがあるでしょう。

Emacs でも矩形選択は可能です。C-SPC で普通にテキストを選択してから、複数の矩形コマンドを使うことができます。

C-x r t  矩形領域にテキストを挿入する
C-x r k  矩形領域を kill する (kill-ring に保存する)
C-x r y  矩形領域を Yank する
C-x r o  矩形領域にスペースを挿入する

たとえ矩形の外のテキストがハイライトされていても、上記のコマンドが影響を与えることはありません。

ブックマーク

Emacs は開いたファイルのリストを保存できます。

C-x r m カレントバッファをブックマークに追加。
C-x r b ブックマークからバッファを開く。
C-x r l ブックマークの確認。

Elisp インタプリタ

eval-last-sexp (C-x C-e) を使うことで、elisp 式を評価することができます。Emacs は、開始時に常に *scratch* バッファを生成します。*scratch* バッファはディスクに保存されず、自由にテキストやコードを記述することができます。これは特にelispの評価に有用です。このバッファは、デフォルトで lisp-interaction-mode 有効で開始することに注意してください。

その他に、Emacs は、ielm コマンドでトップレベルの elisp インタプリタを提供します。

スマートなウィンドウ切り替え

長い間使っていると C-x o による伝統的なウィンドウ切り替えは面倒かもしれません。windmove コマンドはもっと便利にウィンドウを切り替えることができます。Shift を押しながら方向キーでウィンドウを指定するだけです。

windmove キーを有効にするには、設定ファイルに以下を記述してください:

~/.emacs
(when (fboundp 'windmove-default-keybindings)
  (windmove-default-keybindings))

シェルコマンドの実行

M-! を使うことで、外部コマンドを呼び出すことができます。前置引数を使用する(C-u M-!)ことで、結果を現在のバッファのポイント位置に出力することができます。

リージョン上で M-| を使うことで、リージョンをコマンドの入力として使うことができます。たとえば、

C-u M-| sort -u RET

によって、リージョンがソートされ、重複を除去して、リージョンをその結果で置き換えることができます。

シェルバッファ

シェルバッファを生成することで、ターミナルと同様にコマンドを実行することができます。 昔ながらのシェルバッファは、shell コマンドによって生成することができます。

Emacs は、すべて Emacs Lisp で書かれた非常に強力なシェル eshell を機能として持っています。csh や zshといったシェルに対する主な優位点は、ネイティブなシェル言語が elisp そのものである点です。そのため、シェル関数として elisp のすべての先進的な機能を使用できます。

対応する括弧のハイライト

show-paren モードを使うことができます。デフォルトでは、対応する括弧が表示されるまで少し遅延がありますが、show-paren-delay を 0 に設定することでなくすことができます。

~/.emacs
(setq show-paren-delay 0)
(show-paren-mode 1)

スペルチェック

辞書を選択するには:

M-x ispell-change-dictionary

一単語をチェックするには M-$ を使います。 バッファ全体をチェックするには、

M-x ispell-buffer

flyspell-mode を有効にすることで、入力と同時に (on-the-fly) スペルチェックができます。ソースコードに対しては、代わりに flyspell-prog-mode を使うことで、コメントに限定して有効にできます。Emacs でスペルチェックをするには aspell パッケージも必要になります。それぞれの言語に対応したパッケージがあります。英語に対しては、(aspell と共に)aspell-en が必要になります。

テーブル

Emacs は、様々な言語での一般的なテーブルを扱う居力な機能を備えています。例を見てみましょう。

Fruits  Quantity
Apples  5
Melons  2

この内容をリージョンで選択して、以下を実行します。

table-capture

半角スペース2文字を列の区切りとして、改行 (C-q C-j) を行の区切りとして使用します。 以下の結果を得ます。

+------+--------+
|Fruits|Quantity|
+------+--------+
|Apples|5       |
+------+--------+
|Melons|2       |
+------+--------+

以下の操作で元に戻せます。

table-release

table-insert-row, table-span-cell, table-widen-cell といったような、たくさんの便利な table-* 関数があります。

最後に、table 関数の究極の目的は、指定されたマークアップ言語に変換することです。 それには、table-generate-source が使われます。 LaTeX に対しては、前のテーブルは、以下の結果となります。

% This LaTeX table template is generated by emacs 24.2.1
\begin{tabular}{|l|l|}
\hline
Fruits & Quantity \\
\hline
Apples & 5 \\
\hline
Melons & 2 \\
\hline
\end{tabular}

table mode を使用することで、行ごとおよび列ごとの和といった、スプレッドシートの作業を行うこともできます。しかし、すぐに機能が限定的であると分かるでしょう。その上、非常に遅いです。より多くの強力な可能性については、org-mode を見てください。

予定表、スプレッドシート、文章作成

有名でパワフルな Org mode のおかげで、Emacs はパワフルなオフィス系機能をおすすめできます。このモードは、標準の Emacs ディストリビューションに含まれます。

Org mode は元々強力な TODO およびアジェンダのエージェントですが、すぐにはるかに幅広い機能セットに進化しました。 Org mode は単純に機能が多すぎて、すべての機能をざっと見ることすらできません。そのため、私たちはいくつかの例であなたの欲求を刺激するに留めます。

TODO.org ファイルを新規ファイルとして開きます。Org mode がロードされるはずです。もしロードされなければ、M-x org-mode によって有効にできます。

TODO.org
* First entry
** Subentry
   Some comments
*** Subsubentry
* Second entry
  - List item 1
  - List item 2

ここで、いくつかの有用なキーバインドは以下となります:

  • TAB 現在のエントリーの折りたたみ・展開を切り替えます。
  • S-TAB すべてのエントリーの折りたたみ・展開を切り替えます。
  • M-RET 現在の項目と同じレベルに新しい項目を開始します。
  • M-<left> および M-<right> レベルを変更します。
  • M-<up> およb M-<down> すべてのサブセクションを含めて項目を移動します。
  • S-<left> および S-<right> ステータスを変化させます。リストアイテムでは、項目のスタイルを変更します。
  • S-<up> および S-<down> 優先度を変更します。
  • C-c ^ 現在のエントリーのすべてのサブエントリーをソートします。
  • C-c . 現在のエントリーにタイムスタンプを追加します。Shift と矢印を使って、数日や数週をスキップできます。カレンダーでマウスを使ったり、特定の日で Enter を押したりして、それらを選択できます。

スプレッドシート機能は、非常に包括的です。マニュアルから抜粋してみましょう:

    
	最後に、素晴らしい `calc.el 'パッケージでできることについて欲求を
 刺激するために、いくつかの関数に対する位置 `x' で次数 `n'のテイラー級数を
 計算する表を示します。 

     |---+-------------+---+-----+--------------------------------------|
     |   | 関数        | n | x   | 結果                                  |
     |---+-------------+---+-----+--------------------------------------|
     | # | exp(x)      | 1 | x   | 1 + x                                |
     | # | exp(x)      | 2 | x   | 1 + x + x^2 / 2                      |
     | # | exp(x)      | 3 | x   | 1 + x + x^2 / 2 + x^3 / 6            |
     | # | x^2+sqrt(x) | 2 | x=0 | x*(0.5 / 0) + x^2 (2 - 0.25 / 0) / 2 |
     | # | x^2+sqrt(x) | 2 | x=1 | 2 + 2.5 x - 2.5 + 0.875 (x - 1)^2    |
     | * | tan(x)      | 3 | x   | 0.0175 x + 1.77e-6 x^3               |
     |---+-------------+---+-----+--------------------------------------|
     #+TBLFM: $5=taylor($2,$4,$3);n3

Org mode は、行においてパイプ | がホワイトスペース以外の最初の文字のとき、テーブルと認識します。前のテキストでは、線を描きませんでした。セル内の内容、または |- のあとに TAB が押されたとき、線が自動的に描かれています。結果列も手動では記述しておらず、最後の行の calc 式から計算されています。C-u C-c C-c を使うことで、テーブル内のすべての値を再計算することができます。

TODO ファイルと同様に、行と列を操作するキーバインディングがあります。Alt + 矢印キーで、列と行を移動することができます。

より深く詳細を知るには、公式マニュアルを参照してください: C-h i m Org mode RET

リファクタリングとスマート補完

(Eclipse などの) IDE が大抵備えているプログラミング機能が必要な場合、Semantic ツールが役に立ちます。Semantic は Emacs の標準ディストリビューションに含まれています。現在 C, C++, Scheme, Javascript, Java, HTML, Make がサポートされています。現在のサポート状況は CEDET のページ で確認できます。

Semantic がサポートする好みのプログラミング言語で書かれたファイルを開きます。そして Semantic マイナーモードを起動します。

M-x semantic-mode

Semantic は、あなたのファイルに含まれるライブラリ (たとえば C では、ほとんどの場合、標準ライブラリ) を2,3秒パースします。

機能

一旦完了すると、素晴らしい Semantic の機能が使えます。

スマート補完

C-c , SPC を押すことで、ポイントにあるシンボルを補完することができます。それが引数の場合、型が正しいかチェックされます。

シンボルにジャンプする

C-c , j を押すことでシンボルを入力するプロンプトを表示し、その定義元にジャンプします。TAB で自動補完ができます。文字 J を押すと、シンボルを複数ファイルに渡って探索します。

シンボルの呼び出しをリスト表示する

C-c , g を押すことでシンボルを入力するプロンプトを表示し、参照されている場所のリストを表示します。np を押すことで結果表示を巡回できます。RET を押すことで詳細をトグルし、参照箇所で再度 RET を押すことで参照元にジャンプします。G を押すことで、入力したシンボルの場所を複数ファイルに対してリスト表示します。

リファクタリング

最初に前述のコマンドでリファクタリングしたいシンボルの使用先をリスト化します。( を押すと、シンボルに対するマクロ定義を開始します。これは実際、リファクタリングに比べてより非常に強力です。なぜなら、シンボルに任意の関数を適用したり、周囲のシンボルに作用することさえしたりできます。C-x ) を押すことで、マクロ定義を終了し、E キーにて実行します。

シンボルの説明

以下の関数を呼び出すことで、シンボルの詳細を表示します。

semantic-ia-show-summary

これは複雑なデータ構造とプロトタイプに対して非常に有用です 。デフォルトではキーバインドがありません。

設定

以下に、サポートされているすべてのプログラミング言語で Semantic を使用するためのサンプル設定を示します。キーバインディングのと表示設定の例です。

;; ghost 表示での Semantic (M-n と M-p で完了をブラウズできます)
(semantic-mode 1)
(define-key my-keys-minor-mode-map (kbd "C-c , d") 'semantic-ia-show-summary)
(setq semantic-complete-inline-analyzer-displayor-class 'semantic-displayor-ghost)

特定の言語に対して特化した設定を追加することもできます。ここでは C のために:

(add-hook
 'c-mode-hook
 (lambda ()
   (local-set-key (kbd "M-TAB") 'semantic-complete-analyze-inline)
   (local-set-key "." 'semantic-complete-self-insert)
   (local-set-key ">" 'semantic-complete-self-insert)))

文献

Emacs から直接 info マニュアルにアクセスすることが可能です: C-h i m Semantic RET

パッケージ

Emacs の機能はサードパーティ製のパッケージで拡張できます。公式にサポートされているパッケージマネージャとして package.el が組み込まれていますが、Emacs のコミュニティメンバーによって書かれたパッケージマネージャが他にも存在します。package.elpackage-archives 変数を使ってパッケージを検索します。デフォルトでは Emacs Lisp Package Archive (ELPA) が含まれています。M-x list-packages で Emacs が認識している全てのパッケージが列挙されたバッファが作成されます。マニュアル ((info "(emacs) Packages")) にはさらに詳しい情報が載っています。

サードパーティ製のパッケージのアーカイブを追加することもできます。MELPA が広く使われています。

人気の拡張の多くは [community] リポジトリのパッケージや AUR からインストールできます。大抵の場合、パッケージの名前の前に 'emacs-' が付きますが (例: emacs-lua-mode)、常にそうなっているわけではありません (例: auctexAUR)。

ヒント: Arch Linux の Wiki を編集している場合は Emacs Mediawiki パッケージが役に立ちます。

パッケージによっては設定ファイルに変更を加えないと機能が有効にならない場合があります。例えば、auctexAUR をインストールしたときは、設定ファイルに以下を追加:

(load "auctex.el" nil t t)
(load "preview-latex.el" nil t t)

パッケージのソースコードや README で有効化する方法が書かれているはずです。

トラブルシューティング

Emacs が 'Undefined color: "WINDOW_FOREGROUND"' というエラーメッセージで起動しない

mcpp パッケージまたは gcc パッケージをインストールする必要があります。xrdbX resources を前処理するために C のプリプロセッサ cpp を使用します。C のプリプロセッサがインストールされていない場合、xrdb は C のプリプロセッサを実行しないため WINDOW_FOREGROUND が16進数のカラーコードに展開されません。

Gccemacs を使用すると Emacs systemd サービスが起動しない

Gccemacs (ブランチ emacs-native-comp または pgtk-nativecomp) を使っているときに、systemd サービスを開始しようとすると、.eln ファイルが見つからないというエラーメッセージが記録されることがあります。

$ journalctl --user -xb -g eln
emacs[7507]: emacs: ../native-lisp/28.0.50-x86_64-pc-linux-gnu-fc9c33938bf279333039c28064d363e8/lisp-mode-410874a46ab8852855281f021ca61fe7-1738806322de892570d69dfc55b437c2.eln: cannot open shared object file: No such file or directory

回避策として、[Service] セクションで emacs.serviceWorkingDirectory 行を 編集 します。

emacs.service
[Service]
...
WorkingDirectory=/usr/lib/emacs/28.0.50/x86_64-pc-linux-gnu/
...
ノート: WorkingDirectory パラメータは、既存の Restart パラメータの に定義する必要があります。

カラー出力の問題

デフォルトでは、Emacs シェルはカラー表示に使われるエスケープシーケンスをそのまま表示してしまいます。つまり、カラー出力がされるべきところに変な記号が表示されます。

この問題を解決するには以下を ~/.emacs に記述してください:

(add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on)

X ウィンドウでの文字の表示問題

X ウィンドウで emacs を起動した時にメインウィンドウの文字が全て黒縁の白四角になってしまう場合 (対応するフォントがインストールされていない文字を表示したときと同じような記号)、xorg-fonts-75dpixorg-fonts-100dpi をインストールして X ウィンドウを再起動してください。

起動が遅い

ヒント: systemd ユニットとして Emacs を起動する方法でも起動時間を短縮できます。

しばしば起動時間が遅くなる原因は2つあります。

どちらが原因なのか調べるために、次のコマンドで Emacs を実行してください:

$ emacs -q

このコマンドでも Emacs の起動が遅い場合、不適切なネットワーク設定を参照してください。そうでない場合は、ほぼ確実に .emacs に問題があります。

  • /etc/hosts の設定が間違っていると、Emacs の起動が5秒以上遅くなることになります。詳しくはネットワーク設定ガイドの 'ホストネームの設定' を見てください。
  • 原因を探るシンプルな方法は、~/.emacs (または ~/.emacs.d/init.el) にて予想されるセクションをコメントアウト(例えば行頭に ';' を入力)し、変化するか確認するため Emacs を再度開始することです。"require" と "load" を使用することで、特に大きな拡張機能を使った時、起動が遅くなり得ることを心に留めてください。原則として、これらはターゲットが次のいずれかである場合にのみ使用する必要があります。Emacsが起動時に必要とするか、あるいは拡張機能を自動ロードする場合です。そうでなければ、'autoload' 関数を直接使用できます。 たとえば、
(require 'anything)

の代わりに、以下が使えます。

(autoload 'anything "anything" "Select anything" t)

Cannot open load file: ...

このエラーに共通する主な原因は、'load-path' 変数に拡張機能が置かれているディレクトリのパスが含まれていないことです。解決するには、拡張機能のロードを試みる前に、適切なパスをリストへ追加します:

 (add-to-list 'load-path "/path/to/directory/")

拡張機能のためのパッケージを使用しようとして、かつ Emacs が '/usr' 以外のプレフィックスで設定されたとき、ロードパスを更新する必要があります。以下を ~/.emacs のパッケージによって提供される処理の前に配置します:

 (add-to-list 'load-path "/usr/share/emacs/site-lisp")

もし手動で Emacs をコンパイルしたら、デフォルトのプレフィックスは '/usr/local' であることを心に留めてください。

デッドアクセントキーの問題: '<dead-acute> is undefined'

このバグについて Google で検索すると、次のリンクが見つかります: https://lists.gnu.org/archive/html/help-gnu-emacs/2009-05/msg00167.html

問題の説明: Emacs の最近のバージョンでは、 アクセントキーを使用する通常の方法は、期待通りに動きません。'fiancé' のような単語をアクセントしようとすると上のメッセージが表示されます。

解決するには、スタートアップファイル ~/.emacs の上部に以下の行を記述します。

  (require 'iso-transl)

さらに、これは不具合ではなく、新しい Emacs バージョンの機能です。メーリングリストでの本件に関するメッセージを読むと、以下であることが分かりました (https://lists.gnu.org/archive/html/help-gnu-emacs/2009-05/msg00179.html):

これは何も自動的にロードされないように見えます。なぜなら、iso-transl と iso-acc の間に選択があるからです。両方とも、C-x 8 あるいは ALt-<accent> プレフィックスでインプットメソッドを提供するように見えます。しかし、あなたとわたしがしたことは、アクセントのために、ただデッドキー(^, ´, `, ~, ¨)を押し、それからアクセントされる文字を "統合する" ため別のキーを押しただけです。そしてここでは Alt キーが押されていません!ドキュメントによると、これは8ビットエンコーディングに適しているように見えます。そのため UTF-8 では、かなり役立たないはずです。私は、これが紹介されたときにこの不具合を報告しました。しかし、このバグは機能として分類されたように見えます。。。多分これは、かなり役立たないけど、ただファイルが自動ロードされるためだけです。

C-M-% やその他のバインディングが emacs nox で動作しない

これはターミナルが Xorg よりも制限的であることが原因です。ただし、ターミナルによっては多くのバインディングを扱うことができることがあります。2つの解決法が考えられます:

  • グラフィカルバージョンを使用する。
  • サポートされているバインディングに変更する。

例:

.emacs
(global-set-key (kbd "C-M-y") 'query-replace-regexp)

Emacs がフリーズする

シングルスレッドであるがゆえに、Emacs は様々な操作でブロックします。フリーズが発生する状況は様々です。例えば、Emacs はあなたからの入力を待っているのかもしれません (例えばあるフレームでミニバッファを開いているのに他のフレームで作業しようとしている場合など)。あるいは、Emacs は完了するまで時間のかかるコードを実行中なのかもしれません。あるいはバグを踏んだという可能性もあります。Emacs プロセスを殺さずに Emacs のブロックを解除する方法は複数存在します。

  • C-g を押してみる。Emacs が行っていることによっては、複数回押す必要があります。
  • ESC ESC ESC を押してみる。
  • 他のターミナルで killall -SIGUSR2 emacs を実行する。

Emacs-nox の出力が汚い

ターミナル上で動作している時、色、インデント、あるいは出力に関するものが狂ったように見えます。(多分?)Emacs がある点で特別な文字を送り、それが現在のターミナルと競合しているためのようです。 もしこれが起きた時、できることは M-x redraw-display を実行することです。これにより、ターミナルの表示を再描画します。この問題が頻繁に起きるなら、たとえば

(global-set-key (kbd "<f7>") 'redraw-display)

といった記述を、.emacs ファイルに置くといった方法で、コマンドをキーに割り当てたいと思うかもしれません。

グラフィカルバージョンの Emacs はこの問題が起きません。

emacs ターミナルにおかしなエスケープ数字 (utf-8) が表示される

.bashrc または .zshrc で以下の変数をエクスポートしてください:

~/.bashrc
export LANG="en_US.UTF-8"
export LC_ALL="en_US.UTF-8"
export TERM=xterm-256color

小文字の utf を使っていることがエラーの原因です (例: en_US.utf-8)。

利用可能なロケールは locale -a で確認できます。

tmux で emacs を使っているときに Shift + 矢印キーが動作しない

まず tmux の設定で xterm-keys を有効にしてください:

.tmux.conf
setw -g xterm-keys on

しかしながら、この設定は他のキーコンビネーションを破壊します。それを修正するために、以下を emacs の設定に記述します:

~/.emacs
(defadvice terminal-init-screen
  ;; `tmux' と名付けることをアドバイスします。そして `terminal-init-screen' が実行される前に実行します。
  (before tmux activate)
  ;; Docstring.  これはアドバイスを記述し、emacs 内部で有効になります;
  ;; たとえば、 C-h f terminal-init-screen RET を実行したときに表示されます。
  "Apply xterm keymap, allowing use of keys passed through tmux."
  ;; これは elisp コードで、`terminal-init-screen' より前に実行されます。
  (if (getenv "TMUX")
    (let ((map (copy-keymap xterm-function-map)))
    (set-keymap-parent map (keymap-parent input-decode-map))
(set-keymap-parent input-decode-map map))))

詳しくは tmux FAQ を参照。

KDE でウィンドウのリサイズがおかしい

KDE ユーザーには Emacs のウィンドウが正しくリサイズされないという現象がおこることがあります。リサイズした部分が透過されマウスでクリックしても下のウィンドウがクリックされます。この挙動を修正するには、KDE の GTK3 テーマを oxygen-gtk 以外のテーマに変更してください。例えば、gtk3 に含まれている Emacs テーマを使って下さい。

KDE で Emacs を完全に最大化するには、タイトルバーの Emacs アイコンをクリックして、More Actions > Special Window Settings を選択してください。そして "Size & Position" タブで "Obey geometry restrictions" を選択して、ドロップダウンメニューで "Force" を選んで右のラジオボタンで "No" を選んで下さい。

派生

Emacs の実装は多数存在します。おそらく GNU/Emacs が一番ポピュラーです。軽量な Emacs 互換のテキストエディタは Arch のリポジトリや AUR にあります。

  • mg — C で書かれた軽量な Emacs の実装です。mg は UTF-8 をサポートしていません。
https://homepage.boetes.org/software/mg/ || mg
  • Zile — "Zile Is Lossy Emacs" Zile はできる限り Emacs に近づくように書かれている軽量な Emacs クローンです。Zile は UTF-8 をサポートしていません。
https://www.gnu.org/software/zile/ || zile
  • uemacs — Linus Torvalds によるカスタム版 Micro-emacs。
https://git.kernel.org/pub/scm/editors/uemacs/uemacs.git || uemacs-gitAUR
  • emacs-ng — Emacsの新しいアプローチ - TypeScript、Threading、Async I/O、WebRender を含む。
https://github.com/emacs-ng/emacs-ng || emacs-ng-gitAUR
  • qemacs — "Quick Emacs" は、Emacs Lisp インタプリタをベースとしていますが、コードベースが小さく、ユーザーインターフェイスが簡素化されています。
https://bellard.org/qemacs/ || qemacsAUR
  • sxemacs — xemacs のフォーク。
http://www.sxemacs.org/ || sxemacsAUR
  • jove — Jonathan のバージョンの Emacs は、Lisp を含まない Emacs に似たエディタです。
https://github.com/jonmacs/jove || joveAUR

Emacs ディストリビューション

  • Spacemacs - コミュニティ主導の Emacs ディストリビューション
  • Doom Emacs - 頑固な火星人ハッカーのための Emacs フレームワーク
  • Witchmacs - 最もかわいい Emacs ディストリビューション
  • Yukimacs - Uncle Dave の Emacs と Witchmacs に大きく影響された (Spacemacs や Doom Emacs ではなく) ゼロから構築された GNU/Emacs 構成

その他: Starter Kits

参照