石原 博の覚書

電子工作に関する日々の覚書を記載します

Forthのエディタ(コマンド)

2021-05-16 23:11:09 | 日記

エディタの使い方

[1]新規ファイルを作る(0〜N-1  のN個のスクリーン)

 N create-file ファイル名

[1']ファイルオープンする

 open ファイル名

[2]スクリーン1を編集

 1 editor

 

エディタコマンド

定義 内容 使用例 説明
: TOP (S -- ) R# OFF ; スクリーン内のカーソル変数(R#)にFALSE(0)を書き込む(OFF) TOP カーソルを1行目の左端に移動
: C (S n -- ) R# @ + C/SCR MOD R# ! ; スクリーン内のカーソル変数(R#)を読み出して(@)、nを足す(+)
C/SCR(スクリーン内の文字数1024)で割ったあまり(MOD)をカーソル変数(R#)に書き込む(!)
2 C
-3 C
カーソルを右に2文字移動
カーソルを左に3文字移動
: T (S n -- ) TOP C/L * C ; カーソルをスクリーンの最初に移動(TOP)してから、
C/L(1行内の文字数64)をかけて(*)移動数を求め、移動する(C)
2 T カーソルを2行目左端へ移動
: +T (S n -- ) LINE# + T ; 現在行(LINE#)を足して(+)、その行に移動する(T) 1 +T カーソルを1行下左端へ移動
: KEEP (S -- ) ‘LINE C/L ‘INSERT PLACE ; 現在行の先頭(‘LINE)からC/L(行内文字数64)を’INSERT(insert-buffer)へ、文字列として保存(PLACE)する    
: K (S -- ) ‘FIND PAD C/PAD CMOVE ‘INSERT ‘FIND C/PAD CMOVE PAD ‘INSERT C/PAD CMOVE ; find-bufferからPAD(作業領域)へC/PAD(84個)移動(CMOVE)
insert-bufferからfind-bufferへC/PAD(84個)移動(CMOVE)
PAD(作業領域)からinsert-bufferへC/PAD(84個)移動(CMOVE)
⇒結局find-bufferとinsert-bufferの交換
   
: W (S -- ) SAVE-BUFFERS ; バッファーをディスクへ保存する    
: I (S -- ) (I) INSERT C ; insert-bufferに文字列を入れ((I)) (S -- len‘insert len ‘cursor #after)
insert-bufferからcursor位置に挿入(INSERT) (S string length buffer size -- )
insert-bufferの文字列長だけカーソルを進める(C) (S n -- )
I xyz カーソル位置からxyzを挿入
: O (S -- ) (I) REPLACE C ; insert-bufferに文字列を入れ、
(I) (S -- len ‘insert len ‘cursor #after) insert-bufferに文字列を入れ
REPLACE (S string length buffer size -- ) insert-bufferからcursor位置に上書き
C (S n -- ) insert-bufferの文字列長だけカーソルを進める
O xyz カーソル位置からxyzを上書き
: P (S -- ) ‘INSERT ?TEXT DROP ‘LINE C/L CMOVE MODIFIED ; insert-bufferに文字列を入れ、行先頭(‘LINE)からC/L(64文字)移動 P xyz 現在行に xyzを上書き
: U (S -- ) C/L C ‘LINE C/L OVER #END INSERT P ; C/L(64文字)カーソルを進め、
(‘LINE C/L OVER #END) 行頭 C/L 行頭 行頭からスクリーン末までの文字数(#END)を INSERT  現在行を次行に複製する
Pでinsert-bufferに文字列を入れ、行先頭(‘LINE)からC/L(64文字)移動
U xyz 次行にxyzを挿入
: X (S -- ) KEEP ‘LINE #END C/L DELETE MODIFIED ; 現在行をinsert-bufferに入れ(KEEP)、
行頭アドレス(‘LINE) 行頭からスクリーン末までの文字数(#END) C/L(64文字) を引数にして削除(DELETE)
X 現在行を削除
(削除した行はinsert-bufferへ)
: SPLIT (S -- ) PAD C/L 2DUP BLANK ‘CUSOR #REMAINING INSERT MODIFIED ; PAD(作業領域)をC/L(64文字)用意し、空白化(2DUP BLANK)
PAD(作業領域)からC/L(64文字)をカーソル位置(‘CURSOR)から挿入(INSERT)
⇒ブランクを64文字分挿入
   
: JOIN (S -- ) ‘LINE C/L + C/L ‘C#A INSERT ; ‘LINE(行頭アドレス)にC/L(64文字)を足して(+)次の行頭を求め、V/L(64)文字分のデータを
現在のカーソルアドレスと行末までの文字数(’C#A)、以降に挿入(INSERT)
(‘LINE C/L + C/L ‘C#A INSERT) 'LINE+C/L C/L ‘CURSOR #AFTER INSERT
   
: WIPE (S -- ) ‘START B/BUF BLANK MODIFIED ; バッファーの先頭アドレス(‘START)からB/BUF(1024)ブランクを書き込む WIPE 現在のスクリーンを消去
: G (S screen line -- ) C/L * SWAP IN-BLOCK + C/L ‘INSERT PLACE C/L NEGATE C U C/L C ; screenのline行目をinsert-bufferに入れ、1行上にあがり挿入(U)(Uは次行挿入なので先に1行上がる)
カーソルを1行下げる。
1 2 G スクリーン1の2行目を現在位置に挿入
: F (S -- ) FIND? ?MISSING ‘F+ C ; find-bufferに文字列を入れ、現在のカーソルからスクリーン末まで検索
なければエラー あればカーソルをfind-bufferの文字列長(‘F+)進める
f xyz xyz をfind-burrerに入れ検索
: S (S n -- ) 1 ?ENOUGH FIND? IF ‘F+ C EXIT THEN DROP FALSE OVER SCR @ DO N TOP ‘FIND COUNT ‘CURSOR #REMAINING SEARCH IF ‘F+ C DROP TRUE LEAVE ELSE DROP THEN KEY? ABORT” Break!” LOOP ?MISSING ;

find-bufferに文字列を入れ、現在のカーソルからスクリーン末まで検索

この後n個のスクリーンも対象とする。

   
: E (S -- ) ‘FIND C@ DUP NEGATE C ‘C#A ROT DELETE ; find-bufferの文字列長(‘FIND C@)だけカーソルを戻し(NEGATE C)、
find-bufferの文字列長 cursor位置(‘cursor) 行末までの文字列長(#after)
(ROT DELETE) cursor位置(‘cursor) 行末までの文字列長(#after) find-bufferの文字長 DELETE
⇒カーソル前の、find-buffer文字列長分の文字を削除(文字列の内容は関係ない)
   
: D (S -- ) F E ; find-bufferに文字列を入れ、検索。そこから文字列長分を前に向かって削除
⇒一致する文字列を削除
D xyz xyzを削除
: R (S -- ) E I ; カーソル前のfind-bufferに文字列長分の文字を削除し、insert-bufferに文字列を入れ、カーソル位置に挿入する
⇒削除する文字列は指定出来ない。事前にFなどで検索する必要あり
F abc
R xyz
abcを検索し、xyzに置き換える
: TILL (S -- ) ‘C#A (TILL) ‘F+ DELETE ; ‘C#A (S -- cursor after )
(TILL) (S -- offset ) find-bufferに文字列を入れ検索 一致位置はoffset
'F+ (S n1 -- n2 )
⇒カーソル位置から、find-bufferに文字列を入れて検索し一致した検索文字列を含め削除
TILL xyz xyzを含め削除
: J (S -- ) ‘C#A (TILL) DELETE ; ⇒カーソル位置から、find-bufferに文字列を入れて検索し一致した検索文字列を含めず削除 J xyz xyzまでの文字列を削除
: KT (S -- ) ‘CURSOR (TILL) ‘F+ ‘INSERT PLACE ; ‘CURSOR (S -- cursor )
(TILL) (S -- offset ) find-bufferに文字列を入れ検索 一致位置はoffset
'F+ (S n1 -- n2 )
'INSERT (S -- insert-buffer )
⇒カーソル位置から、find-bufferに文字列を入れて検索し一致した検索文字列を含めinsert-bufferにコピー
   
: NEW (S n -- ) L/SCR SWAP DO [ FORTH ] I [ EDITOR ] T EDIT-AT >IN OFF QUERY SPAN @ IF P ELSE [ FORTH ] I REDISPLAY LEAVE THEN .SCREEN LOOP .SCREEN ; (n L/SCR SWAP DO [ FORTH ] I [ EDITOR ] T) n行目から最終行まで入力する
(EDIT-AT >IN OFF QUERY SPAN @ IF P) 画面上のカーソル位置にカーソルを移動し、入力がればその行に上書き
([ FORTH ] I REDISPLAY LEAVE THEN) 入力がなければ行番号(I)とその行を印字(REDISPLAY)し、抜ける(LEAVE)
⇒n行目から複数行入力する。2回改行で抜ける
   
: DONE (S -- ) [ EDITOR ] EDITING? @ IF PREVIOUS EDITING? OFF CR SCR ? >UPDATE @ 0< NOT IF .” Un” THEN .” modified” ?STAMP W THEN DISK-ERROR OFF AUTO 2@ ! ;     編集終了
: ED (S -- ) [ EDITOR ] GET-ID INSTALL EDITOR ‘VIDEO B/BUF ERASE DARK .ALL ;      
: EDIT (S scr -- ) 1 ?ENOUGH SCR ! [ EDITOR ] TOP ED ; 引数が1個であることを確認(1 ?ENOUGH)し、スクリーン変数に代入(SCR !)
カーソルをTOP位置に移動させて、編集(ED)
1 EDIT スクリーン1を編集する


最新の画像もっと見る

コメントを投稿