定制neovim的一键编译运行快捷键

 
Category: Tips

写在前面

最近使用的编辑器开始向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编译器, 这里就设置了两种:gccclang, clang还配置了Google的内存检查工具asan.

其他类型的静态语言或者脚本都可以类似配置, 这里我给出了自己完整的配置代码:

dotfile/run.lua at main · Apocaly-pse/dotfile (github.com).

将上述代码保存为run.lua, 并且将其导入init.lua中, 只需要添加一句:require(core.run)即可.

参考