« 2012年7月 | トップページ | 2012年10月 »

2012年8月

2012年8月30日 (木)

tecoに再挑戦(retry)する

tecoに再挑戦(retry)する

Time-stamp: "Mon Dec 05 15:41:02 JST 2011"

平成23年11月23日、viの元祖であるラインエディタのedやexそしてsedにつ いて考えているときemacsの元祖とされるtecoとはなんぞやに行き着く。 ms-dosやwindowsで動くtecoのバイナリがあるのだから使ってみようとす る。実は平成22年8月31日ごろtecoに挑戦したが使い方が分からず、そのま まになった。前回はwindowsで動くバイナリと日本語の解説を見つけただけ で終わっている。

tecoの英文マニュアルとして次のpdfを使う。ほぼ同じ内容のものがプレイ ンテキストやhtmlファイルあるいは拡張子docの付いたワード文書(たいてい テキストエディタで読める)が方々のサイトにある。文書の日付が新しい (1990年)こと、そして注意書きが小さいフォントなどメリハリがあって読み 易いのでこれを選んだ。また、adobe readerは起動に時間がかかるけれど拡 張子docが呼ぶopen officeより起動が速いこともある。

次は元祖tecoのマニュアルより詳しく(冗長)に書かれており読み易い。対話 的(interactive)なtecoを目指して作られたものらしい。windowsで動くバイ ナリはない(実はソースファイルを含めて現在は何もない。マニュアルがあ るだけらしい)。なお、このページはトップページからリンクされてない(ヘ リコプターのページにぶら下げてある)。

tecoの動かし方の手掛りとしてwikipediaにある次の記述から出発する。こ れでトンネルの先に光が見えるようになった。tecoは大昔の機械で動いてい たものだから現在のwindowsでの使い方がマニュアルには書かれてない。

「プログラミング言語としてのTECOの文法は奇妙だが、非常に強力で、その クローンはMS-DOSやUNIX上でいまだに利用可能である。TECOのコマンドは文 字(制御文字もある)であり、プロンプトはアスタリスク("*")である。ESC キーを2回押下することでコマンドが完了し、画面にはドル記号("$$")で 表示される。(wikipediaより)」

escキーは文字列とtecoコマンドの区切りになる。wikipediaの実行例に 次がある。

「*SHello$0TT$$ "Hello" を検索してその行を表示する」

これは「S」(search)コマンドと「0T」(zero-tee)コマンド及び「T」(type) コマンドを一度にコマンドラインに打ち込むものである。中程の$(esc押 下で表示される)が無ければ引き続く文字列が「S」(search)コマンドの引き 数(argument)に取り込まれてしまう。そのためにコマンド(文字列)の区切り として$を入れる。「S」(search)コマンドや「I」(insert)コマンドの ように引き数として後置の文字列を指定する場合は引き続くコマンドとの区 切りを入れる必要がある。

「T」(type)コマンドは前置きの引き数を取るが後置の引き数は取らない。 したがって「0T」(zero-tee)コマンドの直後に「T」(type)を区切りなしで 続けることができる。「0T」(zero-tee)コマンドは行頭からポインタまで、 そして「T」(type)コマンドはポインタから行末までを表示する。つまり 「0TT」(zero-tee-tee)コマンドはポインタのある行を表示する(専用の 「V」(view)コマンドと同じ働きになる)。コマンド区切り$の直後に$を置く と、引き続くコマンドが無いことを意味する。それはコマンドを実行しなさ いという指示になる。

(注)キーボードからはescキーを打つけれどマクロをファイルから実行する ときの区切り子(delimiter)として何を使うのか? @修飾子(at-mark modifier)を使うらしい。@I/text/のように。

tecoc.exeのあるディレクトリでtecocと打つと 改行されてtecoのコマンド プロンプトであるアスタリスク(*)の次にカーソルが移る。これがtecoに対 するコマンドプロンプトである。tecocを打ち込む「>」はms-dosのコマンド プロンプトになる。

D:>teco>tecow32>tecoc
*

