一文詳解Linux下如何在vim里使用異步編譯和運(yùn)行
我打算在vim所打開的文件中直接編譯運(yùn)行cpp,無需一直切換窗口, 所使用的是llvm流.
功能:
當(dāng)只有一個(gè)文件時(shí),在vim所打開的main.cpp中無需離開按下F9就構(gòu)建當(dāng)前文件,按下F10就可以運(yùn)行當(dāng)前文件.
當(dāng)整個(gè)項(xiàng)目中(有多個(gè)文件),在vim所打開的main.cpp中無需離開只需按下F7構(gòu)建整個(gè)項(xiàng)目, 按下F8就運(yùn)行整個(gè)項(xiàng)目,按下F6只生成一個(gè)a.out的調(diào)式文件, 需要離開vim在bash下調(diào)試.
先決條件:
(有g(shù)db,make,和vim也可以)
echo "======= 開發(fā)工具版本檢查 =======" && \ echo "=== Clang 編譯器 ===" && clang++ --version && \ echo -e "\n=== LLDB 調(diào)試器 ===" && lldb --version && \ echo -e "\n=== LLD 鏈接器 ===" && ld.lld --version && \ echo -e "\n=== Make 構(gòu)建工具 ===" && make --version

目錄結(jié)構(gòu):
~/ ├── .vim/ # Vim 配置目錄 ├── .vimrc # Vim 主配置文件 │ ├── tasks.ini # AsyncTask 任務(wù)定義 │ └── plugin/ # Vim 插件目錄 │ ├── asyncrun.vim # 異步運(yùn)行插件 │ └── asynctasks.vim # 異步任務(wù)插件 ├── cpp/ # C++ 項(xiàng)目主目錄 │ ├── Fraction.h # 分?jǐn)?shù)類頭文件 │ ├── Fraction.cpp # 分?jǐn)?shù)類實(shí)現(xiàn) │ ├── main.cpp # 主程序文件 │ └── Makefile # 構(gòu)建配置 └── README.md # 項(xiàng)目說明文檔
兩個(gè)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
" ==================== 基礎(chǔ)設(shè)置 ====================
" 啟用語法高亮
syntax on
" 搜索時(shí)實(shí)時(shí)顯示匹配結(jié)果
set incsearch
" ==================== 縮進(jìn)設(shè)置 ====================
" Tab 鍵顯示為4個(gè)空格寬度
set tabstop=4
" 自動(dòng)縮進(jìn)時(shí)使用4個(gè)空格
set shiftwidth=4
" 退格鍵刪除4個(gè)空格
set softtabstop=4
" 禁用粘貼模式(確保正常縮進(jìn))
set nopaste
" 智能縮進(jìn)
set smartindent
" 自動(dòng)縮進(jìn)
set autoindent
" ==================== 狀態(tài)欄設(shè)置 ====================
" 總是顯示狀態(tài)欄
set laststatus=2
" 狀態(tài)欄格式:
" %n: 緩沖區(qū)編號(hào)
" %F: 完整文件路徑
" %m: 修改標(biāo)志
" %r: 只讀標(biāo)志
" %{}: 日期時(shí)間
" %l/%L: 當(dāng)前行/總行數(shù)
" %c: 列號(hào)
" %p%%: 百分比
set statusline=%n:\ %<%F%m%r\ %{strftime(\"%H:%M\ %a\ %b\%d\ %Y\")}\ %=\ %l/%L:%c\ %p%%
" ==================== 文件類型設(shè)置 ====================
" 啟用文件類型插件
filetype plugin on
" 啟用文件類型縮進(jìn)
filetype indent on
" ==================== AsyncTask 項(xiàng)目級(jí)任務(wù)映射 ====================
" F6: 調(diào)試整個(gè)項(xiàng)目(使用 lldb)
noremap <silent><f6> :AsyncTask project-debug<cr>
" F7: 構(gòu)建整個(gè)項(xiàng)目(編譯所有文件)
noremap <silent><f7> :AsyncTask project-build<cr>
" F8: 運(yùn)行整個(gè)項(xiàng)目(執(zhí)行生成的可執(zhí)行文件)
noremap <silent><f8> :AsyncTask project-run<cr>
" ==================== AsyncTask 文件級(jí)任務(wù)映射 ====================
" F9: 構(gòu)建當(dāng)前文件(只編譯當(dāng)前編輯的文件)
noremap <silent><f9> :AsyncTask file-build<cr>
" F10: 運(yùn)行當(dāng)前文件(編譯并運(yùn)行當(dāng)前文件)
noremap <silent><f10> :AsyncTask file-run<cr>
task.ini
# ==================== 項(xiàng)目級(jí)任務(wù) ==================== # 項(xiàng)目構(gòu)建任務(wù) - 對(duì)應(yīng) F7 快捷鍵 [project-build] command=make project-build errorformat=%f:%l:%c: %m output=quickfix cwd=$(VIM_ROOT) # 修正:項(xiàng)目任務(wù)應(yīng)該在項(xiàng)目根目錄 save=2 # 項(xiàng)目運(yùn)行任務(wù) - 對(duì)應(yīng) F8 快捷鍵 [project-run] command=make project-run output=terminal # 修正:運(yùn)行結(jié)果應(yīng)該輸出到終端 cwd=$(VIM_ROOT) # 修正:項(xiàng)目任務(wù)應(yīng)該在項(xiàng)目根目錄 save=2 # 項(xiàng)目調(diào)試任務(wù) - 對(duì)應(yīng) F6 快捷鍵 [project-debug] command=make project-debug output=terminal # 修正:調(diào)試器應(yīng)該輸出到終端 cwd=$(VIM_ROOT) # 修正:項(xiàng)目任務(wù)應(yīng)該在項(xiàng)目根目錄 save=2 # ==================== 文件級(jí)任務(wù) ==================== # 文件構(gòu)建任務(wù) - 對(duì)應(yīng) F9 快捷鍵 [file-build] command=make file-build output=quickfix errorformat=%f:%l:%c: %m # 修正:需要設(shè)置錯(cuò)誤格式 cwd=$(VIM_FILEDIR) # 正確:文件任務(wù)在當(dāng)前文件目錄 save=2 # 文件運(yùn)行任務(wù) - 對(duì)應(yīng) F10 快捷鍵 [file-run] command=make file-run output=terminal # 修正:運(yùn)行結(jié)果應(yīng)該輸出到終端 errorformat=%f:%l:%c: %m # 修正:需要設(shè)置錯(cuò)誤格式 cwd=$(VIM_FILEDIR) # 正確:文件任務(wù)在當(dāng)前文件目錄 save=2
makefile
CXX = clang++
CXXFLAGS = -Wall -Weffc++ -Wextra -Wconversion -Wsign-conversion -g -std=c++23
LDFLAGS = -fuse-ld=lld
# 項(xiàng)目級(jí)配置
PROJECT_TARGET = a.out
PROJECT_SRCS = $(wildcard *.cpp)
PROJECT_OBJS = $(PROJECT_SRCS:.cpp=.o)
PROJECT_HEADERS = $(wildcard *.h)
# 文件級(jí)配置
CURRENT_FILE = $(VIM_FILENAME)
CURRENT_TARGET = $(basename $(CURRENT_FILE))
CURRENT_OBJ = $(CURRENT_TARGET).o
# 默認(rèn)目標(biāo)
all: project-build
# ==================== 項(xiàng)目級(jí)目標(biāo) ====================
# 構(gòu)建整個(gè)項(xiàng)目
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)"
# 運(yùn)行整個(gè)項(xiàng)目
project-run: project-build
@echo "=== PROJECT RUN: Running $(PROJECT_TARGET) ==="
./$(PROJECT_TARGET)
@echo "=== Program finished (exit code: $$?) ==="
# 項(xiàng)目調(diào)試
project-debug: project-build
@echo "=== PROJECT DEBUG: Starting debugger ==="
lldb $(PROJECT_TARGET)
# ==================== 文件級(jí)目標(biāo) ====================
# 只編譯當(dāng)前文件
file-build:
@echo "=== FILE BUILD: Compiling $(CURRENT_FILE) only ==="
$(CXX) $(CXXFLAGS) -c $(CURRENT_FILE) -o $(CURRENT_OBJ)
@echo "Generated: $(CURRENT_OBJ)"
# 編譯并運(yùn)行當(dāng)前單個(gè)文件(獨(dú)立程序)
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 ==="
# 文件級(jí)調(diào)試
file-debug:
@echo "=== FILE DEBUG: Debugging $(CURRENT_FILE) ==="
$(CXX) $(CXXFLAGS) $(CURRENT_FILE) -g -o $(CURRENT_TARGET)
lldb $(CURRENT_TARGET)
# ==================== 通用規(guī)則 ====================
# 項(xiàng)目級(jí)編譯規(guī)則
%.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構(gòu)建整個(gè)項(xiàng)目

F8運(yùn)行整個(gè)項(xiàng)目

F6調(diào)式(帶-g)生成的a.out 會(huì)覆蓋之前的可執(zhí)行文件a.out,這個(gè)可用作lldb來調(diào)式程序.

接著就可以調(diào)式了

單文件同上.
注意:quickfix設(shè)置了只顯示6行,如果要查看更詳細(xì)的信息,按下Ctrl+w+w在當(dāng)前vim和quickfix窗口切換.如果發(fā)現(xiàn)沒有quickfix出來,就在vim命令模式下用:copen打開.

以上就是一文詳解Linux下如何在vim里使用異步編譯和運(yùn)行的詳細(xì)內(nèi)容,更多關(guān)于Linux vim里使用異步編譯和運(yùn)行的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
服務(wù)器間如何實(shí)現(xiàn)scp免密文件傳輸
文章介紹了如何在本地電腦或源服務(wù)器上生成SSH密鑰,并將其復(fù)制到遠(yuǎn)程服務(wù)器上,以實(shí)現(xiàn)免密碼登錄,此外,還介紹了如何使用SCP命令在本地和遠(yuǎn)程服務(wù)器之間傳輸文件2025-02-02
php擴(kuò)展memcached和memcache的安裝配置方法
這篇文章主要介紹了php擴(kuò)展memcached和memcache的安裝配置方法,需要的朋友可以參考下2014-11-11
Linux中使用crond工具創(chuàng)建定時(shí)任務(wù)的方法
這篇文章主要介紹了Linux中使用crond工具創(chuàng)建定時(shí)任務(wù)的方法,本文通過多種方法給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02
apache密碼生成工具h(yuǎn)tpasswd使用詳解
本文主要介紹了1、 htpasswd的作用與安裝,2、 htpasswd命令詳解,3、 htpasswd的實(shí)例,4、 htpasswd的應(yīng)用,有需要的小伙伴參考下2015-01-01
分享9個(gè)實(shí)戰(zhàn)及面試常用Linux Shell腳本編寫
這篇文章主要介紹了9個(gè)實(shí)戰(zhàn)及面試常用Shell腳本編寫,非常不錯(cuò),具有一定的收藏價(jià)值,需要的朋友可以參考下2018-10-10
Linux中怎么通過PID號(hào)找到對(duì)應(yīng)的進(jìn)程名及所在目錄方法
本篇文章主要介紹了Linux中怎么通過PID號(hào)找到對(duì)應(yīng)的進(jìn)程名及所在目錄方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-06-06
解決因文件權(quán)限導(dǎo)致git fetch命令執(zhí)行失敗的問題
最近在工作中遇到一個(gè)問題,就是在在一個(gè)基于 git 的發(fā)布系統(tǒng)中拉取代碼,發(fā)現(xiàn)無法拉取最新的提交記錄,查找相關(guān)資料發(fā)現(xiàn)是因?yàn)槲募?quán)限的問題,所以這篇文章主要介紹了關(guān)于解決因文件權(quán)限導(dǎo)致git fetch命令執(zhí)行失敗的問題,需要的朋友可以參考下。2017-04-04

