'''2004-06-16''' [SRIV] This is a minimal console text editor for Linux written in pure TCL. Usage: con-editor.tcl filename After the file loads, the screen is blank till you hit the down arrow key, I forget why I did that. To save the file, press Ctrl-Q, it will prompt you to Save Y/n . I notice that the backspace key isnt working properly on my current computer, so I'll need to look into that. Update: backspace works at a true console, but misbehaves in an xterm. Screenshot: [http://www.sr-tech.com/images/con-editor.jpg] #!/bin/sh # the next line restarts using tclsh \ exec `which tclsh` "$0" "$@" # con-editor.tcl a linux console based editor in pure tcl # 2004-06-16 Steve Redler IV set filename [lindex $argv 0] proc edittext { file2read visible} { global CLEAR buffer HOME CURSOROFF CURSORON dispcol disprow set COLUMN 1 set ROW 1 set lastrow "" set lastcol "" set firstcol2display "" set firstrow2display "" set line "" set bufferrow 0 set buffercol 0 set keyvalue "" puts -nonewline $CURSOROFF$HOME while {$keyvalue!=17} { set inputchr [read $file2read 1] set keyvalue [scan $inputchr {%c}] if {[eof $file2read]} {return done} #puts " $keyvalue" switch $keyvalue { 17 {return done} 25 {if {$bufferrow<[llength $buffer]} { set buffer [lreplace $buffer $bufferrow $bufferrow] set lastcol "" }} 10 {set currline [string range $line 0 [expr $buffercol - 1]] set buffer [lreplace $buffer $bufferrow $bufferrow $currline] if {!$visible} {set disprow $bufferrow} incr bufferrow incr ROW set buffer [linsert $buffer $bufferrow [string range $line $buffercol end]] set lastcol "" set line [lindex $buffer $bufferrow] set buffercol 0 } 27 {set inputchr [read stdin 1] set val [scan $inputchr {%c}] if {$val=="91"} { set inputchr [read stdin 1] set vald [scan $inputchr {%c}] switch $vald { 65 {if {$bufferrow > 0} {incr bufferrow -1} set line [lindex $buffer $bufferrow] incr ROW -1 } 66 {if {$bufferrow < [expr [llength $buffer] -1]} {incr bufferrow 1 } set line [lindex $buffer $bufferrow] if {$bufferrow > [expr $ROW -1]} {incr ROW } } 67 {if {$buffercol < [string length $line]} { incr buffercol 1 }} 68 {if {$buffercol > 0} {incr buffercol -1 }} 51 {set inputchr [read stdin 1] if {$buffercol > [string length $line]} {set buffercol [string length $line]} set prevchr [expr $buffercol ] set line [string replace $line $prevchr $prevchr ""] set buffer [lreplace $buffer $bufferrow $bufferrow $line] set lastcol "" } } } } 127 {if {$buffercol!=0} { if {$buffercol > [string length $line]} {set buffercol [string length $line]} set prevchr [expr $buffercol - 1] set line [string replace $line $prevchr $prevchr ""] incr buffercol -1 } set buffer [lreplace $buffer $bufferrow $bufferrow $line] set lastcol "" } 9 {set inputchr " " append newline [string range $line 0 [expr $buffercol - 1]] $inputchr [string range $line $buffercol end] set line $newline set newline "" set buffer [lreplace $buffer $bufferrow $bufferrow $line] incr buffercol +4 if {$buffercol > [string length $line]} {set buffercol [string length $line]} set lastcol "" } default {append newline [string range $line 0 [expr $buffercol - 1]] $inputchr [string range $line $buffercol end] set line $newline set newline "" set buffer [lreplace $buffer $bufferrow $bufferrow $line] incr buffercol if {$buffercol > [string length $line]} {set buffercol [string length $line]} set lastcol "" } } if {$visible} { if {$ROW<=1} {set ROW 1} if {$ROW>=23} {set ROW 23} set COLUMN [expr $buffercol + 1] if {$COLUMN<=1} {set COLUMN 1} if {$COLUMN>=80} {set COLUMN 80} #puts -nonewline $CLEAR puts -nonewline $CURSOROFF$HOME set firstrow2display [expr $bufferrow - $ROW +1] set lastrow2display [expr $firstrow2display + 23] set firstcol2display [expr $buffercol - $COLUMN +1] set lastcol2display [expr $firstcol2display + 79] if {($lastrow!=$firstrow2display) | ($lastcol!=$firstcol2display)} { for {set i $firstrow2display} {$i < $lastrow2display } {incr i} { puts -nonewline "\x1b\x5bK" puts [string range [lindex $buffer $i] $firstcol2display $lastcol2display ] } } set lastrow $firstrow2display set lastcol $firstcol2display set disprow [expr $bufferrow +1] set dispcol [expr $buffercol +1] puts -nonewline "\x1b\x5b\x32\x34\x3b\x36\x30\x48Row:$disprow Col:$dispcol " puts -nonewline "\x1b\x5b$ROW\x3b$COLUMN\x48" puts -nonewline $CURSORON flush stdout } } } #start of console editor program #puts -nonewline $CLEAR proc console_edit {fileName} { global CLEAR buffer HOME CURSOROFF CURSORON dispcol disprow #Script-Edit by Steve Redler IV steve@sr-tech.com 5-30-2001 set CLEAR "\x1b\x5b\x32\x4a" set buffer [list {} ] set HOME "\x1b\x5b\x31\x3b\x31\x48" set CURSORON "\x1b\x5b?25h" set CURSOROFF "\x1b\x5b?25l" set infile [open $fileName RDWR] edittext $infile 0 close $infile puts -nonewline $CLEAR$HOME$CURSORON puts -nonewline "\x1b\x5b\x32\x34\x3b\x30\x30\x48\x07$fileName loaded " puts -nonewline "\x1b\x5b\x32\x34\x3b\x36\x30\x48Row:$disprow Col:1 " fconfigure stdin -buffering none -blocking 1 fconfigure stdout -translation crlf flush stdout exec stty raw -echo edittext stdin 1 exec stty -raw echo set COLUMN 1 set ROW 24 puts -nonewline "\x1b\x5b$ROW\x3b$COLUMN\x48[string repeat " " 59]" puts -nonewline "\x1b\x5b$ROW\x3b$COLUMN\x48Save $fileName ? Y/n " flush stdout #fconfigure stdin -buffering full -blocking 1 set line [read stdin 1] if {$line!="n"} { set outfile [open $fileName w ] puts "len of buffer [llength $buffer]" for {set i 0} {$i<[llength $buffer]} {incr i} { puts $outfile [lindex $buffer $i] # puts [lindex $buffer $i] } close $outfile puts "\x1b\x5b$ROW\x3b$COLUMN\x48 Saved " } else { puts "\x1b\x5b$ROW\x3b$COLUMN\x48 Aborted " } puts -nonewline $CLEAR exit 0 } console_edit $filename