Vim:如何检测用户所处的模式,状态行?

时间:2012-12-23 17:59:16

标签: vim statusline

我需要一种简单(或复杂)的方式来确定用户所处的模式。我需要知道用户是处于正常,插入,视觉,替换,更改等。

我知道mode()函数,但是我无法弄清楚如何输出一个完整的字符串而不是一个字符。

我的计划是创建一个函数,根据字符串mode()的返回值动态更改状态行的背景和前景色。基本上是一个函数与一堆ifs和elseifs,它会为我做。但是这种方法存在一个缺陷,我无法知道默认情况下主题设置的颜色。

基本上,我需要一些关于如何创建执行以下功能的提示/帮助:

  • 知道用户所处的模式。其余的功能每次发生变化时都会有不同的反应。
  • 使用fgbg值设置一些变量,这些变量反映当前主题为其设置的内容。
  • 根据这些值更改状态行的前景和背景。

我尝试过这样做,但这是一种非常粗暴的做法,它根本不起作用。它只设置一次颜色,之后每次更改都没有反应。

感谢您的帮助! :)

编辑:

非常确定我之前尝试过的不起作用的是:

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

然而,这个解决方案在我的标准中并不理想,因为它不干净,或者尽可能干净,因为它会造成很多混乱。 :/

1 个答案:

答案 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会转换为Normali转换为Insert等。

Lines 25 to 42定义将改变状态行颜色的函数。目前它仅支持Solarized,并且仅当您的版本具有此fork/pull request时才支持。如果您满足这些要求,当您处于插入模式时将获得红色背景,而当处于任何类型的视觉模式时,您将获得绿色背景,其余模式将与正常模式相同。

并且lines 118 to 119将定义的函数放在状态行中,它还使用从行3 to 23定义的全局变量以文本格式输出当前模式。

我相信这是一个比通常使用的更清晰的解决方案(自动命令和我见过的东西)。基本上唯一的缺陷就是没有办法知道主题的变量,但你当然可以做hi! link StatusLine Error,这会使状态行的语法与主题的错误相同。

希望这有帮助!