首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于窗口模式的活动窗口自定义文本与状态线颜色

基于窗口模式的活动窗口自定义文本与状态线颜色
EN

Stack Overflow用户
提问于 2022-10-07 19:34:21
回答 1查看 49关注 0票数 0

我的.vimrc中有以下内容,在活动窗口状态线中显示Y,在非活动窗口状态行中显示X,在窗口拆分时显示X

代码语言:javascript
运行
复制
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)中的模式而改变(最后),我尝试如下:

代码语言:javascript
运行
复制
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提供的必须从函数返回整个字符串的建议,我尝试了以下操作:

代码语言:javascript
运行
复制
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()

这也不管用。获得的错误是:

代码语言:javascript
运行
复制
Error detected while processing function MyStatusLine:
line   27:
E15: Invalid expression: %#NormalColor#%{(g:currentmode[mode()]=='n')?'\ \ normal\ ':''}
EN

Stack Overflow用户

回答已采纳

发布于 2022-10-07 23:24:00

在以下一行:

代码语言:javascript
运行
复制
set statusline+=%!MyStatusLine()

%!之后的所有内容都被计算为一个表达式,以生成该选项的值,但是您正在向表达式中添加更多内容:

代码语言:javascript
运行
复制
set statusline+=%#NormalColor#%{(g:currentmode[mode()]=='n')?'\ \ normal\ ':''}
[...]

在表达式计算的上下文中,这些内容是没有意义的,因此评估失败了,状态线也无法工作。

您需要从MyStatusLine()返回完整的字符串。

-跟进

函数的输出应该是字符串,所以连接到该字符串中的所有变量都应该是字符串或计算字符串的表达式。

%#NormalColor#%和其余的都是垃圾:它既不是字符串,也不是计算为字符串的表达式。

因此,与其:

代码语言:javascript
运行
复制
let l:normcol=%#NormalColor#%{(g:currentmode[mode()]=='n')?'\ \ normal\ ':''}

你应该做这样的事情:

代码语言:javascript
运行
复制
let l:normcol = "%#NormalColor#%{(g:currentmode[mode()]=='n')?'\ \ normal\ ':''}"

此外,这种巨大的连接在最后是笨拙的,至少可以说。我会把所有这些字符串放在一个列表中,然后用一个join结束。类似于:

代码语言:javascript
运行
复制
return [
    \ "my first string",
    \ "my second string",
    \ ]->join()
票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73991916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档