我的.vimrc中有以下内容,在活动窗口状态线中显示Y,在非活动窗口状态行中显示X,在窗口拆分时显示X。
set laststatus=2
function MyStatusLine() abort
let l:filename = '%f'
let l:mod = '%m'
let l:ell = '%l'
let l:Ell = '%L'
let l:Pee = '%P'
let sl = ""
if g:statusline_winid == win_getid(winnr())
let sl .= "Y "
else
let sl .= "X "
endif
return sl.l:filename.' '.l:mod.' '.l:ell.' '.l:Ell.' '.l:Pee
endfunction
set statusline+=%!MyStatusLine()我正在尝试合并一种方法,建议的here,这本身的工作为我。这将根据窗口所在的模式更改状态行的颜色。
在尝试将这两者(即在活动窗口的statusline上显示Y和在非活动窗口的状态线上显示N )结合起来时,它们的颜色也会根据它们在(last)中的模式而改变(最后),我尝试如下:
set laststatus=2
let g:currentmode={
\ 'n' : 'n',
\ 'v' : 'v',
\ 'V' : 'vl',
\ '' : 'vb',
\ 'i' : 'i',
\ 'R' : 'r',
\ 'Rv' : 'rv',
\ 'c' : 'c',
\ 't' : 'f',
\}
hi NormalColor ctermbg=black ctermfg=white
hi InsertColor ctermbg=darkgreen ctermfg=black
hi ReplaceColor ctermbg=darkred ctermfg=black
hi VisualColor ctermbg=darkblue ctermfg=black
function MyStatusLine() abort
let l:filename = '%f'
let l:mod = '%m'
let l:ell = '%l'
let l:Ell = '%L'
let l:Pee = '%P'
let sl = ""
if g:statusline_winid == win_getid(winnr())
let sl .= "Y "
else
let sl .= "X "
endif
return sl.l:filename.' '.l:mod.' '.l:ell.' '.l:Ell.' '.l:Pee
endfunction
set statusline+=%!MyStatusLine()
set statusline+=%#NormalColor#%{(g:currentmode[mode()]=='n')?'\ \ normal\ ':''}
set statusline+=%#InsertColor#%{(g:currentmode[mode()]=='i')?'\ \ insert\ ':''}
set statusline+=%#ReplaceColor#%{(g:currentmode[mode()]=='r')?'\ \ replace\ ':''}
set statusline+=%#ReplaceColor#%{(g:currentmode[mode()]=='rv')?'\ \ v-replace\ ':''}
set statusline+=%#VisualColor#%{(g:currentmode[mode()]=='v')?'\ \ visual\ ':''}
set statusline+=%#VisualColor#%{(g:currentmode[mode()]=='vl')?'\ \ v-line\ ':''}
set statusline+=%#VisualColor#%{(g:currentmode[mode()]=='vb')?'\ \ v-block\ ':''}
set statusline+=%#NormalColor#%{(g:currentmode[mode()]=='c')?'\ \ command\ ':''}
set statusline+=%#NormalColor#%{(g:currentmode[mode()]=='f')?'\ \ finder\ ':''}但是,这是不起作用的,当.vimrc来源时,将获得以下错误消息:
E121: Undefined variable: #NormalColor#
是否有获得这两种功能的方法?
ETA:按照romainl提供的必须从函数返回整个字符串的建议,我尝试了以下操作:
set laststatus=2
function MyStatusLine() abort
let g:currentmode={
\ 'n' : 'n',
\ 'v' : 'v',
\ 'V' : 'vl',
\ '' : 'vb',
\ 'i' : 'i',
\ 'R' : 'r',
\ 'Rv' : 'rv',
\ 'c' : 'c',
\ 't' : 'f',
\}
hi NormalColor ctermbg=black ctermfg=white
hi InsertColor ctermbg=darkgreen ctermfg=black
hi ReplaceColor ctermbg=darkred ctermfg=black
hi VisualColor ctermbg=darkblue ctermfg=black
let l:filename = '%f'
let l:mod = '%m'
let l:ell = '%l'
let l:Ell = '%L'
let l:Pee = '%P'
let sl = ""
if g:statusline_winid == win_getid(winnr())
let sl .= "Y "
else
let sl .= "X "
endif
let l:normcol=%#NormalColor#%{(g:currentmode[mode()]=='n')?'\ \ normal\ ':''}
let l:insert=%#InsertColor#%{(g:currentmode[mode()]=='i')?'\ \ insert\ ':''}
let l:replace=%#ReplaceColor#%{(g:currentmode[mode()]=='r')?'\ \ replace\ ':''}
let l:vreplace=%#ReplaceColor#%{(g:currentmode[mode()]=='rv')?'\ \ v-replace\ ':''}
let l:visual=%#VisualColor#%{(g:currentmode[mode()]=='v')?'\ \ visual\ ':''}
let l:v-line=%#VisualColor#%{(g:currentmode[mode()]=='vl')?'\ \ v-line\ ':''}
let l:v-block=%#VisualColor#%{(g:currentmode[mode()]=='vb')?'\ \ v-block\ ':''}
let l:command=%#NormalColor#%{(g:currentmode[mode()]=='c')?'\ \ command\ ':''}
let l:finder=%#NormalColor#%{(g:currentmode[mode()]=='f')?'\ \ finder\ ':''}
return sl.l:filename.' '.l:mod.' '.l:ell.' '.l:Ell.' '.l:Pee.' '.l:normcol.' '.l:insert.' '.l:replace.' '.l:vreplace.' '.l:visual.' '.l:v-line.' '.l:v-block.' '.l:command.' '.l:finder
endfunction
set statusline+=%!MyStatusLine()这也不管用。获得的错误是:
Error detected while processing function MyStatusLine:
line 27:
E15: Invalid expression: %#NormalColor#%{(g:currentmode[mode()]=='n')?'\ \ normal\ ':''}发布于 2022-10-07 23:24:00
在以下一行:
set statusline+=%!MyStatusLine()在%!之后的所有内容都被计算为一个表达式,以生成该选项的值,但是您正在向表达式中添加更多内容:
set statusline+=%#NormalColor#%{(g:currentmode[mode()]=='n')?'\ \ normal\ ':''}
[...]在表达式计算的上下文中,这些内容是没有意义的,因此评估失败了,状态线也无法工作。
您需要从MyStatusLine()返回完整的字符串。
-跟进
函数的输出应该是字符串,所以连接到该字符串中的所有变量都应该是字符串或计算字符串的表达式。
%#NormalColor#%和其余的都是垃圾:它既不是字符串,也不是计算为字符串的表达式。
因此,与其:
let l:normcol=%#NormalColor#%{(g:currentmode[mode()]=='n')?'\ \ normal\ ':''}你应该做这样的事情:
let l:normcol = "%#NormalColor#%{(g:currentmode[mode()]=='n')?'\ \ normal\ ':''}"此外,这种巨大的连接在最后是笨拙的,至少可以说。我会把所有这些字符串放在一个列表中,然后用一个join结束。类似于:
return [
\ "my first string",
\ "my second string",
\ ]->join()https://stackoverflow.com/questions/73991916
复制相似问题