我正在使用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 模式事件。您可以根据其他答案中的建议在一定程度上解决这个问题。
作为该方法的替代方法,您可以创建一个包装函数diffthis
并diffoff
在该函数中更改您的设置。
nnoremap <leader>df :call ToggleDiff()<CR>
function! ToggleDiff()
if &diff
diffoff
setlocal syntax=on
else
diffthis
setlocal syntax=off
endif
endfunction