\documentstyle[epsf,ascmac,alltt,fancybox]{jarticle}
\title{エディタ}
\date{}
\author{}
\newcommand{\dg}{\gt}
\newcommand{\dm}{\min}
\setlength{\topmargin}{-12mm}
\setlength{\textheight}{24.5truecm}
\setlength{\textwidth}{17truecm}
\setlength{\oddsidemargin}{-8.5mm}
\setlength{\evensidemargin}{-8.5mm}
\newcommand{\丸数字}[1]
{{\ooalign{\hfill\(\scriptstyle#1\)\hfill\crcr\(\bigcirc\)}}}
\newcommand{\CR}{\ovalbox{\ooalign{\hfill\(\scriptstyle\hookleftarrow\)\hfill\crcr}}}
\begin{document}
\maketitle
各種設定ファイルやプログラムのソースファイルを編集するために
{\dg\bf エディタ}(editor)\index{えでぃた@エディタ}\index{editor} は
不可欠である．通常，2 種類のエディタを使うことができる．

1 つは {\tt emacs} である．{\tt emacs} は GNU(GNU is Not UNIX)
\footnote{{\tt emacs} は，GNU プロジェクトの代表であるストールマンによ
り DEC-20 というミニコン上の TOPS-20 という OS 上で開発された。開発言
語は，TECO という LISP に似た言語で，その言語専用のエディタとして開発
された．よって {\tt emacs} 自身も TECO で記述した．その後，ゴスリング
(現サン・マイクロシステムズ) により C 言語で書き直されたが，さらに
ストールマンにより C 言語で書き直された．そして，GNU プロジェクトを旗
揚げした．}
というプロジェクトでつくり出したエディタで，無料で配布されている
({\dg\bf フリーソフトウエア}(free software)
\index{ふりーそふとうえあ@フリーソフトウエア}という)．
UNIX では {\tt emacs} は完全に，標準のツールである．
一口に {\tt emacs} といっても実はいくつもの亜種が存在し，
日本語を使うことができる {\tt emacs} エディタだけでも以下のプログラム
がある．
\begin{itemize}
\item 日本語が使えるようになった {\tt emacs} である{\tt nemacs}({\tt
    {\tt mule} の古いバージョン})
\item 多国語対応を目指して作られた {\tt mule} (GNU multi language emacs)
\item 小型の {\tt emacs} として開発された {\tt mg}(Micro GNU emacs) の
日本語版 {\tt ng}
\end{itemize}
サイズや拡張機能などの点での違いがあるが，基本的な編集機能
はほとんど同じである．
この演習では {\tt mule} を中心に説明する．

もう 1 つは，{\tt vi} エディタである．
このエディタは，UNIX に最初から備わっているエディタである．
このエディタには {\dg\bf コマンドモード}
(command mode)\index{こまんどもーど@コマンドモード}
\index{command mode} と {\dg\bf 挿入モード}(insert mode)
\index{そうにゅうもーど@挿入モード} の 2 つのモードがあり，
初心者が使うには，少し使いづらいかもしれない．
一方，サイズが非常に小さく，テキストの変更を行なうためには，明示的に
指定が必要で，意図しない書き換えがおきにくい，
などの特徴を持つ．システム管理のための設定ファイルの修正や，
いったん作成したプログラムのソースコードの修正などに適している．

\section{フルスクリーンエディタ {\tt mule}}
{\tt mule}\footnote{ここでは {\tt mule}という語は {\tt emacs}，{\tt ng}，
{\tt kemacs} の総称として用いている．手元のエディタ名と {\tt mule}
をおき替えよう．} はフルスクリーンエディタである．
キーボードから入力した文字は通常のテキストとして，全てカーソルキーの位置
に挿入される．
{\tt mule}は，テキスト入力以外の全ての操作は，すべて
\ovalbox{\tt CTRL} キーまたはメタキー(\ovalbox{\tt ESC} のこと)
を用いて行う．\ovalbox{\tt CTRL}+\ovalbox{\tt x}
に続いて何かを入力する形式が非常に多く使われる．

説明中ではコマンドは以下のように表現する．
\ovalbox{\tt CTRL}+\ovalbox{$<\hbox{キー}>$} は，\ovalbox{\tt CTRL} を
\underline{押しながら}\ovalbox{$<\hbox{キー}>$}
を入力することを示す．
\ovalbox{\tt CTRL}+\ovalbox{$<\hbox{キー1}>$}+\ovalbox{$<\hbox{キー2}>$} は，
\ovalbox{\tt CTRL}を\underline{押しながら}\ovalbox{$<\hbox{キー1}>$} を入力し，
\ovalbox{\tt CTRL}を\\\underline{離してから}\ovalbox{$<\hbox{キー2}>$}
を入力することを示す．
\ovalbox{\tt ESC}+\ovalbox{$<\hbox{キー}>$}は，\ovalbox{\tt ESC}を%
\underline{押してからすぐに離し}，
\ovalbox{$<\hbox{キー}>$} を入力することを示す．

\subsection{起動}
{\tt mule} は，マルチバッファ機能を備えているので以下のように複数のファ
イルを指定することができる．
\begin{itembox}[l]{起動}
\begin{alltt}
prompt\% \underline{mule \(<\hbox{ファイル名1}>\) \(<\hbox{ファイル名 2}>\cdots\)}\CR
\end{alltt}
\end{itembox}

\subsection{基本的な使い方}
\begin{center}\begin{tabular}{l|l}
\hline
\ovalbox{\tt CTRL}+\ovalbox{\tt x}+
\ovalbox{\tt CTRL}+\ovalbox{\tt s} & (save-file) ファイルの保存 \\
\ovalbox{\tt CTRL}+\ovalbox{\tt x}+
\ovalbox{\tt CTRL}+\ovalbox{\tt c} & (save-buffers-kill-emacs){\tt emacs}の終了\\
\ovalbox{\tt CTRL}+\ovalbox{\tt f} & $\rightarrow$(forward-char) 右へ\\
\ovalbox{\tt CTRL}+\ovalbox{\tt b} & $\leftarrow$(backward-char) 左へ\\
\ovalbox{\tt CTRL}+\ovalbox{\tt p} & $\uparrow$(previous-line) 上へ\\
\ovalbox{\tt CTRL}+\ovalbox{\tt n} & $\downarrow$(next-line) 下へ\\
\ovalbox{\tt CTRL}+\ovalbox{\tt v} & (scroll-up) 1画面前進\\
\ovalbox{\tt ESC}+\ovalbox{\tt v} & (scroll-down) 1画面後退\\
\ovalbox{\tt DEL} & (backward-delete-char) 後退\\
\ovalbox{\tt CTRL}+\ovalbox{\tt d} & (delete-char) 1文字削除\\
\ovalbox{\tt CTRL}+\ovalbox{\tt k} & (kill-line) 1行削除\\
\ovalbox{\tt CTRL}+\ovalbox{\tt y} & (yank) 一時バッファの内容を出力\\
\ovalbox{\tt CTRL}+\ovalbox{\tt s} & (iserch-forward)
前方にインクリメンタルサーチ\\
\ovalbox{\tt CTRL}+\ovalbox{\tt g} & (keyboard-quit) 実行中のコマンドの中止\\
\hline
\end{tabular}\end{center}
{\tt mule} を起動すると，
編集するファイルの最初の1ページが画面上に現れる．
カーソルを動かし，テキストを編集する．カーソルを動かすのは
\ovalbox{\tt CTRL}+\ovalbox{\tt f}，
\ovalbox{\tt CTRL}+\ovalbox{\tt b}，
\ovalbox{\tt CTRL}+\ovalbox{\tt p}，
\ovalbox{\tt CTRL}+\ovalbox{\tt n}
の4 つのキーであるが，これらは矢印キーで代用されている．
矢印キーに慣れている人はそちらを使ってもよい．

画面のスクロールには，\ovalbox{\tt CTRL}+\ovalbox{\tt v}，
\ovalbox{\tt ESC}+\ovalbox{\tt v}を使う．
編集が終ったら，\ovalbox{\tt CTRL}+\ovalbox{\tt x}+%
\ovalbox{\tt CTRL}+\ovalbox{\tt s}(save-file)で編集しているバッファ
の内容をファイルに書き出し，\ovalbox{\tt CTRL}+%
\ovalbox{\tt x}+\ovalbox{\tt CTRL}+\ovalbox{\tt c}
(save-buffers-kill-emacs)で終了する．
保存をせずに終了したい時は，\ovalbox{\tt CTRL}+%
\ovalbox{\tt x}+\ovalbox{\tt CTRL}+\ovalbox{\tt c}
を実行し\newline
\underline{ファイルをセーブしますか?}
という問いに{\tt n}，\underline{本当にエディタを終了しますか?}
という問いに{\tt yes}と答える．

\subsection{進んだ使い方}
他にいろいろな操作が必要となる場合がある．
\begin{enumerate}
\item 2つ以上のファイルを同時に編集する\\
別のファイルを参照しながら編集を行ないたい，
別ファイルの一部分を持ってきたい，などを処理するためには，編集中に
\ovalbox{\tt CTRL}+\ovalbox{\tt x}+\ovalbox{\tt CTRL}+\ovalbox{\tt f}
(find-file)
さらにファイルネームを入力し，バッファの切替えは
\ovalbox{\tt CTRL}+\ovalbox{\tt x}+\ovalbox{\tt b}\newline
(switch-to-buffer) コマンドを入力する．不要になったバッファは
\ovalbox{\tt CTRL}+\ovalbox{\tt x}+\ovalbox{\tt k}(kill-buffer)
コマンドで切り離すことができる ({\tt mule}では，
ファイルを読み込んでメモリ上に読み込んだ領域を
{\dg\bf バッファ}(buffer)\index{ばっふぁ@バッファ}\index{buffer}という)．

上のコマンドは，実行すると画面の最下行にカーソルが移動し，ファイル
やバッファの名前を入力できる．さらに，補完機能
を利用することができる．
入力待ちで \ovalbox{$<\hbox{\tt SP}>$} を入力すると，
画面の半分の大きさのウインドウがあらわれ，
指定できる候補がすべて列挙される．また，候補の頭文字の何文字かを
入力してもう一度\ovalbox{$<\hbox{\tt SP}>$}を押すと，
その頭文字をもつ候補に共通な部分を {\tt mule} が補完してくれる．
これを繰り返すと目標の候補を非常に素早く選ぶことができる．

\item 領域をコピーする\\
テキストのある部分を，コピーしたり移動したりしたい場合は，
\ovalbox{\tt CTRL}+\ovalbox{\tt k}
(kill-line) コマンドを使う．このコマンドは，1 回実行すると
カーソルからその行の末尾までを消去し，もう 1 回実行すると，
その行の改行文字を消去する．連続して何回も実行すると，
何行もまとめて消去することがでる．この時に消去した連続した領域は全て
{\dg\bf 一時バッファ} に格納される．

さらに \ovalbox{\tt CTRL}+\ovalbox{\tt y}(yank)
を入力すると，一時バッファ中のテキストがカーソルの位置に
出力される．yank は何度でも実行することができるので，
コピーしたい場合時は，まず kill-line コマンドでコピーしたい領域を消去し，
その場で yank を実行し消去した領域を元に戻し，
適当な場所にテキストを持っていく．

\item 検索，置換を行なう\\
検索には，{\dg\bf インクリメンタル検索}(incremental search)
\index{いんくりめんたるけんさく@インクリメンタル検索}
\index{incremental search}と
{\dg\bf 通常検索}(normal search)
\index{つうじょうけんさく@通常検索}\index{normal search}の 2 種類がある．
インクリメンタル検索は，1 文字を入力した時点でその 1 文字が存在する
場所を検索して直ちにジャンプし，2 文字目を入力すると今度はその 2 文字が存在
する場所にジャンプ $\cdots$ というように，
検索文字の入力と同時に検索が実行されていく．
極端に遅い端末以外では，インクリメンタル検索が便利である．
どちらの検索を行なっても，\ovalbox{\tt CTRL}+\ovalbox{\tt s}+
\ovalbox{\tt CTRL}+\ovalbox{\tt r} で直前の検索文字について再度，前方/後方に
検索を行なうことができる．
置換では，\ovalbox{\tt ESC}+\ovalbox{\tt \%}を実行できる対話置換が便利
であろう．このコマンドを実行すると，まず元文字列と置換文字列を尋ねて来
る．そのあと，全ての置き換
えについて，確認を尋ねられる．このとき次のどれかで返答する．
\begin{center}\begin{tabular}{l|l}
\hline
\ovalbox{$<\hbox{\tt SP}>$} & (yes) 置換を行なう\\
\ovalbox{\tt DEL} & (no) 置換をしない\\
{\tt !} & (do rest) これ以降確は，確認無しで全て置換\\
\ovalbox{\tt ESC} & (stop) 終了\\
{\tt .} & (abort back) 終了(カーソルは元位置へ)\\
\ovalbox{\tt CTRL}+\ovalbox{\tt g} & (abort) 中止\\
\hline
\end{tabular}\end{center}
{\tt vi}の説明中で紹介された正規表現を使った検索，置換も実行することが
できる．

\item キーに割り当てされていないコマンドを使いたい\\
{\tt mule} のコマンドは，実はキーに割り当てされているものだけではない．
キー割り当てされないコマンドは，コマンド
名を直接入力し実行する．
上で紹介した命令も，すべて名前がついている．やはり同じ方法で実行するこ
とができる．次に示す．
\end{enumerate}

\begin{center}\begin{tabular}{l|l}
\hline
\ovalbox{\tt ESC}+\ovalbox{\tt x} & (execute-extended-command)
コマンドを，コマンド名を入力することで実行\\
\hline
\end{tabular}\end{center}
この命令を実行すると，最下行で行入力が可能な状態になるが，補完機能が使
用することができる．補完を使って，いろいろなコマンドを候補のリスト
を選ぶことができる．

\subsection{ファイルの操作}
\begin{center}\begin{tabular}{l|l}
\hline
\ovalbox{\tt CTRL}+\ovalbox{\tt x}+\ovalbox{\tt CTRL}+%
\ovalbox{\tt s} & (save-file) 保存する \\
\ovalbox{\tt CTRL}+\ovalbox{\tt x}+\ovalbox{\tt CTRL}+%
\ovalbox{\tt c} & (save-buffers-kill-emacs){\tt emacs}を終了する \\
\ovalbox{\tt CTRL}+\ovalbox{\tt x}+\ovalbox{\tt CTRL}+%
\ovalbox{\tt f} & (find-file) ファイルを読み込む \\
\ovalbox{\tt CTRL}+\ovalbox{\tt x}+\ovalbox{\tt k}
                & (kill-buffer) バッファを捨てる \\
\ovalbox{\tt CTRL}+\ovalbox{\tt x}+\ovalbox{\tt b}
                & (switch-to-buffer) 表示バッファを切替える \\
\ovalbox{\tt CTRL}+\ovalbox{\tt x}+\ovalbox{\tt CTRL}+%
\ovalbox{\tt w} & (write file) バッファをファイルに書き出す \\
\ovalbox{\tt CTRL}+\ovalbox{\tt x}+\ovalbox{\tt i} &
(insert file) カーソル位置にファイルを挿入する \\
\hline
\end{tabular}\end{center}

\subsection{カーソルの移動}
\begin{center}\begin{tabular}{l|l}
\hline
\ovalbox{\tt CTRL}+\ovalbox{\tt f} & $\rightarrow$(forward-char) 右へ\\
\ovalbox{\tt CTRL}+\ovalbox{\tt b} & $\leftarrow$(backward-char)  左へ\\
\ovalbox{\tt CTRL}+\ovalbox{\tt p} & $\uparrow$(previous-line) 上へ\\
\ovalbox{\tt CTRL}+\ovalbox{\tt n} & $\downarrow$(next-line) 下へ\\
\ovalbox{\tt CTRL}+\ovalbox{\tt v} & (scroll-up) 1画面前進\\
\ovalbox{\tt ESC}+\ovalbox{\tt v}  & (scroll-down) 1画面後退\\
\ovalbox{\tt CTRL}+\ovalbox{\tt a} & (beginning-of-line)行頭へ移動\\
\ovalbox{\tt CTRL}+\ovalbox{\tt e} & (end-of-line) 行末へ移動\\
\ovalbox{\tt ESC}+\ovalbox{\tt <}  & (beginning-of-buffer)バッファ先頭へ\\
\ovalbox{\tt ESC}+\ovalbox{\tt >}  & (end-of-buffer) バッファ末尾へ\\
\hline
\end{tabular}\end{center}

\subsection{消去}
\begin{center}\begin{tabular}{l|l}
\hline
\ovalbox{\tt DEL} & (backward-delete-char) カーソル直前1文字を削除\\
\ovalbox{\tt CTRL}+\ovalbox{\tt d} & (delete-char) 1文字削除\\
\ovalbox{\tt CTRL}+\ovalbox{\tt k} & (kill-line) 1行削除\\
\hline
\end{tabular}\end{center}

\subsection{バッファ操作}
{\tt mule}は 1 単語以上の領域を削除すると，
一時バッファに格納される．
一時バッファ中に格納されたテキストは，下の {\tt yank} コマンドで出力される．
また，マークセット({\tt mark-set}) \index{まーくせっと@マークセット}
\index{mark-set@{\tt mark-set}} というコマンドを実行後，
カーソルを後方に移動し領域消去，または領域コピーを行なうと，
マークした位置からその場所までの領域を一時バッファに格納される．
\begin{center}\begin{tabular}{l|l}
\hline
\ovalbox{\tt CTRL}+\ovalbox{\tt y} & (yank) 一時バッファの内容を出力\\
\ovalbox{\tt CTRL}+\ovalbox{$<\hbox{\tt SP}>$} & (set-mark-command) 
領域の先頭をマークする\\
\ovalbox{\tt CTRL}+\ovalbox{\tt w} & (kill-region) 領域を削除(バッファに収納)\\
\ovalbox{\tt ESC}+\ovalbox{\tt w} & (copy-region-as-kill) 
領域を一時バッファにコピー\\
\hline
\end{tabular}\end{center}

\subsection{文字列検索・置換}
\begin{enumerate}
\item インクリメンタル検索
\begin{center}\begin{tabular}{l|l}
\hline
\ovalbox{\tt CTRL}+\ovalbox{\tt s} & (iserch-forward) 
前方にインクリメンタル検索 \\
\ovalbox{\tt CTRL}+\ovalbox{\tt r} & (iserch-backward)
後方にインクリメンタル検索 \\
\hline
\end{tabular}\end{center}
\item 文字列置換
\begin{center}\begin{tabular}{l|l}
\hline
\ovalbox{\tt ESC}+\ovalbox{\tt \%} & (query-replace-string)対話置換の開始\\
\hline
\end{tabular}\end{center}
\item キャンセル・取消し(Undo)
\begin{center}\begin{tabular}{l|l}
\hline
\ovalbox{\tt CTRL}+\ovalbox{\tt g} & (keyboard-quit) 実行中のコマンド
の中止する \\
\ovalbox{\tt CTRL}+\ovalbox{\tt x}+\ovalbox{\tt u} &
(advertized-undo) 繰り返し可能なアンドゥ\\
\hline
\end{tabular}\end{center}
編集中に，誤った操作をしてしまったときなどに，上の undo を行なうことに
よってどんどん操作をさかのぼり復帰することができる．
\item ヘルプ
\begin{center}\begin{tabular}{l|l}
\hline
\ovalbox{\tt CTRL}+\ovalbox{\tt h} & (help-for-help) ヘルプの入口 \\
\ovalbox{\tt CTRL}+\ovalbox{\tt h}+\ovalbox{$<\hbox{文字列}>$} &
(command-apropos)  \ovalbox{$<\hbox{文字列}>$}
というコマンドのリストを表示する \\
\ovalbox{\tt CTRL}+\ovalbox{\tt h}+\ovalbox{\tt b} &
(describe-bindings) 現在のキー割り当て表を表示する \\
\ovalbox{\tt CTRL}+\ovalbox{\tt h}+\ovalbox{\tt c}+
\ovalbox{$<\hbox{キー}>$} &
(describe-key-briefly)\ovalbox{$<\hbox{キー}>$}が実行するコマンド名の
表示する \\
\ovalbox{\tt CTRL}+\ovalbox{\tt h}+\ovalbox{\tt i} &
(info) ドキュメントリーダーinfo(1) を実行，マニュアルを表示する \\
\ovalbox{\tt CTRL}+\ovalbox{\tt h}+\ovalbox{\tt t} &
(help-with-tutorial){\tt emacs} のチュートリアルを読み込み，表示する \\
\hline
\end{tabular}\end{center}
\end{enumerate}

\subsection{ウインドウ操作}
{\tt mule}は，画面を複数のウインドウに分けることができる．
\begin{center}\begin{tabular}{l|l}
\hline
\ovalbox{\tt CTRL}+\ovalbox{\tt x}+\ovalbox{\tt 2} &
(split-window-vertically)縦にウインドウを分割する\\
\ovalbox{\tt CTRL}+\ovalbox{\tt x}+\ovalbox{\tt 1} &
(delete-other-windows) 現在のウインドウ以外のウインドウを削除する \\
\ovalbox{\tt CTRL}+\ovalbox{\tt x}+\ovalbox{\tt 0} &
(delete-window) 現在のウインドウを削除する \\
\ovalbox{\tt CTRL}+\ovalbox{\tt x}+\ovalbox{\tt o} &
(other-window) 別のウインドウに移動する \\
\ovalbox{\tt CTRL}+\ovalbox{\tt x}+\ovalbox{\tt 3} &
(split-window-horizontally)横にウインドウを分割する \\
\hline
\end{tabular}\end{center}

\section{{\tt mule} の機能}
{\tt mule}は，スクリーン上部に{\dg\bf メニュー}(menu)
\index{めにゅー@メニュー}\index{menu}が，スクリーン右側には
{\dg\bf スクロールバー}(scroll bar)\index{すくろーるばー@スクロールバー}
\index{scroll bar}が表示されている．
マウスを用いてこのメニューやスクロールバーを操作できる．
{\dg\bf フレーム}という概念が導入されている(後述)．

\subsection{マウスを使った基本操作}
{\tt mule} は，カーソルを移動したい位置にマウスカーソル移動し左ボ
タンをクリックすると，その位置にカーソルが移動する．また，中ボタンを
クリックすると \ovalbox{\tt CTRL}+\ovalbox{\tt y} と同じように，一時バッ
ファの内容をマウスカーソルの位置に挿入する．四角いカーソルではなく，
マウスカーソルの位置に挿入するので間違えないようにしよう．こ
れは，複数の位置に同一文字列を挿入するような場合に便利である．また，一時
バッファに内容を入力するには，左ボタンをドラッグする．アンダーライン
が引かれている内容が一時バッファに入力される．
\begin{center}\begin{tabular}{l|l}
\hline
左ボタンクリック & 
(mouse-set-point)カーソルの移動する \\
中ボタンクリック &
(mouse-yank-at-click)一時バッファの内容を出力する \\
左ボタンドラッグ &
(mouse-set-region)一時バッファへ内容を入力する \\
\hline
\end{tabular}\end{center}

\subsection{スクロールバーを用いたスクロール}
スクロールバーは，テキストのどの位置を表示しているかを示したものである．
外側の枠はテキスト全体を表し，黒い部分のテキストが画面に表示されている．
画面の大きさよりもテキストのほうが小さい場合には，スクロールバー全
体が黒くなる．

スクロールバーの上にマウスカーソルを移動させると，マウスカーソルが上下
の矢印の形に変化する．この状態で，左ボタンをクリックすると，テキスト
が半画面ほど前へスクロールする．逆に，右ボタンをクリックすると，テキ
ストが半画面ほど後ろへスクロールする．また，中ボタンをドラッグしてマ
ウスを上下させることで，テキストをスクロールさせることもできる．
\begin{center}\begin{tabular}{l|l}
\hline
左ボタンクリック &
(scroll-bar-scroll-up)半画面前進する \\
右ボタンクリック &
(scroll-bar-scroll-down)半画面後退する \\
中ボタンドラッグ &
(scroll-bar-drag)画面のスクロールする \\
\hline
\end{tabular}\end{center}

\subsection{モードラインでのマウス操作}
{\tt mule} は，下から 2 行目は白黒反転しており，{\dg\bf モードライン}%
(mode line)\index{もーどらいん@モードライン}\index{mode line} という．
複数のウインドウが表示されている場合に，モードライン上にマウスカーソル
を移動させて中ボタンをクリックすると，
\ovalbox{\tt CTRL}+\ovalbox{\tt x}+\ovalbox{\tt 1} と同じように，そのウ
インドウ以外のウインドウを削除する．また，モードライン上で右ボタンを
クリックすると\newline
\ovalbox{\tt CTRL}+\ovalbox{\tt x}+\ovalbox{\tt 0} と同じように，ウイ
ンドウを削除する．
\begin{center}\begin{tabular}{l|l}
\hline
中ボタンクリック &
(mouse-delete-other-windows)他のウインドウを削除する \\
右ボタンクリック &
(mouse-delete-window)現在のウインドウを削除する \\
\hline
\end{tabular}\end{center}

\subsection{マウスを用いたウインドウの分割}
マウスを用いて，任意の位置で画面を複数のウインドウに分割することができる．
この場合，マウスカーソルの位置が画面を分割する位置になる．
\begin{center}\begin{tabular}{l|l}
\hline
スクロールバー上で\ovalbox{\tt CTRL}+中ボタンクリック &
(mouse-split-window-vertically)ウインドウを縦に分割\\
モードライン上で\ovalbox{\tt CTRL}+中ボタンクリック &
(mouse-split-window-horizontally)ウインドウを横に分割\\
\hline
\end{tabular}\end{center}

\subsection{メニューによる操作}
{\tt mule} では，キーを入力する代わりにメニューを用いて操作を
することができる．メニュー上にマウスカーソルを移動して，左ボタンをク
リックすると，プルダウンメニューが表示される．
このメニューの右側に括弧の中は，その機能に対するキー入力を表す．
すなわちメニューを選択する代わりに，括弧中のキーを押すことで，同様の処
理を実行することができる．起動時には，次のようなメニューがある．
\begin{center}\begin{tabular}{l|l}
\hline
Special &
{\tt mule} 上で動作するプログラムの呼出しする \\
Buffers &
現在のバッファやフレームの内容の一覧を表示・選択する \\
File &
ファイルのオープンやクローズなど \\
Edit &
アンドゥやカット＆ペーストなど \\
Help &
各種ヘルプ \\
\hline
\end{tabular}\end{center}
この他にも，編集しているファイルの内容によっては，メニューが追加される
ことがある．

\subsection{フレームの操作}
{\tt mule} の起動時に表示されるウインドウ全体を {\dg\bf フレーム}(frame)
\index{ふれーむ@フレーム}\index{frame} という．
表示領域を増やしたいときには，フレームを生成する．
よって，複数の {\tt mule} を起動するようなムダを省くことができる．
\begin{center}\begin{tabular}{l|l}
\hline
\ovalbox{\tt CTRL}+\ovalbox{\tt x}+\ovalbox{\tt 5}+\ovalbox{\tt 2} &
(make-frame)フレームの生成\\
\ovalbox{\tt CTRL}+\ovalbox{\tt x}+\ovalbox{\tt 5}+\ovalbox{\tt 0} &
(delete-frame)フレームの消去\\
\ovalbox{\tt CTRL}+\ovalbox{\tt x}+\ovalbox{\tt 5}+\ovalbox{\tt o} &
(other-frame)フレーム間の移動\\
\ovalbox{\tt CTRL}+\ovalbox{\tt x}+\ovalbox{\tt 5}+\ovalbox{\tt f} &
(find-file-other-frame)フレームを生成し，ファイルを読み込む\\
\hline
\end{tabular}\end{center}

\subsection{{\tt dired}}
ファイルをオープンする代わりに，ディレクトリをオープンすると%
{\tt dired}\index{dired}というツールが起動し，ファイルの一覧が表示
される．この状態でカーソルを上下に移動し \ovalbox{\tt e} を押すと，
指定したファイルをオープンする．その他にも，次のような操作ができる．
\begin{center}\begin{tabular}{l|l}
\hline
\ovalbox{\tt e} &
(dired-find-file) ファイルをオープンする \\
\ovalbox{\tt C} &
(dired-do-copy) ファイルコピーする \\
\ovalbox{\tt R} &
(dired-do-rename) ファイル名を変更する \\
\ovalbox{\tt D} &
(dired-do-delete) ファイルの削除する \\
\ovalbox{\tt q} &
(dired-quit){\tt dired} を終了する \\
\hline
\end{tabular}\end{center}
また，メニューを使って操作することもできる．

\subsection{辞書検索}
メニューの Special から Online Dictionary を選ぶと，新しいフレームが開
き {\dg\bf 辞書検索システム} \index{じしょけんさくしすてむ@辞書検索システム}
\index{online dictionary}が起動する．
メニューの Dict から Change Dictionary を選ぶことで，英和と和英を選択
することができる\footnote{広辞苑は選択できない．}．
検索するには \ovalbox{{\tt f}} を押す．パターンを入力すると候補が
表示され \ovalbox{{$<\hbox{\tt SP}>$}} と \ovalbox{{\tt DEL}} で内容をスク
ロールすることができる．辞書検索を終了するには \ovalbox{\tt q} を押す．
\begin{center}\begin{tabular}{l|l}
\hline
\ovalbox{\tt f} &
(od-lookup-pattern)検索する \\
\ovalbox{\tt q} &
(od-quit)終了する \\
\ovalbox{{$<\hbox{\tt SP}>$}} &
(od-scroll-entry-up)検索結果を上へスクロールする \\
\ovalbox{\tt DEL} &
(od-scroll-entry-down)検索結果を下へスクロールする \\
\hline
\end{tabular}\end{center}

\section{スクリーンエディタ{\tt vi}}
\begin{itembox}[l]{起動}
\begin{alltt}
prompt\% \underline{vi \(<\hbox{ファイル名}>\)}\CR
\end{alltt}\end{itembox}
{\tt vi} を起動する時，$<\hbox{ファイル名}>$というファイルが存在してい
なければ，新規ファイルになる．
もしファイルがあるならば，その最初の 1 ページ分の内容が画面に表示される．

\subsection{コマンドモードと挿入モード}
{\tt vi} には，{\dg\bf コマンドモード}(command mode)
\index{こまんどもーど@コマンドモード}\index{command mode}と
{\dg\bf 挿入モード}\index{そうにゅうもーど@挿入モード}
(insert mode)\index{insert mode}の2つのモードがあり，
これらを切替えながら作業を行う．コマンドモードは，
カーソルの移動や削除，文字列の検索などを行なうモードである．
挿入モードは，コマンドモードで目的の位置を決めた後で実際に書き
込みを行なうのに使われるモードである．

{\tt vi} を \underline{起動した直後は，コマンドモード} になっている．
現在のモードが挿入モードか，コマンドモードかという情報は特に画面に表示
されていないので注意しよう．

コマンドモードから，\ovalbox{\tt i}，\ovalbox{\tt a}，
\ovalbox{\tt o}のいずれかのキーを入力
すると，{\dg\bf 挿入モード}\index{そうにゅうもーど@挿入モード}に移り，
次から キー入力した文字はそのままテキストとしてカーソル位置に挿入され
る．
テキストの入力が終ったら \ovalbox{\tt ESC}を入力すると{\dg\bf コマンドモード}
\index{こまんどもーど@コマンドモード}に戻る．

また，コマンドモードで\ovalbox{\tt :}を入力すると，
ファイル操作や置換操作などの作業のために，最下行に{\tt :}が表示され，
後ろにコマンド入力ができる状態になる．
今どのモードにいるのか分からなくなった時には \ovalbox{\tt ESC} キーを
2 回以上押せば確実にコマンドモードに戻ることができる．

\subsection{基本的な使い方}
\ovalbox{\tt CTRL}+\ovalbox{$<\hbox{キー}>$}は，
\ovalbox{\tt CTRL}キーを押しなが
ら\ovalbox{$<\hbox{キー}>$}を押すことを示す．
{\tt vi}が起動するとコマンドモードになり入力はできない．まず，
カーソルを移動して入力を行ないたいところまで移動する．
カーソルの移動は，右手を自然にキーボードにおいた時に人差指が来る
\ovalbox{\tt j}の左右の4つのキー，\ovalbox{\tt h}，\ovalbox{\tt j}，
\ovalbox{\tt k}，\ovalbox{\tt l}を使う．
これらのキーを使った移動は最初は慣れないかもしれない．
矢印キーを使って移動ができるように設定されれているので，
使いやすい方を使用すればよい．大きく移動したい時は
\ovalbox{\tt CTRL}+\ovalbox{\tt f}，
\ovalbox{\tt CTRL}+\ovalbox{\tt b}でスクロール移動する．

入力したい場所までカーソルを移動させたら，挿入コマンドでテキストの入力
を開始する．\ovalbox{\tt i} キーで，カーソルの場所から挿入することがで
きる．\ovalbox{\tt a} キーを入力すると，カーソルが
1 文字右に動き，そこから挿入することができる．
\ovalbox{\tt i}キーと\ovalbox{\tt a}キーは場合によって使い分けよう．
テキストの入力中は \ovalbox{\tt BS} キーで後ろ向きに文字を削除できるが，
行をまたがって戻ることはできない．このときはいったん\ovalbox{\tt ESC}
を押してコマンドモードに戻ればよい．

テキストの削除は，コマンドモードで行う．\ovalbox{\tt x}キー
がカーソル位置の1文字を削除，\ovalbox{\tt d}+\ovalbox{\tt d}が1行を削
除する．
文字列の検索したいときには，\ovalbox{\tt /}キーをコマンドモードで入力
する．実行した直後に，
カーソルが画面の再下段に移動し，
ここで検索したい文字列を入力する．この時，入力する文字列に，
正規表現(後述)も使うことができる．同じ文字列を前方に再度検索
したい時は \ovalbox{\tt n} キーを使う．
\ovalbox{\tt .}キーは，
直前に実行したのコマンドを再度実行するキーである．
また，大抵のコマンドは，数値 $n$ を入力すると，$n$ 回繰り返すことができ
る．
テキストの編集が終ったら
\ovalbox{\tt :}+\ovalbox{\tt w}+\ovalbox{\tt q}
で {\dg\bf 保存}+{\dg\bf 終了} する．保存せずに終了する際は
\ovalbox{\tt :}+\ovalbox{\tt q}+\ovalbox{\tt !}を使う．

下に，{\tt vi}の基本的な命令を示す．
\begin{center}\begin{tabular}{l|l}
\hline
\ovalbox{\tt :}+\ovalbox{\tt w} & ファイルへの書き込み\\
\ovalbox{\tt :}+\ovalbox{\tt w}+\ovalbox{\tt !} & ファイルへ強制書き込み\\
\ovalbox{\tt :}+\ovalbox{\tt w}+\ovalbox{\tt q} & セーブ \& エディタ終了\\
\ovalbox{\tt :}+\ovalbox{\tt q} & エディタ終了\\
\ovalbox{\tt :}+\ovalbox{\tt q}+\ovalbox{\tt !} & 
テキストの変更を破棄して強制終了\\
\ovalbox{\tt h} & $\rightarrow$左へ\\
\ovalbox{\tt j} & $\downarrow$下へ\\
\ovalbox{\tt k} & $\uparrow$上へ\\
\ovalbox{\tt l} & $\rightarrow$右へ\\
\ovalbox{\tt CTRL}+\ovalbox{\tt f} & 前方へスクロール\\
\ovalbox{\tt CTRL}+\ovalbox{\tt b} & 後方へスクロール\\
\ovalbox{\tt i} & カーソル位置に挿入\\
\ovalbox{\tt a} & カーソル直後に挿入\\
\ovalbox{\tt o} & 次行に挿入\\
\ovalbox{\tt x} & 1文字削除\\
\ovalbox{\tt d}+\ovalbox{\tt d} & 1行削除\\
\ovalbox{\tt $<\hbox{行数}>$}+\ovalbox{\tt G} & 指定行へ．
$<\hbox{行数}>$を省略すると最終行へ\\
\ovalbox{\tt /}+\ovalbox{$<\hbox{文字列}>$} & 文字列を前方検索\\
\ovalbox{\tt .} & 直前の命令をもう一度実行\\
\ovalbox{\tt $n$}+\ovalbox{$<\hbox{コマンド}>$} & 
\ovalbox{$<\hbox{コマンド}>$}を$n$回繰り返して実行\\
\hline
\end{tabular}\end{center}

\subsection{ファイル操作}
ファイル関係のコマンドを以下に示す．
まずコマンドモードで\ovalbox{\tt :}を入力し，
画面の最下行に入力行が移ったところで入力する．$<\hbox{ファイル名}>$を省
略すると，いま編集しているファイルが対象となる．たとえば，
テキストの修正を行い \ovalbox{\tt :}+\ovalbox{\tt e}+\ovalbox{\tt !}
を実行すると，そのテキスト自身の再読み込みを行ない，前にセーブしたところから
編集のやり直しになる．
\begin{center}\begin{tabular}{l|l}
\hline
\ovalbox{\tt :}+\ovalbox{\tt w}+\ovalbox{$<\hbox{ファイル名}>$} &
指定ファイルへの書き込み\\
\ovalbox{\tt :}+\ovalbox{\tt w}+\ovalbox{\tt !}+
\ovalbox{$<\hbox{ファイル名}>$} & 指定ファイルへ強制書き込み\\
\ovalbox{\tt :}+\ovalbox{\tt w}+\ovalbox{\tt q} & セーブ＆エディタ終了\\
\ovalbox{\tt :}+\ovalbox{\tt q} & エディタ終了\\
\ovalbox{\tt :}+\ovalbox{\tt q}+\ovalbox{\tt !} &
テキストの変更を破棄して強制終了\\
\ovalbox{\tt :}+\ovalbox{\tt r}+\ovalbox{$<\hbox{ファイル名}>$} &
次行へ指定ファイルの読み込み\\
\ovalbox{\tt :}+\ovalbox{\tt e}+\ovalbox{$<\hbox{ファイル名}>$} &
指定ファイルの読み込み，編集\\
\ovalbox{\tt :}+\ovalbox{\tt e}+\ovalbox{\tt !}+
\ovalbox{$<\hbox{ファイル名}>$} & 指定ファイルを強制読み込み，編集\\
\hline
\end{tabular}\end{center}

\subsection{テキストの操作}
\begin{enumerate}
\item テキストの挿入\\
以下のコマンドを入力すると挿入モードに入り，テキストの入力を行うことが
できる．
\ovalbox{\tt ESC}を入力すればコマンドモードに戻る．
\begin{center}\begin{tabular}{l|l}
\hline
\ovalbox{\tt i} & カーソル位置に挿入\\
\ovalbox{\tt a} & カーソル直後に挿入\\
\ovalbox{\tt I} & 行頭に挿入\\
\ovalbox{\tt A} & 行末に挿入\\
\ovalbox{\tt o} & 次行に挿入\\
\ovalbox{\tt O} & 前行に挿入\\
\hline
\end{tabular}\end{center}

\item テキストの削除\\
カーソルを削除したい場所へ移動し，以下のコマンドを入力すると，文字また
は文字列を削除する．
\begin{center}\begin{tabular}{l|l}
\hline
\ovalbox{\tt x} & 1文字削除\\
\ovalbox{\tt d}+\ovalbox{\tt w} & 1語削除\\
\ovalbox{\tt d}+\ovalbox{\tt d} & 1行削除\\
\ovalbox{\tt D} & 行末まで削除\\
\hline
\end{tabular}\end{center}

\item テキストのおき替え\\
以下のコマンドは，文字やテキストを新しく取り替えたいときに使用する．
\ovalbox{\tt r}以外のコマンドを使用すると，挿入モードに入る．
\begin{center}\begin{tabular}{l|l}
\hline
\ovalbox{\tt r} & 1文字を1文字と\\
\ovalbox{\tt s} & 1文字を文字列と\\
\ovalbox{\tt c}+\ovalbox{\tt w} & 1語を\\
\ovalbox{\tt c}+\ovalbox{\tt c} & 1行を\\
\ovalbox{\tt C} & 行末までを\\
\hline
\end{tabular}\end{center}
\end{enumerate}

\subsection{カーソルの移動}
カーソルの移動に関するコマンドを以下に示す．
\begin{enumerate}
\item 移動\\
\begin{center}\begin{tabular}{l|l}
\hline
\ovalbox{\tt h} & $\leftarrow$ 左へ\\
\ovalbox{\tt j} & $\downarrow$下へ\\
\ovalbox{\tt k} & $\uparrow$上へ\\
\ovalbox{\tt l} & $\rightarrow$右へ\\
\ovalbox{\tt 0} & 行頭へ\\
\ovalbox{\tt \$} & 行末へ\\
\ovalbox{\tt -} & 前行先頭へ\\
\ovalbox{\tt +} & 次行先頭へ\\
\hline
\end{tabular}\end{center}
\item 単語移動\\
\begin{center}\begin{tabular}{l|l}
\hline
\ovalbox{\tt w} & 直後の単語へ\\
\ovalbox{\tt b} & 直前の単語へ\\
\ovalbox{\tt e} & カーソル位置の単語の最後の文字へ\\
\hline
\end{tabular}\end{center}
\item スクロール\\
\begin{center}\begin{tabular}{l|l}
\hline
\ovalbox{\tt CTRL}+\ovalbox{\tt f} & フォーワード\\
\ovalbox{\tt CTRL}+\ovalbox{\tt b} & バックワード\\
\ovalbox{\tt CTRL}+\ovalbox{\tt d} & ダウンスクロール\\
\ovalbox{\tt CTRL}+\ovalbox{\tt u} & アップスクロール\\
\hline
\end{tabular}\end{center}
\item ジャンプ\\
\begin{center}\begin{tabular}{l|l}
\hline
\ovalbox{\tt H} & ホームポジションへ\\
\ovalbox{\tt \%} & 対応する括弧へ\\
\ovalbox{$<\hbox{行数}>$}+\ovalbox{\tt G} &
指定行へ，\ovalbox{$<\hbox{行数}>$}を省略すると最終行へ\\
\hline
\end{tabular}\end{center}
\end{enumerate}

\subsection{文字列検索}
以下は，指定した文字列を検索し，その場所へジャンプするコマンドである．
\begin{center}\begin{tabular}{l|l}
\hline
\ovalbox{\tt /}+\ovalbox{$<\hbox{文字列}>$} & 文字列を前方検索\\
\ovalbox{\tt ?}+\ovalbox{$<\hbox{文字列}>$} & 文字列を後方検索\\
\ovalbox{\tt n} & 直前に検索した文字列の前方再検索\\
\ovalbox{\tt N} & 直前に検索した文字列の後方再検索\\
\hline
\end{tabular}\end{center}

\subsection{バッファ操作}
「テキストの削除」で紹介したコマンドを使用すると削除した部分は
{\dg\bf 一時バッファ}(temporary buffer)\index{いちじばっふぁ@一時バッ
ファ}\index{temporary buffer}に格納される．
この一時バッファの内容は下のコマンドで出力することができる．
\begin{center}\begin{tabular}{l|l}
\hline
\ovalbox{\tt p} & 一時バッファの内容をカーソル直後へ\\
\ovalbox{\tt P} & 一時バッファの内容をカーソル位置へ\\
\ovalbox{\tt y}+\ovalbox{\tt w} & 1語を一時バッファへ\\
\ovalbox{\tt y}+\ovalbox{\tt y} & 1行を一時バッファへ\\
\ovalbox{\tt Y} & 行末までを一時バッファへ\\
\hline
\end{tabular}\end{center}

\subsection{置換}
文字列置換をするためには，まず \ovalbox{\tt :} を入力し，最下行で
コマンドを入力できる状態にする．
そのあと，置換コマンド \ovalbox{\tt s} を実行する．\ovalbox{\tt s}
コマンドの書式を以下に示す．
\begin{alltt}
: [範囲指定] s/検索文字列/置換文字列/[オプション]
\end{alltt}
\begin{itembox}[l]{全ての{\tt foolish}を{\tt genius}に置換したい}
\begin{alltt}
:\% s/foolish/genius/g
\end{alltt}
\end{itembox}
と入力する．
\begin{itemize}
\item 範囲指定\\
省略するとその行のみ，\ovalbox{\tt \%}でファイル全体，
始行, 終行で部分範囲を置換範囲として指定する．
\item オプション\\
\ovalbox{\tt g}を指定すると1行の中で何回でも置換を行う．
指定しないと 1 行の中の最初にあるものだけを置換する．
\end{itemize}

\subsection{正規表現}
{\dg\bf 正規表現}(regular expression)\index{せいきひょうげん@正規表現}とは，
\index{regular expressions}
ある条件に当てはまる文字列を指定する方法である．
この方式で，前述の検索コマンドや置換コマンド中の検索文字列というパラメータを
入力することができる．正規表現で使う特殊文字を以下に示す．
\begin{center}\begin{tabular}{l|l}
\hline
{\tt \^{}} & 行の始まりと一致する\\
{\tt \$} & 行の終りと一致する\\
{\tt .} & 任意の1文字と一致する\\
{\tt *} & 直前の文字の任意個の繰り返しに一致する\\
{$<\hbox{文字}>$} & 文字の中のどれか1文字に一致．
また，\hbox{\tt -}で文字の範囲を指定できる\\
{\tt [ \^{} $<\hbox{文字}>$ ]} & 文字の中に入らないどれか 1 文字に一致\\
{\tt n <} & 単語の始まりと一致する\\
{\tt n >} & 単語の終わりと一致する\\
\hline
\end{tabular}\end{center}
正規表現の例:\newline
\begin{center}\begin{tabular}{l|l}
\hline
\ovalbox{\tt e}+\ovalbox{\tt .}+\ovalbox{\tt .}+\ovalbox{\tt
  .}+\ovalbox{\tt s} & {\tt e}で始まり{\tt s}で終わる5 文字．たとえば
{\tt emacs}\\
\ovalbox{\tt a}+\ovalbox{\tt b}+\ovalbox{\tt *}+\ovalbox{\tt c} &
{\tt "ac"}，{\tt "abc"}，{\tt "abbc"}，{\tt "abbbc"}の全てにあてはまる\\
\ovalbox{\tt \^{}}+\ovalbox{\tt a}+\ovalbox{\tt .}+\ovalbox{\tt *}+
\ovalbox{\tt b}+\ovalbox{\tt \$} & 
{\tt a}で始まり{\tt b}で終わる行と一致\\
\ovalbox{\tt [}+\ovalbox{\tt b}+\ovalbox{\tt f}+\ovalbox{\tt
  k}+\ovalbox{\tt ]}+\ovalbox{\tt i}+\ovalbox{\tt n}+\ovalbox{\tt d} &
{\tt "bind"}，{\tt "find"}，{\tt "kind"}にあてはまる．\\
\ovalbox{\tt [}+\ovalbox{\tt a}+\ovalbox{\tt b}+\ovalbox{\tt c}
+\ovalbox{\tt ]}+\ovalbox{\tt *} &
{\tt "a"}，{\tt "b"}，{\tt "c"}だけからなる，すべての文字列\\
\ovalbox{\tt i}+\ovalbox{\tt s}+\ovalbox{\tt w}+\ovalbox{\tt s}+
\ovalbox{\tt [}+\ovalbox{\tt 1}+\ovalbox{\tt -}+\ovalbox{\tt 6}
+\ovalbox{\tt ]}+\ovalbox{\tt 0} & {\tt "isws10"}，{\tt "isws20"}
$\cdots${\tt "isws60"}にあてはまる\\
\ovalbox{\tt [}+\ovalbox{\tt \^{}}+\ovalbox{\tt a}+\ovalbox{\tt -}+
\ovalbox{\tt z}+\ovalbox{\tt A}+\ovalbox{\tt -}+
\ovalbox{\tt Z}+\ovalbox{\tt ]} & アルファベット以外の1 文字と一致\\
\ovalbox{$\backslash$}+\ovalbox{\tt <}+\ovalbox{\tt w}+
\ovalbox{\tt [}+\ovalbox{\tt \^{}}+\ovalbox{\tt ]}+\ovalbox{\tt *}+
\ovalbox{\tt e}+\ovalbox{$\backslash$}+\ovalbox{\tt >} &
{\tt w}で始まり空白以外の文字が続き{\tt e}で終わる単語\\
\hline
\end{tabular}\end{center}
正規表現に関する詳細は，オンラインマニュアルの grep(1) を参照すること．

\subsection{その他}
\begin{center}\begin{tabular}{l|l}
\hline
\ovalbox{\tt .} & 直前の命令をもう一度実行\\
\ovalbox{$n$}+\ovalbox{$<\hbox{コマンド}>$} &
$<\hbox{コマンド}>$を$n$回繰り返して実行\\
\hline
\end{tabular}\end{center}

\end{document}
