!!!! 準備 前回の講義で解説があったプログラム([[GDK2014::イベント]])を例に説明していきます.一緒にemacsを操作しながら説明を聞いて下さい. 自分のディレクトリにない人は svnからダウンロードしてください. 8< #svnから持ってくる(実行した直下にinput_eventディレクトリができる) svn export https://svn.cis.iwate-u.ac.jp/svn/csd/kimura/input_event #持ってきたディレクトリに移動 cd input_event >8 !!!! コンパイル !!! コンパイルの実行 ほとんどの人が利用していると思いますが,作成したプログラムのコンパイルはEmacsから実行すると便利です. 「M-x compile」とすると,ミニバッファに「Compile Command: 」と表示されます.ここで実行したいコマンドを入力するとコンパイルを実行できます. 今まではミニバッファに「gcc xxxx.c -o xxxx」のようなコマンドをタイプしていたと思いますが, Makefile が作られている場合は,ミニバッファ「make」とタイプすればOKです. !!! エラー処理 (こちらも既に活用している人がいるかもしれませんが)Emacsからコンパイルする利点はコンパイルエラーを処理するときです. ショートカットキーを一度タイプするだけでエラー箇所へジャンプしてくれます. || C-x ` (バッククォート) | 次のエラーに対応する箇所へジャンプ(next-error) || M-g p | 前のエラーに対応する箇所へジャンプ(previous-error) このコマンドを次々に実行して,エラー箇所をチェックすることができます. !!!! バッファ,ウィンドウ,フレーム !!! バッファ Emacsでファイルを編集するとき,ファイルを直接に編集するわけではありません. まずファイルをいったん''バッファ''にコピーして,コピーしたものを編集します. 編集したコピーをファイルに保存すると,編集内容がファイルに反映されます. バッファに関する代表的な操作を3つ挙げます. || C-x b | 直前のバッファと切替える || C-x C-b | バッファ一覧の表示 || C-x k | 現在のバッファを閉じる !!! ウィンドウ バッファを表示している部分のことを''ウィンドウ''と言います. 要は,テキストを編集する部分のことです. ウィンドウに関する代表的な操作を下に挙げます. || C-x 2 | 現在のウィンドウを上下に2分割します. || C-x 3 | 現在のウィンドウを左右に2分割します. || C-x o | 別のウィンドウにカーソルを移動します. || C-x 0 | カーソルがあるウィンドウを消します. || C-x 1 | カーソルがあるウィンドウを残して、他のウィンドウを消します. !!ウィンドウの分割と合わせて使おう: シエルコマンドの実行 Emacsからコマンドを実行できます.ウィンドウ分割と合わせて使いましょう. ||M-x shell|サブシェルを起動.Emacsバッファを介して,コマンドの入出力を対話的に行うことができる ||M-!|ミニバッファ内でシェルコマンドを指定すると,そのコマンドの実行結果を表示してくれる (shell-command). !!! フレーム 画面に表示されている emacs 全体のことを''フレーム''と言います. フレームに関する便利なショートカットを以下にまとめます. || C-x 5 2 | 新しいフレームを作成して,現在のバッファを表示します. || C-x 5 o | 他のフレームへ移動します. || C-x 5 0 | 現在のフレームを削除します. || C-x 5 f | 新しいフレームを作成して,そこで指定したファイルを開きます || C-x 5 b | 新しいフレームを作成して,そこで指定したバッファを表示します. !!!! C-mode !!! モード Emacsは,編集するファイルに応じて固有の「モード」があります. 例えば * Cプログラムを編集するのはC mode * テキストを編集するのはtext mode * Makefileを編集するのはmakefile mode これらのモード(メジャーモード)は,主にファイルの拡張子で決まります. * 拡張子が c や h ならC mode * 拡張子が txt ならtext mode * ファイル名が Makefile や makefile なら makefile mode それぞれのモードには,その種類のファイルを編集するための色々な機能が用意されています. 例えば C mode では * 適切に字下げ(インデント)してくれる * ファイル内を移動する便利なコマンド などが用意されています. !!! 現在のモード 現在利用しているモードは,モードライン(Emacs下部にある灰色の部分)に表示されています. !! C-modeで使える便利な機能 || C-c C-q | 現在編集中の関数全体をインデント || M-a | カーソルが1 statementずつ戻る || M-e | カーソルが1 statementずつ進む || C-M-a | 関数の先頭へ移動 || C-M-e | 関数の末尾へ移動 || C-c C-c | リージョン内をコメントアウト || C-u C-c C-c | 上の逆操作(リージョン内のコメントをはずす) // !!! 便利なモード: 省略表示(hs-mode) // 長い if-else 文があるときに便利です. // if文のthen節を編集している途中で、else節の中身が見たくなるようなときが // よくあると思います. // 長いif文だと,else の中身を閲覧するためにカーソルを移動させるのは面倒ですよね.そのようなとき,then節を「省略」して表示できます. // まず, //8< //M-x hs-minor-mode //>8 //とタイプして,マイナーモードをhs-mode(Hide-Show モード)に変更します. //そうすると,以下のコマンドが使えます. //||C-c @ C-h| 現在のブロックを省略表示にする //||C-c @ C-s| 現在のブロックを通常表示にする //||C-c @ C-c| 現在のブロックの表示を通常/省略表示に切り替える //||C-c @ C-M-h| すべて省略表示にする //||C-c @ C-M-s| すべて通常表示にする // ------------------------------------- !!!! タグ !!! タグって? プログラムを作るとき, * 「この関数の定義を見直したい」 * 「前に#defineした値を忘れた」 // - 「この変数の型は何だっけ?」 と思うことが度々あります.その度にファイルをさかのぼって定義を見直すのは結構面倒な作業になります. さらに複数のファイルを使ってプログラムを作っているときは「この関数を定義したファイルはどれだっけ?」ということになり,さらに面倒になります. タグ(TAG)を使うと,こうした面倒から解消されます. マクロ,関数などがどのファイルにあるかという情報を,タグファイルというファイルに保存しておき,Emacsから必要なときに瞬時に参照したい情報を見ることができるようになります. !!! タグテーブルの作成 タグテーブルとは,複数のファイルで構成されるプログラムが,どのように各ファイルに分割されているのか記述したものです. これは,プログラムを構成するファイル名,そのファイルに入っている関数の名前やファイル内の位置の一覧です. ソースファイルがあるディレクトリで,次のコマンドを実行します. 8< % etags ファイル名 >8 プログラムをたくさんのファイルを使って作成している場合は 8< % etags *.h *.c >8 実行すると,そのディレクトリに ''TAGS'' というファイルができます。 このファイルには,プログラムで定義されている関数や変数の名前などが記録されています。 ! 補足 もしプログラムのソースを複数のディレクトリを使って作成している場合は,以下のようにして TAGS を作ります。 8< % find . -name "*.[ch]" -print | xargs etags >8 これで現在のディレクトリの下にある全ての *.c *.h ファイルを使ってTAGSを作ることができます. !!! タグの機能を使ってみる. 以下の2つの機能を使ってみよう. || M-. | 指定した関数を定義したファイルを開き,関数を定義している場所を表示 || C-x 4 . | 指定した関数を定義したファイルを別ウィンドウに開き,関数を定義している場所を表示 はじめてタグの機能を使うときは,タグテーブルの場所を聞かれるが, 先ほど作ったファイル(TAGS)をしてすれば良い.通常は,デフォルトのままで良い(つまり,そのままリターンを押せばよい).