コマンドプロンプトに「erreadme.txt$$」と打ち込むとreadme.txtファイル を読み込む。読み込みが成功すると次のコマンドプロンプトになる。なお、 $$はescキーを押す度にダラーサインが表示されたものである。escキーを二 回続けて押すとコマンド実行になる。ダラーサインはキーボード上の「$」 を打って表示されたものではない。「EWtest$$」を打ち込むと書き出しファ イルの指定になる。終了は「EX$$」になる。読み込みファイルと書き出し ファイルを指定しただけで終了すると同じ内容のファイルが異なる名前で複 製されることになる。

Text Editor and Corrector (TECO)とは、1960年代にマサチューセッツ工 科大学(MIT)で開発されたテキストエディタ。当初の名称は Tape Editor and COrrector であったという。ところが解説(概説)の多くではcorrector としての使い方が説明されるだけである。まったくの白紙に文字を書き込む editorとしての使用例が示されない。どうしてだろうか?

テキストファイルを編集する道具がeditorであるから、先ずは既存のテキス トファイルを表示させてみようとする。そこでwindowsで動くバイナリ(実行 ファイル)tecoc.exeのあるディレクトリで引き数をファイル名にしてms-dos コマンドプロンプトから次のように打ち込んでみる。

D:\teco\tecow32>tecoc readme.bak
%Unrecognized command "readme.bak"
*

拒否されてしまいアスタリスクの後ろにカーソルが来る。teco自体は終了し ていない。ms-dosのコマンドプロンプトに戻す方法が分からない。右上隅の ×ボタンを押すと「このプログラムを自動的に終了することはできません。 プログラムの終了コマンドを使ってください。~~保存してないデータはす べて失われますが、このプログラムを今すぐ終了しますか?」と何やら不気 味なメッセージが出る。

tecoについて日本語で書かれた解説がない(少ない)。グーグルで「teco」を キーワードにしたのでは電機会社がヒットする。キーワードを「teco editor」にするとwikipediaの記事が出る。それに上記の記述があった。

アスタリスクがtecoのコマンドプロンプトであること、そしてコマンドを完 了(実行)させるにはescキーの2回押すというtecoの掟(おきて)を知る。この ことは方々のサイトにあるtecoの英文マニュアルにちゃんと書いてある。残 念ながら私の貧弱な英文読解力では読み取れなかった。ザッと見て知りたい ことが書かれている部分を見つけだす能力がない。そして、マニュアルがま わりくどい書き方になっている。それは機種依存な書き方でないからであ る。

機械のマニュアルが日本語であればそれが言う通りに現物を動かそうとす る。なんで説明通りに動かないのかと悩む。ひょっとして機械が壊れている のではと機械そのものを疑う。英語による説明の場合は英語の言っている意 味が分からない(英文解釈に自信がない)。機械の性能を疑うより自分の(英 文)マニュアル読解力のほうを疑う。現物を動かしてその反応からマニュア ルは、この動きを言っているのかと納得する。最初に英文マニュアルを読ん だときはサッパリ分からない。断片的に分かる部分を現物の動きに重ね合わ せて試行錯誤するうちに英語の言っていることが次第に分かってくる。
マニュアルの言っていることも分からず、機械も思い通りに動かない。いじ りたおしているうちに突然閃いて英語説明と機械の動きが腑に落ちる。訛 (方言)の強い人に知らない場所への道案内をたのんだようである。先ず、言 葉(マニュアルの英文)が途切れ途切れ(まだら)にしか分からない。そして道 筋(機械の動き)がイメージできない(察しがつかない)。迷いながらもようや く目的地に着いたあとで、さっきの人はこのこと(目印とか曲がり角)を言っ ていたのかと気付く。
英語の分かる人は英文のマニュアルを理解してから機械に取り掛かる二段階 方式をとる。英語が苦手だと拾い読みのあやふやなままで機械をいじくりた おす同時進行方式になる。英語を理解しておれば機械が思い通りに動かない で諦める。英語が分からないと機械も分からずサッパリ分からないの徒労で 終わる。

