当前位置: 首页 > news >正文

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 -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打开.
在这里插入图片描述

http://www.dtcms.com/a/469189.html

相关文章:

  • Python高效实现Excel转PDF:无Office依赖的轻量化方案
  • 做网站PPPOE网络可以吗一个好网站设计
  • 混淆矩阵在金融领域白话解说
  • 深耕金融调研领域,用科学调研破解银行服务困境(市场调研)
  • 未备案网站处理系统写作墨问题 网站
  • 【Linux】手搓日志(附源码)
  • Excel 下拉选项设置 级联式
  • pycharm自动化测试初始化
  • nacos3.0.4升级到3.1.0
  • linux入门5.5(高可用)
  • JAVA·数组的定义与使用
  • Transformer 面试题及详细答案120道(81-90)-- 性能与评估
  • 可以做软件的网站有哪些功能中国新闻社待遇
  • 【鉴权架构】SpringBoot + Sa-Token + MyBatis + MySQL + Redis 实现用户鉴权、角色管理、权限管理
  • 三星S25Ultra/S24安卓16系统Oneui8成功获取完美root权限+LSP框架
  • ffmpeg 播放视频 暂停
  • 老题新解|大整数的因子
  • Eureka的自我保护机制
  • 探索颜色科学:从物理现象到数字再现
  • AirSim_SimJoyStick
  • 第五部分:VTK高级功能模块(第149章 Remote模块 - 远程模块类)
  • 道可云人工智能每日资讯|《政务领域人工智能大模型部署应用指引》发布
  • 自己做网站哪家好win10 wordpress安装教程视频
  • wordpress整体搬迁宁波seo深度优化平台有哪些
  • 4K Wallpaper mac v2.7.dmg 安装教程(Mac电脑详细安装步骤4K壁纸Mac下载安装)
  • Mac 软件出现「应用程序“xxx”不能打开」的解决办法
  • 东航集团客户网站是哪家公司建设4k高清视频素材网站
  • Compose 在Row、Column上使用focusRestorer修饰符失效原因
  • Sora 2:当AI视频“以假乱真”,内容创作进入新纪元,体验AI创作能力
  • 推荐一个浏览器代理插件(Tajang Proxy),支持Chrome和Edge