在Vim中激活Perl 6语法高亮显示

Vim文本编辑器的现代版本自带Perl 6语法高亮显示,但自动激活它有些棘手,因为Perl 6文件可以有模糊不清的文件扩展名。每次打开Perl 6文件时都纠正文件类型会很麻烦,所以我会向您展示我用来使Vim自动检测Perl 6文件的一些技巧。
在Vim中显示和设置文件类型
首先,我想确保语法高亮显示默认是开启的,所以我在我的.vimrc
中添加了这个选项
syntax on
要编辑你的.vimrc
,只需启动Vim并输入这个命令:e $MYVIMRC
。使用:w
保存你的更改,然后使用:so %
重新加载你的.vimrc
。
现在,我已经开启了语法高亮显示,我需要知道如何在处理Perl 6文件时将Vim的文件类型设置为Perl 6。我可以通过输入这个命令:set filetype?
来查看当前的文件类型。要将文件类型设置为Perl 6,我使用这个命令:set filetype=perl6
。filetype
关键字可以缩写为ft
。在这种情况下,最后一个命令变为:set ft=perl6
。
检测Perl 6文件
现在的挑战是正确检测我在Vim中处理的是否是Perl 6文件。Perl 6脚本不应该有问题:Vim(不是Vi)会自动解析shebang行以确定文件类型。然而,当脚本有像.pl
这样的扩展名时,这就会失败。
使用.pm6文件扩展名
Vim会自动使用Perl 6语法高亮显示,如果文件扩展名是.pm6
。所以当处理Perl 6模块文件时,最好使用这个扩展名。然而,这对我处理别人的Perl 6项目没有帮助。它对测试文件也没有帮助,因为测试文件没有等效的Perl 6文件扩展名(在安装Perl 6模块时,.t6
测试文件会被忽略)。
使用modeline
modeline是文件文本中的一行代码,Vim会读取并执行它。所以为了激活Perl 6语法高亮显示,我只需要将这个modeline添加到我所处理的每个Perl 6文件中
# vim: filetype=perl6
查看JSON5::Tiny的源代码是一个现实世界的例子。对这个Perl 6来说,这段代码看起来就像一个普通的注释,但Vim会使用它来开启Perl 6语法高亮显示。modeline可以出现在代码的任何地方,但最好放在文件的开始或结束位置。
较旧的Vim版本(7.3之前)和当Vim以root权限运行时,由于安全风险,modelines被禁用。不要以root身份运行Vim!但如果你有较旧的Vim,你可以使用:set modeline
来开启modelines。与filetype
一样,modeline可以缩写为ml
,所以set ml
也行。要自动激活modelines,将以下行添加到你的.vimrc
中
set ml
使用modelines的缺点?首先,是之前提到的较旧Vim版本的安全风险。此外,感觉将编辑器指令添加到我所处理的代码中有些不纯,因为不是每个人都使用Vim。但这些似乎是小事。
使用本地vimrc
通常不同的开源项目会有不同的编码规范,我需要遵循,所以使用本地的 vimrc 文件来存储这些特定项目的设置非常有帮助。这也适用于语法高亮。为了使用本地的 vimrc 文件,我在 .vimrc
中添加了以下代码
if filereadable(".vimrc.local")
so .vimrc.local
endif
这将检查当前工作目录中的 .vimrc.local
文件,如果找到,则会自动执行。 警告 这是一个安全风险 - Vim 将会执行本地 vimrc 中的任何指令,所以我在处理非我自己的项目时非常小心。接下来,我在根项目目录中创建了一个 .vimrc.local
文件,并将以下自动命令添加到其中
au Bufnewfile,bufRead *.pm,*.t,*.pl set filetype=perl6
现在,当我打开或创建任何以 Perl 扩展命名的文件时,Vim 会将其语法高亮设置为 Perl 6。我喜欢这个技术,因为它不会造成干扰:它不需要对 Perl 6 文件本身进行任何更改,因此在共享项目中效果很好(我从不将我的本地 vimrc 检入 Git 仓库)。
使用代码检测
我还可以让 Vim 尝试自动检测 Perl 6 代码。两个指示符可以表明我们正在使用 Perl 6 而不是 Perl 5 代码:shebang 行和 use v6;
指令。为了检查这些,我在我的 .vimrc 中添加了一个函数
function! LooksLikePerl6 ()
if getline(1) =~# '^#!.*/bin/.*perl6'
set filetype=perl6
else
for i in [1,2,3,4,5]
if getline(i) == 'use v6;'
set filetype=perl6
break
endif
endfor
endif
endfunction
au bufRead *.pm,*.t,*.pl call LooksLikePerl6()
此函数使用 getline()
检查文件的第一个行,以查看它是否看起来像 Perl 6 的 shebang。这应该适用于 .pl
脚本,但 Perl 6 模块文件将不会有 shebang,所以脚本的下一部分将检查文件的第一个 5 行以查找 use v6;
指令。代码的最后一句是一个自动命令,它将在我们打开具有 Perl 文件扩展名的文件时调用该函数。
这种技术的缺点是并非所有 Perl 6 代码都使用 use v6;
指令,因此在处理模块文件时,代码检测可能会失败。然而,代码检测可以通过使用更多规则来检测 Perl 6 代码(如类声明)来改进。vim-perl 插件具有更复杂的 Perl 6 代码检测 规则。
完整的 .vimrc
这个 .vimrc
包含了上面显示的所有代码
syntax on
"Recognize modeline # vim: filetype=perl6
set ml
"check for a local vimrc
if filereadable(".vimrc.local")
so .vimrc.local
endif
"check for Perl 6 code
function! LooksLikePerl6 ()
if getline(1) =~# '^#!.*/bin/.*perl6'
set filetype=perl6
else
for i in [1,2,3,4,5]
if getline(i) == 'use v6;'
set filetype=perl6
break
endif
endfor
endif
endfunction
au bufRead *.pm,*.t,*.pl call LooksLikePerl6()
结论
这就是全部内容,Vim 中检测文件类型的四种有用但不完美的技术。我倾向于使用所有四种的组合。这将是一个很好的问题。我希望 Perl 6 社区达成一致,并鼓励使用明确的文件扩展名,如 .pm6
、.t6
和 .pl6
。Larry Wall 将其称为“免费广告”。这也是提高 Perl 6 程序员生产力的简单方法。并非每个文本编辑器都像 Vim 那样可定制。
本文最初发布在 PerlTricks.com。
标签
反馈
这篇文章有什么问题吗?请在 GitHub 上打开一个问题或拉取请求来帮助我们。