« 2012年8月 | トップページ | 2012年11月 »

2012年10月

2012年10月29日 (月)

ラインエディタ(line editor)にはテレタイプ(teletype)端末が相応しい

ラインエディタ(line editor)にはテレタイプ(teletype)端末が相応しい

Time-stamp: "Sun Dec 25 10:03:14 JST 2011"

ブラウン管や液晶のvdt(visual display terminal)で使うラインエディタは とても不便きわまりないものだが、テレタイプ端末で使うラインエディタは それほど不便なものではなかったと思う。そのことを気付かせてくれたのは 次の記事である。私は三十七年前にほんの数ヶ月間であるがテレタイプ端末 を使ったことがある。そのときの様子が次の記事にある「入力した文字はす べてこちら側の紙に書き込まれました」という一文であざやかによみがえっ た。

vi以前には、エディターといえばexというラインエディターしかなかったの です。ラインエディターというのは、そのカーソルがある1行しか表示をす ることができないエディターのことで、全体の様子をうかがいすることすら できないという、使いづらいものです。といってもその当時は、端末といえ ばテレタイプというタイプライターの親分みたいなものを使っていたので入 力した文字はすべてこちら側の紙に書き込まれましたから、それはそれで良 かったのです。

私は1974年にテレタイプ端末でミニコンhitac10-][(ハイタックテン2型、日 立製)を使ったことがある。といっても学校のコンピュータ実習の一年たら ずの期間だけさわったにすぎない。一台の機械を学生五、六人が協同で土曜 日の午後に二時間くらい使ったと思う。それ以後コンピュータを扱うことはな かった。1995年にwindows3.1の機械を入手するまで長いブランクがある。し かし、その大昔の経験がラインエディタを理解するに役立ったようである。

パソコンのコマンドラインから打ったコマンドに対してコンピュータが返し てくる結果がvdtの画面に収まりきらないとき、初めのほうはスクロールア ウトしてしまう。コマンドラインの画面はバックスクロールできない。その ためページャーのmoreやlessに渡して一画面ずつ停止できるようにする (more)かまたは前後にスクロールできる(less)を使うことになる。

テレタイプ端末にはキーボード操作やコンピュータからの結果すべてが紙に 印字される。時間的に前のほうの様子を見るには端末から吐き出されたロー ルペーパーをたぐりよせればよい(つまり人力バックスクロールである)。

現在のvdtを表示装置としてラインエディタedを使うと、打ち込んだ内容や 編集作業でコンピュータが応えてきた結果で限られたサイズの画面が一杯に なりどんどん上方に流れ去る。スクロールアウトした部分を巻き戻すことは できない。テレタイプ端末なら印字用紙が供給されさえすれば操作や結果の すべてがタイプライタの向こう側にぶら下がっている。

現在のvdt端末でもedエディタで編集する文がほんの二、三行なら入出力の 様子が画面に残る。しかし、何十行にもなるとすぐにスクロールアウトが発 生する。moreやlessのページャーを使ってもコンピュータの処理結果はゆっ くり読めるようになるが、使用者のキーボード打ち込みの経過はスクロール アウトしてしまう。何行もの長大な文章を編集するにedは不便極まりない。

テレタイプ端末のキーボードから打ち込んだ文字は、テレタイプがタイプラ イタであるから先ずは紙に印字される。それと同時に打ち込まれた文字が電 気信号としてコンピュータに伝わる(実際にはキーボードからコンピュータ へ押されたキーの情報が伝わり、コンピュータからタイプせよの信号が来る のだろう)。

手動式のタイプライターはタイプバー(アーム、ハンマーともいう)と呼ばれ る先端に活字が仕込まれた棒がキーの押し込みにより梃子仕掛けでタイプ用 紙に叩きつけられる。紙の上にセットされたインクリボンをタイプバーの先 にある活字で叩くことにより転写される(熱転写ではなく圧力転写である)。 テレタイプ端末は電動式のタイプライターであり、手動式タイプライタのよ うなタイプバーはなくてデイジーホイールと呼ばれるものを使って印字して いた。

叩いたキー情報がコンピュータに伝わると同時に紙に打ち出される。その動 きは出力装置としてテレタイプ端末を使おうがディスプレイ(VDT、visual display terminals)を使おうが変わらない。違うのは紙に印字されたものは タイプライタの向こう側にぶら下がっているが、表示画面からスクロールア ウトしたものは消え去ってしまい見ることができないことである。

テレタイプ端末ではタイプ用紙に印字するので、既に打ち込んだ文字を遡っ て消去して書き換えることはできない。手動式タイプライターでは backspaceキー(手動式タイプライターではキートップにbackspaceの文字は なくて左向きの矢印がありback arrowと呼ばれたようだ)で印字位置を戻す ことができた。

手動式タイプライターは修正液で打ち損じ箇所を消して打ち直しする。しか し、テレタイプ端末では既に紙に打ち出されたものを打ち直すことはできな い。紙に印字したと同時にコンピュータに伝わっている。紙の上の文字を修 正してもコンピュータが受け取った情報は修正されないだろう。テレタイプ 端末を使っていた当時に打ち損じをどうやって修正していたのかは思い出せ ない。紙の上の文字を修正するのではなくて、コンピュータに伝わった入力 文字をキャンセルする手順である。

とりあえず間違ったままで確定する。そのあとで間違えた行を削除して打ち 直したのではと思う。紙の上の印字を直せないのと同じようにコンピュータ に伝わった間違いも直せない。改めて削除コマンドを使うしかなかったので はなかろうかと考える。

テレタイプとは遠く離れた場所にある電動式タイプライタを電線でつなげた ものと大雑把に考える。手元にある電動タイプライタのキーを叩くと目の前 にあるタイプ用紙に印字すると同時に電線でつながった先にある電動タイプ ライターにも印字される。テレタイプ回線は音声電話回線と同じように通信 時には回線がつながったままでなければならない。回線使用料は使用時間 (距離併用もあったのだろうか)で決まる。そこで回線がつながったら一気に 情報を送り出して短時間のうちに通信を終えるようにしたい。

テレタイプ回線がつながってから人手でポツポツとタイプしていたのでは間 に合わない。熟練して高速タイプが出来るとしても打ち損じは起こり得る。 そこで回線につなぐ前にテレタイプの機械をオフラインで使い穿孔紙テープ を作る。テレタイプ回線がつながったらテレタイプ端末に付属する紙テープ 読取装置に予め用意してある紙テープを読み込ませる。キーボードを直接に 叩くことなく情報を送り出す。テレタイプ端末には紙テープ穿孔と紙テープ 読取の機能が付いていた。

初期のコンピュータはパンチカードによりプログラムやデータを受け取って いた。パンチカードは当時の1ドル紙幣の大きさで読み取り装置はかなり大 型なものになる。コンピュータが小型化するに連れて入出力装置も小型なも のが求められ、紙テープを使うテレタイプをコンピュータの入出力装置とし て流用するようになる。

ネット検索しているうちにテレタイプ端末にはrubout(ラブアウト)という キーがあったことを思い出す。「rub out」とは「削り取る、消し取る」と いう意味がある。ruboutはasciiコードのDEL(7Fhex)に相当する。十六進数 の7Fは全部の桁が1である7桁の二進数である。二進数の1にパンチ穴あり を、そして0にパンチ穴なしを対応させる。

ruboutに相当する十六進数7Fhexは二進数では1111111binになる。紙テープ の8個ある穿孔位置のすべてに穴をあける。最上位桁は偶数パリティとして 穿孔する。意味を持つのは下位7桁である。各桁の数字の和が偶数になるよ うに最上位桁を0か1にする。これで穿孔誤りを判定することができる。打ち 損じた文字は正しい文字とは穿孔場所が違う。パンチ穴を塞ぐことはできな いので8箇所すべてに穴をあけてそれを読み飛ばすことにする。8箇所のすべ てに穿孔がないものとすべての箇所を穿孔したものは無効とみなすわけであ る。asciiコードには今では使われないテレタイプ由来の制御文字がいくつ も残っている。

テレタイプ端末からの打ち損じをどのように処理していたかの手掛かりにな る記事があった。どうやらruboutキーを使ったようだ。私がタイプライタ端 末を使っていたとき具体的にどのようにして修正したかはまったく記憶にな い。たぶんこの記事のような手順だったのだろう。日本語記事はあっさりし た書き方だが英文マニュアルは詳しい。ruboutキーを押したらバックスラッ シュが印字されて直前の文字が削除されるようだ。その後に正しい文字を続 けるという手順らしい。現在印字位置から何文字も前にある一文字を消すこ とはできない。その文字以降にあるすべての文字を消す必要がある。

入力中の一文字消去は[Del](コード7F テレタイプの[RUBOUT]キーに相当)。 [Del]の入力で\が表示され前の文字が消されたのを示す。間違って[BS]を使 うと一見正しく修正されたように見えるので注意。入力中の一行全部取消し は[_](コード5F テレタイプの[←]キー)。
1.3.2  Back Arrow(←)
The back arrow (←) is used for error recoveries in both command and
text modes.  When used in text mode, ← cancels everything to the
left of itself back to the beginning of the line.
The user then continues typing on the same line.  When used command
mode, ← cancels the entire command and the Editor issues a "?" and
carriage return/line feed (CR/LF).  Back Arrow cannot cancel past
CR/LF in either command or text mode.
A ← ?(CR/LF)
THIS ← "HERE IS A TEXT MODE EXAMPLE"(CR/LF)
only the part in quotes is entered in the buffer
1.3.3  Rubout(\)
Rubout(\)is also used error recovery in both command and text modes
with exception.  When executing a READ command from either the
paper tape or Teletype reader, rubouts are ignored completely and
do not go to into the buffer.
It is necessary for the READ command to disable the rubout function
since all tab characters on paper tape are, for timing purpose,
followed by rubouts which would destroy the tabs.  Rubouts are not
stored in the text buffer but are inserted by the Editor following
all tab characters on the output tape.
At any other time in text mode(specifically if text mode was
entered via the APPEND, CHANGE, INSERT or SEARCH command)typing
rubout echoes a back slash (\) and deletes the last typed
character.  Repeated rubuouts delete from right to left up to, but
not including the CR/LF combination, separating the current line
from the previous one.
Example:
THE QUUICK\\\\ICK BROWN FOX (CR/LF) will be entered in the buffer as
THE QUICK BROWN FOX
When used in command mode, rubout is equivalent to back arrow and
cancels the entire command.  The editor then issues a "?" and a
CR/LF combination.

手動タイプライタもテレタイプ端末も使った経験のない人が現在のパソコン でラインエディタを動かそうとすると途方もなく扱いにくいものと感じる。

テレタイプ端末からラインエディタを使うには、先ずは手動式タイプライ ターと同じ使い方(ラインエディタedならa(append)コマンドを使って)によ り何行でもどんどん入力していけばよい。どちらの方法でも同じようにキー ボードから打ち込んだ文字がタイプ用紙(ロール紙)に印字されてゆく。

もし、ラインエディタで直しが必要になったらその行を修正または新規入力 してその行のみを印字させて確認する。タイプ用紙を節約するために直しの 結果を確認するには直した行だけを印刷する。ラインエディタが行単位で編 集する設計となっている大きな理由である。その度に全文を印刷したら紙が 勿体ない。

すべての打ち込みと直しが終わったら全部を一気に印字して再確認する。手 動式タイプライターによる作業成果はタイプ用紙上にあるものだけだが、ラ インエディタによる成果は紙の上だけではなく同じものがコンピュータのメ モリ内にもある。

現在のパソコンでラインエディタを使おうとするから無理がある。ラインエ ディタに最適な出力装置はタイプライタ端末である。

| | コメント (4) | トラックバック (0)

2012年10月26日 (金)

teco の iteration (繰り返し)実行例を動かす

teco の iteration (繰り返し)実行例を動かす

Time-stamp: "Sat Dec 17 15:06:25 JST 2011"

tecoの記事(wikipediaより)にマクロの実行例がある。tecoのテキストバッ ファ内の各行を、行の先頭文字のアルファベット順にソートするマクロであ る。例1が次である。これを実際に動かしてみようと思う。

!START! j 0aua             ! 先頭にジャンプし、1文字めをレジスタAにロード !
 !CONT! l 0aub             ! 次の行の1文字めをレジスタBにロード !
 qa-qb"g xa k -l ga 1uz '  ! A>B なら行を入れ替えて、フラグをレジスタZにセットする !
 qbua                      ! B を A にロード !
 l z-."g -l @o/CONT/ '     ! バッファに他の行があれば(CONTに)ループする !
 qz"g 0uz @o/START/ '      ! 行入れ替えが起きた場合、最初からもう1回行う !

マクロのコマンドが実行する仕事内容はコメントとして入っている。とは 言ってもどれがコマンドやらさっぱり分からない。tecoのコマンドはアル ファベット1個か2個という少ないものであるためマニュアルから見つけにく い。それはおくとしてもどうやればこのマクロを実行できるのであろうか。 実際に自分の手で動かしてみれないことにはマクロを解読する気にならな い。

手掛かりにしたのは次のpdfにある円周率計算tecoマクロである。記事の中 に「本稿ではそれをWindows 2000 上のTECOC [1] でデバッグしたものを掲 載する.」とある。なお、参考文献[1]としてTom Almy, Text Editor and COrrector, July 1999.とある。

なお、ここで使ったであろうwindowsで動くtecoのバイナリは次のページか らダウンロードできる。

円周率計算tecoマクロ記事の中に実行例として次がある。どうやらmungとい うオプションが要るらしいと分かる。記事中のマクロをコピペしてファイル 名をpi2c.tecとしたものをms-dosプロンプトから実行したらあっさり円周率 が表示された。

C:\Ueda\teco>tecoc mung pi2c.tec 10000
(円周率表示)
C:\Ueda\teco>

mungという文字列はtecoのマニュアルに載っている。しかし、windowsの ms-dosプロンプトからどう使えばよいのかはマニュアルに載っていない。 windowsが出来るより遥か昔に使われたtecoのマニュアルである。windowsで の動かし方を載せることは到底かなわない。

円周率マクロでは桁数10000桁を引き数として与えている(10000桁出力には 時間がかかりすぎるかもしれないので100とした)。マクロに書かれているの はtecoのコマンドプロンプトに打ち込む内容(tecoコマンド)である。これを 見習うしかない。

そこでソート例1のマクロの前後にファイル読み込みとマクロ実行後の出力 ファイル名を指定するコマンドを入れてsort1.tecとする。「tecoc mung sort1.tec」をms-dosコマンドプロンプトから実行すればよいのではと考え る。wikipediaのソート例1のマクロの前後にそれらを書き加えたものが次の sort1.tecである。

@er/readme.bak/               ! 処理ファイル読み込み !
y                             ! テキストバッファに読み込む !
!START! j 0aua                ! 先頭にジャンプし、1文字めをレジスタAにロード !
 !CONT! l 0aub                ! 次の行の1文字めをレジスタBにロード !
 qa-qb"g xa k -l ga 1uf '     ! A>B なら行を入れ替えて、フラグをレジスタfにセットする !
 qbua                         ! B を A にロード !
 l z-."g -l @o/CONT/ '        ! バッファに他の行があれば(CONTに)ループする !
 qf"g 0uf @o/START/ '         ! 行入れ替えが起きた場合、最初からもう1回行う !
ht                            ! 結果表示 !
! @ew/kekka.txt/ !            ! 結果書き出し !
ex                            ! teco終了 !

これでreadme.bakを読み込んだテキストバッファ内の各行を行の先頭の文字 に従ってソート(並べ直した)した結果が画面表示される。ファイルに出力す るなら、結果書き出しコマンドのコメント化を解除すればよい。なお、前後 を!で囲んだものはジャンプ先を表すラベルか、またはコメントである。な お、フラグと「l z-."g -l @o/CONT/ '」の中にあるz(バッファ末尾字のポ インタ)が同じzになっており紛らわしいのでフラグをfに変更する。

D:\tecow32>tecoc mung sort1.tec
(結果表示)
D:\tecow32>

一ページくらいの英文テキストファイルを処理した結果をファイル出力して 元ファイルと比べてみるのがよい。元ファイルの各行の先頭文字のascii コードの順番に並べ直される。行頭がタブ文字(horizontal tab)(asciiコー ドは9hex)の行、次はスペース文字、そして数字、アルファベットの順番に 並ぶ。第二文字目に関してはソートしないので元ファイルの順番が保存され たものになる。

(注)7ビット文字のasciiコード(16進数表示による文字の背番号)一覧表が手 元にあると重宝する。タブ文字の背番号が一番若いだろうが他の文字の順番 は憶えてない。ネット上にascii一覧表のページもあるが次のツールが便利 に使える。ところでtecoのマクロを見るとき、それに小文字ばかりが使って あるとアルファベット小文字の「l」(エル)と数字の「1」(イチ)そしてパイ プ記号の「|」の識別に困ることがある。さらにアルファベット小文字の 「o」(オー)とアルファベット大文字の「O」(オー)、そして数字の「0」(ゼ ロ)も単独でポツンとある場合は見分けがつかない。私の使っているエディ タ(vim)はカーソル下にある文字のasciiコードを表示してくれる。その文字 の背番号からasciiツールでどの文字であるかを確認している。ネット上の asciiコード表にアクセスするよりパソコンにあるツールを使うほうが速 い。

例1のマクロで分かりにくいのはdouble quote (")が何の働きをしているか である。ダブルクォートはifに相当してシングルクォートまでがif-then文 になっている。もしelse文を入れるならシングルクォート(if-then-else文 の終わりを指示する)の前にパイプ記号(|)で区切って入れる。そして 「n"G」の意味は「test for greater than zero」になる。次が参考にな る。

4.6.1. The Double Quote 'IF' command
In TECO, the double quote character is the conditional IF operator.
The double quote is followed by a single letter which determines the
actual test to be applied. The argument to the conditional operator
is the single argument which precedes the double quote character.
If the condition specified is true, the commands which follow the
conditional operator are executed normally. However, if the
condition specified is false, TECO skips over all the following
commands until it encounters an else clause, or the close of the
conditional code which is marked by a single quote. An example of a
conditional expression follows:
!LOOP!Q1-1U1Q1"GOLOOP$'
This command loops decrementing the value in Q-register 1 as long as
it contains a value greater than zero ("G). When the value is no
longer greater than zero, the OLOOP command is not executed, and the
conditional falls through the single quote command to the next
command which is typed.

また、tecoマニュアルには次の記述がある。両方を読んでようやくおぼろげ ながらも理解できた(気がした)。日本語解説の枯渇に苦しんでいる。理解が 曖昧なので原文をそのままコピペする。tecoなんて一年に一度使うことがあ るかどうかというものだから、しっかりどこかに書き留めておかないとすぐ に忘れてしまう。

5.14 CONDITIONAL EXECUTION COMMANDS(tecoマニュアルより)
All conditonal execution commands are of the form:
n"X command-string '
or
n"X then-command-string | else-command-string '
In the first form of the command, "n" is a numeric argument on which
the decision is based,  "X" is any of the conditional execution
commands listed in table 5-14, and "command string" is the command
string which will be executed if the condition is satisfied.  The
numeric argument is separated from the conditional execution command
by a double quote (") and the command string is terminated with an
apostrophe (').  If the condition is not satisfied,  the command
string will not be executed; execution will continue with the first
command after the apostrophe.
In the second form of the command, two command strings  are
specified.  The first one is executed if the condition is satisfied
and the second is executed if the condition is not satisfied.  Only
one of the command strings will be executed.  After execution of the
appropriate command string, control will continue  with the first
command after the apostrophe (unless the command string caused a
branch out of the conditional to occur), since execution of the
vertical bar command (|) causes TECO to scan to the next matching
apostrophe.
Conditional commands are similar to the IF-THEN-ELSE constructs that
you find in other structured programming languages, although none
can match the brevity and elegance of TECO's implementation.
Nonetheless, you must use these facilities wisely.  Good programming
practice dictates that a branch into the range of a conditional
(from outside that range) should not occur.
Conditional execution commands may be nested in the same manner as
iteration commands.  That is, the command string which is to be
executed if the condition on n is met may contain conditional
execution commands, which may, in turn, contain further conditional
execution commands.

ソートの例1は、いわゆるgo-to文を使うマクロである。同じ処理をgo-to文 を使わないでループ(iteration、繰り返し。構造化プログラミングというら しい)で処理するのが例2になる。これをコピペしたものは動かない。いつま で経っても終わらない。無限ループに入ってしまうらしい。

0uz                              ! 繰り返しフラグをクリア !
 <j 0aua l                       ! 1文字目をレジスタAにロード !
 <0aub                           ! 次の行の1文字目をBにロード !
 qa-qb"g xa k -l ga -1uz '       ! A>B なら、行を入れ替えてフラグをセット !
 qbua                            ! B を A にロード !
 l .-z;>                         ! バッファに他の行があればループ !
 qz;>                            ! 入れ替えが起きたときは最初に戻る !

ここで鍵となるのはループからの脱出の条件である。コマンド列を<>で囲む ループ(繰り返し、iteration)からの脱出については次のページの記事を参 考にした。マニュアル以外の英文記事も少ない。需要がないのだから仕方な い。現在の日常業務にtecoを使おうと考える人はいない。歴史的遺産でしか ない。tecoの流儀はviやemacsに受け継がれている。tecoを知ることはまっ たくの無駄ではない。

テキストエディタのviやemacsの元祖であるtecoを知ることで現代のテキス トエディタを理解したいからtecoをいじっている。何事でもそうだが、その 環境にドップリ浸かっているとその環境の快適と不快適が見えない。環境を 外から眺めることや歴史を遡って現在と比較する(故き(ふるき)を温ねて(た ずねて)新しきを知る、温故知新)ことでより理解が深まる。

なにしろtecoは1960年代に開発されたものである。その扱いにくさは超一級 である。現在のスクリーンエディタの使い勝手からいうと途方もなく扱いに くいものであるが、当時としてはとても便利な最先端のものだっただろう。 一度に何行もが一覧できるディスプレイ装置はなくて、結果を一行ずつテレ タンプ用の機械を流用して紙に打ち出し(タイプ)ていた時代のことである。

4.1.2. Colon Modifier
The following example finds all occurrences of 'foo' and appends the
string 'bar' to it:
<SFOO$;IBAR$>
In the first case, the insert command to insert the string 'BAR' is
executed each time the search command successfully finds 'FOO'. The
final time when 'FOO' cannot be found, the semi-colon command causes
the insert command to be skipped, and the iteration to be cleanly
exited. (coptersより)

これを実際に試してみることでiterationからの脱出について理解しようと する。先ず、繰り返しの処理を実行するテキストファイルをつくる。大きな ファイルを読み込んでサーチ・インサートの実験をやると、ちゃんと実行で きたかどうかが分かりにくい。処理結果が分かる最小限のサンプルテキスト を使う。なお、$はescキーを押したら表示されるもので$キーを押している のではない。

D:\tecow32>tecoc    ms-dosのコマンドプロンプト
*iasdf              tecoのコマンドプロンプトから挿入コマンドを実行
hjkl                文字列の最後はenter(改行)
$$                  insertコマンド実行
*.=$$               ポインタ位置(.=コマンド)確認
12                  ポインタは12にある
*ht                 テキストバッファのすべてを表示(whole type)
asdf                テキストバッファ一行目
hjkl                テキストバッファ二行目
*                   tecoのコマンドプロンプト

insertコマンドで文字をテキストバッファの先頭から挿入してゆくと最後に 打ち込んだ文字の後ろにポインタがある。そこが12になる。8文字しか打ち 込んでいないのに12になるのは改行でキャリッジリターンCR(carriage return)とラインフィードLF(line feed)の二文字が加わるためである。

(0)a(1)s(2)d(3)f(4)[CR](5)[LF](6)h(7)j(8)k(9)l(10)[CR](11)[LF](12)

()内はポインタの数値であり、[]は制御文字を表す。

*iasdf             insertコマンド実行(前二行をもう一度入力)
hjkl               四行目を入力
$$                 escキーの二度押し、挿入コマンド実行
*.=$$              ポインタ位置表示コマンド
24                 ポインタは24にある
*ht                テキストバッファの全表示(whole type)
asdf               テキストバッファ一行目
hjkl               テキストバッファ二行目
asdf               テキストバッファ三行目
hjkl               テキストバッファ四行目
*                  tecoのコマンドプロンプト

二行を繰り返した四行のテキストにtecoの検索コマンドs(search)と挿入コ マンドi(insert)コマンドを使って「as」の後ろに「qwe」を書き加えること にする。その結果が次である。

*j$$               ポインタをテキストバッファ先頭に戻す
*<@s/as/;@i/qwe/>$$  検索と挿入を繰り返す
*ht$$              テキストバッファ全表示(whole type)
asqwedf            テキストバッファ一行目
hjkl               テキストバッファ二行目
asqwedf            テキストバッファ三行目
hjkl               テキストバッファ四行目
*.=                ポインタ位置表示コマンド
0                  ポインタは先頭に戻る
*                  tecoのコマンドプロンプト
(注)サーチコマンドs(search)やインサートコマンドi(insert)コマンドのよ うに後置引き数として文字列をとる場合はアットマーク修飾子(at-mark modifier)を使って文字列の末尾を指示する。tecoのコマンドプロンプトか らこれらのコマンドを単独で実行する場合はescキーを押すことで後置文字 列の末尾がtecoに指示される。しかし、マクロの場合はescキーを使わない (使えない)。そこで代りに@をコマンドに前置し文字列を/などで囲む(/でな くても挟まれる文字列に無い文字であればよい)。

ループの一般形は「n<command string>」である。nは繰り返しの回数にな る。nが与えられない場合は際限なく繰り返す。そこでセミコロンコマンド 「;」で脱出条件を設定する。セミコロンの前にある検索コマンドs(search) または置換コマンドfs(find sabustitute)またはfr(find replace)コマンド などが成功したら末尾の大なり不等号「>」までにあるコマンドを実行す る。検索コマンドに失敗したらループから抜ける。

wikipediaにあるtecoマクロ実行例のソートの例2をその例1と比べると幾つ かのコマンドが抜け落ちているように見える。うまくいった例1に合わせて 次のように変更した。

! 0uf !                       ! 不要(繰り返しフラグをクリア) !
<j 0aua                       ! 先頭にジャンプし、1文字めをレジスタAにロード !
<l 0aub                       ! 次の行の1文字めをレジスタBにロード !
 qa-qb"g xa k -l ga 1uf '     ! A>B なら行を入れ替えて、フラグをレジスタfにセットする !
 qbua                         ! B を A にロード !
 l .-z; -l>                   ! バッファに他の行があれば(CONTに)ループする !
 -qf; 0uf>                    ! 行入れ替えが起きた場合、最初からもう1回行う !

このマクロの前後に例1と同じファイル処理関係コマンドを加えたものが sort2.tecになる。これを「D:\tecow32>tecoc mung sort2.tec」で実行する と例1のマクロで得られる結果と同じになった。

tecoマクロではコマンドをスペース文字(asciiコードの20hex)で区切らない (スペース文字は無視される)。人間にとって読み易くするためにスペース文 字を入れている。そのためスペース文字を消した次の文字の羅列に見える一 行に書かれたマクロをtecoのコマンドプロンプトから打ち込んでもよい。し かし、50字以上もある文字列を正確に打ち込むのはとても難しい。tecoのコマ ンドプロンプトではコマンド編集もコマンド履歴も使えないからである。

コマンドプロンプトから文字を打ち込むとき、次の文字が入る位置でカーソ ルが点滅する。文字を打ち込むと表示された文字の直後にカーソルが移る。 エディタやワープロのカーソルは最後に打ち込んだ文字の直後にあるカーソ ルを前方向に移動することができる。打ち込みの途中で文字の抜け落ちや間 違いに気付いたらカーソルを左方向に移動させてそれまでに入力した文字列 を修整できる。言い換えるとコマンドプロンプトに打ち込んだ文字列を編集 することができる。

tecoのコマンドプロンプトではコマンド編集ができない。だいいちカーソル 移動キー(矢印キー)が効かない。backspace キーで前の文字を消すことしか できない。そのため最初の文字を間違えたらそれまでに打ち込んだ文字をす べてご破算にするしかない。ms-dosのコマンドプロンプトへはエディタから コピーした文字列を貼り付けできるけれどtecoのコマンドプロンプトへは貼 り付けできない。

50文字以上もあるコマンド列をtecoのコマンドプロンプトへ一字の間違いも なく打ち込むことは不可能ではないにしても気が遠くなる作業である。その 場合は「EQq」コマンドを使う。このコマンドは後置するファイルの内容をq レジスタのqに読み込む。qはqレジスタの名前で0,1,~,9及びa,~,zの36個 のどれかである。マクロの実行には「Mq」(macors)コマンドを使う。名前が qであるqレジスタの内容をコマンド列と解釈して実行する。

マクロa (srta.tec)
!START!j0aua!CONT!l0aubqa-qb"gxak-lga1uf'qbualz-."g-l@o/CONT/'qf"g0uf@o/START/'
マクロb (srtb.tec)
<j0aua<l0aubqa-qb"gxak-lga1uf'qbual.-z;-l>-qf;0uf>

マクロをファイルからqレジスタに読み込んで実行するには次のようにする。

D:\tecow32>tecoc        tecoc.exe起動
*erreadme.bak$$         readme.bak読み込み
*y$$                    テキストバッファへ読み込む
*eqasrta.tec$$          マクロファイルsrta.tecをqレジスタaに読み込む
*ma$$                   qレジスタaの内容をtecoコマンドと解釈して実行
*ht$$                   テキストバッファの内容全部を表示
(ソート結果表示)        画面に表示しきれないときはファイルに出力する
*                       tecoのコマンドプロンプト

wikipediaに次の記述(逸話)がある。「(tecoの)ほとんど全ての文字にコマ ンドが割り当てられており、適当な文字列も(必ずしも有益とは言えない が) TECO プログラムと解釈することができる。当時よく行われたゲームと して、TECO で何かのファイルを編集していて、自分の名前をコマンド列と して与えたときに何が起きるかを見てみるというものがあった。」上記の srt.tecやsrtb.tecの内容は文字の羅列にしか見えない。面白半分か、teco を使いこなせない腹癒せ(はらいせ)からヤケッパチをやったものだろう。た いていはエラーメッセージになる。

| | コメント (1) | トラックバック (0)

« 2012年8月 | トップページ | 2012年11月 »