TECO線集者EMACS、私はあなたの父芪です

私の生たれた少し前に曞かれたパロディの蚘事「 Real Programmers Do n't Use Pascal」で初めおTECOに぀いお読みたした。 そこには、本物のプログラマヌは、新しい゚ディタヌEMACSおよびVIを䜿甚しないず曞かれおいたす。


いいえ、本物のプログラマヌは「尋ねた だからそれを手に入れおください」-耇雑で、神秘的で、匷力で、寛容ではなく、危険です。 TECO、正確には。
オリゞナル
いいえ、本物のプログラマは「あなたがそれを求め、あなたがそれを手に入れた」テキスト゚ディタを望んでいたす-耇雑で、䞍可解で、匷力で、容赊なく、危険です。 TECO、正確には。

興味をそそられたした。 これはどんな動物ですか、觊るこずができたすか りィキペディアによるず、TECOはT ext Editor CO rrectorであり、1962幎にDECで䜜成され、PDPファミリコンピュヌタで䜿甚され、埌にOpenVMSシステムで䜿甚されたした。 Cにはポヌトがあり、最新の状態の愛奜家によっお維持されおおり、最新のオペレヌティングシステムの䞋で組み立おられおいたす。 それで、少なくずも少しは本物のプログラマのように感じるこずにしたした。



Linuxでのコンパむルは問題を匕き起こしたせんでしたlibncurses-devをむンストヌルするだけです。 そしお、 tecocを実行するず、匷力な゚ディタヌむンタヌフェむスが衚瀺されたす。


 * 

はい、1぀星です。 これは、コマンドを入力するための招埅状です。 指瀺なしではできないようです。 幞いなこずに、このマニュアルはむンタヌネットで簡単に芋぀けるこずができたす。 これは、VAX、PDP-11、PDP-10、およびPDP-8の暙準TECOテキスト゚ディタヌおよびコレクタヌず呌ばれる300ペヌゞ近くの本です。 ここでは、1990幎の最新バヌゞョンをPDFで読むこずができたす。圓時、TECOはほずんど忘れられおいたした。


たず、この奇跡から抜け出す方法を考え出す䟡倀がありたす。 EXず入力しおからEscapeを2回抌す必芁があるこずがわかりたした。 䞀般的に、゚スケヌプをダブルクリックするず、入力したコマンドが実行されたす。 Enterキヌは、単に改行ずしお䜿甚されたす。 ゚スケヌプは画面にドルずしお衚瀺されたすが、ドルを入力しおも゚スケヌプ効果は埗られたせん。 ただし、さらに$を蚘述するず、Escapeキヌを抌す必芁があるこずを意味したす。 したがっお、 EX$$終了したすファむルは保存されたす。 玠晎らしい、入堎ず退堎を孊んだ-仕事の半分が完了した。


䞀般に、TECOコマンド圢匏は次のようなものです。


 [[<1>,] <2>] [:] <> [<1> [ $ <2> ] $ ] 

議論が巊ず右の䞡方に行くこずができるのはかなり珍しいです。 ただし、別の方法で取埗するこずをお勧めしたす。巊偎の数字はチヌムの䞀郚ではなく、結果ずしお数字たたは数字のペアを返す別のチヌムです。 この堎合、埌続のコマンドは前のコマンドの結果を䜿甚できたす。


゚スケヌプは䞍䟿です。コピヌしお貌り付けるず、ドルずなるだけで、区切りずしお認識されないためです。 幞いなこずに、テキスト匕数を持぀コマンドには代替構文がありたす @ <> <> <> <> 、ここでセパレヌタは任意の文字です。 たずえば、 IHabr$を䜿甚しお珟圚のカヌ゜ル䜍眮に「Habr」ずいうテキストを挿入できたすI、テキスト、゚スケヌプ-䌌おいない、 IHabr$ @I/Habr/䜿甚できたす。 人生を簡玠化するために、2番目の構文に切り替えたした。


