标记列表不会动态更新

时间:2019-10-11 14:41:32

标签: vim ctags cscope

我是VIMscript的初学者。编码时,我需要更新标签和cscope数据库,以便可以跳转和搜索新添加的代码(函数,宏等)。

我的.vimrc文件具有以下代码:

function UpdateTags()
    silent! execute (":!rm -rf tags cscope.files cscope.out")
    silent! execute (":!ctags -R . *.c *.h *.hpp *.cpp --tag-relative=yes ./ 2>/dev/null")
    silent! execute (":!cscope -b -R") | redraw!
    normal == :cs reset<CR><CR>
    normal == :TlistUpdate<CR>
endfunction

nnoremap <silent> <C-k> :call UpdateTags()<CR>

我看到标签和cscope.out文件已更新。但是,我无法解决以下几件事:

  • 屏幕闪烁两次(我在函数中仅将重绘一次)
  • 标签列表未更新。如果我再次手动执行:TlistUpdate命令,那么我会看到新标签。

以下代码有效:

function UpdateTags()
        call system ("rm -rf tags cscope.files cscope.out")
        call system ("ctags -R . *.c *.h *.hpp *.cpp --tag-relative=yes ./ 2>/dev/null")
        call system ("cscope -b -R")
        silent cscope reset
        TlistUpdate
endfunction

1 个答案:

答案 0 :(得分:1)

sytem()

execute交换system。这有两个好处:

  1. 由于system的工作原理,屏幕没有闪烁,需要重绘
  2. 您应该可以使用silent而不是silent!,后者会隐藏任何错误

将Ex(冒号)命令用作命令

normal ==您如何假装用户从普通模式运行==。 (您可以使用normal!来避免地图。)

要运行:cscope reset:TlistUpdate,只需运行它们:

function! UpdateTags() abort
  " ...
  cscope reset
  TlistUpdate
  " ...
endfunction