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
相关产品推荐
相关产品推荐

