Vim 语法高亮支持 Perl 和 POD 文件。Vim 假定后缀为 .pl 和 .pm 的文件名是 Perl
代码。如果无法通过后缀检测文件类型,Vim 也会测试文件的首行来检查该文件是否为
Perl 脚本。Vim 假定带后缀 .POD 的文件名是 POD 文本。
要使用 Perl 标签,需要 Universal/Exuberant ctags。可在这里找到:
Universal Ctags (推荐): https://ctags.io
Exuberant Ctags: http://ctags.sourceforge.net
另一方案是名为 pltags.pl 的 Perl 脚本,它与 Vim 一起发行,位于
$VIMRUNTIME/tools 目录下。该脚本比 Exuberant ctags 的 Perl 支持具备更多的功
能。
要编译带 Perl 接口的 Vim,需要较新的 Perl 版本。并且必须在编译 Vim 前已正确安
装好 Perl。
Vim 的 Perl 支持由
Sven Verdoolaege<skimo@breughel.ufsia.ac.be> 和
Matt Gerassimof
提供。
在 MS-Windows 平台上 (那里也提供其他平台的版本),可从以下网址获取 Perl:
http://www.perl.org/
ActiveState 版本应该可用,而 Strawberry Perl 也是一个不错的选择。
:perl :pe
:pe[rl] {cmd} 执行 Perl 命令 {cmd}。当前使用的包是 "main"。测试
:perl 是否可用的简单示例:
:perl VIM::Msg("Hello")
:pe[rl] << [trim] [{endmarker}]
{script}
{endmarker}
执行 Perl 脚本 {script}。
{script} 之下的 {endmarker} 不能 有任何前导空白。
如果省略了 [endmarker],默认为一个句号 '.' (译者注:
换而言之,此时 {script} 结束后必须给出 '.',不能省
略),类似于 :append 和 :insert 命令。在函数内使用
时,最好显式指明 '.',因为 "$i;" 看起来像 Vim 的
:insert 命令的开始部分。
这种 :perl 命令形式主要用于在 vim 脚本里面内嵌 perl
代码。
备注: 如果编译时未加入 Perl 特性,此命令不能工作。要避
免错误,见 script-here 。
Vim 脚本示例:
function! WhitePearl()
perl << EOF
VIM::Msg("珍珠 (Perl) 适合做项链");
VIM::Msg("红宝石 (Ruby) 适合做戒指");
VIM::Msg("蟒蛇皮 (Python) 适合做包");
VIM::Msg("那 Tcl 呢???");
EOF
endfunction
要查看运行中的 Perl 版本:
:perl print $^V
:perldo :perld
:[range]perld[o] {cmd} 对 [range] 行范围的每行执行 Perl 命令 {cmd},其中,$_
被依次赋值为每行的文本,不包含行尾的 <EOL>。修改 $_ 可
用于直接修改行文本,但要注意无法用此命令来添加或者删除
行。
缺省 [range] 为整个文件: "1,$"。
不妨尝试一下以下代码:
:perl $a=1
:perldo $_ = reverse($_);1
:perl VIM::Msg("hello")
:perl $line = $curbuf->Get(42)
E299
在沙盘 sandbox 里执行 Perl 命令会受到限制。":perldo" 完全无法执行。可能的
话,会在安全环境下执行 ":perl"。
perl-overview
以下是在 Perl 中可用的函数概要:
:perl VIM::Msg("Text") # 显示信息
:perl VIM::Msg("Wrong!", "ErrorMsg") # 显示错误信息
:perl VIM::Msg("remark", "Comment") # 显示高亮的信息
:perl VIM::SetOption("ai") # 设置 vim 选项
:perl $nbuf = VIM::Buffers() # 返回缓冲区的个数
:perl @buflist = VIM::Buffers() # 返回所有缓冲区组成的数组
:perl $mybuf = (VIM::Buffers('qq.c'))[0] # 返回一个用于 'qq.c' 的缓冲区对象
:perl @winlist = VIM::Windows() # 返回所有窗口组成的数组
:perl $nwin = VIM::Windows() # 返回窗口的个数
:perl ($success, $v) = VIM::Eval('&path') # $v: 'path' 选项值,$success: 1
:perl ($success, $v) = VIM::Eval('&xyz') # $v: '' 而 $success: 0
:perl $v = VIM::Eval('expand("<cfile>")') # 扩展文件名 <cfile>
:perl $curwin->SetHeight(10) # 设置窗口高度
:perl @pos = $curwin->Cursor() # 返回光标坐标 (row,col),类型为数组
:perl @pos = (10, 10)
:perl $curwin->Cursor(@pos) # 把光标位置设为 @pos
:perl $curwin->Cursor(10,10) # 把光标位置设为第 10 行第 10 列
:perl $mybuf = $curwin->Buffer() # 返回窗口包含的缓冲区对象
:perl $curbuf->Name() # 返回缓冲区名
:perl $curbuf->Number() # 返回缓冲区编号
:perl $curbuf->Count() # 返回缓冲区中的行数
:perl $l = $curbuf->Get(10) # 返回第 10 行文本
:perl @l = $curbuf->Get(1 .. 5) # 返回第 1 到第 5 行文本
:perl $curbuf->Delete(10) # 删除第 10 行
:perl $curbuf->Delete(10, 20) # 删除第 10-20 行
:perl $curbuf->Append(10, "Line") # 添加一行文本
:perl $curbuf->Append(10, "Line1", "Line2", "Line3") # 添加三行文本
:perl @l = ("L1", "L2", "L3")
:perl $curbuf->Append(10, @l) # 添加三行文本: L1,L2 和 L3
:perl $curbuf->Set(10, "Line") # 替换第 10 行为 "Line"
:perl $curbuf->Set(10, "Line1", "Line2") # 替换第 10 行和第 11 行
:perl $curbuf->Set(10, @l) # 用 L1,L2 和 L3 分别替换 10-12 行
perl-Msg
VIM::Msg({msg}, {group}?)
显示消息 {msg}。可选 {group} 参数指定用来显示这个消息
的高亮组。
perl-SetOption
VIM::SetOption({arg})
设置 vim 选项。{arg} 可以是 ":set" 命令能接受的任何参
数形式。注意 这意味着参数里不允许有空格!见 :set 。
perl-Buffers
VIM::Buffers([{bn}...]) 没有给出参数时,在数组上下文里,返回所有缓冲区组成的列
表,而在标量上下文里,则返回缓冲区的个数。给出的参数为
缓冲区名或缓冲区编号组成的列表 {bn} 时,返回匹配 {bn}
的缓冲区列表,匹配具体规则与 Vim 内部函数 bufname()
相同。
警告: 使用 :bwipe 后,返回列表不再合法。如果强行使
用,可能会使 Vim 崩溃。
perl-Windows
VIM::Windows([{wn}...]) 没有给出参数时,在数组上下文里,返回所有窗口组成的列
表,而在标量上下文里,则返回窗口的个数。给出的参数为窗
口编号组成的列表 {wn} 时,返回匹配 {wn} 的窗口列表。
警告: 某个窗口关闭后,返回列表不再合法。如果强行使用,
可能会使 Vim 崩溃。
perl-DoCommand
VIM::DoCommand({cmd}) 执行 Ex 命令 {cmd}。
perl-Eval
VIM::Eval({expr}) 计算 {expr},在列表上下文里,返回 (success,value),而
在标量上下文里,只返回 value。
success=1 表示求值成功,且 value 会包含 {expr} 的计算
结果。而 success=0 表示表达式求值失败。一些常用的例子:
'@x' 返回寄存器 x 的内容,'&x' 返回选项 x 的值,'x' 返
回内部变量 x 的值,而 '$x' 等价于 perl 中的 $ENV{x}。
{expr} 里,可以调用命令行里可用的所有函数。
返回类型为列表 List 时,会通过连接项目并在项目间插入
换行符来转化为字符串再返回。
perl-Blob
VIM::Blob({expr}) 返回 Blob 字面常量字符串 0zXXXX,其中 XXXX 来自
{expr} 里字符序列,每个字符会转化为两位十六进制数。
perl-SetHeight
Window->SetHeight({height})
设置窗口高度为 {height},但不超过屏幕范围。
perl-GetCursor
Window->Cursor({row}?, {col}?)
没有给出参数时,返回窗口光标坐标 (row,col),类型为数
组。给出参数 {row} 和 {col} 时,设置窗口光标位置为
({row},{col})。注意 {col} 采用 Perl 风格,从 0 开始计
算,因此与 Vim 的计数标准小 1。
Window->Buffer() perl-Buffer
返回给定窗口包含的缓冲区对象。
perl-Name
Buffer->Name() 返回缓冲区的文件名。
perl-Number
Buffer->Number() 返回缓冲区的编号。
perl-Count
Buffer->Count() 返回缓冲区中的行数。
perl-Get
Buffer->Get({lnum}, {lnum}?, ...)
对每个指定的 {lnum},返回缓冲区第 {lnum} 行的文本字符
串。指定 {lnum} 列表时,会返回相应文本组成的数组。
perl-Delete
Buffer->Delete({lnum}, {lnum}?)
删除缓冲区第 {lnum} 行。给出第二个参数 {lnum} 时,删除
从第一个 {lnum} 到第二个 {lnum} 范围内的所有行。
perl-Append
Buffer->Append({lnum}, {line}, {line}?, ...)
在缓冲区第 {lnum} 行后,追加所有 {line} 字符串。{line}
列表也可以是数组形式。
perl-Set
Buffer->Set({lnum}, {line}, {line}?, ...)
缓冲区的第 {lnum} 行开始的行被 {line} 指定的一行或多行
替换。{line} 列表也可以是数组形式。如果参数无效,替换
不会实际进行。
$main::curwin
当前窗口对象。
$main::curbuf
当前缓冲区对象。
script-here
当使用某一语言的嵌入式脚本时,如果当前环境不支持该语言,可能希望跳过该脚本代
码。为此,可用
if has('perl')
perl << EOF
print 'perl works'
EOF
endif
备注: "EOF" 必须出现在行首,前面不能有前导空格。
MS-Windows 和 Unix 上,可动态调入 Perl 库。此时 :version 输出会包含
+perl/dyn 。
此时,Vim 仅在必要时才会寻找 Perl DLL 或共享库文件。不使用 Perl 接口时,就不需
要库文件。因此,即使没有这些文件,仍然可以使用 Vim。
MS-Windows
可从 http://www.perl.org 下载 Perl。编译 Vim 时,使用的是 ActiveState 版本。
要使用 Perl 接口,必须确保 Perl DLL 位于系统搜索路径中。如果 Vim 报告找不到
perl512.dll,请确保 $PATH 包含该文件所在的路径。Perl 安装程序通常已经完成此步
骤。可以在控制台窗口里输入 "path",查看当前使用的搜索路径。也可用 'perldll' 选
项指定 Perl DLL 的位置。
DLL 的版本必须和 Vim 编译使用的 Perl 版本保持一致。写作本文档时,该名字为
"perl512.dll",对应 Perl 5.12。要确信这一点,可编辑 "gvim.exe" 文件,并查找
"perl\d*.dll\c"。
Unix
可用 'perldll' 选项指定 Perl 共享库文件的位置,替代编译时指定的
DYNAMIC_PERL_DLL 文件。共享库的版本必须和 Vim 编译使用的 Perl 版本保持一致。
注意: 在本地编译 Perl 时,需要在编译时提供支持线程的版本,否则 Vim 无法成功链
接。为此,在配置 Perl 时,应使用 -Dusethreads 标志位。要检查生成的 Perl 程序
是否支持线程,可运行 `perl -V`,然后在 "Compile-time options" 一节中检查是否包
含 USE_ITHREADS 。
vim:tw=78:ts=8:noet:ft=help:norl: