使用 C++ 开发 Vim 插件
1. 背景介绍
Vim 的插件开发通常用 Vimscript 或者 Lua(Neovim),但有时我们希望利用 C++ 的高性能和丰富库生态 来完成复杂功能,例如代码分析、语法检查、文本处理等。
实现方式一般是:
用 C++ 写一个可执行程序;
Vim 插件通过
:!
、system()
、job_start()
调用这个程序;捕获结果并展示。
这样就能把 C++ 程序包装成 Vim 插件。
2. 插件开发思路
C++ 不直接嵌入到 Vim,而是作为 外部工具。Vim 插件的工作就是:
把当前缓冲区/选中内容传给 C++ 程序
接收 C++ 程序处理后的结果并展示
3. 几种调用方式
同步调用
let result = system("./my_tool 'hello world'") echo result
异步调用(Vim 8 / Neovim)
call job_start(["./my_tool", expand("%")], {'on_stdout': {j,d,e->execute('echo join(d)')}})
共享库 + Vim C 接口(复杂,这里不展开,入门不推荐)
4. Demo 工程实现
我们写一个简单的插件:
插件命令
:ReverseLine
功能:把当前行的字符串反转
实现:C++ 可执行文件接收字符串,返回反转结果
工程结构
cpp/reverse.cpp
#include <iostream>
#include <string>
#include <algorithm>int main(int argc, char* argv[]) {if (argc < 2) {std::cerr << "Usage: reverse <string>" << std::endl;return 1;}std::string input = argv[1];std::reverse(input.begin(), input.end());std::cout << input << std::endl;return 0;
}
cpp/CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(reverse_tool)set(CMAKE_CXX_STANDARD 11)add_executable(reverse reverse.cpp)
编译:
cd cpp
mkdir build && cd build
cmake ..
make
# 得到 ./reverse 可执行文件
plugin/reverse.vim
" 定义 Vim 命令 :ReverseLine
command! ReverseLine call ReverseCurrentLine()function! ReverseCurrentLine()let l:line = getline('.')let l:result = system(g:reverse_tool_path . ' "' . l:line . '"')call setline('.', substitute(l:result, '\n$', '', '')) " 去掉换行
endfunction
README.md
# Vim 插件 Demo (C++ 实现)## 功能
提供 `:ReverseLine` 命令,调用 C++ 程序把当前行反转。## 安装
1. 编译 C++ 程序```bashcd cppmkdir build && cd buildcmake ..make```得到 `reverse` 可执行文件。2. 设置 Vim 配置在 `~/.vimrc` 中加入:```vimlet g:reverse_tool_path = '/absolute/path/to/vim-cpp-plugin-demo/cpp/build/reverse'```3. 复制插件文件```bashmkdir -p ~/.vim/plugincp plugin/reverse.vim ~/.vim/plugin/```## 使用
在 Vim 中执行:
```
:ReverseLine
```
即可把当前行的文本反转。
5. 使用
编译
设置 Vim 配置
在 ~/.vimrc
中加入:
let g:reverse_tool_path = '/absolute/path/to/vim-cpp-plugin-demo/cpp/build/reverse'
安装插件
mkdir -p ~/.vim/plugin
cp plugin/reverse.vim ~/.vim/plugin/
6. 执行
在vim命令行模式下执行
:ReverseLine
执行后效果: