George Peter Staplin: I wrote this simple editor as an experiment. It saves automatically, and has a unique feature. The unique feature is that all lines indented with spaces receive coloring that reflects their depth. (The editor seems usable enough. I am using it to construct this wiki page.)
License: OLL
proc highlight {t laststart lastend} { foreach {pat col} $::patcol { $t tag remove $col $laststart $lastend } set start [$t index @0,0] set end [$t index "[$t index @0,[winfo height $t]] lineend"] foreach {pat col} $::patcol { set s $start while {"" ne [set found [$t search -count length -regexp $pat $s $end]]} { $t tag add $col $found [set s [$t index "$found + $length chars"]] $t tag configure $col -background $col } } after 500 [list highlight $t $start $end] } proc get.line s { string range $s 0 [expr {[string first . $s] - 1}] } proc update.lines w { set start [$w.text index @0,0] set height [winfo height $w.text] $w.lines delete 1.0 end array set metrics [font metrics [$w.lines cget -font]] set incr_by [expr {$metrics(-linespace) / 2}] set last_idx end set last_line end #When $last_idx ne $idx we have a wrap or a new line for {set y 0} {$y < $height} {incr y $incr_by} { set idx [$w.text index @0,$y] if {$idx ne $last_idx} { if {$last_line ne [set l [get.line $idx]]} { $w.lines insert end $l\n set last_line $l } else { $w.lines insert end \n } } set last_idx $idx } $w.lines config -width [expr {[string length $last_line] + 1}] } proc create.gui w { scrollbar $w.yscroll -command "[list update.lines $w] ; [list $w.text yview]" text $w.lines -width 3 -takefocus 0 text $w.text -yscrollcommand "[list update.lines $w] ; [list $w.yscroll set]" -wrap word grid $w.yscroll -row 0 -column 0 -sticky ns grid $w.lines -row 0 -column 1 -sticky ns grid $w.text -row 0 -column 2 -sticky news bindtags $w.lines {} } proc save {t name} { if {![$t edit modified]} { after 1000 [list save $t $name] return } puts -nonewline [set fd [open $name w]] [$t get 1.0 end-1c] close $fd $t edit modified 0 after 1000 [list save $t $name] } proc syntax {} { puts stderr "syntax is: [info script] filename" exit 1 } proc main {argc argv} { if {1 != $argc} { syntax } create.gui "" grid rowconfigure . 0 -weight 100 grid columnconfigure . 2 -weight 100 .text insert end [read [set fd [open [lindex $argv 0] r]]]; close $fd for {set i 1} {$i < 12} {incr i} { set c [format %2.2x [expr {$i * 21}]] lappend ::patcol ^[string repeat " " $i] #[set c][set c]aa } highlight .text 1.0 end update.lines "" save .text [lindex $argv 0] } main $::argc $::argv