手元にあるwindowsで動くバイナリtecoc.exeをms-dosプロンプトから使う実 行例は載っていない。windowsで動くtecoc.exeとはいっても、そもそも windows自体がなかった時代に作られたtecoである。windowsでの実行例が昔 のマニュアルに載っているはずがない。

既存のテキストファイルをtecoに読み込むにはER(edit read?)コマンドを 使う。tecoのコマンドプロンプトであるアスタリスクの後ろにERに続けて ファイル名を入力してescキーを二回押す。ダラーサイン2個を表示してERコ マンドが実行される。そして次のコマンド待ちのアスタリスクになる。

D:\teco\tecow32>tecoc
*ERreadme.bak$$
*

コマンド名ERとファイル名の間をスペースで区切らない。コマンド名とその 引き数を空白で区切るというms-dosの常識が通用しないカルチャーショック に出会う。空白を入れるとファイル名に取り込まれるらしい。余分な空白を 入れると読み込みに失敗して次のようになる。

*er readme.bak$$
?SYS   No such file or directory
?UFI   unable to open file  readme.bak for input
*

なお、コマンド名は大文字でも小文字でもよい。コマンド名を大文字とし、 それに続くファイル名を小文字で表現している記事が多い。大文字・小文字 を使い分けてコマンド名とファイル名を識別しやすくしているのだろう。

読み込んだreadme.bakを表示させようとして「T」(type)コマンドを実行し ても何も表示されず、次のコマンド待ちになる。またもや、つまづいてしま う(アスタリスク(*)はtecoのコマンドプロンプトである。また末尾の$$は escキーを押す度に表示され、2回でコマンド実行になる)。

*erreadme.bak$$
*t$$
*

wikipediaの実行例は、ファイルを読み込んだあとで「P」(put, pageの意味 だろう)コマンドを実行している。テキストバッファに読み込むという操作 が必要になるらしい。またしても現在のエディタとは違う(メモリの節約の ためにファイル全部をいちどきに読み込まない仕様らしい)。

(wikipediaより)
*EBhello.c$$    バックアップ付きでファイルをリード/ライト・オープン
*P$$            最初のページを読み込む
*SHello$0TT$$   "Hello" を検索してその行を表示する
  printf("Hello world!\n");    その行
*-5DIGoodbye$0TT$$   5文字削除して、"Goodbye"を挿入し、その行を表示
  printf("Goodbye world!\n");  修正された行
*EX$$                        編集結果をファイルにコピーして終了

そこで「P」コマンドを実行してみる。そうすると出力ファイルがないとい うメッセージが表示される。構わずに「T」(type)コマンドを実行しても何 も起こらない。アラームが出たということは「T」コマンドが実行されな かったということらしい。読み込みファイルを指定した直後に「T」(type) コマンドを実行したのと変わらない。

*erreadme.bak$$
*p$$
?NFO   No file for output
*t$$
*

仕方ないので「EW」(edit write)コマンドで実在しないファイル名を与え る。その後に「T」(type)コマンドを押したらようやくreadme.bakファイル の内容(1行目)が表示された。何をやっても反応しなかったものがようやく 動いてくれた。ここまでが長い道のりであった。ほぼ一年前はtecoの windowsで動くバイナリを入手して動かそうとしたが、この部分が分からな くて諦めてしまった。道具を取り寄せただけで息切れしている。

*erreadme.bak$$
*p$$
?NFO   No file for output
*ewtest$$
*p$$
*t$$
      TECO-C (version number 146)
*

表示された内容はtecoc.exeを含むアーカイブtecow32.zipにあるreadme.txt をリネームしたものである。そのテキストファイルの第一行目の内容が表示 された。その後、試しに「Y」(yankだろう)コマンドを使うと出力ファイル がないというアラームが出ないことに気付く。「P」(put)と「Y」(yank)の 違いはマニュアルに書いてあるがアラームの有無がどうしてなのかは分から ない。

