一文详解Linux下如何在vim里使用异步编译和运行
目录
- 功能:
- 先决条件:
- 配置文件
我打算在vim所打开的文件中直接编译运行cpp,无需一直切换窗口, 所使用的是llvm流.
功能:
当只有一个文件时,在vim所打开的main.cpp中无需离开按下F9就构建当前文件,按下F10就可以运行当前文件.
当整个项目中(有多个文件),在vim所打开的main.cpp中无需离开只需按下F7构建整个项目, 按下F8就运行整个项目,按下F6只生成一个a.out的调式文件, 需要离开vim在bash下调试.先决条件:
(有gdb,make,和vim也可以)
echo "======= 开发工具版本检查 =======" && \ echo "=== Clang 编译器 ===" && clang++ --version && \ echo -e "\n=== LLDB 调试器 ===" && lldb --version && \ echo -e "\n=== LLD 链接器 ===" && ld.lld --version && \ echo js-e "\n=== Make 构建工具 ===" && make --version
目录结构:
~/ ├── .vim/ # Vim 配置目录 ├── .vimrc # Vim 主配置文件 │ ├── tasks.ini # AsyncTask 任务定义 │ └── plugin/ # Vim 插件目录 │ ├── asyncrun.vim # 异步运行插件 │ └── asynctasks.vim # 异步任务插件 ├── cpp/ # C++ 项目主目录 │ ├── Fraction.h # 分数类头文件 │ ├── Fraction.cpp # 分数类实现 │ ├── main.cpp # 主程序文件 │ └── Makefile # 构建配置 └── README.md # 项目说明文档
两个vim插件信息,是韦易笑大佬写的vim异步插件
"====================================================================== " asyncrun.vim - Run shell commands in background and output to quickfix " " Maintainer: skywind3000 (at) gmail.com, 2016-2024 " Homepage: https://github.com/skywind3000/asyncrun.vim " " Last Modified: 2025/03/24 10:50:34 "======================================================================
"====================================================================== " " asynctasks.vim - Modern Task System for Vim " " Maintainer: skywind3000 (at) gmail.com, 2020-2021 " " Last Modified: 2024/06/18 16:30 " Verision: 1.9.19 " " For more information, please visit: " https://github.com/skywind3000/asynctasks.vim " "======================================================================
配置文件
.vimrc
" ==================== 基础设置 ==================== " 启用语法高亮 syntax on " 搜索时实时显示匹配结果 set incsearch " ==================== 缩进设置 ==================== " Tab 键显示为4个空格宽度 set tabstop=4 " 自动缩进时使用4个空格 set shiftwidth=4 " 退格键删除4个空格 set softtabstop=4 " 禁用粘贴模式(确保正常缩进) set nopaste " 智能缩进 set smartindent " 自动缩进 set autoindent " ==================== 状态栏设置 ==================== " 总是显示状态栏 set laststatus=2 " 状态栏格式: " %n: 缓冲区编号 " %F: 完整文件路径 " %m: 修改标志 " %r: 只读标志 " %{}: 日期时间 " %l/%L: 当前行/总行数 " %c: 列号 " %p%%: 百分比 set statusline=%n:\ %<%F%m%r\ %{strftime(\"%H:%M\ %a\ %b\%d\ %Y\")}\ %=\ %l/%L:%c\ %p%% " ==================== 文件类型设置 ==================== " 启用文件类型插件 filetype plugin on " 启用文件类型缩进 filetype indent on " ==================== AsyncTask 项目级任务映射 ==================== " F6: 调试整个项目(使用 lldb) noremap <silent><f6> :AsyncTask project-debug<cr> " F7: 构建整个项目(编译所有文件) noremap <silent><f7> :AsyncTask project-build<cr> " F8: 运行整个项目(执行生成的可执行文件) noremap <silent><f8> :AsyncTask project-run<cr> " ==================== AsyncTask 文件级任务映射 ==================== " F9: 构建当前文件(只编译当前编辑的文件) noremap <silent><f9> :AsyncTask file-build<cr> " F10: 运行当前文件(编译并运行当前文件) noremap <silent><f10> :AsyncTask file-run<cr>
task.ini
# ==================== 项目级任务 ==================== # 项目构建任务 - 对应 F7 快捷键 [project-build] command=make project-build errorformat=%f:%l:%c: %m output=quickfix cwd=$(VIM_ROOT) # 修正:项目任务应该在项目根目录 save=2 # 项目运行任务 - 对应 F8 快捷键 [project-run] command=make project-run output=terminal # 修正:运行结果应该输出到终端 cwd=$(VIM_ROOT) # 修正:项目任务应该在项目根目录 save=2 # 项目调试任务 - 对应 F6 快捷键 [project-debug] command=make project-debug output=terminal # 修正:调试器应该输出到终端 cwd=$(VIM_ROOT) # 修正:项目任务应该在项目根目录 save=2 # ==================== 文件级任务 ==================== # 文件构建任务 - 对应 F9 快捷键 [file-build] command=make file-build output=quickfix errorformat=%f:%l:%c: %m # 修正:需要设置错误格式 cwd=$(VIM_FILEDIR) # 正确:文件任务在当前文件目录 save=2 # 文件运行任务 - 对应 F10 快捷键 [file-run] command=make file-run output=terminal # 修正:运行结果应该输出到终端 errorformat=%f:%l:%c: %m # 修正:需要设置错误格式 cwd=$(VIM_FILEDIR) # 正确:文件任务在当前文件目录 save=2
makefile
CXX = clang++ CXXFLAGS = -Wall -Weffc++ -Wextra -Wconversion -Wsign-conversion -g -std=c++23 LDFLAGS = -fuse-ld=lld # 项目级配置 PROJECT_TARGET = a.out PROJECT_SRCS = $(wildcard *.cpp) PROJECT_OBjs = $(PROJECT_SRCS:.cpp=.o) PROJECT_HEADERS = $(wildcard *.h) # 文件级配置 CURRENT_FILE = $(VIM_FILENAME) CURRENT_TARGET = $(basename $(CURRENT_FILE)) CURRENT_OBJ = $(CURRENT_TARGET).o # 默认目标 all: project-build # ==================== 项目级目标 ==================== # 构建整个项目 project-build: $(PROJECT_TARGET) $(PROJECT_TARGET): $(PROJECT_OBJS) $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $^ @echo "=== PROJECT BUILD: All files compiled ===" @echo "Target: $(PROJECT_TARGET)" @echo "Sources: $(PROJECT_SRCS)" # 运行整个项目 project-run: project-build @echo "=== PROJECT RUN: Running $(PROJECT_TARGET) ===" ./$(PROJECT_TARGET) @echo "=== Program finished (exit code: $$?) ===" # 项目调试 project-debug: project-build @echo "=== PROJECT DEBUG: Starting debugger ===" lldb $(PROJECT_TARGET) www.devze.com # ==================== 文件级目标 =编程客栈=================== # 只编译当前文件 file-build: @echo "=== FILE BUILD: Compiling $(CURRENT_FILE) only ===" $(CXX) $(CXXFLAGS) -c $(CURRENT_FILE) -o $(CURRENT_OBJ) @echo "Generated: $(CURRENT_OBJ)" # 编译并运行当前单个文件(独立程序) file-run: @echo "=== FILE RUN: Compiling and running $(CURRENT_FILE) ===" $(CXX) $(CXXFLAGS) $(CURRENT_FILE) -o $(CURRENT_TARGET) @echo "Running: ./$(CURRENT_TARGET)" ./$(CURRENT_TARGET) @echo "=== Single file execution finished ===" # 文件级调试 file-debug: @echo "=== FILE DEBUG: Debugging $(CURRENT_FILE) ===" $(CXX) $(CXXFLAGS) $(CURRENT_FILE) -g -o $(CURRENT_TARGET) lldb $(CURRENT_TARGET) # ==================== 通用规则 ==================== # 项目级编译规则 %.o: %.cpp $(PROJECT_HEADERS) $(CXX) $(CXXFLAGS) -c $< -o $@ # 清理 clean: rm -f $(PROJECT_OBJS) $(PROJECT_TARGET) *.o $(basename $(wildcard *.cpp)) @echo "=== Clean completed ===" # 显示信息 info: @echo "=== Project Info ===" @echo "Project target: $(PROJECT_TARGET)" @echo "Project sources: $(PROJECT_SRCS)" @echo "Current file: $(CURRENT_FILE)" @echo "Cjsurrent target: $(CURRENT_TARGET)" .PHONandroidY: all clean project-build project-run project-debug file-build file-run file-debug info
演示
F7构建整个项目
F8运行整个项目
F6调式(带-g)生成的a.out 会覆盖之前的可执行文件a.out,这个可用作lldb来调式程序.
接着就可以调式了
单文件同上.
注意:quickfix设置了只显示6行,如果要查看更详细的信息,按下Ctrl+w+w在当前vim和quickfix窗口切换.如果发现没有quickfix出来,就在vim命令模式下用:copen打开.
以上就是一文详解linux下如何在vim里使用异步编译和运行的详细内容,更多关于Linux vim里使用异步编译和运行的资料请关注编程客栈(www.devze.com)其它相关文章!
精彩评论