Emacs の使い方 基本のキー
今回は Emacs の入門的な記事です。
"これだけは覚えておいた方がいいんじゃないかな"という基本的な使い方(キー)をあげてみました。
また、少し応用的な使い方についてもなるべくリンクで紹介しています。
すでに使える状態にあるという前提で進めています。 Windows の場合にはインストール等の設定は以下の記事をご覧ください。 しかし、多少は設定のコードも書いているので、それを使いたい場合には ~/.emacs.d/init.el に追記して下さい。 また、 setq で設定しているような変数は M-x customize-option の後に変数を入力すれば カスタマイズ で設定することもできます。
また、説明が少し長くなってますので、チートシート的に使えるように一覧版も用意しています。
準備
使い方を説明する時に使う用語などについて、先に説明します。キーの表記
Emacs では、キーバインドを次のような表記で表すことが多いです。表記 | 意味 |
---|---|
C-v | Ctrl キーを押しながら v を押す。 |
M-v | [Esc] キーを押した後に v を押す。 または Alt キーを押しながら v を押す。 |
PC 用のキーボードではこれがないため、Esc, Alt の 2 種類の代替えが用意されています。 個人的には M-v のような連打をよくするものは Alt、 それ以外は [Esc] というように使い分けています。
また、 一回のキーで終わらず、さらにつづけるものもあります。 例えば C-x h では Ctrl を押しながら x を押した後に h を押します。
画面関連の用語
Emacs の画面で使われる主な用語です。用語 | 意味 |
---|---|
バッファー | ファイルなどを開いたもの |
ウィンドウ | バッファーを表示しているところ |
モード行 | バッファー情報などを表示している行 |
ミニバッファー | メッセージを表示や値の入力をするところ。 |
フレーム | 通常の GUI でいう外部ウィンドウ |