(注)この記事を書くにあたって、よーく調べたらtecow32.zipにはtecoc.exe しか入ってなかった。readme.txtは次に含まれるreadme.1stだった。
Documentation and support files (170k)
http://almy.us/files/tecodoc.zip

(注)「P」(page)コマンドあるいは「Y」(yank)コマンドで読み込むページと は何か? 巨大なファイルは分割してテキストバッファに読み込むらしい。 どれくらいで区切るのだろうか。メモリの節約のためにファイル全部をいち どきに読み込まない仕様らしい。試しに巨大ファイルとして郵便事業株式会 社の郵便番号簿をtecoc.exeから読み込ませてみた。csvのテキストファイル で約12万行(11MB)ある。「Y」コマンドで読み込ませたら全部を読み込んで しまった(tecoc.exeで日本語は表示できる。入力はできない)。「ZJ」コマ ンドでテキストバッファの末尾にポインタを移動する。最終行が改行だけの 場合は「-1L」コマンドで前の行の先頭にポインタを移す。「T」コマンドで 最終行を表示してみる。

検索コマンドに日本語を指定できない(ようだ)。郵便番号から住所を検索す ることはできる。

D:>teco>tecow32>tecoc
*erken_all.csv$ys9071801$0tt$$
47382,"90718","9071801","オキナワケン","ヤエヤマグンヨナグニチョウ
","ヨナグニ","沖縄県","八重山郡与那国町","与那国",0,0,0,0,0,0
*

テキストバッファの行内容を表示させるコマンドには「T」(type)と「V」 (view)がある。両者の違いを示すにはテキストバッファにおけるポインタを 知る必要がある。

ポインタとはテキストバッファに読み込んだページ上における各文字が先頭 から何番目のカラムにあるかを示すものである。tecoのポインタはスクリー ンエディタのカーソルに相当する。カーソルは編集中の文章に重ねて表示さ れるけれどtecoのポインタは目に見えない。ポインタが文章中のどこにある かはポインタが持つ自然数値による。ポインタの位置は「.=」コマンドで表 示される数値で表わされる。

テキストバッファの先頭の第1文字目を収めるカラムの後ろ(第1文字目と第2 文字目の間)のポインタが1になる。先頭から第n字目のカラムの後ろにポイ ンタのnがある。ポインタの0は第一カラムの前(第0字目の後ろ)にある。入 力ファイルを読み込んだ時点のポインタは0になっている。

テキストバッファの行内容を表示する「T」(type)コマンドはポインタから 行末までの文字列を表示する。入力ファイルを「P」(pageまたはput)コマン ドでテキストバッファに読み込んだ直後のポインタは0になっている。それ ゆえ「T」(type)コマンドはファイルの第一行目の全体を表示する。

数値nを前置する「nT」(type)コマンドは、ポインタが行頭にあるか行の途 中にあるかで表示が違う。行頭にポインタがあってnがプラスなら行を進め る方向へポインタのある行を含めてn行を表示する。行頭にポインタがあっ てnがマイナスなら現在行を含めないで行を遡る方向のn行を表示する。

ポインタが行の途中にあってnがプラスなら、現在行のポインタより行末ま でを含めたn行を表示する。ポインタが行の途中にあってnがマイナスなら、 現在行のポインタから行頭までと遡るn行を表示する(現在行の行頭からポイ ンタまでが尾鰭としてくっつく)。

nがゼロのときはポインタのある行の行頭からポインタまでを表示する。 「0T」(ゼロティ)はポインタのある行のポインタの位置を知るのに便利であ る。「0TT」(ゼロティティ)とすると「0T」(ゼロティ)で行頭からポインタ までを表示し、次の「T」(type)でポインタから行末までを表示する。それ ゆえ「0TT」(ゼロティティ)はポインタのある行の全体を表示する。「HT」 (whole type)はテキストバッファのすべてを表示する。

ポインタのある行全体を表示するには「V」(view)コマンドもある。これは 「0TT」と等価である。数値nを前置した「nV」は定義されてない。使えるけ れども挙動不審になるようである。

