Emacs とは

GNU Emacs (グニュー・イーマックス)は UNIX 上のプログラミングにひろく用いられているエディタです。 Emacs Lisp というプログラミング言語を使って機能拡張することができます。 文書やプログラムの作成だけでなく、設定次第で電子メールの読み書きも可能です。

使いこなすには参考書があったほうがよいでしょう。

事前準備

ターミナルから次のコマンドを実行して利用環境を設定します。 $ 記号はシェルのプロンプトを示しており、自分で入力する必要があるのは ~mtkg からになります。

$ ~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 は終了します。

ファイルの編集

ファイルの作成 (C-x C-f)

まず、Emacs を起動しておきます。 ターミナルから次のコマンドを実行してください。

$ emacs &

ファイルを読み書きするには、まずファイルをオープンします。 C-x C-f とタイプすると、エコー領域(Emacs の一番下の部分)に

Find file: ~/

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

ファイルの編集

次のような内容のファイルを作成してみましょう。

親譲の無鉄砲で小供の時から損ばかりしている。小学校に居る時分
学校の二階から飛び降りて一週間ほど腰を抜ぬかした事がある。な
ぜそんな無闇をしたと聞く人があるかも知れぬ。別段深い理由でも
ない。新築の二階から首を出していたら、同級生の一人が冗談に、

ファイルの保存 (C-x C-s)

ファイルを保存するには次のコマンドを使います。 (漢字が思うように出てこない場合は平仮名で構いません。)

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

削除、移動、コピー

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

C-h       カーソルの前の文字を削除
C-d       カーソルの置かれた文字を削除
C-k       カーソルの置かれた文字から行末までを削除
C-y       削除した行をカーソル位置に挿入
C-x u     編集の取り消し(必要な回数繰り返す)

高度な編集コマンド

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

Emacs では「ポイント・マーク・リージョン」を利用してファイルを編集することができます。 それぞれの意味は次のようになります。

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

Emacs ではリージョンを削除またはコピーすることができます。 削除またはコピーしたリージョンは kill-ring に保存され、別の場所にコピーすることができます。

テキストブロックのコピー(または移動)方法は次のようになります。

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

編集コマンドをまとめておきます。

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

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

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

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 の画面分割:上と左下は 09.muse の編集、右下は M-x man の実行
Emacs の画面分割:上と左下は 09.muse の編集、右下は M-x man の実行

文字列の検索

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

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

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

I-search:

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

本日の課題

Fortran プログラム (1)

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

program hello_world
  write(*,*) 'hello world'
end program hello_world

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

$ gfortran hello.f90
$ ./a.out

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

Fortran プログラム (2)

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

program sum
  implicit none
  integer :: n, tmp
  tmp = 0
  do n = 1, 100
     tmp = tmp + n
  end do
  write(*,*) tmp
end program sum

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

$ gfortran sum.f90
$ ./a.out

端末に 5050 と表示されれば OK です。

Fortran プログラム (3)

sum.f90 を変更して 1 から 1000 までの和を求めてみましょう。