In einem Text-Widget wird eine Position als Index bezeichnet und kann auf verschiedene Arten spezifiziert werden. Die einfachste Form besteht aus zwei durch einen Punkt getrennte Zahlen, also z.B 2.3, wobei die erste Zahl eine Zeilennummer (beginnend mit 1) und die zweite die Nummer eines Zeichens (beginnend mit 0) innerhalb der Zeile angibt.
.text delete 2.8 2.18 set str [.text get 3.5 3.19]
Die erste Anweisung löscht alle Zeichen, die in der zweiten Zeile vom 8. bis 18. Zeichen stehen, wohingegen die zweite Anweisung die Zeichen in der 3. Zeile vom 5. bis zum 19. Zeichen aus dem Textfenster ausliest und in die Variable str schreibt.
Eine andere Art der Positionsangabe stellen symbolische Bezeichnungen, sogenannte Marken dar.
.text mark set first 4.7
Diese Anweisung setzt die Marke first auf das siebte Zeichen der 4. Zeile, wobei eine Marke eigentlich nicht die Position, sondern das Zeichen selbst bezeichnet. Sie werden wie Indizes verwaltet (z.B. 2.3), ihr Vorteil liegt jedoch darin, daß wenn Zeichen zwischen Position 1.0 und 4.7 gelöscht oder eingefügt werden, die Marke sich immer noch auf dasselbe Zeichen bezieht. Die Marke wandert mit.
Drei Marken haben in Textwidgets eine besondere Bedeutung:
Eine absolute Textposition kann durch weitere relative Angaben verändert werden. Beispiele für relative Angaben sind +/- n chars, +/- n lines, linestart/ lineend und wordstart/ wordend.
.text mark set insert "[.text index insert] + 4 chars"Diese Anweisung setzt den Textcursor um 4 Positionen nach vorne.
Bei der Markierung von ganzen Textausschnitten findet die Technik des Taggings Anwendung. Tags sind Textbereiche, die unabhängig vom restlichen Text formatiert und mit eigenen Ereignisprozeduren verbunden werden können (mit bind). Man kann selbst Tags definieren und an Ereignisprozeduren binden, oder man greift auf das standardmäßig bei Text-Widgets vordefinierte Tag sel zurück. Mit diesem Tag ist es möglich mit Hilfe der Maus (bei gedrückter linker Maustaste bewegen des Mauspfeils) oder der Tastatur (drücken der Shift Taste und Bewegen des Cursors mit Pfeiltasten) Textausschnitte zu markieren.
Um eine Datei in ein Textfenster zu laden, oder einen Text aus dem Textfenster in eine Datei zu schreiben, sei auf die beiden, im Listing folgenden, Prozeduren LadeDatei und SaveDatei hingewiesen.
#!/usr/bin/wish -f
#------------------------------------------------------#
#
# Programmname : text.tk
# TK-Version 4.0 TCL-Version 7.4
# Erstellungsatum: Wed Sep 11 13:12:14 GMT 1996
#
#------------------------------------------------------#
#--------------------- Functions ----------------------#
proc LadeDatei {textfenster Datei} {
wm iconname . $Datei
$textfenster delete 1.0 end
set fd [open $Datei]
while {![eof $fd]} {
$textfenster insert end [read $fd 1000]
}
close $fd
}
proc SaveDatei {textfenster Datei} {
set fd [open $Datei w+]
set inhalt [$textfenster get 1.0 end]
puts -nonewline $fd $inhalt
close $fd
}
proc anzeigen {} {
.m.text tag remove big 0.0 end
set string [.o.suchbegriff get]
if {$string == ""} {
return
}
set cur 1.0
while 1 {
set cur [.m.text search -count length $string $cur end]
if {$cur == ""} {
break
}
.m.text tag add big $cur "$cur + $length char"
set cur [.m.text index "$cur + $length char"]
}
focus .m.text
.m.text mark set insert 1.0
}
proc next {} {
set k [.m.text tag nextrange big \
"[.m.text index insert] + 1 chars" end]
if {$k == ""} {
return
}
.m.text mark set insert [lindex $k 0]
global CURSORPOS
set CURSORPOS [.m.text index insert]
}
#----------------------- Main -------------------------#
set AKTDATEINAME ""
set POSITION ""
set CURSORPOS ""
frame .o
frame .m
frame .u
pack .o .m .u -side top
entry .o.suchbegriff -relief sunken -width 30
button .o.zeige -text "Highlight" -command anzeigen
pack .o.suchbegriff .o.zeige -side left -padx 20
bind .o.suchbegriff <Return> {
anzeigen
}
text .m.text -relief sunken -bd 2 -yscrollcommand ".m.scroll set"
scrollbar .m.scroll -command ".m.text yview"
pack .m.scroll -side right -fill y
pack .m.text -side left
.m.text tag configure big -background SlateBlue2 -borderwidth 2 \
-font "-*-times-medium-r-*--24-*-*-*-*-*-*-*" -relief raised
.m.text tag bind big <Enter> {
.m.text tag configure big -background IndianRed
}
.m.text tag bind big <Leave> {
.m.text tag configure big -background SlateBlue2
}
bind .m.text <Motion> {
global POSITION
set POSITION [ .m.text index current]
}
bind .m.text <KeyRelease> {
global CURSORPOS
set CURSORPOS [.m.text index insert]
}
bind .m.text <ButtonRelease> {
global CURSORPOS
set CURSORPOS [.m.text index insert]
}
label .u.mpos -text "Pointer :" -anchor w
label .u.mlpos -textvariable POSITION -relief sunken -width 6 -anchor e
label .u.cpos -text "Cursor :" -anchor w
label .u.clpos -textvariable CURSORPOS -relief sunken -width 6 -anchor e
button .u.next -text "Next" -width 6 -command next
button .u.save -text "Save" -width 6 -command {SaveDatei .m.text $AKTDATEINAME}
button .u.exit -text "Exit" -width 6 -command exit
pack .u.mpos .u.mlpos .u.cpos .u.cpos .u.clpos .u.next .u.save .u.exit \
-side left -padx 8 -pady 3
if {$argc == 1} {
set AKTDATEINAME [lindex $argv 0]
if { [ file exists $AKTDATEINAME ] == 1 } {
LadeDatei .m.text $AKTDATEINAME
}
} else {
puts "usage: text.tk dateiname"
exit
}