ポインタを移動させるには「C」(colomn)と「L」(line)コマンドを使う。 「C」(colomn)はポインタを一つ進める。数値を前置するとその数だけ進め る。負数ならその数だけ戻る。「0C」(zero see)はポインタを移動しない。 「L」(line)コマンドは次の行頭にポインタを移す。「0L」(zero el)は ポインタがある行においてポインタをその行頭に移動する。

「J」(jump)コマンドはポインタをテキストバッファの先頭(数値のゼロ)に セットする(「BJ」(beginning jump)も同じ)。テキストバッファの末尾にポ インタを移すには「ZJ」(izzard jump、最後の文字へ跳ぶ)を使う。

テキストバッファに文字列を挿入するには「I」(insert)コマンドを使う。 ポインタの位置に文字列textを挿入するにはtecoのコマンドプロンプトに 「Itext」と打ち込みescキーを2回押す。コマンド名「I」と挿入する文字列 を空白で区切らない。もし、空白で区切ると先頭にスペースがある文字列と みなされる。

空のテキストバッファに書き込むには「I」(insert)コマンドで書き込んで ゆく。改行にはenterキーを使う。何行でも続けて書き込める。ポインタは 最後に書き込んだ文字の後ろにある。内容を確認するには「J」(jump)コマ ンドでポインタをテキストバッファの先頭(ゼロ位置)に戻す。第1行目を表 示するなら「T」(type)コマンドを使う。n行を表示させるなら「nT」を、全 部の行を表示するには「HT」(whole type)コマンドになる。

既存のテキストバッファに文字を挿入するにはポインタを挿入位置に移動さ せなければならない。ポインタの位置はテキストバッファの先頭文字から何 番目のカラムにあるかの番号で示される。何行目の何文字目とはいかずテキ ストバッファ先頭からの通し番号が使えるだけである。「T」(type)コマン ドで表示される先頭文字の前位置の番号が「.=」で表示される。それを手掛 りにして「C」(column)でポインタを動かすことになる。それは、あまりに も面倒で気の遠くなる作業である。そこでサーチコマンドを使う。

ポインタを希望の位置にセットするためにサーチコマンド「S」(search)が ある。tecoのコマンドプロンプト(アスタリスク*)へ「S」に続けて検索文字 列を「Stext」のように入力してescキーを2回押す。現在のポインタ位置か ら後方で見つかった検索文字列の末尾文字の後ろにポインタが移動する。も し、場所を特定するに十分な長さの文字列を指定しないなら文字数不足によ り希望の場所でないかもしれない。そのときは、見つかったポインタ位置か ら同じキーワードで再検索する。

希望の場所にポインタが移動したかどうかを知るには、まず「0T」(zero- tee)コマンドを実行する。このコマンドはポインタのある行の先頭文字から ポインタまでの文字列を表示する。その文字列の末尾にtecoのコマンドプロ ンプトであるアスタリスク(*)が表示され、そのあとにカーソルが移動して コマンド待ちになる。次に「T」(type)コマンドを実行するとポインタ位置 から行末までの文字列が表示される。この場合は文字列の最後に改行文字が あるのでtecoのコマンドプロンプトのアスタリスクが次の行の先頭に表示さ れる。これら二つの表示内容から希望の場所かどうかを知ることになる。

テキストバッファから文字列を削除するには「K」(kill)コマンドや「D」 (delete)コマンドを使う。「K」は行を削除し、「D」は文字を削除する。 「K」(kill)コマンドの前置引き数の効果についてはポインタ移動の「L」 (line)コマンドよりは表示の「T」(type)コマンドに似ている。文字削除の 「D」(delete)の前置引き数の効果についてはポインタ移動の「C」(colomn) コマンドに似ている。なお、「0D」(zero-dee)と「0C」(zero-see)は無視さ れる。なお、「HK」(whole kill)コマンドでテキストバッファがクリアされ る(テキストバッファの内容をすべて表示する「HT」(whole type)コマンド と似ている)。

