Изменение цветовой схемы при вызове 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