我需要一种简单(或复杂)的方式来确定用户所处的模式。我需要知道用户是处于正常,插入,视觉,替换,更改等。
我知道mode()
函数,但是我无法弄清楚如何输出一个完整的字符串而不是一个字符。
我的计划是创建一个函数,根据字符串mode()
的返回值动态更改状态行的背景和前景色。基本上是一个函数与一堆ifs和elseifs,它会为我做。但是这种方法存在一个缺陷,我无法知道默认情况下主题设置的颜色。
基本上,我需要一些关于如何创建执行以下功能的提示/帮助:
fg
和bg
值设置一些变量,这些变量反映当前主题为其设置的内容。我尝试过这样做,但这是一种非常粗暴的做法,它根本不起作用。它只设置一次颜色,之后每次更改都没有反应。
感谢您的帮助! :)
编辑:
非常确定我之前尝试过的不起作用的是:
function! StatuslineModeColor()
let s:StatuslineMode=mode()
if s:StatuslineMode == 'n'
hi Statusline ctermbg=blue guibg=blue
elseif s:StatuslineMode == 'i'
hi Statusline ctermbg=red guibg=red
endif
endfunc
在状态栏中,我提出以下内容:
let &stl.='%{StatuslineModeColor()}'
编辑2:
我已经发现,基本上我需要做的是找到一种方法来抓住主题之前使用的任何颜色。如果我使用这个解决方案,那就是http://www.reddit.com/r/vim/comments/gexi6/a_smarter_statusline_code_in_comments/c1n2oo5
然而,这个解决方案在我的标准中并不理想,因为它不干净,或者尽可能干净,因为它会造成很多混乱。 :/
答案 0 :(得分:2)
2016年10月更新:从那时起,我的dotfiles已移至https://gitlab.com/greduan/dotfiles,因此该文件的新网址为:https://gitlab.com/greduan/dotfiles/blob/76e16dd8a04501db29989824af512c453550591d/vim/after/plugin/statusline.vim
所有行都相同。
由于没有人想出答案我自己做了解决方案,你可以在这里找到:https://github.com/Greduan/dotfiles/blob/76e16dd8a04501db29989824af512c453550591d/vim/after/plugin/statusline.vim#L3-L42
基本上它执行以下操作:
Lines 3 to 23使用包含所有不同模式的字典定义一个全局变量,将其翻译成可读文本。因此,代表正常的n
会转换为Normal
,i
转换为Insert
等。
Lines 25 to 42定义将改变状态行颜色的函数。目前它仅支持Solarized,并且仅当您的版本具有此fork/pull request时才支持。如果您满足这些要求,当您处于插入模式时将获得红色背景,而当处于任何类型的视觉模式时,您将获得绿色背景,其余模式将与正常模式相同。
并且lines 118 to 119将定义的函数放在状态行中,它还使用从行3 to 23定义的全局变量以文本格式输出当前模式。
我相信这是一个比通常使用的更清晰的解决方案(自动命令和我见过的东西)。基本上唯一的缺陷就是没有办法知道主题的变量,但你当然可以做hi! link StatusLine Error
,这会使状态行的语法与主题的错误相同。
希望这有帮助!