AZ-Prolog インタプリタはスクリーンエディタ (AzEdit) を内蔵しており、それを使って効率良くプログラムの修正および追加を行うことができます。
このエディタとインタプリタは密接な関係にあります。例えば、エディタコマンドにより、エディタバッファ(テキストを格納する領域)からファイルを介さずに直接、ヒープ領域(インタプリタのプログラム領域)に転送(コンサルトまたはリコンサルト)できます。しかも、シンタックスチェックをしながら転送しますので、転送中に構文エラーが発見されると、カーソルが移動してその箇所を知らせます。
また、このエディタ自身もPrologで記述されていますので、Prologの基礎知識があれば、そのプログラムを変更することで、キー割り当ての変更を初め、機能の追加・変更も自由にできます。
提供されたインタプリタにはコンパイルされたAzEditが拡張ライブラリとして付属していますので、読み込んでご使用いただけます。
?- dlib_require(azedit).
新しくインタプリタを生成する場合にはazedit.plをコンパイルしなおして付加するか、コンサルトして使用することが可能です。画面制御を伴うため、コンパイルする際はコンパイルオプション「/curses」または「/i (/dcursesを併用しない)」が必須となります。
本章ではAzEditの使い方と、機能拡張の方法を説明しています。
以下ここの説明で使う用語の定義をしておきます。
【エディタバッファ】
編集するテキストを格納するためのメモリ上の領域です。
AZ-Prolog ではこのバッファを最大8個まで確保できます。
なお、以下では単に、バッファと呼ぶこともあります。
また、漢字などの2バイト文字の扱いは書き込み時の漢字モードによって決定されます。
(漢字モードが「on」の場合は2バイトをまとめて1文字として扱い「off」の場合は1バイトずつに分けて2文字として扱います)
【バッファ番号】
バッファを識別するため、各バッファに付けられた番号です。
【現在のバッファ番号】
現在(述語を実行した時点)の操作対象となっているバッファの番号。
この現在のバッファ番号は「^C」コマンドにて変更(切り替え)できます。
なお、インタプリタ立ち上げ直後のデフォルト値は0です。
【キルバッファ】
「^W」「^K」「ESC D」コマンドでエディタバッファ内の文字列を削除した場合にその文字列が一時的にこのキルバッファに格納される仕組になっています。
キルバッファに格納された文字列は「^Y」コマンドによって任意の位置(現在のドット位置の次)に挿入することができ、これによって文字列の移動やコピーができます。
なお、このキルバッファは1つだけで各エディタバッファで共有します。
これにより、各エディタバッファ間でも文字列の移動やコピーができます。
【ドット】
通常は画面のカーソルがある位置がドット位置です。
バッファ中のポインタの一種で、このドットが指し示す位置に対して文字列の挿入・削除などの編集が行われます。
【マーク】
ドットと同じくバッファ中のポインタの一種で、このマーク位置へのジャンプや、このマークとドット間の文字に対して削除、キルバッファへのコピー、ヒープ領域へのコンサルトなどの操作を行うことができます。
なお、このマークは画面には表示されません。
【位置】
バッファの先頭からの文字数。
【文字数】
英数字などの1バイト文字は無条件で1文字と数えますが、漢字などの2バイト文字は書き込み時の漢字モードによって決定されます。
書き込み時の漢字モードが「on」だった場合は1文字として数え、「off」だった場合は1バイトずつに分けて2文字として数えます。
【NL】
改行コード。
【文字コード】
英数字などの1バイト文字のキャラクタコード、漢字などの2バイト文字の漢字コードを総称して「文字コード」と呼んでいます。
【画面】
コンソール画面、またはウィンドウシステムでは一つのウィンドウを指します。
【終端行】
画面中、エディタで使用している部分下端の次の行です。
「AZ-Prolog Editer (Version ….)*」と表示されます。
現在のバッファ番号が * のところに表示されます。
【前方】
バッファの最後に向う方向。(画面の下方向)
【後方】
バッファの先頭に向う方向。(画面の上方向)
【下方】
画面の下方向。バッファの最後に向う方向。前方。
【上方】
画面の上方向。バッファの先頭に向う方向。後方。
【直後】
すぐ前方。
【直前】
すぐ後方。
この節では AzEditでテキストを編集するために必要なコマンドを説明します。
AzEdit のコマンドは、コントロールキーあるいはエスケープキーを押すことにより実行されます。
なお「CTRL-F」(以下、「^F」と表現することもあります)は「コントロールキーを押しながらFを押すこと」を示すのはこれまでの章と同じです。
Windowsなどの一部OSでは、ESCキーが取得されないものもあり、このときはESCキーの代わりに「CTRL-[」で代用できます。コントロールキーを押しながら“[“キーを押します。
AzEditのプログラムを dlib_require(azedit) で読み込むと、次の3種類の方法よってエディタを起動することができます。
a)|?-edit. b)|?-edit(述語名). c)|?-editall.
現在のエディタバッファの状態でAzEditが起動されます。
エディタバッファを一旦空にして、ヒープ領域に定義されている述語の中から『述語名』で指定された述語のテキストをバッファエディタに転送後エディタを起動します。
また、『述語名』をlistingの場合と同じように『述語名/引数の数』、あるいは『述語名』と『述語名/引数の数』からなるリストを指定することもできます。
エディタバッファを一旦空にして、現在ヒープ領域定義されている全ての述語をエディタバッファに転送後エディタを起動します。
★インタプリタ立ち上げ後最初の起動
インタプリタ立ち上げ後最初にAzEditが起動されると、画面をクリアして
EditBuffersize(char):
と表示されます。
編集するテキストの文字数を入力して下さい。
(入力する値が、バイト数ではなく文字数であることに注意して下さい)
すると、画面のほぼ中央に
AZPrologEditer(Version1.0)-0
と表示されて、カーソルが画面の左上にあるはずです。
この表示された文字列はAzEditが画面上で使用する下端を示しています。
この文字列の最後の「-0」は現在のバッファ番号を表しています。
インタプリタ立ち上げ後最初にAzEditが起動されると必ず「0」となります。
★AzEditの再起動
一旦AzEditを終了した後に再び起動したときは、画面の上から数行をクリアしてそこにテキストの一部を表示して、その下端に
AZPrologEditer(Version1.0)?0
が表示されます。
そして、カーソルは現在のドット位置を示します。
これ以降テキストが変更されるとそれと同時に画面も変化し、常に編集しているテキストの状態を画面に表示します。
CTRL-F | カーソルを一文字前に移動(Forwardcharacter) |
CTRL-B | カーソルを一文字後ろに移動(Backwardcharacter) |
CTRL-N | カーソルを一行下に移動(Nextline) |
CTRL-P | カーソルを一行上に移動(Previousline) |
ESC-F | カーソルを現在の単語の次に移動 (Forwardword) |
ESC-B | カーソルを一つ前の単語の先頭に移動(Backwardword) |
CTRL-A | カーソルを次の行の先頭に移動 |
CTRL-E | カーソルを次の行の最後に移動(Endofline) |
CTRL-V | 次の画面を表示(Viewthenextscreen) |
CTRL-Z | 前の画面を表示 |
ESC-< | カーソルをテキストの先頭に移動 |
WSC-> | カーソルをテキストの最後に移動 |
CTRL-X CTRL-X | カーソルとマークの交換(Exchange) |
ESC-Space | カーソルの位置にマークを付ける |
CTRL-L | カーソルを中心に画面を再配置 |
(※カーソル移動コマンドは、英語を連想すると覚えやすいでしょう。)
AzEditでは、削除、挿入などのテキストの修正は全て現在表示されているカーソルの前後おいて行われます。
そのため、まずカーソルを所定の位置へ移動させる必要があります。
カーソル移動の基本的なコマンドとして、「CTRL-F」「CTRL-B」「CTRL-P」「CTRL-N」があります。
「CTRL-F」はカーソルを一文字前(テキストの最後に近づく方向)に進め、「CTRL-B」は逆にカーソルを一文字後ろ(テキストの先頭に近づく方向)に戻します。
また、「CTRL-P」は上、「CTRL-N」は下の行にカーソルをそれぞれ移動させます。
カーソルが行の最後にある場合にCTRL-Fを行うと、カーソルは次の行の先頭に移動します。
逆に、カーソルが行の先頭にある場合にCTRL-Bを行うと、前の行の最後に移動します。
このようにAzEditではテキストは一連のつながった文字の列として取り扱われ、行と行の区切りにはNL(NewLine)が文字として入れられています。
現在画面に表示されている外側にカーソルを移動させようとすると、自動的に前あるいは後ろの画面が表示されます。
例えば、カーソルが画面に表示されている最後の行にあるときに「CTRL-N」を行うと、次の画面が表示されます。
前の画面と新しい画面にはつながりを持たせるために数行のオーバーラップの行があります。
(オーバーラップの行数はそのときにAzEditが使用している行数の約1/4です。)
「CTRL-F」「CTRL-B」は一文字ごとにカーソルを前後に動かしましたが、単語単位で動かすこともできます。「ESC-F」は現在の単語の次の位置にカーソルを移動させ、「ESC-B」は一つ前の単語の先頭に移動させます(単語とは、一連のカナ漢字あるいは英数字の列のことです)。
現在カーソルのある行の先頭への移動は「CTRL-A」、最後へは「CTRL-E」で行えます。
カーソルが既に行の先頭あるいは最後にある場合に「CTRL-A」「CTRL-E」をそれぞれ行ってもカーソルは移動しません。
「CTRL-V」「CTRL-Z」は画面単位に移動させます。
「CTRL-V」は次の画面を、「CTRL-Z」は前の画面を表示します。
さらに、テキストの先頭には「ESC-<」で、最後にはESC->でカーソルをそれぞれ移動させることができます。
このとき、誤ってこれらのコマンドを使用した場合にすぐにもとの位置に戻せるように、コマンドを実行するまえのカーソルの位置にマークが付けられます。
マークの付けられた位置への移動は「CTRL-X CTRL-X (CTRL-Xを2度続けて打つ)」によって行えます。
実際には、「CTRL-X CTRL-X」は現在のカーソルの位置とマークされた位置を交換します。
つまり、カーソルはマークされた位置に移動し、前にカーソルのあった位置に新しいマークが付けられます。
また、「ESC-Space(エスケープキーを押してからスペースキーを押す)」現在のカーソルのある位置にマークを付けることもできます。
最後に、カーソルの移動ではありませんが、現在カーソルのある位置を中心としてテキストの前後を見たい場合がよくあります。
こんなときは「CTRL-L」で現在カーソルのある行を画面の中心として、その前後のテキストを再表示します。
Return | NLをカーソルの前に挿入 |
CTRL-O | NLをカーソルの位置に挿入(Openline) |
Tab | タブをカーソルの前に挿入 |
CTRL-Q | 特殊文字の挿入(Quotedinsert) |
CTRL-D | カーソル位置の文字を削除(Deletecharacter) |
BS,CTRL-H | カーソルの前の文字を削除(BackSpace) |
ESC-D | カーソルのある単語を削除(Deleteword) |
ESC-BS | カーソルの一つ前の単語を削除 |
CTRL-K | カーソルより右を削除(Killline) |
CTRL-W | カーソルとマークの間を削除(Killregion) |
CTRL-Y |
ESC-D,CTRL-K,CTRL-Wで削除した テキストをカーソルの前に挿入(Yank) |
AzEditはいわゆるインサートモードとなっていますので、文字あるいは文字の列を挿入したい場合には、単にその文字あるいは文字列を打ちます。
コントロールキーあるいはエスケープキーを伴わずに打たれた文字は全て現在カーソルのある位置の前に挿入されます。(オーバーライト(上書き)モードではありません。AzEditを改造すればオーバーライトモードを作ることもできます)
例えば「append」と打てば、カーソルのあった位置以降に「append」が挿入され、カーソルは「append」の次の位置となります。
文字の挿入によってその行が画面の横の長さを超えた場合には、画面右端に「!」が表示され、その行と次の行が続いていることを示します。
一つの長い行を途中で切って二つの行にしたいときには、カーソルを切りたい位置に移動してリターンキーを押します。NLが挿入されてカーソルより右の文字が新しい行になります。
また、「CTRL-O」は、カーソルの位置にNLを挿入し、カーソルは移動しません。
また、タブキーを押すと「CTRL-I」がテキストに挿入され、画面にはカーソルから次のタブストップまでの分の空白が表示されます。(タブストップは、1カラム目、9カラム目、7カラム目というように8カラム毎に設定されています)
コントロールキーあるいはエスケープキーは、通常、コマンドとして取り扱われるためにテキストには挿入されません。
まず「CTRL-Q」を打ってから目的のキーを打つとそのコントロールコードが挿入されます。
画面には^が文字の前に付けられて表示されます。(例えば、CTRL-Fは^Fと表示されます)
・一文字単位
バッファのテキストから一文字単位で削除するには、カーソルをその文字の位置に移動させ「CTRL-D」で行います。
また、最後に挿入した文字を削除する場合には、バックスペースキー(BSまたはCTRL-H)で行えます。
即ち、「CTRL-D」はカーソルの位置の文字を削除し、「BS」はカーソルの前の文字を削除します。
既に述べたように、行の区切りも一つの文字ですから、行の最後において「CTRL-D」を行うと、次の行がその行の後ろにつながります。
・単語単位
単語単位での削除は、「ESC-Dと「ESC-BS」で行えます。
それぞれ、「ESC-D」現在カーソルのあるところの単語、「ESC-BS」は一つ前(テキストの先頭より)の単語を削除します。
・行単位
行単位の削除は、「CTRL-K」で行います。「CTRL-K」は、現在のカーソルの位置からその行の最後までを削除、あるいはカーソルが既に行の最後にある場合には、次の行との区切りであるNLを削除します。
例えば、ある行全体を削除したいときには、カーソルをその行の先頭に移動させた後に「CTRL-K」を2回行う必要があります。
・ブロック単位
さらに大きな部分の削除は、「CTRL-W」で行われます。「CTRL-W」は現在のカーソルの位置とマークの付けられた位置の間を削除します。
「ESC-D,CTRL-K,CTRL-W」で削除された部分は次の削除コマンドまで(ESC-D,CTRL-K,CTRL-W)テキストとは別のところに取って置かれ「CTRL-Y」によってカーソルの位置に挿入することができます。
「ESC-D」あるいは「CTRL-K」をいくつか連続して使って削除を行った場合には、それら全ては一つのものとして取って置かれC「TRL-Y」で一度に挿入されます。
例えば、間違って「CTRL-K」を押して行が削除された場合には、直ちに「CTRL-Y」を行えば復活させることができます。
また、これらの機能(削除と復帰)を使うことによりテキストの移動・複写も行うことができます。
まず、「CTRL-K」または「CTRL-W」によって移動させたいテキストを削除し、カーソルを挿入すべき位置に移動した後に、削除したテキストを「CTRL-Y」で復活させます。
復活は何回でも行えますので、テキストの複写が可能です。
CTRL-S 文字列 ESC | 前方探索(Search) |
CTRL-R 文字列 | 後方探索(Reversesearch) |
CTRL-S CTRL-S | 同じ文字列の前方探索 |
CTRL-R CTRL-R | 同じ文字列の前方探索 |
ESC-R 文字列1 ESC 文字列2 ESC |
文字列1を文字列2に置き換える(Replace) |
ESC-Q 文字列1 SC 文字列2 ESC |
文字列1を文字列2にキーボード からの指示に従い置き換える(Queryreplace) |
CTRL-Sで前向き、CTRL-Rで後ろ向き探索をします。
「CTRL-S」を押すと探索すべき文字列を尋ねてきますので、文字列を入力した後にエスケープキーを押します。
すると、現在のカーソルの位置からテキストの終わりの方に向かって(前向きの探索)入力された文字列と一致する文字列があるかどうかを探索し、もしあった場合には、カーソルはその文字列の次に移動します。
探索が失敗したときには、「FailSearch」と表示し、カーソルは元の位置のままです。
同様に、カーソルの位置からテキストの始めの方に探索したい場合(後ろ向きの探索)には、「CTRL-R」で行います。
さらに、最後に探索に使われた文字列は記憶されていますので、もう一度探索するときには、「CTRL-SCTRL-S」あるいは「CTRL-RCTRL-R」で行えます。
探索において通常は英字の大文字と小文字の区別は行いません。
したがって、例えば、「append」を探索した場合には、「append」だけでなく「APPEND、Append」等も同時に探索されます。
大文字と小文字の区別を行いたいときには、PROLOGにおいて「e_bothcase(_,off)」を実行させます。
置換には「ESC-R」と「ESC-Q」の2種類のコマンドが用意されています。
ESC-Rでは、探索する文字列とそれを置き換える文字列をエスケープ(画面には「$」で表示されます)で区切って入力すると、現在のカーソルの位置からテキストの最後に向かって探索して見つけた文字列は全て置き換えます。
例えば、「abc」という文字列を「xyz」に置き換える場合は、
ESC R abc ESC xyz ESC
とキーボードから入力します。
すると画面のエコー行に、
Replace$abc$xyz$
と表示されて、現在のカーソル位置から前方にあるすべての「abc」という文字列を「xyz」に置き換えます。
「ESC-」Qは確認付きの置換です。
上のようにESC-Rがカーソル位置から前方の文字列を問答無用に置き換えるのに対し、「ESC-Q」では文字列を見つけるごとに置き換えるか否かを選択できます。
具体的には「ESC-Q」コマンドを入力して、「ESC-R」と同様に検索文字列と置換文字列を画面にその位置をカーソルで指示し、キー入力待ちになります。
ここで置き換えるか、あるいは置き換えずに次の文字列を探すかを指示します。
[スペース]を押下すると置き換えられ、[バックスペース]を押下すると置き換えずに次を探します。
また、[!]を押下するとESC-Rと同じように以後出現する全てを置き換えます。
[その他のキー]を押下すると置き換えを中止します。
(※誤って「CTRL-S」あるいは「CTRL-R」を押してしまった場合には、「CTRL-G」を押せばキャンセルされます。)
スペース | 置換 |
バックスペース | 次検索 |
! | 未確認全置換 |
その他のキー | 中止 |
なお、どちらの場合も検索方向は前方のみで、後方に置換することはできません。
AzEditでは、ディスク上のファイルをバッファに読み込んでそれを編集したり、編集の終了したテキストをファイルにしたりすることができます。
まず、ファイルの読み込みは「CTRL-X CTRL-V」で行います。
CTRL-X CTRL-Vを打ち込むと、ファイル名を尋ねてきますので、編集を行いたいファイルの名前を入力してリターンキーを押します。
コマンド実行以前のテキストを削除して、ファイルからテキストを読み込ませます。その後にテキストの先頭から表示します。
「CTRL-X CTRL-I」はコマンド実行以前のテキストは削除せずに、現在のカーソル位置を先頭としてファイルからテキストを読み込んだ後、カーソルは元の位置に移動させます。
次に、編集の終わったテキストをファイルにセーブしたいときには、「CTRL-X CTRL-W」を行います。
「CTRL-X CTRL-W」コマンドで入力したエコー行にファイル名が表示されますので、それでよければリターンキーだけを押します。
もしファイル名を変更したい場合は、表示されているファイル名をBSキー(バックスペースキー)で削除して、改めてファイルの名前を入力してリターンキーを押します。
ファイル操作コマンド一覧
CTRL-X CTRL-V ファイル名 | ファイルをバッファに読み込む(Visitfile) |
CTRL-X CTRL-I ファイル名 | ファイルをバッファに読み込む(Insertfile) |
CTRL-X CTRL-W ファイル名 | テキストをバッファに書き出す(Writefile) |
CTRL-X CTRL-S | テキスト全体のreconsult |
CTRL-X S | 指定領域のreconsult |
Prologのプログラムを実行するにはインタプリタのプログラム領域であるヒーヒープ領域に転送する必要があります。 ヒープ領域に転送するにはファイルを介しても可能ですが、AzEditのコマンド「CTRL-X CTRL-S」によって直接「reconsult」することもできます。
「reconsult」ですので既に同じ述語(述語名とアリティが同じ述語)が存在していた場合にはその定義は消去され、AzEditで編集した述語に置き換えられます。
また、「reconsult」中にSyntaxErrorが発生した場合には、そこで「reconsult」が打ち切られカーソルはErrorの発生した位置に移動します。
「CTRL-X CTRL-S」はAzEditの持つすべてのテキストが「reconsult」されますが、テキストの一部だけを「reconsult」することもできます。
「CTRL-X S」では、マークとカーソルの間の領域が「reconsult」されます。
(1)エディタ上のプログラムのコンパイル
AzEditに次のコマンドが追加されています。
また、次のようにすることでエディタ上でのバイトコード・コンパイルが可能です。
(バイトコード・コンパイルについては「コンパイラ」を参照してください。)
CTRL-X CTRL-L | バッファ上の全プログラムをコンパイル・ロード |
CTRL-X L | マークとカーソル間の述語をコンパイル・ロード |
コンパイル結果はファイルとしては残りません。また異なるファイルをエディタからコンパイルしても同一モジュールと見なしますので、最後のもののみ残りますから注意してください。
CTRL-C | バッファの切り替え |
CTRL-X CTRL-B | バッファの領域を確保 |
CTRL-X CTRL-C | バッファを切り離し(領域開放) |
AzEditは同時に複数(最大8個まで)のテキストを扱うことができます。
このバッファは主記憶上(OSの仮想記憶も含む)に確保されます。
個々のバッファの大きさは2の32乗-1文字までです。
ただし、内部の制御情報もバッファ内に置かれますから、格納可能なテキストの大きさはバッファの大きさより11~3割減になります。このため編集するテキストの大きさより大きめに取っておく必要があります。
バッファの操作には「領域確保」「切り替え」「切り離し(領域開放)」があります。
「CTRL-X CTRL-B」コマンドを入力すると最初にAzEditを起動したときと同様にエコー行に、
EditBuffersize(char):
と表示されて、入力待ちになります。希望のバッファの大きさを入れると「領域確保」されます。
AZPrologEditor(Version.....)-*
と表示されて、カーソルが画面の左上にあるはずです。
この文字列の最後の「*」のところに現在のバッファ番号が表示されます。元の最終番号より一つ大きい番号になります。もし、8個のバッファすべてを使っている場合は、
usedallbuffer!!
と表示されてコマンドは無視されます。「CTRL-X CTRL-B」からやり直してください。
バッファを複数個使用している場合に「CTRL-C」で編集するバッファを切り替える(現在のバッファ番号を変更する)ことができます。
「CTRL-C」を押すたびに現在のバッファ番号が一つずつ昇順に切り替わります。最後の番号までいくと「0」に戻ります。
現在、確保されているバッファが一つしかない場合は、切り離しはできません。
nowbufferonly!!
と表示されてコマンドは無視されます。
バッファを切り離すと当然ながらバッファの内容は消されてしまいます。
必要な場合は必ずディスクにセーブしておいてください。
CTRL-X CTRL-Z | PROLOGへ戻る |
CTRL-X Z | 画面の下の部分にスクロール領域を設定してPROLOGへ戻る |
AzEditでの編集を止めてPROLOGに戻るには、AzEditが使用していた以後保存された状態でPROLOGが走ります。即ち、画面の上の部分にはAzEditの最終状態を表示したままとなり、画面のスクロールは下の部分で行われます。(CTRL-X Zコマンドは機種により使用できない場合があります。)
ESC-+ | AzEditの使用する行数を一行増やす |
ESC-- | AzEditの使用する行数を一行減らす |
ESC-W | AzEditの使用する行数を最大にする |
ESC-U | 単語を大文字に変換(Uppercase) |
ESC-L | 単語を小文字に変換(Lowercase) |
ESC-C | 単語を先頭だけ大文字に変換(Capitalize) |
AzEditは初期設定によって画面の約半分の行数を使用しますが、コマンドによってこれを変更できます。
「ESC-+」は使用する行数を一行増やし、「ESC--」は一行減らします。また、「ESC-W」でいっきに最大にすることもできます。「ESC-U」で、英小文字で書かれた単語を大文字に変換できます。
逆に「ESC-L」で、大文字を小文字に変換することもできます。さらに、先頭の英字だけ大文字にして後は小文字にすることも「ESC-C」で行えます。
カスタマイズとはユーザ自身が都合や好みに合わせてAzEditのキー割り当ての変更・機能拡張をすることです。
そのために最低限必要な事項をこの節で説明しています。
AzEditはそれ自身Prologで記述されています。
そしてインタプリタではそれをAZ-Prologコンパイラでコンパイルし、コンパイル組込述語として組み込まれています。
このためAzEditのソースファイルを変更した後にコンパイルをしなおす必要があります。
(コンパイル方法については「7.コンパイラ」を参照してください。)
なおここの説明は、Prolog言語に熟知されていることを前提とします。
もちろん標準のAzEditをそのまま使用する場合には、ここの知識は一切必要ありません。
以下の説明は、AzEditのソースファイルを見ながら読むとわかりやすいでしょう。
上記のようにAzEditはPrologで記述されていますが、実際にはほとんどの基本機能(エディタバッファ操作)は専用の「標準組込述語」で実現されています。
簡単に言えばAzEditのソースではそれらの専用の「標準組込述語」を呼び出しているに過ぎません。(個々のエディタ専用「標準組込述語」の説明はヘルプを参照してください。)
AzEditソースを見ると、50行目あたりから「 e_do/1 」の頭部を持つ節がずらっと連なっています。
これらの節の一つ一つがエディタコマンドに対応しています。
AzEditを起動してキー入力されると、すぐにそのキャラクタコードがこの「 e_do/1 」の引数に渡されます。そして、マッチ(ユニファイが成功)した節の本体(コマンドプログラム)を実行します。
また、2ストロークコマンド(^X* と ESC-*)の場合は、「 e_do/1 」の本体にある「d_keyin/1」によってさらにもう1キャラ読み込んで、「 e_do/1 」からそれぞれ「e_dox/1」「e_dom/1」に渡されて、また「 e_do/1 」と同じように分岐しています。
この「 e_do/1 」の引数を変更するだけで、キー割り当てが変更できます。
例えば「CTRL-C(バッファ切り替えコマンド)」を「CTRL-T」に変更するには、「CTRL-C」はキャラクタコード「3」ですから「e_do(3,no)」の節を探して、変更します。
e_do(3):-e_edit(O,O),repeat(_),e_edit(X,(X+1)and7),e_edit,e_doch(O),!.の頭部の「e_do(3)」を「e_do(20)」に変更するだけでOKです。
e_do(11):-e_register(1,11,11),!,e_dok. e_do(11):-!,e_kill,e_dok.
のように複数個ある場合は、確実にそのすべてを変更する必要があります。
ここでは例として、「バッファ内の任意のキャラクタ位置にジャンプするコマンド」を追加してみましょう。
さいわい標準のAzEditではCTRL-Jにはコマンドが割り当てられていませんので、ここに割り当ててみましょう。
結論を先に書くと・・・
e_do(10):-!, e_echo,e_echos("EditBufferPosition(char):"), e_getln(13,[],L),e_cr_buf(L,I),!,e_jump(I).
なる節を追加することになります。
頭部のe_do(10)は「CTRL-J」のキャラクタコードは「10」ですからこうなります。
本体の各ゴールの説明をしておきます。
e_echo/0 | エコー行を消す、標準組込述語。 |
e_echos/1 | エコー行にメッセージを出す、標準組込述語 e_echo/1 を使った定義述語。 |
e_getln/3 | キー入力された文字列をキャラクタコードのリストで返すAzEditの定義述語。第一引数は入力を識別するためのキャラクタコードを指定する。 |
e_cr_buf/2 | 数字文字列のキャラクタコードのリストを数値に変換するAzEditの定義述語。 |
e_jump/1 | 引数で指定されるバッファ内の文字位置にドットを移動させる。 |
このようにコマンドの追加は、「 e_do/1 」またはそれ以下に節を追加することにより簡単にできます。
まず、ソースリストから「 e_do00/2 」の節を見つけてください。
この述語は第1引数がエラー番号・第2引数がエラーメッセージとなっています。
該当する部分を書き換えてください。
エラーメッセージに限らず、任意の時点で任意のメッセージを出すことができます。
e_echo,e_echos("メッセージ"),
のゴール列を任意の節に書けばよいわけです。 例えば「CTRL-X CTRL-S」コマンドでリコンサルトするときに「Reconsult」と表示させるならば、
e_dox(19):-!, e_pos(P),e_jump(0),e_markend,e_doxs,e_jump(P), e_echo,e_echos("Reconsulted").
なる節を、
e_dox(19):-!, e_echo,e_echos("Reconsult"). e_pos(P),e_jump(0),e_markend,e_doxs,e_jump(P), e_echo,e_echos("Reconsulted").
とします。
キー割り当てが重複すると正常な動作は保障されませんから、変更は慎重に行う必要があります。