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

gre*_*uan 7 vim statusline

我需要一种简单(或复杂)的方法来确定用户所处的模式.我需要知道用户是否处于Normal,Insert,Visual,Replace,Change等.

我知道这个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
Run Code Online (Sandbox Code Playgroud)

在状态栏中,我提出以下内容:

let &stl.='%{StatuslineModeColor()}'
Run Code Online (Sandbox Code Playgroud)

编辑2:

我已经弄清楚,基本上我需要做的是找到一种方法来抓住主题之前使用的任何颜色.如果我使用这个解决方案,那就是:http://www.reddit.com/r/vim/comments/gexi6/a_smarter_statusline_code_in_comments/c1n2oo5

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

gre*_*uan 2

2016 年 10 月更新:从那时起,我的点文件已移至https://gitlab.com/greduan/dotfiles,因此该文件的新 URL 为: https: //gitlab.com/greduan/dotfiles/blob/76e16dd8a04501db29989824af512c453550591d/vim/之后/插件/statusline.vim

所有的线都是一样的。


由于没有人提出答案,我制定了自己的解决方案,您可以在这里找到它: https: //github.com/Greduan/dotfiles/blob/76e16dd8a04501db29989824af512c453550591d/vim/after/plugin/statusline.vim#L3-L42

基本上它执行以下操作:

第 3 行到第 23 行定义了一个全局变量,其中包含包含所有不同模式的字典,并将其转换为可读文本。所以n代表正常的会被翻译成Normal, itoInsert等等。

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

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

我相信这是一种比通常使用的解决方案(自动命令和我见过的类似的东西)干净得多的解决方案。基本上,它的唯一缺陷是无法知道主题的变量,但您当然可以hi! link StatusLine Error这样做,例如,这将使状态行具有与主题错误相同的语法突出显示。

希望这可以帮助!

  • 引用的 git 存储库已被删除。 (2认同)