speertext

A text widget which can be split into two view using emacs shortcuts <Ctrl-x><Key-1> or 2 or 3 etc.

 package require snit
 snit::widget speertext {
    option -test ""
    variable mtext
    delegate method * to mtext
    constructor {args} {
        $self configurelist $args
        pack [panedwindow $win.pan -orient vertical] -side top -expand yes -fill both -pady 2 -padx 2
        set pan $win.pan
        frame $pan.ftext
        set text [text $pan.ftext.t -yscrollcommand "$pan.ftext.scrolly set"]
        set mtext $text
        set sy [scrollbar $pan.ftext.scrolly -orient v -command "$pan.ftext.t yview"]
        pack $text -side left -expand yes -fill both 
        pack $sy -side right -fill y
        #::autoscroll::autoscroll $sy
        frame $pan.ftextp
        set text [$text peer create $pan.ftextp.t]
        $text configure -yscrollcommand "$pan.ftextp.scrolly set"
        set sy [scrollbar $pan.ftextp.scrolly -orient v -command "$pan.ftextp.t yview"]
        pack $text -side left -expand yes -fill both 
        pack $sy -side right -fill y
        #::autoscroll::autoscroll $sy

        $pan add $pan.ftext $pan.ftextp
        foreach w [list $mtext $text] {
            bind $w <Control-x><Key-2> [mymethod bindControlXSplit vertical]
            bind $w <Control-x><Key-3> [mymethod bindControlXSplit horizontal]
            bind $w <Control-x><Key-1> [mymethod bindControlXSplit zero]
        }

    }
    method bindControlXSplit {orient} {
        puts $orient
        if {$orient eq "zero"} { 
            $win.pan forget $win.pan.ftextp
            return -code break 
        } 
            
        if {[llength [$win.pan panes]] == 1} {
            $win.pan add $win.pan.ftextp
        }
        $win.pan configure -orient $orient 
        return -code break 
    }
 }

And here a test.

 pack [speertext .spt] -side left -fill both -expand yes

 for {set i 0} {$i < 50} {incr i 1} {
    .spt insert end "Hello $i\n"
 }