当前位置: 代码网 > 服务器>服务器>Linux > 一文详解Linux下如何在vim里使用异步编译和运行

一文详解Linux下如何在vim里使用异步编译和运行

2025年10月12日 Linux 我要评论
我打算在vim所打开的文件中直接编译运行cpp,无需一直切换窗口, 所使用的是llvm流.功能:当只有一个文件时,在vim所打开的main.cpp中无需离开按下f9就构建当前文件,按下f10就可以运行

我打算在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 -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)

# ==================== 文件级目标 ====================
# 只编译当前文件
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 "current target: $(current_target)"

.phony: 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里使用异步编译和运行的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com