【问题标题】:reloading vimrc causes different syntax highlighting重新加载 vimrc 会导致不同的语法高亮
【发布时间】:2013-02-03 06:57:57
【问题描述】:

当我在 macvim 中打开一个文件时,它就像 http://imgur.com/a/3cLqB#0。 我已将,V 设置为:source ~/.vimrc<CR>

打开此文件后,按,V,语法高亮显示更改为http://imgur.com/a/3cLqB#1。 区别在于(,),;,, 从蓝色变成白色,->,.,? 从蓝色变成深蓝色。 为什么会这样?这是我的 vimrc 文件https://gist.github.com/pvinis/4979592

--
更新:我发现Valloric/vim-operator-highlight 是改变颜色的插件。所以第一张图片是正确的图片。 我还发现,只要我执行:syntax on,颜色就会重置。有没有办法检查语法是否已经打开?

【问题讨论】:

  • :set background? 在您执行 ,V 之前和之后显示什么?
  • 两者都暗。有什么方法可以导出所有设置的内容,然后查看差异?
  • 您可以使用:set:hi 列出设置和语法高亮。 This tip 也可能有助于调试。
  • 我使用了:set 并得到了之前和之后的列表。之前的额外内容是formatoptions=croql,之后没有formatoptions。我有我的 vimrc formatoptions-=ct,这会导致 formatoptions 完全消失?
  • 不好意思,又查了一遍,是formatoptions=q

标签: vim


【解决方案1】:

问题:

在重新加载.vimrc 时,一些高亮组被搞砸了。 这取决于您拥有的插件以及您使用的配色方案。 我注意到一些highlight links 被破坏了,一些highlight groups 被清除了。

受影响的亮点组

在我的特定设置中,我注意到 hi links 损坏或清除 groups on:

重新加载后注意受影响的区域:
(重新加载意味着保存修改后的文件。在这个例子中使用:wa

解决方案

不幸的是,我尝试过的列出的答案或任何选项组合在重新加载后都不会保留或恢复hi 组。 重新加载后手动运行colorscheme <your-coloscheme> 可以修复所有问题,但是使用Vimscript 执行此操作时不会。
希望有人能分享这个烦人的小问题的正确解决方案。

丑陋的黑客

重新加载vimrc:

对我的 vim 配置文件进行任何更改时,我都会执行 reload.vim:
.vimrc:

" .....
augroup reload_vimrc " {
    autocmd!
    autocmd BufWritePost ~/.vim/*.vim,~/.vim/vimrc source ~/.vim/reload.vim
augroup END " }

reload.vim: 恢复断开的链接和清除的组

我们要做的是在采购vimrc 之后恢复hi 组。
找到受影响区域的正确值,例如对于SignColumn,输入:
:hi SignColumn之前发生任何重新加载。

结果是(xxx 是预览):

您必须为每个受影响的hi 执行此操作。
在下面的 sn-p 中,我最初修复 SignColumn 以匹配我的 solarized 颜色方案。
然后我修复了一些GitGutter 颜色问题:
例如,GitGutterAdd 链接到保留的 GitGutterAddDefault,但从 GitGutterAddDefaultDiffAdd 已损坏,所以我重新安装了那个。以此类推。

reload.vim:

source ~/.vim/vimrc

hi SignColumn ctermfg=12 ctermbg=0 guifg=Cyan guibg=Grey

" GitGutterAdd -> GitGutterAddDefault (preserved)
hi link GitGutterAddDefault DiffAdd

" GitGutterChange -> GitGutterChangeDefault (preserved)
hi GitGutterChangeDefault ctermfg=3 ctermbg=0 guifg=#bbbb00

" GitGutterDelete -> GitGutterDeleteDefault (preserved)
hi GitGutterDeleteDefault ctermfg=1 ctermbg=0 guifg=#ff2222

" GitGutterChangeDelete -> GitGutterChangeDefault (preserved)
" (which we already fixed above)

" Powerline highlight groups
" (see this attached Gist for solution)

一切正常:

修复powerline-status颜色:

这个有点棘手,但原理是一样的。 powerline 的所有高亮组都以 Pl_ 开头。但其中一些可能还不存在。例如,如果您还没有进入visual 模式,那么视觉模式的相应组将不会被填充。因此,输入insertvisualnormal 模式来填充组,然后复制它们。您可以在hl 命令的输出底部找到它们。然后,将它们粘贴到您的 reload.vim 中,并将它们调整为合法的 hl 命令。

这听起来像是很多工作,但事实并非如此。 这是一个 gist 和完整的 reload.vim,还有一些 gifs 来指导您完成。

【讨论】:

  • 我注意到与您描述的行为相同的行为,感谢您提出这个答案。仍然没有办法解决这个问题吗?你明白为什么colorscheme xyz 在手动运行而不是在脚本中运行时有效吗?
  • 我发布了一个答案,其中包含对我有用的解决方法。也许它也适合你?
【解决方案2】:

我遇到了与这种情况非常相似的事情。我能够通过确保这些顺序正确来解决它:

syntax on
let g:solarized_termtrans=1
let g:solarized_termcolors=256
set background=dark
colorscheme solarized

我也用这个来重新加载

augroup reload_vimrc
autocmd!
autocmd BufWritePost $MYVIMRC source $MYVIMRC
augroup END

有了这两个,我可以实时更新我的​​ vimrc 而无需重新加载。我正在将 iTerm2 与终端 vim 一起使用。希望这可以帮助其他人,因为我花了很多时间试图让这个实时重新加载工作。还要确保您拥有最新版本的日光主题。我知道提起来似乎很平常,但它可能会有所作为。

【讨论】:

    【解决方案3】:

    我猜高亮部分是由某些插件定义/更改的。 :colorscheme 的重新执行会重置这些定义。插件必须使用 :autocmd 挂钩到 ColorScheme 事件,但大多数都不需要。

    要解决此问题,请尝试将 :colorscheme 包装在防护中:

    if ! exists('g:colors_name') || g:colors_name !=# 'Tomorrow-Night-Eighties'
        colorscheme Tomorrow-Night-Eighties
    endif
    

    【讨论】:

    • 然后尝试确定 .vimrc 中的哪一行导致了这种情况。您可以进行二分查找:删除/注释掉一半,如果没有变化则重复另一半,然后拆分有问题的一半并重复。
    【解决方案4】:

    这对我有用

    "auto reload vimrc once changed
    if has("autocmd")
      autocmd! BufWritePost .vimrc source $MYVIMRC
    
      " This fixes the color changes and things not working :D
      autocmd! BufWritePost .vimrc filetype plugin indent on
    endif
    

    【讨论】:

    【解决方案5】:

    我完全不知道为什么,(可能出于与手动执行 :source ~/.vimrc 相同的原因)但我替换

    autocmd BufWritePost *vimrc,*exrc :source %
    

    autocmd BufWritePost *vimrc,*exrc :call feedkeys(":source %\<cr>")
    

    解决了问题。

    【讨论】:

      【解决方案6】:

      autocmd BufWritePost *vimrc,*exrc :call feedkeys(":source %\&lt;cr&gt;")

      马上帮我修好了。订购时一定有一些奇怪的问题。我也有一个按键来资源文件,即使 autocmd 失败,这个 总是 工作。

      【讨论】:

        【解决方案7】:

        很可能与您的具体情况无关,但我遇到了类似的问题,所以我想我会分享,因为这是 Google 上的第一个 StackOverflow 结果。

        我的重新加载问题分为两个阶段:使用深色 Solarized 主题,重新加载 .vimrc 首先会稍微改变颜色,然后再次重新加载,它会切换到浅色 Solarized 主题。

        .vimrc 中关于颜色的语句是:

        set background="dark"
        let g:solarize_termcolors=256
        colorscheme solarized
        

        问题?第一行不应有引号:

        set background=dark
        

        我现在可以在不更改颜色的情况下重新加载 .vimrc。我不确定为什么它会工作一次,但之后会以不同的方式工作。我意识到在注释掉除其他人建议的这些行之外的所有内容之后。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-26
          • 2016-10-12
          • 2013-04-05
          • 1970-01-01
          • 2014-07-08
          • 1970-01-01
          相关资源
          最近更新 更多