You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VIM竞赛编程场景下如何复用CompileAndRun命令生成的旧缓冲区

解决方案

你可以通过给专用终端缓冲区增加唯一标识,每次执行命令前自动清理已存在的同标识缓冲区来实现复用效果,修改后的完整配置如下:

function! TermWrapper(command) abort
    " 先清理已存在的编译运行专用终端缓冲区
    if exists('t:cp_term_bufnr') && bufexists(t:cp_term_bufnr)
        execute 'bdelete! ' . t:cp_term_bufnr
    endif

    if !exists('g:split_term_style') | let g:split_term_style = 'vertical' | endif
    if g:split_term_style ==# 'vertical'
        let buffercmd = 'vnew'
    elseif g:split_term_style ==# 'horizontal'
        let buffercmd = 'new'
    else
        echoerr 'ERROR! g:split_term_style is not a valid value (must be ''horizontal'' or ''vertical'' but is currently set to ''' . g:split_term_style . ''')'
        throw 'ERROR! g:split_term_style is not a valid value (must be ''horizontal'' or ''vertical'')'
    endif
    exec buffercmd
    " 记录当前缓冲区编号为专用编译终端缓冲区
    let t:cp_term_bufnr = bufnr('%')

    if exists('g:split_term_resize_cmd')
        exec g:split_term_resize_cmd
    endif
    exec 'term ' . a:command
    exec 'setlocal nornu nonu'
    exec 'startinsert'
    autocmd BufEnter <buffer> startinsert
endfunction

let g:split_term_style = 'vertical'
let g:split_term_resize_cmd = 'vertical resize 80'

command! -nargs=0 CompileAndRun call TermWrapper(printf('g++ -std=c++11 %s && ./a.out', expand('%')))
autocmd FileType cpp nnoremap <leader>fw :CompileAndRun<CR>

修改说明

  • 新增了终端缓冲区检查逻辑:每次调用TermWrapper函数时,先检查当前标签页下是否存在之前创建的编译专用终端缓冲区,存在就直接强制删除
  • 新增了缓冲区标记逻辑:每次新建终端缓冲区后,把当前缓冲区编号存入t:cp_term_bufnr变量(t:前缀代表变量作用域为当前标签页,不同标签页可以独立保存自己的编译终端缓冲区,互不干扰)
  • 原有CompileAndRun命令和快捷键的使用逻辑完全不变,每次执行都会自动复用之前的终端窗口位置,不会再新增拆分窗口挤占代码编辑空间

内容的提问来源于stack exchange,提问作者Airi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 07:15:00