Изменение цветовой схемы при вызове vimdiff внутри Vim

Я использую плагин 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 ответа

Решение

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

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

Источник

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

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

К сожалению, у 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
Другие вопросы по тегам