if_perl

if_perl.txt 适用于 Vim 9.2 版本。 最近更新: 2025年10月 VIM 参考手册 by Sven Verdoolaege and Matt Gerassimof 译者: foolstone@ustc.edu、Willis、tocer Perl 与 Vim perl Perl 1. 编辑 Perl 文档 perl-editing 2. 编译带 Perl 接口的 Vim perl-compiling 3. 使用 Perl 接口 perl-using 4. 动态调入 perl-dynamic {仅当编译 Vim 时加入 +perl 特性才有效}

1. 编辑 Perl 文件 perl-editing

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 支持具备更多的功 能。

2. 编译带 Perl 接口的 Vim perl-compiling

要编译带 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 也是一个不错的选择。

3. 使用 Perl 接口 perl-using

: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" 必须出现在行首,前面不能有前导空格。

4. 动态调入 perl-dynamic

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: