7

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

我知道这个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

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

4

1 回答 1

2

2016 年 10 月更新:从那时起,我的 dotfiles 已移至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 被翻译成Normal, itoInsert等等。

第 25 到 42 行定义了改变状态行颜色的函数。目前它只支持 Solarized 并且只有当你的版本有这个fork/pull request时。如果您满足这些要求,您将在插入模式下获得红色背景,在任何视觉模式下获得绿色背景,其余模式与正常模式相同。

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

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

希望这可以帮助!

于 2012-12-25T18:12:26.433 回答