4

Я использую плагин VCSCommand .

Я вызываю утилиту VimDiff внутри Vim, вызывая :VCSVimDiff .

Я имею в моем vimrc:

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

Это работает, когда я вызываю vimdiff из моей консоли, но не когда я звоню из Vim с помощью VCS.

Это проблема с плагином или отсутствует конфигурация vimrc ?

3 ответа3

6

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 и выполнить команды, чтобы установить цветовую схему по умолчанию.

Я использую следующую команду, чтобы удалить буфер, с которым у меня был diff, отключить режим 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

Эти команды развивались годами, что является моим оправданием их несоответствий.

1

К сожалению, у 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
0

garyjohn, спасибо за ваше время, но я нахожу свое решение. Оно работает!

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

Источник

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .