エディタの使い方
[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を編集する |
※コメント投稿者のブログIDはブログ作成者のみに通知されます