This is a small tool to indent/unindent Tcl code for this Wiki.
package require Tk proc doIndent {indent} { set d [string trimright [.text get 1.0 end] " \r\n"] set nd "" foreach line [split $d \n] { if {$indent && ([string index $line 0] != " ")} { set line " $line" } elseif {(!$indent) && ([string index $line 0] == " ") && ([string index $line 1] != " ")} { set line [string range $line 1 end] } append nd $line \n } set nd [string trimright $nd " \r\n"] .text delete 1.0 end .text insert end $nd } text .text -yscrollcommand [list .scroll set] -font {{Lucida Console} 8} scrollbar .scroll -command [list .text yview] grid .text .scroll -sticky news grid columnconfigure . 0 -weight 1 grid rowconfigure . 0 -weight 1 bind all <F2> {doIndent 0} bind all <F3> {doIndent 1}
wdb -- Nice idea! I've stolen it immediately, and here comes my improved version which not only adds the required space but additionally pretty-prints the source code -- more precisely, updates the appropriate indent level:
package require Tk pack [text .t] -expand yes -fill both bind .t <F2> { set src [.t get 1.0 end-1chars] .t delete 1.0 end-1chars .t insert 1.0 [pp $src] } proc indentAtLine {str nr} { set allLines [split $str \n] set lines [lrange $allLines 0 [expr {$nr - 1}]] set testStr [join $lines] set indent 0 while {![info complete $testStr]} { incr indent append testStr \} } if {[string index [string trim [lindex $allLines $nr]] 0] eq "\}"} then { incr indent -1 } set indentStr [string repeat " " 4] string repeat $indentStr $indent } proc pp {str} { set result "" set i 0 foreach line [split $str \n] { append result " "\ [indentAtLine $str $i]\ [string trim $line]\ \n incr i } string trimright $result }
wdb Attention -- processes line-spanning braced groups { and } but hangs if line-spanning bracket groups [ and ] appear.