diff --git a/femto.tal b/femto.tal index 44f6abb..9d460d2 100644 --- a/femto.tal +++ b/femto.tal @@ -37,6 +37,7 @@ ( blue, magenta, cyan, white ) ( TODO: ) +( - dollar ($) and caret (^) regex bug ) ( - optimize term drawing ) ( - get long line truncation/scrolling working ) ( - allow line numbers to be toggled off ) @@ -44,9 +45,7 @@ ( - open file command? ) ( - close file command? ) ( - move by word/paragraph ) -( - search ) ( - search&replace ) -( - windows line-ending support (CRLF) ) |00 @System [ &vector $2 &wst $1 &rst $1 &pad $4 &r $2 &g $2 &b $2 &debug $1 &halt $1 ] |10 @Console [ &vector $2 &read $1 &pad $5 &write $1 &error $1 ] @@ -105,7 +104,6 @@ &tab-width $2 ( how many spaces to display tab chars ) &insert-tabs $1 ( tab key inserts tabs when true ) &color $2 ( digits of highlight color in reverse order ) - &line-endings $1 ( 00 = unix, 01 = windows, 80 = mixed ) ] ( tracks information related to the buffer's view of data ) @@ -272,8 +270,7 @@ @count-c ( c^ -> n* ) #0000 ,&count STR2 STH ;data - &loop ( DUP2 .buffer/limit LDZ2 EQU2 ,&done JCN ) - LDAk #00 EQU ,&done JCN + &loop LDAk #00 EQU ,&done JCN LDAk STHkr NEQ ,&next JCN ,&count LDR2 INC2 ,&count STR2 &next INC2 ,&loop JMP @@ -286,26 +283,7 @@ @setup-linecount ( -> ) #0a ;count-c JSR2 INC2 .buffer/line-count STZ2 #09 ;count-c JSR2 #0000 GTH2 .config/insert-tabs STZ - #0d ;count-c JSR2 DUP2 INC2 .buffer/line-count LDZ2 EQU2 STH - #0000 NEQ2 STHkr #00 EQU AND #80 MUL - STHr ADD DUP .config/line-endings STZ - ;strip-cr JCN2 JMP2r - -( strip our carriage returns \r ) -( ) -( a few imporant notes: ) -( 1. we need "re-add" these \r bytes when displaying the buffer size ) -( 2. we need to "zero out" all the trailing bytes ) -@strip-cr ( -> ) - ;data LIT2r :data ( readpos [writepos] ) - &loop LDAk #00 EQU ,&done JCN - LDAk #0d NEQ ,&next JCN INC2 ,&loop JMP - &next LDAk STH2kr STA - INC2 INC2r ,&loop JMP - &done STH2kr .buffer/limit STZ2 - &fill DUP2 STH2kr EQU2 ,&exit JCN - #00 STH2kr STA INC2r ,&fill JMP - &exit POP2 POP2r JMP2r + JMP2r ( reads filename from the program's argv ) ( ) @@ -804,14 +782,6 @@ .config/insert-tabs LDZk #00 EQU SWP STZ ;redraw-statusbar-and-cursor JSR2 ;return JMP2 -( toggle whether to use literal tab characters ) -( ) -( when opening a file, this defaults to 01 if existing tab ) -( characters are found, and 00 otherwise. ) -@toggle-line-endings ( -> ) - .config/line-endings LDZk #00 EQU SWP STZ - ;redraw-statusbar-and-cursor JSR2 ;return JMP2 - ( interpret user input as an escaped sequence ) ( ) ( called by on-key with state/saw-esc is true ) @@ -825,7 +795,6 @@ .state/key LDZ LIT '> EQU ( M-> ) ;goto-end JCN2 .state/key LDZ LIT 'c EQU ( M-c ) ;toggle-color JCN2 .state/key LDZ LIT 'g EQU ( M-g ) ;goto-line JCN2 - .state/key LDZ LIT 'l EQU ( M-l ) ;toggle-line-endings JCN2 .state/key LDZ LIT 's EQU ( M-s ) ;regex-search JCN2 .state/key LDZ LIT 't EQU ( M-t ) ;toggle-tabs JCN2 .state/key LDZ LIT 'v EQU ( M-v ) ;page-up JCN2 @@ -1178,21 +1147,10 @@ &next LDAk #09 EQU ,&tabs JCN INC2 INC2r ,&loop JMP &tabs INC2 .config/tab-width LDZ2 STH2 ADD2r ,&loop JMP -( display ** if the buffer has unsaved changes, -- otherwise ) -@get-save-status - ;messages/unsaved ;messages/saved - .state/modified LDZ JMP SWP2 POP2 JMP2r - ( move the terminal cursor to the statusbar line ) @move-to-statusbar ( -> ) #0000 .term/rows LDZ2 ;term-move-cursor JMP2 -@buffer-size - .buffer/limit LDZ2 ;data SUB2 - .config/line-endings LDZ #00 EQU ,&done JCN - .buffer/line-count LDZ2 #0001 SUB2 ADD2 - &done JMP2r - ( draw the full statusbar ) @draw-statusbar ( -> ) ;move-to-statusbar JSR2 @@ -1203,11 +1161,13 @@ &done POP2 POP2 POP2r ( ) ;move-to-statusbar JSR2 - ;get-save-status JSR2 ;print JSR2 + + ( display ** if the buffer has unsaved changes, -- otherwise ) + #2d .state/modified LDZ #00 NEQ #03 MUL SUB DUP emit emit sp + ;filename ;print JSR2 sp emit-[ - ( .buffer/limit LDZ2 ;data SUB2 ;emit-dec2 JSR2 ) - ;buffer-size JSR2 ;emit-dec2 JSR2 + .buffer/limit LDZ2 ;data SUB2 ;emit-dec2 JSR2 ;messages/bytes ;print JSR2 sp .buffer/line-count LDZ2 ;emit-dec2 JSR2 @@ -1218,8 +1178,6 @@ .cursor/row LDZ2 INC2 ;emit-dec2 JSR2 emit-) sp emit-[ LIT 's .config/insert-tabs LDZ ADD emit - emit-: - LIT 'u .config/line-endings LDZ #00 NEQ #02 MUL ADD emit ( "u" or "w" ) emit-] ;emit-reset JMP2 @@ -1250,6 +1208,7 @@ &fail POP2 #0000 &done POP2r JMP2r +( TODO: this doesn't handle tabs correctly ) @draw-region ( offset* limit* col* row* -> ) OVR2 ( offset limit col row col ) .term/cols LDZ2 SWP2 SUB2 STH2 ( offset limit col row [cols-col] ) @@ -1481,17 +1440,17 @@ @abs-line ( y* -> s* ) ;data SWP2 ;line-to-pos JMP2 -( find string pointer for absolute y coordinate ) -@rel-line ( y* -> s* ) - .buffer/offset LDZ2 SWP2 ;line-to-pos JMP2 - ( return a pointer to the current line ) @cur-line ( -> s* ) - .cursor/row LDZ2 .buffer/line-offset LDZ2 SUB2k - .term/rows LDZ2 LTH2 ,&ok JCN + .cursor/row LDZ2 .buffer/line-offset LDZ2 LTH2k ,&early JCN + ( if cursor/row is later than line-offset ) + ( we can save some time by starting at ) + ( buffer/offset instead of the beginning ) + SUB2 .buffer/offset LDZ2 SWP2 ;line-to-pos JMP2 + &early + ( if cursor/row is earlier than line-offset ) + ( we need to use the absolute y coordinate ) POP2 ;abs-line JMP2 - &ok - SUB2 ;rel-line JMP2 ( return a pointer to the current cursor position ) @cur-pos ( -> s* ) @@ -1583,8 +1542,6 @@ &quit-prompt "Save 20 "modified 20 "file 20 "(y/n)? 20 00 &unknown-input "Unknown 20 "input: 20 00 &no-matches-found "No 20 "matches 20 "found: 20 00 - &saved "-- 20 00 - &unsaved "** 20 00 &term-size-parse-error "error 20 "parsing 20 "term 20 "size 00 &rel-line-error "invalid 20 "relative 20 "line 20 "number 00 ]