Version 1 of Linux Console Text Editor In Pure TCL

Updated 2004-06-16 19:33:10 by SRIV

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 .

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-1-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   [email protected]    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