编写-Vim-compiler-插件

compiler 命令

1
:compiler[!] {name}

这个命令实际上就是加载一个 .vim.lua 的文件.

其会查找的目录为:

  • $VIMRUNTIME/compiler, 内置的可用 compiler plugins
  • ~/.config/nvim/compiler, 用户自己编写的 compiler plugins, 若想覆盖其他 plugin, 可以放在 ~/.config/nvim/after/compiler

如, 有一个文件为 ~/.config/nvim/after/compiler/aaaa.vim, 则可以用:

1
:compiler aaaa

来加载这个文件.

编写需满足的机制

避免反复加载

在开头加上:

1
2
3
4
if exists("current_compiler")
finish
endif
let current_compiler = "xxxx"

通过检查一个变量是否设置来确认是否加载.

如, 先运行了:

1
:compiler perl

之后即使运行了另一句:

1
:compiler gcc

其仍然只加载了 perl.vimperl.lua. 而不会加载 gcc.vimgcc.lua

定义 CompilerSet 命令并用其设置 makeprg 选项

在插件中加上:

1
2
3
4
5
if exists(":CompilerSet") != 2
command -nargs=* CompilerSet setlocal <args>
endif
CompilerSet errorformat& " use the default 'errorformat'
CompilerSet makeprg=nmake

这种形式的代码, 即定义 :CompilerSet 这个 user command.

这里的 makeprg 这个选项设置了 :make 要调用的 compiler.

比如:

1
:set makeprg=perl %

则运行 :make 实际运行的命令如:

1
:!perl filename.pl 2>&1| tee /tmp/nvim.jie/xxxx/x

make 命令的执行细节

运行:

1
:make [arguments]

实际上等价于:

1
:!{makeprg} [arguments] {shellpipe} {errorfile}

这里的 makeprg, shellpipe, errorfile 都是 Vim option. 其值可以通过:

1
2
3
:set makeprg?
:set shellpipe?
:set errorfile?

来查看.

在设置 makeprg 时, % 会展开为当前文件名, %< 会展开为文件名 without extension. $* 会展开为所有参数 (也就是 [arguments].


编写-Vim-compiler-插件
http://example.com/2024/03/11/编写-Vim-compiler-插件/
作者
Jie
发布于
2024年3月11日
许可协议