acme (1)
目次
履歴
acme の解説は重要なのですが、多くの分量が要求されて億劫なのでこれまで放置されてきました。暇なおり順不同に書いていきます。
コンセプト
acme は UNIX で有名な emacs の Plan 9 版に相当します。acme には emacs にない面白い工夫があります。acme は Rob Pike による作品です。
acme の画面
この画面は自宅にある Mac の VirtualPC で動いている Plan 9 端末を使って
9fs hera # 1
cd /n/hera/mail/lib # 2
acme # 3
を実行したあといくらかの操作のあとに得られたものです。acme を実行する前の 2 つのコマンドは、大学の Plan 9 のファイルサーバに接続し(#1)、作業ディレクトリをサーバの /mail/lib
に移しています(#2)。
この図では acme 画面に2つのウィンドウが見えます。右に見えるのはディレクトリ/n/hera/mail/lib
、左に見えるのはファイル /n/hera/mail/lib/smtpd.conf
です。これらは一般に複数の行から構成され、ウィンドウの body と呼ばれます。これらの名前は、各々のウィンドウの上に1行で表示されている小さなウィンドウ(tag ウィンドウ)に書かれています。
- ウィンドウはスペースが許す限り、いくつでも作成できます
- ウィンドウは自由に再配置できます
再配置にはウィンドウの左上のコーナー
の四角の部分をマウスでドラッグします。
- ウィンドウを広げたり、1つの列に1個だけ残して他のウィンドウを画面から隠す事ができます。上と同様にウィンドウの左上のコーナーを利用します。左ボタン、中央のボタン、右ボタンを使って反応を確かめてください。
- どのウィンドウも文字の書き込みや削除ができます
操作はマウスとキーボードで行います。コントロールキーやカーソルキーは使用しません。
基本操作
どのウィンドウにおいても次の操作が共通です。
- 左ボタン
-
文字列を選択します。文字列に空白が含まれない場合にはドラッグする必要はありません。
- 中央ボタン
-
選ばれた文字列をコマンドとして実行します。
- 右ボタン
-
選ばれた文字列のファイルあるいはディレクトリがあればそれを開く
なければ、ウィンドウの中から同じ文字列を探します。
tag ウィンドには
名前 Del Snarf | Look
が現れます。これらは次の意味を持っています。
- 名前
-
ウィンドウの名前です
- Del
-
ウィンドウを削除します
- Snarf
-
選ばれた文字列を snarf バッファにコピーします。snarf バッファの文字列を貼付けるにはマウスの左ボタンで貼付け位置を選択し、左ボタンを押したまま、右ボタンをクリックします。
- |
-
パイプに使用します
- Look
-
文字列を探索します
ディレクトリの操作
ディレクトリの body ウィンドウにはファイルの名前が表示されています。マウスでファイルやディレクトリを選び、右ボタンを使ってディレクトリを渡り歩いたり、あるいは編集したいファイルを開きます。
ディレクトリの画面は自由に編集できます。しかし、その結果がディレクトリに反映されるわけではありません。いわば、作業領域的に使用できるわけです。ですからここにコマンドとその引数を書いて左ボタンと中央ボタンを使って実行させることができます。
この図では、ディレクトリウィンドウから
ls -l
を実行しています。左ボタンで選択された文字列の背景色が変化しています。また出力結果が別のウィンドウに表示されています。(名前に +Error
が追加されます。)
win
は acme の中だけで許される特別なコマンドです。
これによってコマンド実行を専門とするウィンドが生成されます。 (図の vpc
は、この端末の名称です。)
tag ウィンドウには
ディレクトリ名 Del Snarf Get | Look
が表示されています。Del, Snarf, |, Look はどのウィンドウでも共通です。Get がディレクトリウィンドウの tag に固有です。
- Get
-
ウィンドウの内容を一旦消去し、ディレクトリの内容を読み込みます。
ファイルの編集と保存
ファイルの変更前の tag ウィンドウは
ファイル名 Del Snarf | Look
ですが、変更すると
ファイル名 Del Snarf Undo Put | Look
に変わります。Undo を実行すると
ファイル名 Del Snarf Undo Redo Put | Look
のように、さらに Redo メニューが加わります。
Del, Snarf, |, Look の意味はどのウィンドウでも共通です。その他については
- Undo
-
やり直し。編集前の状態まで Undo できます。
- Redo
-
Undo の取り消し
- Put
-
編集結果を保存します。tag ウィンドウのファイル名を書き換えて Put すると、その名前のファイルに保存されます。(別名で保存)
文字列や行の探索
右ボタン
ファイルウィンドウの中では、ファイルの中に書かれている文字列を他の箇所で探す場合にはマウスの右ボタンを利用できます。
この例では "prompt" がファイルの中に何カ所かあり、その中の1つをカーソルで選択し、マウスの右ボタンを押すと、次の "prompt" にマウスカーソルが移動します。
この機能は大変便利な事が多いのですが、もしも "prompt" と言う名のディレクトリがサブディレクトリにあれば、それが開かれてしまいます。
文字列探索 Look
正式の文字列探索には Look を使用します。
図のように実行すべき文字列範囲を指定し、中央のボタンをクリックします。この場合にはファイルの中の文字列だけを探索します。
行番号にジャンプ
指定された行番号の行を探すには
:10
のように、:
のあとに 行番号を書き右クリックします。間に空白を入れてはなりません。行番号は 1 から始まります。
行範囲の選択
範囲を選択する事もできて
:3,6
で3行目から6行目までの範囲が選択されます(下図)。マウスの右ボタンをクリックします。
特にテキストのすべてを選択するには
:1,$
とします。$ はテキストの末尾を意味します。
現在の文字カーソルの位置からテキストの末尾までを選択するには
:.,$
です。. は現在の文字カーソルの位置を表します。
括弧対応
次の3種
{...} (...) [...]
の括弧の対応をマウスの左ボタンで簡単に調べる事ができます。
この機能はプログラミングにおいて大変重宝します。
例えば { } の括弧対応を調べるには { の次に文字カーソルを位置づけ右クリックします。あるいは } の前に文字カーソルを位置づけ右クリックします。
図で分かるようにネストを処理しています。しかし対応を調べる括弧が文字列やコメントの中に含まれる場合まで正しく処理しているわけではありません。
正規表現による探索
正規表現による文字列の指定は
:/正規表現/
の形式をとります。行末の / は省略できます。
例えば p
で始まり m
で終わる文字列であれば
:/p.*m/
です。
行ごとにマッチングが調べられます。マッチングは最長一致です。
正規表現による範囲の選択
:/正規表現/,/正規表現/
逆方向への探索
:-/正規表現/
で逆方向の探索ができます。行末の / は省略できます。
注意: 探索に成功するとマウスカーソルが見つけた文字列に移動するのでそのまま右クリックすると正方向に同じ文字列を探してしまいます。従って逆方向探索を続ける場合にはタグウィンドウの :-/正規表現
を右クリックし続ける必要があります。
編集コマンド Edit
tag ウィンドウには載っていないのですが Edit と言う強力なコマンドが存在します。Edit の使い方は Unix の標準ラインエディタ ed と似ています。
範囲の指定
次の図は Edit を使って 3行目から 6 行目までを選択しました。
3行目を選択する。
Edit 3
3行目から 6 行目までを選択する。
Edit 3,6
1行目から最後までを選択する。
Edit 1,$
文字列 usemouse を見つけて選択する。
Edit /usbmouse/
行末の / は省略できます。
3行目から文字列 usbmouse までを選択する。
Edit 3,/usbmouse/
文字列 usbmouse から最後までを選択する。
Edit /usbmouse/,$
文字列 usbmouse から sysname までを選択する。
Edit /usbmouse/,/sysname
選択された範囲は背景色が変化します。
逆方向への文字列探索
Edit ?正規表現?
の形式をとります。最後の ? は省略できます。
Edit ?name1?,/name2
とすると、現在のカーソル位置を内部に含み、文字列 name1 で始まり、文字列 name2 で終わる最小範囲が分かります。
「?正規表現」の形式による逆方向の探索は 「:-/正規表現」による文字列探索や行探索とは一貫性を持たず、好ましくないと考えられますが、Edit は sam エディタのシンタックス(同じ事であるが ed のシンタックス)を使っているためにこのようになったのだと思われます。
逆方向探索のニーズはプログラミナグにおいてはとても高いので、さらに簡便な方法がサポートされていれば良いと思います。例えば SHIFT キーを押しながらのマウス右ボタンなど。
文字列の置換
ed と同様な方法で文字列の置換を行えます。次のシンタックスに従います。
Edit 範囲 s/正規表現/置換文字列/g
置換を行う行範囲をあらかじめ指定しておけば「範囲」は省略できます。(マウスの右ボタンを押しながらでも範囲が定まります)
次の図は
Edit s/p.*m/alice/g
を実行した後の結果を表しています。
全ての範囲について置換を行うのであれば
Edit 1,$ s/p.*m/alice/g
とすればよいでしょう。
会話的な文字列置換はサポートされていません。一挙に文字列置換を行った場合の失敗確率は高いので、会話方式もサポートされるべきだと思います。
比較的会話方式に近いやりかたは
Edit /alice/ s/alice/bob
あるいは
Edit /alice/,$ s/alice/bob
のような書き方です。ここではテキスト中の alice を bob に会話的に書き換えるのですが、次の問題点があります。
- 変更前ではなく、変更結果を見せる。正しい変換でなければ Undo で処理する。
- 変換した場所を知るには自分でスクロールしなければならないことがある。
もっと良い方法があれば知らせてください。