在 Vim 中调用 vimdiff 时更改配色方案

在 Vim 中调用 vimdiff 时更改配色方案

我正在使用VCS命令插入。

我通过调用在 Vim 内部调用 VimDiff 实用程序:VCSVimDiff

我的有vimrc

if &diff
    set t_Co=256
    set background=dark
    colorscheme peaksea
else
    colorscheme molokai
endif

当我vimdiff从控制台调用时它可以工作,但当我使用 VCS 从 Vim 调用它时则不行。

这是插件问题,还是vimrc缺少配置?

答案1

Vim 在启动时读取一次 vimrc。if &diff语句在读取时执行,而不是每次状态更改时执行'diff'。在执行时执行这些颜色命令的一种方法:VCSVimDiff是将它们放在 vimrc 中的自动命令中,如下所示。

au FilterWritePre * if &diff | set t_Co=256 | set bg=dark | colorscheme peaksea | endif

FilterWritePre事件是 Vim 执行 diff 时触发的事件。

[该评论效果不佳,因此我将补充我原来的答案。]

如果您想以 结束 VimDiff :q,您可以做的是设置另一个自动命令,也许使用事件BufWinLeave,再次测试&diff并执行命令来设置您的默认配色方案。

我所做的是使用以下命令删除我已比较过的缓冲区,关闭差异模式并恢复一些已保存的设置。

command! -bar -bang Nodiff wincmd l <bar> only<bang> <bar> set nodiff noscrollbind scrollopt-=hor wrap foldcolumn=0 virtualedit= foldlevel=99 <bar> if exists("b:fdm") <bar> let &fdm = b:fdm <bar> endif <bar> if exists("b:syn") <bar> let &syn = b:syn <bar> endif

为了在进入差异模式时进行和/或保存这些设置,我使用以下自动命令。

au FilterWritePre * if &diff | set virtualedit=all | endif
au FilterWritePre * exe 'let b:syn = &syn | if &diff | set syn=OFF | endif'
au BufWinEnter * if &fdm != "diff" | let b:fdm = &fdm | endif

这些命令多年来一直在演变,这就是我对它们不一致的借口。

答案2

不幸的是,Vim 没有显式的 diff 模式事件。您可以根据其他答案中的建议在一定程度上解决这个问题。

作为该方法的替代方法,您可以创建一个包装函数diffthisdiffoff在该函数中更改您的设置。

nnoremap <leader>df :call ToggleDiff()<CR>

function! ToggleDiff()
    if &diff
        diffoff
        setlocal syntax=on
    else
        diffthis
        setlocal syntax=off
    endif
endfunction

答案3

加里约翰,感谢您的时间,但我找到了解决方案。它有效!

au FilterWritePost * if &diff | set t_Co=256 | set bg=dark | colorscheme peaksea | else | colorscheme molokai | endif
au BufWinLeave * colorscheme molokai

来源

相关内容