在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=perl6filetype关键字可以缩写为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

标签

David Farrell

David 是一名专业程序员,他经常在 Twitter博客 上发表关于代码和编程艺术的帖子。

浏览他们的文章

反馈

这篇文章有什么问题吗?请在 GitHub 上打开一个问题或拉取请求来帮助我们。