玠晎らしい。 ファむルにテキストを入力する方法を孊ぶずいいでしょう。 出力ファむルを指定するには、 EWコマンドず入力ファむル、 ERコマンドを䜿甚したす。 良い意味で、それらは䞀臎しないはずです。 圓時、 <FF>蚘号たたはフォヌムフィヌドを䜿甚したペヌゞネヌション付きのテキストファむルの耇数ペヌゞ衚瀺が䞀般的でした。 これは、Ctrl + Lを介しお入力されたコヌド120xCの文字ですLは英語のアルファベットの12番目の文字です。 これにより、ペヌゞを吐き出しお新しいペヌゞを開始するようにプリンタヌに指瀺するだけでなく、適床な量のRAMで長いファむルを線集するこずも可胜になりたした。 TECOは、入力ファむルの1ペヌゞ <FF>文字たでのみをメモリにロヌドし、線集しお出力ファむルに曞き蟌み、次のペヌゞに移動できるようにしたす。 ペヌゞを接着および分割する操䜜もありたす。 ファむルが同じである堎合、良いものは䜕もないこずは明らかです。 たあ、私たちはペヌゞで遊ぶ぀もりはありたせん、最近は絶察にワむルドです。 ファむルは単䞀ペヌゞになりたす。 したがっお、ファむルを最初から䜜成したす。


 *@EW/habr.txt/$$ *@I/Hello, Habrahabr! This is TECO, the most powerful editor in the world. Stop using your fancy IDEs, TECO for the win! Bye. /$$ *EX$$ 

これは機胜し、 habr.txtファむルはテキストずずもに実際に衚瀺されたした。 各コマンドを2぀のEscapeで完了したしたが、実際にはこれは必芁ありたせん。 さお、しかし既存のファむルをどのように線集できたすか 毎回新しい名前を発明するこずに消極的。 これを行うには、最初の蚘録で入力ファむルの名前を*.bakに倉曎する特別なEBコマンドがありたす。したがっお、入力ファむルず出力ファむルが異なるこずが*.bakたす。 ファむルを開いた埌、最初のペヌゞコマンドY に切り替えるこずを忘れないでくださいHTコマンドを䜿甚するず、ファむルの内容党䜓を衚瀺できたす。


 *@EB/habr.txt/YHT$$ Hello, Habrahabr! This is TECO, the most powerful editor in the world. Stop using your fancy IDEs, TECO for the win! Bye. * 

厳密に蚀えば、 HTは2぀のチヌムです。 Hコマンドは、数倀のペア-0ずテキストバッファヌの長さ、぀たり珟圚メモ​​リにあるペヌゞを返したす。 たた、 Tコマンドは、指定されたオフセット範囲でファむルのフラグメントを出力したす。


 *0,5T$$ Hello*7,17T$$ Habrahabr!* 

はい、誰もラむンフィヌドを再床远加したせん。5文字を芁求したした。 しかし、すべおが明確です。 Tコマンドに1぀の数倀のみが枡された堎合、それは印刷される行数ずしお解釈され、カヌ゜ル䜍眮から前埌にカりントされたす。 さらに、カヌ゜ルが行の䞭倮にある堎合、 0Tは珟圚の行の先頭からカヌ゜ルにフラグメントを印刷し、パラメヌタなしのTカヌ゜ルから行の末尟たでを印刷したす。


 *5J$$ *0T$$ Hello*T$$ , Habrahabr! * 

䞊で䜿甚したJコマンドは、指定された絶察オフセットにカヌ゜ルを移動したすカヌ゜ルは垞に文字の間にありたす。 芋た目がいので、このカヌ゜ルを芋たいです。 0TずT間にスティックを印刷するこずはできたすか はい、できたす。 印刷コマンドは^A Ctrl + Aを入力するか、盎接チェックしお文字Aを順番に入力できたす。


 *0T@^A/|/T$$ Hello|, Habrahabr! * 

これで、カヌ゜ルの䜍眮を確認できたす。 このコマンドを蚘録し、必芁に応じお実行するずよいでしょう。 コマンドを実行した埌にすぐに* 、次に文字たたは数字を入力するず、前のコマンドのテキストが察応するQレゞスタに曞き蟌たれたすなぜそれが単なるレゞスタではなくQレゞスタであるかはただわかりたせん。 たずえば、 *Z レゞスタZの内容は、 MZコマンドを䜿甚しおコマンドずしお実行できたす。


 *MZ$$ Hello|, Habrahabr! * 

さお、最初のTECOマクロを蚘録したした。 たあ、ポゞションを駆け抜けるのは退屈です。䜕かを探すこずができたらいいですね。 たずえば、IDEずいう単語を探したしょう。 ヘルプには、このためのSコマンドがありたす。


 *@S/IDE/$$ * 

それで䜕 䜕も裏切りたせんでした 芋぀かりたしたか そしお、芋぀かった堎合、どこに はい、むンタラクティブ゚ディタは砎損しおいたす。 䜕もしなかったら、芋぀けたした。 TECOは、芋぀かったテキストの埌にカヌ゜ルを移動したした。 繰り返しお、すぐにカヌ゜ルで線を匕きたしょう


 *@S/IDE/MZ$$ ?SRH Search failure "IDE" 

ああ、そしお今䜕 ええ、圌は珟圚のカヌ゜ル䜍眮から䜕かを探しおいたすが、2番目のIDEはありたせんでした。 最初にファむルの先頭に移動する必芁がありたす Jだけでできたす。


 *J@S/IDE/MZ$$ Stop using your fancy IDE|s, TECO for the win! 

で、矎。 䞡偎にあるテキストを匷調衚瀺するのはどうですか それから私はほずんどドキュメントを調べなければなりたせんでした。 そのようなこずが䟿利になりたした



したがっお、 ^SCを䜿甚するず、芋぀かった行の先頭に移動できたす。その埌、䜿い慣れた0Tプレフィックスを出力し、 [たす。 次に、䜍眮からフラグメントを印刷する必芁がありたす. to .-^S  ^Sは負の数であるこずを思い出しおください。 次に]ず入力し、カヌ゜ルを-^SCで元の䜍眮に戻し、 T行の残りを印刷したすT プログラム党䜓は次のずおりです。


 *^SC0T@^A/[/.,.-^ST@^A/]/-^SCT$$ Stop using your fancy [IDE]s, TECO for the win! * 

玠晎らしい、私たちはすでにパヌルをやっおいたす。 実際のプログラマヌに関する蚘事から次の匕甚をする時が来たした


TECOコマンドシヌケンスは、読み取り可胜なテキストずいうよりもノむズ䌝送に䌌おいるこずに泚意しおください。 楜しいのは、チヌムずしおTECOに名前を入力し、䜕が起こるかを掚枬するこずです。 TECOず話をするずきのほずんどのタむプミスは、プログラムを砎壊したり、さらに悪いこずに、か぀お働いおいた手順にずらえどころのない䞍思議なバグを導入したりする可胜性がありたす。
オリゞナル
TECOコマンドシヌケンスは、読み取り可胜なテキストよりも䌝送ラむンノむズに䌌おいるこずが確認されおいたす。 TECOでプレむするより面癜いゲヌムの1぀は、コマンドラむンずしお名前を入力し、その動䜜を掚枬するこずです。 TECOずの䌚話䞭に発生する可胜性のある入力゚ラヌは、おそらくプログラムを砎壊するか、さらに悪いこずに、䞀床動䜜するサブルヌチンに埮劙で神秘的なバグを導入したす。

ずころで、TECOの正芏衚珟の類䌌性も利甚できたす。 たずえば、 [AZ]\d+の類䌌物は^EW^EM^EDです。 正芏衚珟が気に入らない堎合は、TECOで少し働いおください 。 その埌、あなたは愛するでしょう。


今、私はいく぀かの制埡構造が欲しいです。 この問題を考えおみたしょうカヌ゜ルが行の先頭にあるず仮定しお、矎しいフレヌムで行のテキストを取埗したす。 ちなみに、行を䞋に移動したす-コマンドL 、䞊に-Lです。 Ctrl + HおよびCtrl + Jを抌しお、 -LTおよびLTコマンドをすばやく実行し、テキストを前埌に実行するこずもできたす。


このタスクでは、珟圚の行にある文字ず同じ数のマむナス蚘号を挿入する必芁がありたす。 それを枬定するには あなたは呌び出すこずができたす. L前埌に2回、差を蚈算したす。 Qレゞスタでの数字の曞き蟌みず読み取りは䟿利です数字ずテキストは同じ名前でQレゞスタに個別に保存されたす。 UAはレゞスタAに数倀を曞き蟌み、 QAそれを読み取りたす。 n回の繰り返しでの単玔なルヌプはn<...>です。 たずえば、マむナス蚘号をA回挿入する堎合は、 QA<@I/-/>ず蚘述したす。 マクロ党䜓は次のようになりたす。


 .UAL.-QA-2UA-L@I/+/QA<@I/-/>@I/+ |/L2R@I/| +/QA<@I/-/>@I/+ /-LC 

おそらく、このマクロで最もわかりにくいのは-2です。 そしお2R 。 すべおが非垞に単玔です。圓時のラむンフィヌドは垞に2文字'\r\n'占めおいたした。 意芋の盞違はなく、玠晎らしかった。 行の先頭の座暙の差からそれを枛算する必芁があり、右のフレヌムを描画するには、2文字巊に移動する必芁がありたす。


このマクロを保存しお、 Yを登録したすY ちなみに、これはコマンド実行埌の*Yだけでなく、 ^Uコマンドを䜿甚しお文字列をレゞスタに曞き蟌むこずができたす @^UY/ / 。 バッファヌの先頭にあるそれを実行しおみたしょう。


 *MY$$ *HT$$ +-----------------+ |Hello, Habrahabr!| +-----------------+ This is TECO, the most powerful editor in the world. Stop using your fancy IDEs, TECO for the win! Bye. * 

いいね 倉数、ルヌプ-これはすでに実際のプログラミングのようです。 シニアTECO開発者の地䜍に぀いおのむンタビュヌに行くこずができたす。 むンタビュヌずいえば。 TECOでFizzBu​​zzマクロを曞きたしょう。 私の前に誰かがこれをしたかどうかはわかりたせん。


ここで、15による剰䜙による陀算は有甚ですが、残念なこずに、剰䜙による陀算の操䜜は圹に立ちたせん。 しかし、陀算は完党に存圚するため、 xx/15*15で衚珟できたす。 確かに、操䜜の優先順䜍も存圚しないため、 -x/15*15+xず蚘述する必芁がありたす。 次に、残りに応じお、異なるこずを行う必芁がありたす。 䜙りが0の堎合、 FizzBuzzたたは12の堎合はFizzBuzz 、5たたは10の堎合はFizz 、それ以倖の堎合は入力番号を印刷したす。 Oコマンドはこれに圹立ちたす。 数倀匕数がない堎合、これは無条件ゞャンプ぀たりGOTOであり、数倀匕数がある堎合はスむッチのようなものですnOは、n番目のマヌクにゞャンプしたすカンマがある堎合。 タグは次のように芋えたす!! コメントも曞かれおいたす-これは、誰も飛び乗っおいないラベルです。 タグを䜜成する!f! フィズ甚、! !b! バズ甚および!fb! FizzBu​​zz甚および!e! -飛び出しの終わり、 break 。 QレゞスタFに曞き蟌むコマンドを含むマクロ党䜓を次に瀺したす。


 *^UF UA-QA/15*15+QA@O/fb,,,f,,b,f,,,f,b,,f/QA=@O/e/!fb!@^A/Fizz/!b!@^A/Buzz /@O/e/!f!@^A/Fizz /!e!$$ 

^Aコマンドに改行を枡しお衚瀺するこずに泚意しおください。 Javaにはただ耇数行リテラルがありたせんが、TECOにはすでに半䞖玀以䞊前のものがありたす。 たた、 !fb! Fbブランチの埌に「フォヌルスルヌ」を実行しお、少し節玄したした!fb! 2぀の半分からFizzBu​​zzず入力したす。 通垞のswitch-caseステヌトメントのように。


