この文書の URL は http://www.cc.kyoto-su.ac.jp/~mtkg/lecture/comp_A/2012/08.html です。

Emacs とは

参考書

事前準備

次のコマンドを実行して利用環境を設定します。

$ ~mtkg/ksu_cc/ubuntu1004/dot.emacs.d/00setup.sh

"Successfully done." と表示されれば OK です。

基本的操作

キー操作の約束

Emacs ではいろいろな機能がコントロールキーやエスケープキーを組み合わせたキー操作に割り当てられています。 まず以下のお約束を覚えましょう。

C-x     コントロールキーを押しながら x を押す
M-x     エスケープキーを押してから x を押す
ESC     エスケープキーを押す
SPC     スペースキーを押す
RET     Retrun キー(または Enter キー)を押す
DEL     Delete キーを押す

起動

起動するにはターミナルから

% emacs ファイル名 &

とします。 ファイル名は省略可能です。

$ emacs ~mtkg/comp_A/ogura.txt &

として Emacs を起動してみましょう。

カーソルの移動

まずは上下左右への移動を覚えましょう。 矢印キーを使ってもよいですが、手をホームポジションから離すと非効率です。

C-p   ↑  カーソルを前行に移動
C-n   ↓  カーソルを次行に移動
C-f   →  カーソルを右に移動
C-b   ←  カーソルを左に移動

次にこれも覚えましょう。

C-a       カーソルを行頭に移動
C-e       カーソルを行末に移動
C-v       次のページに移動
M-v       前のページに移動
M-<       バッファの先頭に移動
M->       バッファの最後に移動
M-b       カーソルを一語左に移動
M-f       カーソルを一語右に移動

間違ったとき(中止)

よくわからなくなってしまったら C-g を打ってください。 (何回か打たないといけないかもしれません。)

画面の再表示

画面表示が乱れてしまったら C-l (コントロール+エル)で再表示できます。

行番号を指定してカーソルを移動するには M-x goto-line を使います。 60行目にはどんな歌が載っているでしょうか?

終了

終了するには C-x C-c とします。 つまり、コントロールキーを押しながら x、続けてコントロールキーを押しながら c を押せば Emacs は終了します。

ファイルの編集

こんどは ogura.txt を手元にコピーして内容を変更できるようにしましょう。

$ cp ~mtkg/comp_A/ogura.txt ./

読み書き

Emacs では編集するテキストを「バッファ (buffer)」の中に保持します。 複数のバッファを切り替えることにより、複数のファイルを編集することができます。

ファイルをバッファに読み込むには C-x C-f とします。 エコー領域(Emacs の一番下の部分)に

Find file: ~/

とデフォルトディレクトリが表示され、ファイル名の入力待ちになります。 ファイル名を入力して RET を押すとファイルの内容がバッファに取り込まれ、編集できる状態になります。 存在しないファイル名を指定した場合は新しいファイルを作成することになります。 ここでは ogura.txt を読み込んでください。

ファイルを保存するには次のコマンドを使います。

C-x C-s   現在カーソルのあるバッファをファイルに保存
C-x C-w   ファイル名を変更して保存
C-x s     編集中のすべてのファイルを保存

ポイント・マーク・リージョン

ポイント
カーソルのある位置
マーク
バッファの任意の位置におくことができる目印。ポイントのある場所にマークを設定するには C-SPC または C-@ とします。
リージョン
ポイントとマークで囲まれた領域

Emacs ではリージョンを対象とした編集コマンドが用意されています。

削除、移動、コピー

編集コマンドには次のようなものがあります。

C-d       カーソルの置かれた文字を削除する
C-k       カーソルの置かれた文字から行末までを削除
C-w       リージョンを削除
M-w       リージョンを kill-ring に登録
C-x u     編集の取り消し(必要な回数繰り返す)
C-x C-x   マークとポイントを入れ替える

Emacs では C-kC-w で削除された領域は kill-ring と呼ばれるものに保存されます。 Windows のクリップボードのようなものと考えればよいでしょう。 この kill-ring の内容は yank コマンド C-y を使ってポイント(カーソル位置)に挿入することができます。 C-wC-y を組み合わせるとテキストブロックの移動を行うことができます。 また、文字の削除を行わずにリージョンを kill-ring に保存するコマンド M-w もあります。 これと C-y を組み合わせれば、テキストブロックのコピーができます。

まとめると次のようになります。

  1. C-SPC または C-@ でリージョンの先頭をマーク
  2. リージョンの最後にカーソルを移動
  3. 移動する場合: C-w で領域をいったん削除し kill-ring に保存
  4. コピーする場合: M-w で領域を kill-ring に保存
  5. 移動先またはコピー先にカーソルを移動して C-y で挿入

バッファとウィンドウの操作

画面を複数のウィンドウに分割して、ひとつのバッファの異なる部分や、異なる別々のバッファを同時に表示するといったことができます。 いろいろ試してみてください。

