Use Tcl in Vim

Vim是功能强大的文本编辑器。Tcl是一门小巧灵活的脚本语言。

在Vim中其实也是可以使用Tcl的。

在Vim中使用Tcl的直接好处是可以很多操作可以不用去学习和记忆Vim自身的脚本命令。

在次之外,如果逐渐变成重度用户的话,一些常用操作可以通过Tcl脚本的方式保存起来。

这可以看作是一种类似于sedawk的文本操作。

在Vim中与Tcl初次见面

下面的命令会在Vim窗口底部输出字符串"hello"。

: tcl puts "hello"

修改当前窗口中第7行的内容:

: 7tcldo set line "this is line 7"

执行一个Tcl脚本

: tclfile tcl-in-vim.tcl

生成递增序列文本 "Line 1"到"Line 100"

:tcl <<
for {set n 1} {$n<=100} {incr n} {
  $vim::current(bufferr) append end "Line $n"
}

Tcl 与 Vim的主要接口

  • :tcl 用于执行Tcl命令
  • :tcldo 用于对指定范围的文本应用Tcl命令
    • Tcl变量$line$lnum分别表示文本内容和对应行号
    • 可以通过修改$line的值来修改对应行的文本内容
  • :tclfile 用于执行Tcl脚本文件

  • ::vim::window 命令用于与Vim窗口(Window)交互

  • ::vim::buffer 命令用于与Vim缓冲区(Buffer)交互

  • ::vim::command 命令用于执行Vim的Ex命令

  • ::vim::expr 命令用于计算Vim脚本语言形式的表达式

  • ::vim::option 命令用于操作Vim的各种选项

  • $::vim::current变量包含当前窗口和当前缓冲区(Buffer)

利用".vimrc.tcl"初始化Vim里的Tcl环境

如果真的决定使用Vim来操作Tcl,一定会有一些常用函数希望家默认加载进去。

可以通过在.vimrc文件中用下列命令初始化Vim里的Tcl环境

if has("tcl")
  tclfile $VIM/.vimrc.tcl
endif

比如考虑到$::vim::current变量输入起来并不方便,我们可以定义如下函数

proc vim {args} {
  $::vim::current(buffer) {*}$args
}

proc range {min max} {
  set values [list]
  for {} {$min<=$max} {incr min} {
    lappend values $min
  }
  return $values
}

如此一来,上面的生成递增文本序列的操作就可以写成下面这个样子

: tcl foreach n [range 1 100] { vim append end "Line $n" }

确认你的Vim支持Tcl

并不是所有的Vim默认都支持Tcl。

可以下面的Vim命令检查当前Vim是否支持Tcl。

: version

如果支持的话,会看到输出中有+tcl或者+tcl/dyn字样。

如果显示的是-tcl的话,则当前Vim编译时没有打开对Tcl的支持。

Windows版本的Vim通常都是默认支持Tcl的。

让Vim正确加载Tcl动态链接库

即使当前Vim支持Tcl,也需要正确加载对应的动态链接库才行。在Windows上,主要就是对应的tcl85.dll或者tcl86.dll

Tcl动态链接库的加载遵从相应的dll文件搜索路径,也遵从Tcl初始化的要求——主要是正确加载相应的init.tcl初始化文件。