写在前面
最近使用的编辑器开始向nvim转变, 下面配置一个编译运行C/C++/Python/Lua/sh/make/…程序的一键编译自动命令, 采用纯lua的API编写, 参考了stackoverflow的一个回答1.
命令框架
主要采用vim的autocmd
, 搭配FileType
事件, 使得vim能根据扩展名判断使用哪个函数调用.
然后就是用设置buffer内键映射的方法, 配置命令, 快捷键以及默认模式.
Python示例
下面以Python为例, 这里我用了我自己的虚拟环境中的Python解释器, 设置快捷键为<F7>
, 在普通模式中运行代码.
开头的命令是保存然后划分窗口打开终端, %
表示当前文件的文件名, 最后的i
表示可以直接编辑输出的内容(方便获取标准输入).
最后的silent
选项用来取消回显(不在命令行窗口显示执行的命令), noremaop
表示不进行递归映射.
vim.api.nvim_create_autocmd("FileType", {
pattern = "python",
callback = function()
vim.api.nvim_buf_set_keymap(
0,
"n",
"<F7>",
":w<CR>:split<CR>:te time /opt/homebrew/Caskroom/miniforge/base/envs/tf26/bin/python3 %<CR>i",
{ silent = true, noremap = true }
)
end,
})
对于静态编译型语言, 例如C语言, 我配置了如下的快捷键, 依然采用<F7>
作为编译运行的快捷键,
vim.api.nvim_create_autocmd("FileType", {
pattern = "c",
callback = function()
-- -fsanitize=address -fsanitize=undefined -D_GLIBCXX_DEBUG
vim.api.nvim_buf_set_keymap(
0,
"n",
"<F7>",
"<ESC>:w<CR>:split<CR>:te gcc-12 -std=c11 -Wshadow -Wall -o %:t:r.out % -g && time ./%:t:r.out<CR>i",
{ silent = true, noremap = true }
)
vim.api.nvim_buf_set_keymap(
0,
"n",
"<F8>",
"<ESC>:w<CR>:split<CR>:te clang -std=c11 -Wshadow -Wall -o %:t:r.out % -g -fsanitize=address -fsanitize=undefined -D_GLIBCXX_DEBUG && time ./%:t:r.out<CR>i",
{ silent = true, noremap = true }
)
end,
})
这里面我设置了输出文件为xxx.out
, 便于gitignore
识别. 这是通过%:t:r
实现的, 这个命令用来截取文件名, 但是不包含扩展名以及.
.
并且由于我电脑上有两个cc编译器, 这里就设置了两种:gcc
和clang
, clang
还配置了Google的内存检查工具asan
.
其他类型的静态语言或者脚本都可以类似配置, 这里我给出了自己完整的配置代码:
dotfile/run.lua at main · Apocaly-pse/dotfile (github.com).
将上述代码保存为run.lua
, 并且将其导入init.lua
中, 只需要添加一句:require(core.run)
即可.