Emacs を始めとしたエディターでは通常、直にファイルを編集するのではなく、 一旦ファイルをメモリー上に読み取って、それに対して編集します。 そのため、編集対象がバッファー(緩衝)と呼ばれます。
その他の用語
用語 | 意味 |
---|---|
コマンド | 実行できる機能 |
メジャーモード | C++、 HTML といった編集対象に合わせて決まるモード。 バッファーに対して一つだけ。 |
マイナーモード | バッファーに対して複数有効にできるモード。 いろいろなメジャーモードで使える拡張機能などがマイナーモードとして提供されることが多い。 |
ヘルプ
最初に Emacs のヘルプ関連の機能について紹介します。ヘルプ関連の機能は C-h から始まるキーに割り当てられています。
キー | 機能 |
---|---|
C-h t |
チュートリアル 日本語環境に設定されていれば、日本語のチュートリアルが表示されます。 実際に操作したりしながら読めるので、最初にちょっとみてみるとよいでしょう。 |
C-h k | キーを実行するとどんなコマンドが実行されるのかを知りたいときに使います。 |
C-h C-b | 今のモードのキーバインドの一覧を表示します。 |
C-h f | 上の 2 つではコマンド名が表示されるだけです。 コマンドの詳しい説明をみるときに使います。 |
C-h m | 現在のモードのヘルプを表示します。 |
また、C-x などの後にキーが続くものは、 C-x の後に C-h を押すと、C-x に続くキーの一覧が表示されます。
基本操作
カーソル移動
カーソル移動にも Ctrl キーとの組み合わせのキーバインディングがあります。矢印キーで移動しても構いませんが、 p, n と上下移動の対応は他でも使うので、覚えておいた方がいいと思います。
前の行 ↑ C-p : : 前の文字 ← C-b .... 現在のカーソル位置 .... 次の文字 → C-f : : 次の行 ↓ C-nその他の移動系でよく使うキーは次のようなところでしょう。
キー | 機能 | キー | 機能 | |
---|---|---|---|---|
C-a | 行頭へ移動 | C-e | 行末へ移動 | |
M-v | 上へスクロール | C-v | 下へスクロール | |
M-< | バッファー先頭へ移動 | M-> | バッファー末尾へ移動 |
キー | コマンド | 機能 |
---|---|---|
C-l | recenter | カーソル位置が中央になるようにスクロール |
M-g g | goto-line | 行番号を指定して移動 |
コマンド指定
Emacs の全てのコマンドがキーに割り当てられているわけではありません。 そういったコマンドを実行する場合には M-x の後にコマンド名を指定して実行します。- M-x COMMAND (execute-extended-command)
特殊キー
少し特殊な扱いとなるキーに次のようなものがあります。キー | コマンド | 機能 |
---|---|---|
C-g | keyboard-quit | 中断 |
C-u | universal-argument | 繰り返し数の指定やコマンドの動作変更 |
C-q | quoted-insert | 次に入力するキーをそのまま入力 |
処理を途中でやめたいときなど、Emacs ではなんかあったときにはとりあえず C-g を押します。 その他のキーについて詳しくは以前の記事をご覧下さい。
ファイル、バッファー
[File] 、 [Buffer] のメニューにあるような操作について説明します。ただし、キーの説明は最低限必要かなというものだけなので、 その他のコマンドはメニューを見てください。
ファイル操作
キー | コマンド | 機能 |
---|---|---|
C-x C-f | find-file | ファイルのオープン。新規作成 |
C-x C-s | save-buffer | ファイルの保存 |
C-x C-w | write-file | 名前をつけて保存 |
C-x C-c | save-buffers-kill-terminal | Emacs の終了 |
- ファイルパス は /
- ファイルを指定する場合、ファイルパスは \ も使えないことはありませんが、
Windows でも Unix の / を使うのが普通です。
- ファイルを指定する場合、ファイルパスは \ も使えないことはありませんが、
Windows でも Unix の / を使うのが普通です。
- ファイルの新規作成とオープンが同じ
- Emacs では他のエディターなどと違い、 新規作成のコマンドはありません。
find-file で存在しないファイルを指定すると新規作成となります。
慣れないとちょっと奇妙に感じるかもしれませんが、 Emacs では拡張子で C++ などの編集モードを決めるので、 ファイルの名前を指定してからファイルを作った方が都合がよくなります。
- Emacs では他のエディターなどと違い、 新規作成のコマンドはありません。
find-file で存在しないファイルを指定すると新規作成となります。
- キー入力とマウス操作で動作が変わる
-
Emacs では基本的にミニバッファーで入力を行いますが、
メニューといったマウス操作で実行した場合は、
ファイルのオープンなどでファイルダイアログが表示されます。
なるべくキー入力時はキー、マウス操作の時はマウスだけで操作ができるようになっています。
-
Emacs では基本的にミニバッファーで入力を行いますが、
メニューといったマウス操作で実行した場合は、
ファイルのオープンなどでファイルダイアログが表示されます。
特殊なファイルのオープン
ファイルのオープン(find-file)では次のようなファイルも開くことができます。対象 | 機能 |
---|---|
リモートファイル | FTP(ang-ftp)を使って表示、編集 |
gz ファイル | gzip で圧縮されたテキストファイルを表示、編集 |
画像ファイル | 画像として表示 (auto-image-file-mode の変数を有効にした場合) |
ディレクトリー | Dired モード |
日本語コード、改行コードの変更
日本語文字コード、改行コードはファイルのオープン時に自動的に判定し、モード行の左側に現在のコードが省略文字で表示されます。これらを変更したい場合にはまず以下のキーを実行します。
- C-x [Return] f (set-buffer-file-coding-system)
表示 | キーワード | 文字コード |
---|---|---|
S | shift_jis | シフト JIS |
S | cp932 | コードページ932 (Windows では正確にはこちら) |
E | euc-jp | EUC-JP |
U | utf-8 | BOM なし UTF-8 |
U | utf-8-with-signature | BOM 付き UTF-8 |
改行コードは次のキーワードです。
キーワード | 説明 |
---|---|
dos | CR + NL |
mac | CR |
unix | NL なし |
日本語コード、改行コードを一緒に指定したい場合には shift_jis-dos のようにハイフン(-)で繋げて入力します。
新規作成時などのデフォルトの文字コードの設定については、以下の記事を見て下さい。
バッファー操作
開いたファイルはバッファーとして扱われます。 複数のファイルを扱う場合には、このバッファーを切り替えて使います。キー | コマンド | 機能 |
---|---|---|
C-x k | kill-buffer | バッファーを閉じる |
C-x b | switch-to-buffer | バッファーの切り替え |
C-x C-b | list-buffers | バッファー一覧 |
ウィンドウ操作
1 つの画面(フレーム)をウィンドウをわけて、使うことがあります。キー | コマンド | 機能 |
---|---|---|
C-x o | other-window | 隣りのウインドウに移る |
C-x 2 | split-window-below | ウィンドウを横に分割 |
C-x 1 | delete-other-windows | カレントのウィンドウ以外を消す |
C-x 0 | delete-window | カレントのウィンドウを消す |
C-M-v | scroll-other-window | 他のウィンドウを下へスクロール |
自分から分けて使わないとしても、 ヘルプ、 コンパイルなど自動で分割されることはよくあります。 C-x o のウィンドウの移動と 0 か 1 でウィンドウを1つに戻す方法は覚えておいた方がいいと思います。
また、分割されたウィンドウはモード行をドラッグすることによって高さを変更することができます。
特殊モードでのキー操作
ファイルの入力等でミニバッファーに入力することになるので、 この辺で通常の編集モード以外での基本的なキー操作についても説明します。ミニバッファーでのキー
ファイルのオープンなどミニバッファーに入力する場合には次のキーが使えます。キー | コマンド | 機能 |
---|---|---|
[Tab]、([Space]) | minibuffer-complete | 補完 [Space] キーは入力で空白を取らない場合のみ。 |
C-p、↑ | previous-history-element | 前の履歴 |
C-n、↓ | next-history-element | 次の履歴 |
表示用バッファーでのキー
ヘルプのような表示用のバッファーの場合には基本的に以下のキーが使えます。キー | 機能 |
---|---|
q | 終了(バッファーを閉じる) |
[Space] | 下にスクロール |
[Back space] | 上にスクロール |
リスト表示バッファーでのキー
ディレクトリー(フォルダー)を開いた時の Dired モード、バッファー一覧など Emacs ではリスト表示するモードが幾つかあります。 たいていは同じようなキーバインディングなので、 何か一つリスト系のモードを覚えておくとよいでしょう。リスト系の機能では共通して、次のようなキーが使えることが多いです。
キー | 機能 |
---|---|
q | 終了(バッファー、ウィンドウを閉じる) |
[Space] | 下にスクロール |
[Back space] | 上にスクロール |
p | 上に移動 |
n | 下に移動 |
[Return] | カレントのリスト項目に対してアクション(開くなど) |
また、Dired モードなどでは削除といった操作はリスト項目にマークを付けて処理することもあります。
キー | 機能 |
---|---|
m | マークをつける |
d | 削除マークをつける |
u | マークの解除 |
x | マークの実行 |
編集
[Edit] のメニューにあるような操作について説明します。領域選択
領域選択といえばマウスのドラッグや Shift + 矢印キーで行うのが一般的でしょう。Emacs でも両方ともできますが、編集中にマウスは触るといったことは基本的にやりません。 矢印キーもちょっと遠いです。
Emacs では領域の端を指定し、移動して範囲を選択するという方法をとります。
- 範囲指定開始 C + [Space] (set-mark-command)
- 移動
- 切り取り、コピーなどのコマンド実行
切り取り、コピー、貼り付け
Emacs では切り取り、貼り付けに kill, yank(復活) という名前が付けられています。Windows では C-x, C-c, C-v に割り当てられているような機能です。 (私はやったことはありませんが、 [Options] の設定で Windows 系に割り当てることもできるようです)
キー | コマンド | 機能 |
---|---|---|
C-w | kill-region | 切り取り |
M-w | kill-ring-save | コピー |
C-y | yank | 貼り付け |
その他、次のようなコマンドもよく使います。
キー | コマンド | 機能 |
---|---|---|
M-y | yank-pop | C-y の後に実行し、クリップボード(kill-ring)の履歴をたどって貼り付け。 |
C-k | kill-line | カーソルから行末までを切り取り |
コピー、切り取りをしたものは Windows ではクリップボードにも格納されますが、 Emacs 内の kill-ring にも格納されます。 ring というのはリング(循環式)リストを指していて、 Emacs ではメモリー上の保存にはこのデータ構造がよく使われます。 M-y はその kill-ring から保存値を取り出して貼り付ける機能です。
また、簡単な Emacs-Lisp で C-y だけで履歴の貼り付けもできるようになります。 C-k に関しては kill-whole-line の変数を t(On) に設定していると、 行頭で実行した時に 1 行の削除となりちょっと便利になります。
(setq kill-whole-line t)コピペ系の機能ではその他にも次のような機能があります。
- 矩形領域のコピペ
- キーを使った複数のコピペ
マウス操作
マウスには結構編集系の機能が割り当てられているので、ここで説明します。操作 | 機能 |
---|---|
左クリック | クリック位置にカーソル位置を移動 |
左ドラック | 範囲選択 |
中クリック | クリック位置に貼り付け |
右クリック | カーソル位置からクリック位置までを選択状態にして、コピー ダブルクリックで切り取り |
左ボタンは他のエディターなどと同じだと思います。
Unix では昔は 3 ボタン式で、中ボタンというものがありました。 今は PC もサーバーマシンもホイールマウスがほとんどだと思いますが、 実はこのホイールはクリックすることができます。 ちょっとクリックしずらいですが、これが中クリックにあたります。
また、中ボタンは選択にも使われます。 補完の選択候補を表示などで、マウスを持っていくとハイライトするものがあるのですが、 こういったものは中クリックで選択できます。
右ボタンのクリックによる選択とコピーは Windows の場合には選択のみでコピー(切り取り)までは行われないようです。 Windows では "明示的にコピーや切り取りを選択しないとクリップボードにはコピーしない" というセキュリティーポリシーがあるので、そのためかもしれません。
ちなみに、メニューの表示は一般的なアプリでは右クリックで表示されますが、 Emacs は Ctrl や Shift と合わせてクリックすることによって表示されます。
ただ、一般的なアプリと違って 位置や選択に対するメニューではなく、モード等で固定の内容です。 そのため、あんまり使うことはないかもしれません。
元に戻す、やり直し(Undo, Redo)
元に戻す(undo)コマンドは複数のキーに割り当てられています。- C-/
- C-x u
- C-_(アンダーバー)
(global-set-key "\C-z" 'undo)元に戻す(undo)の反対の機能でやり直し(redo)という機能があります。 これはちょうどブラウザーの "戻る" と "進む" のような関係です。
Emacs の場合はちょっと特殊で、 やり直しのコマンドはありません。 元に戻す処理をやっている時に C-g を押すと、戻す向きが逆になります。

検索
検索は 1 文字入力していく度に検索していくインクリメンタルサーチがよく使われます。キー | コマンド | 機能 |
---|---|---|
C-r | isearch-backward | 上方向にインクリメンタルサーチ |
C-s | isearch-forward | 下方向にインクリメンタルサーチ |
インクリメンタルサーチ中は次のようなキーが使えます。
キー | 機能 |
---|---|
C-w | カーソル位置の単語を検索文字に設定 (さらに押すと対象が伸びる) |
C-s ( C-r ) | 次の検索結果に移動 開始直後の場合は、前回使った文字列で検索 |

インクリメンタルサーチの開始直後に [Enter] を押すと、 インクリメンタルではなくミニバッファーに文字列を入力してからの検索となります。 これは日本語やクリップボードの文字列を検索したい場合に使用します。
日本語の検索ではローマ字で日本語を検索する Migemo というパッケージもあります。 また、 検索機能にはフォルダー(ディレクリトー)をまたがる grep 検索もあります。
置換
Emacs では、一つ一つ問い合わせながら置換する逐次置換を行います。 これは次のキーで開始します。- M-%(query-replace)
置換時の操作では次のキーをよく使います。
キー | 機能 |
---|---|
y、[Space] | 置換実行(1 つ) |
n | スキップ |
! | 残りすべての置換を実行 |
^ | 前のマッチ位置に戻る |
q、[Enter] | 中止 |
. | 今の問い合わせを置換してから中止 |
? | ヘルプ |
M-% を押した直後の置換対象文字の入力で [Enter] を押すと 前回の検索文字、置換後文字で置換を開始します。
置換を使っていると途中で編集したいということがあると思います。
このため C-r で中断する機能もあります。 ただ、個人的にはちょっとややこしいので、 一旦中止して、先ほどの同じ条件での置換を行っています。
また、 Emacs の置換は賢く、設定によっては文字種を考慮して置換することができるようになっています。 例えば foo → bar の置換の場合、 Foo なら Bar 、 FOO なら BAR と置換します。
正規表現の検索と置換
次のキーでは正規表現を使った検索と置換ができます。キー | 機能 |
---|---|
C-u C-r | 正規表現で上方向にインクリメンタルサーチ |
C-u C-s | 正規表現で下方向にインクリメンタルサーチ |
C-M-% | 正規表現で逐次置換 |
以前、正規表現の知識を少しづつ身につけていけるような記事を書きました。 まだ知らない人は置換のところまででも構わないので、読んで見て下さい。
また、 Emacs の正規表現は今よく使われている Perl 拡張のものと微妙に違うので、 知っている人もざっとみておくとよいと思います。
補完
Emacs では補完をよく使います。そのうちの幾つかを紹介します。dabbrev 補完
dabbrev 補完 は Emacs の補完の中でも私が特に便利だなと思う機能です。- M-/(dabbrev-expand)
それが望むものではなかった場合には、M-/ をさらに押していくと、 上方向に順に検索し、なければバッファー内、他のバッファーと検索していきます。
最初に上方向に検索していくので、前で使った変数などは長い名前でも数回のキー入力で済みます。 慣れると、これなしのコーディングは考えられなくなってきます。
VS などの IDE でも補完はできますが、 この機能の場合は言語を選びません。
モードごとの補完
M-[Tab] を押すとモードごとに違った補完になります。モード | 機能 |
---|---|
Emacs Lisp モード | 関数、変数などのシンボルの補完 |
Text モード | スペルチェッカーの辞書を使った単語の補完 |
C, C++ モード | Tags 機能を使った補完(後述) |
プログラミング用機能
Emacs は様々なテキストの編集に使えますが、 もともとプログラムのコーディング向けなので、 プログラミング用の機能は充実しています。コード編集
次のキーはコーディング中に非常に役に立ちます。 これらはまず覚えておいた方がいいでしょう。キー | 機能 |
---|---|
[Tab] | インデント |
C-j | 改行して、インデント |
C-M-\ | 範囲内をインデント |
M-; | コメント(単体でも、範囲内でも可) |
C-j で改行 + インデントですが、 C, C++ 言語などのモードでは {, ; などを入力したときに自動で改行、インデントする機能があります。 この機能を有効にしておくとコーディングが非常に楽になります。
これら以外にもコーディングに役立つ機能がいろいろと言語のモードごとに用意されています。
メインメニューにあるモードのメニューや C-h m で表示するヘルプで確認してみてください。
IDE 風の編集機能
使える言語は限られてきますが、 Emacs でも IDE 風の機能があります。tags の機能を使うと Emacs で IDE のような関数の定義へのジャンプや補完(M-[Tab])ができます。 さらに auto-complete や eldoc のパッケージを使うと、 IDE 風のポップアップによる補完やカーソル位置の関数定義の表示が行えます。 また、 auto-complete を利用すれば、 前述した dabbrev 補完をポップアップ表示で行うこともできます。
コンパイル
Emacs 上でコンパイルを実行することができます。- M-x compile
- この後、 make などの実行コマンドを入力
さらにこのジャンプ機能を利用しやすくする Lisp も書いてみました。 コンパイル用にエラー行の出力形式が正規表現で登録されています。 この正規表現のマッチ結果をもとにジャンプしているのですが、 エラー行が日本語化されているなどでマッチしない場合には機能は使えません。
こういう時は自分で正規表現を追加すると任意のコンパイルでこの機能が使えるようになります。 また、このコンパイル機能は Windows 環境でもコマンドライン上でビルドできるのであれば、 使用することができます。
- VS のビルドをコマンドラインで実行する | プログラマーズ雑記帳
- VS で gcc のようにファイルを指定してビルドする方法 | プログラマーズ雑記帳
- C# で gcc のようにファイルを指定してビルドする方法 | プログラマーズ雑記帳
デバッグ
M-x の後、 gdb, dbx, rubydb といったコマンドを実行すると それぞれのデバッガーが Emacs 上で動作します。使い方は基本的にそのコマンドラインデバッガーと同じです。 上下 2 つのウィンドウ構成になり、上のプロンプトで通常どおりデバッガーを操作すると、 下のウィンドウに対応位置のコードを表示されます。
それ以外としては C-x [Space] のコマンドは覚えておいた方がよいでしょう。 表示しているコードの方で実行するとそこに breakpoint を付けることができます。
Windows 環境では コンパイラーに VS を使っている場合には Emacs でデバッグはできません。
ただ、デバッグのしやすさでは、 Emacs 派の私でも Emacs より VS の方が上かなと思います。
その他機能
キーボードマクロ
Emacs を使っていて同じ操作を繰り返すことがあるかもしれません。 こういった場合にキーボードマクロを使って操作を覚えさせることができます。キー | コマンド | 機能 |
---|---|---|
C-x ( | kmacro-start-macro | マクロの記録開始 |
C-x ) | kmacro-end-macro | マクロの記録終了 |
C-x e | kmacro-end-and-call-macro | マクロの実行 |
Diff
Emacs では差分ビューワーばりに見やすく差分を表示することができます。しかも Emacs ですからそのまま編集できますし、編集中のバッファーの差分もみれます。
シェル
Windows しか使ったことがない人はあまり使ったことがないかもしれませんが、 Unix ではコマンドライン上でプログラムを起動したり、 ファイルを操作したりするシェルが使われます。これはこれで便利なので、 Windows でも使えば生産性が上がることもあると思います。
特に Emacs では eshell という Emacs 用のシェルがあります。 これは M-x eshell で起動します。
eshell であれば、シェル上から Emacs の操作ができたり、ang-ftp を使って、 リモートのファイルを通常のファイルのようにコピーできたりします。
Emacs のコードハイライトをブログや Word で利用
ブログなどの Web 上でハイライトしたコードを表示したい場合は JavaScript のライブラリーを使うのが一般的だと思います。 ただ、それだと超メジャーな言語しか対応していないことが多いです。それに対して、Emacs では膨大な量の言語に対応しています。 htmlize というパッケージを使えば、 この Emacs のコードハイライトを利用して、ハイライトしたコードの html 片を簡単に得ることができます。 また、 htmlize で作成した html ファイルを一旦 IE で表示し、 それをコピペすれば、 MS Word にもハイライトしたコードを貼り付けることができます。
最後に
今回はいろいろと Emacs の機能を紹介してきました。 しかし、これでもまだまだ Emacs の さわり ぐらいです。しかも、デフォルトでついている機能を中心に紹介しているので、 パッケージをインストールすれば、 Emacs の機能はさらに広がります。 私も結構長いこと使っていますが、"こんなこともできたんだ" という驚きが今だにあります。 この記事がそんな奥の深い Emacs のはじめの一歩になれば と思います。
Emacs における日本語文字コードの設定
今回は Emacs における日本語の文字コードおよび改行コードの設定についての記事です。
文字コードの設定は基本的なものであれば、簡単なのですが、
Windows でデフォルトを UTF-8 にしようとしたりすると少し複雑になります。
ただし、逆に言えば Emacs では細かな設定まで可能ということでもあります。
その細かな設定までできるように解説してみたいと思います。
言語環境の設定
まず、文字コードの設定で最初に行うのは、言語環境を日本語(Japanese)に設定することです。 「何故、文字コードの設定で言語環境を設定するか」というと、 言語環境を設定すれば最低限の文字コードの設定が行われるからです。言語環境の設定は init.el などの設定ファイルに set-language-environment で指定します。
(set-language-environment "Japanese")言語環境は [Options(オプション)] メニューからも設定できます。 オプションの設定を変えた場合は [Save Options(オプションの保存)]を忘れないようにして下さい。
[Options] → [Multilingual Environment] → [Set Language Environment] → [Javanese] ([オプション] → [言語] → [言語環境の設定] → [日本語])言語環境を日本語に設定すれば、環境に合わせた日本語文字コードが設定されます。 Windows では Shift-JIS 、 Unix 系では EUC-JP などユーザーが環境として選んでいる文字コードです。
その設定で良ければ、これで文字コードの設定は完了です。
しかし、 より細かな設定をするためにはこの後に文字コードの設定を追加していくことになります。
なお、文字コードも変わるため、必ず 言語環境の設定した後に文字コードの設定を記述しなければなりません。
オプションのメニューでの設定はカスタマイズの場合と同じでデフォルトでは設定ファイルの最後に追加されます。 set-language-environment 関数を使うかカスタマイズ用の別ファイルにしてロードするようにして下さい。
文字コードのシンボル
文字コードはシンボルを使って指定します。よく使うものを以下の表にまとめました。これ以外にもありますが、そちらは M-x list-coding-systems で確認してください。
シンボル | 文字コード |
---|---|
shift_jis | Shift-JIS |
cp932 | コードページ932 (Windows では正確にはこちら) |
euc-jp | EUC-JP |
utf-8 | UTF-8 (BOM なし) |
utf-8-with-signature | BOM 付き UTF-8 |
また、改行コードは指定がなければシステムに合わせたものになります。 これを変えたい場合は shift_jis-unix のように以下のキーワードと合わせたシンボルを指定します。
キーワード | 説明 |
---|---|
dos | CR + NL |
mac | CR |
unix | NL |
対象別の文字コード指定
デフォルトの文字コードを設定する場合には prefer-coding-system を使います。(prefer-coding-system 'utf-8)同じような関数に set-default-coding-systems というのもあります。 ただし、ヘルプによれば prefer-coding-system の方は改行コードとのセットのシンボルも使えるようですので、 こちらを覚えておいた方がいいでしょう。
この設定によって指定される文字コードは以下の項目です。
- ファイルを新規作成した場合のデフォルト
- サブプロセスでの IO
- 他の項目が指定されていない場合のデフォルト値
設定関数 | 対象 |
---|---|
set-file-name-coding-system | ファイル名 |
set-keyboard-coding-system | キーボード |
set-terminal-coding-system | ターミナル(コンソール) |
例えば、 Windows ではファイル名やキーボードは Shift-JIS(cp932) ですので、 prefer-coding-system で Shift-JIS 以外を指定した場合はこれらの変更は必須となります。
ターミナルの設定は Windows ではあまり使うことはないと思いますが、 GUI ではなく、ターミナルで Emacs を使う場合に必要となります。
(prefer-coding-system 'utf-8) (set-file-name-coding-system 'cp932) (set-keyboard-coding-system 'cp932) (set-terminal-coding-system 'cp932)ここで注意点は prefer-coding-system では BOM 付きの UTF-8 (utf-8-with-signature) を指定してはいけないということです。
サブプロセスでの文字コードも変わってしまうため、 grep やコンパイルなどで外部プログラムをちゃんと呼び出せなくなります。
この対応としては default-process-coding-system 変数でプロセスの文字コードを変えればいいのですが、 それよりもデフォルトをシフトJISにしてファイルのデフォルトを変えた方が早いでしょう。
ファイルのデフォルトの文字コード指定
開いているバッファーのファイルの文字コードを変更する場合には set-buffer-file-coding-system (C-x RET f)を使います。しかし、これを設定で書いても意味がありません。 バッファーごとの文字コード(buffer-file-coding-system) はバッファーローカルな値なので、 ロードしているバッファーの文字コードが変わるだけです。
新規作成時のファイルのデフォルトを変える場合には set-default 関数を使って buffer-file-coding-system のデフォルト値を変更します。
(set-default 'buffer-file-coding-system 'utf-8-with-signature)以前はファイルのデフォルトの文字コード指定には default-buffer-file-coding-system 変数を使う方法もありました。 しかし、 Ver. 23.2 にから非推奨(obsolete)になったため、 buffer-file-coding-system を
set-default
で変更した方がよいでしょう。
ファイルの種別ごとの文字コード指定
文字コードは最近では UTF-8 が使われるのが主流になってきました。 UTF-8 は日本語が冷遇されているので不満はありますが、 文字コードが統一されるのはいいことだと思います。しかし、残念ながら文字コードは統一されていません。 UTF-8 でも 「BOM 付き派」と 「BOM なし派」とがあるためです。 状況はよりやっかいになったとも言えます。
Microsoft 製品では BOM 付きでなければちゃんと動かないことがあります。 一方、 Unix や Java 系のツールや言語では BOM なし派です。
VS 用には BOM 付きがいいですが、 Java など JVM 言語では BOM なしでなければなりません。
そんな中 Emacs ではファイル種別ごとに文字コードを指定することができます。
ただし、この設定は Emacs の文字コード判定よりも優先されるため、 JVM 言語のように BOM なし UTF-8 以外はうけつけないようなソースに限った方がいいと思います。
ファイル種別ごとの文字コードを指定する場合は modify-coding-system-alist で設定します。
(modify-coding-system-alist 'file "\\.java\\'" 'utf-8) ;; Java (modify-coding-system-alist 'file "\\.clj\\'" 'utf-8) ;; Clojure (modify-coding-system-alist 'file "\\.\\(scala\\|sbt\\)\\'" 'utf-8) ;; Scala (modify-coding-system-alist 'file "\\.[eh]rl\\'" 'utf-8) ;; Erlang (modify-coding-system-alist 'file "\\.exs?\\'" 'utf-8) ;; Elixirなお、 Scala の scala-mode2 の場合はパッケージをインストールすると自動的にこの設定が追加されます。 この設定をカスタマイズで行う場合には file-coding-system-alist の変数を変更します。
- M-x customize-option [RET] file-coding-system-alist

ペアでの指定はエンコード、デコードをそれぞれ指定しているものです。 一つだけ指定すれば、両方共に同じものが使われます。
Windows での設定
最後に参考として Windows での私の設定をあげておきます。;; ベースは Shift-JIS のまま (set-language-environment "Japanese") ;; ファイルのデフォルトを HTML や C++ 用に BOM 付き UTF-8 (set-default 'buffer-file-coding-system 'utf-8-with-signature) ;; BOM なし UTF-8 でなければならない言語 (modify-coding-system-alist 'file "\\.clj\\'" 'utf-8) ;; Clojure (modify-coding-system-alist 'file "\\.exs?\\'" 'utf-8) ;; Elixir ; ...ただし、実際には私はカスタマイズやオプションの方を使って設定するので、 これはコピペしやすいようにコードに直したものです。