66 lines
1.5 KiB
Text
66 lines
1.5 KiB
Text
|
#!/usr/bin/env rre
|
||
|
|
||
|
This will (hopefully) be a functional text editor written in RETRO.
|
||
|
|
||
|
Interface:
|
||
|
|
||
|
<filename> : <line-count> : <current-line>
|
||
|
---------------------------------------------------------------
|
||
|
99:
|
||
|
100: :n:square dup * ;
|
||
|
101:
|
||
|
* 102: This is the current line
|
||
|
103:
|
||
|
---------------------------------------------------------------
|
||
|
|
||
|
As with my old block editor, this will be primarily line oriented.
|
||
|
And it's visual, with some simple key bindings.
|
||
|
|
||
|
~~~
|
||
|
'SourceFile var
|
||
|
'FID var
|
||
|
|
||
|
#0 sys:argv s:keep !SourceFile
|
||
|
|
||
|
:count-lines #0 @SourceFile [ drop n:inc ] file:for-each-line ;
|
||
|
|
||
|
#12 'MAX-LINES const
|
||
|
'CurrentLine var
|
||
|
|
||
|
:pad (n-n)
|
||
|
dup #0 #9 n:between? [ '___ puts ] if
|
||
|
dup #10 #99 n:between? [ '__ puts ] if
|
||
|
dup #100 #999 n:between? [ '_ puts ] if ;
|
||
|
|
||
|
:current (n-n)
|
||
|
dup @CurrentLine eq? [ '*_ puts ] [ '__ puts ] choose ;
|
||
|
|
||
|
:skip-to
|
||
|
@CurrentLine n:dec #0 n:max [ @FID file:read-line drop ] times ;
|
||
|
|
||
|
:display
|
||
|
@SourceFile file:R file:open !FID
|
||
|
skip-to
|
||
|
@CurrentLine count-lines MAX-LINES n:min [ dup current pad putn n:inc ':_ puts @FID file:read-line puts nl ] times drop
|
||
|
@FID file:close ;
|
||
|
|
||
|
:handler
|
||
|
getc
|
||
|
$j [ &CurrentLine v:inc ] case
|
||
|
$k [ &CurrentLine v:dec ] case
|
||
|
$q [ 'stty_-cbreak unix:system #0 unix:exit ] case
|
||
|
drop ;
|
||
|
|
||
|
:loop
|
||
|
'stty_cbreak unix:system
|
||
|
repeat
|
||
|
ASCII:ESC '%c[2J s:with-format puts nl
|
||
|
@CurrentLine count-lines @SourceFile '%s_:_%n_:_%n\n s:with-format puts
|
||
|
display
|
||
|
#72 [ $- putc ] times nl
|
||
|
handler
|
||
|
again ;
|
||
|
|
||
|
loop
|
||
|
~~~
|