興味深いこずに、マクロはUA始たりたすAレゞスタA数倀を曞き蟌みたすA そしお䜕番 非垞にシンプル-このマクロの匕数。 呌び出しの盎前に指定する必芁がありたす。 私たちはチェックしたす


 *4MF$$ 4 *5MF$$ Buzz *105MF$$ FizzBuzz *87MF$$ Fizz *44MF$$ 44 * 

玠晎らしい、むンタビュヌを受けたした この蚘事のKDPVを䜜成するには、最埌の実隓が必芁でした。 必芁な文字を衚瀺するプログラムを曞く方法は この蚀語には配列ずデヌタ構造がないようです。 しかし、テキストバッファがありたす ここで、文字ゞェネレヌタヌを<>< ><>< >...ずいう圢匏で駆動したした HKコマンドはバッファヌの珟圚の内容をクリアしたす


 *HK@I/H130H130H124H130H130A62A66A254A130A130B254B128B252B130B252R252R130R252R128R128R/$$ 

J< >@S/<>/を䜿甚しお、目的の番号に自分自身を配眮できたす。これは、数倀パラメヌタヌSを䜿甚するず、指定した文字列のn番目の出珟を怜玢できるためです。 任意のテキストパラメヌタヌでパラメヌタヌ化されたコマンドを実行する方法が芋぀からなかったため、QレゞスタDでコマンドを䜜成し :^UDは末尟に远加したすが、単に^UDはQレゞスタ内のテキストを眮き換えたす、マクロずしお実行したした。 その埌、バックスラッシュ\コマンドを䜿甚しお数倀を解析できたす。 条件挔算子も必芁です。 "N<>' -数倀匕数がれロでない堎合に実行し、 "E<>' -数倀匕数がれロの堎合に実行したす。 「別の方法で」ブランチは、パむプで分離するこずによっお䜜成するこずもできたす。 したがっお、スペヌスたたはラティスの出力は"E32^T|35^T'で行われたす。 ^Tは察応するASCIIコヌドで文字を出力したす。別の䟿利なコマンドは%<>で、察応するQレゞスタの数倀を1぀増やしたす。


私はこのようなレゞスタを䜿甚したした混乱しないように、それぞれが数字たたは文字列にのみ䜿甚されたした



 @^UC/HABRAHABR/1UF!bl!0UE!bm!J@^UD/@S|/QEQC:^UD@:^UD/|/QFMD$ \UAC128UB!br!QB&QA"E32^T|35^T'QB/2UBQB"N@O/br/'%E^[QE-:QC"N@O/bm/'@^A/ /%F^[QF-6"N@O/bl/'$$ 

倚くのマクロはTECOで蚘述されおおり、非垞に耇雑なものです。 もちろん、少なくずも䜕かを理解するためには、マクロを構造化し、改行、むンデント、コメントを挿入するずよいでしょう。 ただし、これによりマクロ凊理が倧幅に遅くなるこずがわかりたす。 したがっお、圌らはミニマむザヌを思い぀いた。 ミニファむの前のミニマむザヌのコヌドを次に瀺したす 。 JavaScriptの䞖界で今日芋られおいるのず䌌たようなもの。


興味深いこずに、キヌボヌドから文字を読み取るためのコマンドがあるため、マクロをむンタラクティブにするこずができたす。 ゚スケヌプシヌケンスを介した端末出力の機胜を䜿甚するず、画面䞊にカヌ゜ルを簡単に配眮し、フラグメントを䜿甚しおテキストを曎新し、色を切り替えるこずができたす。 したがっお、マクロを䜿甚しお、各入力文字たたは特殊キヌを凊理し、むンタラクティブな線集モヌドを䜜成できたす。 これが、元々はTECOのマクロだったEmacsの誕生方法であり、その埌、別のアプリケヌションずしお曞き盎されたした。



Source: https://habr.com/ru/post/J351416/


All Articles