Tcl/Tk 烹调书 - 文本编辑器


第 5 步: 给文本串加标签

脚本


proc TagAll {} {
global seltxt 
set l1 [string length $seltxt]
scan [.ed index end] %d nl
set curpos [.ed index insert]
for {set i 1} {$i < $nl} {incr i} {
	.ed mark set last $i.end
	set lpos [.ed index last]
	set curpos [.ed search -forwards -exact $seltxt $curpos $lpos]
		if {$curpos != ""} {
		.ed mark set insert $curpos
		scan [.ed index "insert + $l1 chars"] %f pos
		.ed tag add $seltxt $curpos $pos
		.ed tag configure $seltxt -background Bisque3
		.ed mark set insert "insert + $l1 chars"
		set curpos $pos
		} else {
			set curpos $lpos
			}
	}
}

特定于 Tk 文本组件的命令 ".ed tag add" 接受一个字符串作为标签的名字,并把这个标签赋予作为标签名字后面的参数而给出的两个位置之间的所有字符(或段落)。所有标签名都在名字空间中注册并且被加上标签的文本的所有出现(occurance)随后就可以用它们的标签的名字来集体的引用。

在这个过程中在找到给定字符串的匹配的所有地方加上标签。使用这个字符串作为标签的名字(例如, "jack" 的所有出现都被加上了标签并且标签的名字是"jack")。

你可以象在这个过程中那样通过调用".ed tag configure"有所区别的显示加了标签的文本,这里被加上标签的字被始终用不同的背景色来显示: 执行这个脚本的最终结果应是:

你还可以给加了标签的文本增加绑定,例如可通过调用

".ed tag bind <Button-3> {
		.ed delete "insert + [string length $seltxt] chars"
		.ed insert insert "I have removed tagged text and inserted this"
		}

你当然应该增加一系列合理的动作 ;-) 过程的其余部分由已经解释过了的 Tcl/Tk 命令构成。注意任何字或一个段落关联的标签可以多于一个。