如果安装了taglist.vim或者存在Tlist_Get_Tagname_By_Line()函数,如何设置状态行?

时间:2018-01-11 05:11:39

标签: vim

我的.vimrc中有以下内容,它根据光标的位置显示一个函数名称(它使用taglist.vim中的函数)

set statusline=%<%f\ [%{Tlist_Get_Tagname_By_Line()}]\ %{fugitive#statusline()}\ %h%m%r%=%-14.(%l,%c%V%)\ %P

我的问题是,如果没有安装taglist.vim, Vim会在您打开程序时抱怨它,而且非常讨厌:

E117: Unknown function: Tlist_Get_Tagname_By_Line
Press ENTER or type command to continue
E15: Invalid expression: Tlist_Get_Tagname_By_Line() 

问。如果Tlist_Get_Tagname_By_line()存在,我该如何设置状态栏?

2 个答案:

答案 0 :(得分:1)

  

我的问题是,如果没有安装taglist.vim,Vim会在你打开程序时抱怨它,而且非常烦人:

不,报告错误的系统从不问题。问题是导致错误的原因。

  

如果Tlist_Get_Tagname_By_line()存在,我该如何设置状态?

您可以使用:help exists()测试功能的可用性。所以你可以......

  • 将整个状态行定义放在条件中:

    if exists('*Tlist_Get_Tagname_By_line')
        set statusline=...
    endif
    
  • 或在状态栏中使用三元表达式:

    ...%{exists('*Tlist_Get_Tagname_By_line')?Tlist_Get_Tagname_By_line():''}...
    

答案 1 :(得分:1)

@ romainl的回答是完全正确的;我想提供一个具有较少重复('statusline'定义)或复杂性(三元组)的具体解决方案:

如果taglist函数不存在,只需定义一个返回空字符串的虚拟函数。

另一个答案也没有提及,如果您在'statusline'中设置~/.vimrc,则尚未加载插件。要检查标记列表的可用性,您必须先显式加载它。三元表达式不会受此影响,但您需要增加运行时成本(必须在每个状态行更新时评估条件)。

" Try to load plugin now.
:runtime! plugin/taglist.vim
if !exists('*Tlist_Get_Tagname_By_line')
    " Dummy stub for when taglist.vim isn't available.
    function! Tlist_Get_Tagname_By_line()
        return ''
    endfunction
endif

或者,您也可以在~/.vim/after/plugin/taglist.vim中定义虚拟存根,或通过:autocmd VimEnter * ...定义虚拟存根,但两者都不如上面推荐的解决方案那样清晰和富有表现力。