C-x 2     カーソルのあるウィンドウを上下2つに分割
C-x 3     カーソルのあるウィンドウを左右2つに分割
C-x 1     カーソルのあるウィンドウ以外のウインドウを削除(バッファは削除されない)
C-x o     カーソルを別のウィンドウに移動
C-x b     編集対象のバッファを変更する
C-x k     カーソルのあるバッファを削除する
C-x C-b   バッファのリストを表示する

次の画像はこのテキストの編集画面です。

Emacs の画面分割:上と左下は 08.muse の編集、右下は M-x man の実行
Emacs の画面分割:上と左下は 08.muse の編集、右下は M-x man の実行

文字列の検索

バッファ中の文字列を検索することができます。

C-s       前方検索(カーソルより後を検索)
C-r       後方検索(カーソルより前を検索)

C-s とするとエコー領域に

I-search:

と表示されます。 キーボードから検索したい文字列を入力すると、カーソルが一致した部分に移動します。 そこで RET とすると検索を始めた場所にマークが置かれ、リージョンが設定されます(C-x C-x とすればポイントとマークが入れ替わり、検索を開始した場所に戻れます)。 次の候補に移動したい場合は再度 C-s とします。

本日の課題

Emacs の使い方をおさらいしてみましょう。

準備

ターミナルから次のコマンドを実行してホームディレクトリに ogura.txt を用意します。

$ cp ~mtkg/comp_A/ogura.txt ./

基本 (1)

ファイルの読み込み

  1. ファイルの読み込み (C-x C-f)
    • Find file: と聞かれるので ogura.txt を読み込みます。

カーソルの移動

  1. カーソルを下に移動 (C-n)
  2. カーソルを上に移動 (C-p)
  3. カーソルを右に移動 (C-f)
  4. カーソルを左に移動 (C-b)
  5. カーソルを行末に移動 (C-e)
  6. カーソルを行頭に移動 (C-a)
  7. カーソルを次のページに移動 (C-v)
  8. もう一度、カーソルを次のページに移動 (C-v)
  9. カーソルを前のページに移動 (M-v)
  10. カーソルをバッファの最後に移動 (M->)
  11. カーソルをバッファの先頭に移動 (M-<)

検索

  1. 「70」という文字列を検索 (C-s)
  2. カーソルをバッファの先頭に移動 (M-<)

編集コマンド

  1. カーソル位置の文字を削除 (C-d)
  2. 直前の操作を取り消し (C-x u)
  3. カーソル位置から行末までを削除(削除される部分は kill-ring に保存される) (C-k)
  4. kill-ring からペースト (C-y)
  5. カーソルをバッファの先頭に移動 (M-<)
  6. マークを置く (C-SPC または C-@)
  7. カーソルを3行下に移動 (C-n)
  8. リージョンを削除 (C-w))
  9. カーソルをバッファの最後に移動 (M->)
  10. kill-ring からペースト (C-y)
  11. ファイルを保存 (C-x C-s)

ウィンドウの分割

  1. ウィンドウを2つに分割する (C-x 2)
  2. カーソルを別のウィンドウに移動する (C-x o)
  3. 別のファイルを読み込む(例えば /etc/passwd)
    • /etc/passwd には書き込み権限がないので読み取り専用モードでオープンされます。
  4. カーソルのあるウィンドウ以外を削除 (C-x 1)
  5. カーソルのあるバッファを削除 (C-x k)
  6. バッファ一覧を表示 (C-x C-b)

終了

  1. Emacs を終了 (C-x C-c)

基本 (2)

次のような内容のファイル sig.txt を作成してみましょう。 (名前や所属、メールアドレスは適宜変更すること。)

--
京産 太郎       (京都産業大学理学部物理科学科)
Taro Kyousan    (Faculty of Science, Kyoto Sangyo University)
Email: noname _AT_ cc.kyoto-su.ac.jp

C プログラム (1)

次のような内容のファイルを hello.c という名前で作成しましょう。 これは秋学期に行う C プログラミングの例になっています。

#include <stdio.h>

int main(void)
{
    printf("hello world\n");
    return 0;
}

端末から次のコマンドを実行します。

$ gcc hello.c
$ ./a.out

端末に "hello world" と表示されれば OK です。

C プログラム (2)

次のような内容のファイルを sum.c という名前で作成しましょう。

#include <stdio.h>

int main(void)
{
    int n, sum = 0;
    for(n = 1; n <= 100; n++) {
        sum = sum + n;
    }
    printf("1+2+...+100 = %d\n", sum);
    return 0;
}

端末から次のコマンドを実行します。

$ gcc sum.c
$ ./a.out

端末に "1+2+...+100 = 5050" と表示されれば OK です。 プログラムを変更して 1 から 1000 までの和を求めてみましょう。