現在の(スクリーン)エディタのように編集中の本文の上にカーソルを重ねて 表示する機能を持たないtecoでは、ポインタ(カーソル)を希望の位置に移動 させるための検索機能が欠かせない。現在のエディタならよほど長大な本文 を編集するのでないかぎり自分の目で本文を読みながらカーソルを希望の位 置に移動させる。検索をカーソルの移動手段として使う必要がない。いや、 そもそも検索機能自体の使われることが少ない。

windowsのエディタとかワープロソフトの検索機能が使いにくい理由の第一 は検索ダイアログボックスが編集画面のうえにドッカリと現われることであ る。検索のキーワードを決める(入力する)ときも本文(編集画面の全体)が見 えないと困る。そして第二は検索を実行するとダイアログが消えて検索キー ワードが分からなくなることである。検索ヒット箇所がハイライト表示され るならよい。しかし、ヒットがなかったときは何を検索したのだろうとな る(忘れてしまう)。第三は検索ダイアログボックスがキーワードの入力以外 の操作をマウスでするように設計されていることである。いちおうキーボー ドからも操作できるようになってはいるが慣れない。マウスでアイコンをク リックするよりはブラインドタッチで使えるキーボードのほうが速い。とこ ろがキーバインドに無理があって憶えられない。えーい面倒だとマウスを使 う。キー位置は指先が憶えているがマウスは手掛かり(キーボードのF, J キーにある突起)のないディスプレイ上を目視で指定しなければならない。

結局のところ検索すること自体が少ないので検索に慣れない。慣れない検索 だから検索しないの悪循環になっている。そして使われない検索機能は改良 されない。付けないわけにはいかないので止むなく装備している。それが windowsソフトに付いている検索機能の現状である。

(注)私が今つかっているブラウザfirefox2.0の検索ダイアログはシンプルで よい。まず浮動型の検索ダイアログボックスでない。画面の最下段の一行分 のスペースに固定されたキーワード入力スペースがある。検索を始めても消 えない。キーワードの他にはヒット箇所を全部ハイライトするかどうかと大 文字・小文字を区別するかどうかのラジオボタンとヒット箇所の巡回方向別 のボタンしかない。

windowsのエディタやワープロの検索ダイアログボックスは検索条件の選択 箇所が多すぎる。検索の度に本文の真ん中を塞ぐダイアログは目障りでしよ うがない。検索サイトのグーグルやヤフーのキーワード入力欄はまことにシ ンプルである。どうしてこれを見習わないのであろうか。もし、そこにワー プロのようにゴチャゴチャと設定項目が並べてあったとしても、たぶん無視 する。ならばオプション設定として普段は表示しないようにしたらよい。

カーソル(ポインタ)を移動する手段として検索機能を使う発想はtecoより後 に開発されたスクリーンエディタのviやemacsに受け継がれている。とくに viではカーソル移動系の、それも検索がらみのコマンドが多いように感じ る。tecoやラインエディタのed, exがワンキーコマンドを基本とすることは tecoを元祖とするemacsよりは、viのほうに色濃く残っている。しかし、vi のワンキーコマンドの簡潔は、モードを持つエディタという不便を抱えるこ とにつながっている。

tecoの日本語解説に次の円周率を計算するtecoのプログラム(tecoエディタ のマクロ)pi2c.tecが収録されている。これをコピペした pi2c.tecをwindows のms-dosプロンプトから実行してみた。整数部分を含めて100桁の円周率が表 示される。凄いものだ。こんな簡単なプログラムで計算できる。円周率の計 算法はまったく分からない。プログラムを解読できたらteco道中級と上田氏 はいう。ヒントは下記のpdfに書かれている。Spigot Algorithmというもの を使うらしい。

D:\teco\tecow32>tecoc mung pi2c.tec 100
3141592653589793238462643383279502884197169399375...
D:\teco\tecow32>

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

« 2012年7月 | トップページ | 2012年10月 »