Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vim 函数中的statusline高亮显示组无效_Vim - Fatal编程技术网

Vim 函数中的statusline高亮显示组无效

Vim 函数中的statusline高亮显示组无效,vim,Vim,在我的vim配置中,我有如下功能 function! StatuslineTrailingSpace() if !exists('b:statusline_trailing_space_warning') let b:statusline_trailing_space_warning = &modifiable ? search('\s\+$', 'nw') != 0 ? ' %#warningmsg#[\s]%*' : '' : '' endif return b

在我的vim配置中,我有如下功能

function! StatuslineTrailingSpace()
  if !exists('b:statusline_trailing_space_warning')
    let b:statusline_trailing_space_warning = &modifiable ? search('\s\+$', 'nw') != 0 ? ' %#warningmsg#[\s]%*' : '' : ''
  endif

  return b:statusline_trailing_space_warning
endfunction
然后在后面的某个地方

set statusline+=%{StatuslineTrailingSpace()}
但是,我看到的不是状态行中的彩色标记
[\s]
,而是完整的
%\warningmsg[\s]%*
字符串

正在尝试使用
%而不是中建议的
%{}
,似乎不起作用,因为我的vim给出了错误

line   70:
E539: Illegal character <!>: statusline+=%!StatuslineTrailingSpace()
第70行:
E539:非法字符:statusline+=%!StatuslineTrailingSpace()

如何使彩色状态行正常工作?

我怀疑您必须使用
%构造以访问缓冲区。然而,由于文档暗示
%必须从选项的开头开始,您最好保存当前状态行,然后使用函数返回整个内容

function! StatuslineTrailingSpace()
  if !exists('b:statusline_trailing_space_warning')
let b:statusline_trailing_space_warning = &modifiable ? search('\s\+$', 'nw') != 0 ? ' %#warningmsg#[\s]%*' : '' : ''
  endif

  return s:former_status_line . b:statusline_trailing_space_warning
endfunction

let s:former_status_line = &statusline
set statusline=%!StatuslineTrailingSpace()

类似的内容?

突出显示组应该在
'statusline'
选项中,而不是在表达式中:

function! StatuslineTrailingSpace()
  if !exists('b:stsw')
    let b:stsw = &modifiable ? search('\s\+$', 'nw') != 0 ? ' [\s]' : '' : ''
  endif

  return b:stsw
endfunction

set statusline+=%#warningmsg#%{StatuslineTrailingSpace()}%*

您是否了解
%之间的差异
%{}
?看起来你想要
%%时给出了一个错误当选项*以“%!”开头时,…
因此可能只是需要将整个状态行放入一个函数中。提示是
%必须站在一开始为我做这件事。我现在使用一个statusline函数,它将所有字符串和函数连接在一起,并通过
set statusline=%使用它!Statusline()