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

4516
Somebody still uses you MS-DOS

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

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

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

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

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

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

4

3 ответа на вопрос

6
garyjohn

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 

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

Интересно. Действительно, это работает. Знаете ли вы решение "вернуться" к исходной схеме цветов, когда я заканчиваю VimDiff с помощью: q? Somebody still uses you MS-DOS 14 лет назад 0
Если вы хотите завершить VimDiff с помощью: q, вы могли бы установить другую автокоманду, возможно, используя событие BufWinLeave, снова протестировать diff & и выполнить команды, чтобы установить цветовую схему по умолчанию. Я использую следующую команду, чтобы удалить буфер, с которым у меня был diff, отключить режим diff и восстановить некоторые сохраненные настройки. команда! -бар -бэнг нодифф винчмд л только set nodiff noscrollbind scrollopt- = hor wrap foldcolumn = 0 virtualedit = foldlevel = 99 если существует ("b: fdm") let & fdm = b: fdm ENDIF если существует ("b: syn") let & syn = b: syn ENDIF garyjohn 14 лет назад 0
Я переместил содержимое вышеприведенного комментария в ответ. garyjohn 14 лет назад 0
Обратите внимание, что Vim 7.4 восстанавливает ваши настройки при отключении режима сравнения. Christian Brabandt 10 лет назад 0
1
Jonathan Potter

Unfortunately Vim doesn't have explicit diff mode events. You can hack around that to some extent with the suggestions from the other answers.

As an alternative to that approach, you can create a function that wraps diffthis and diffoff and change your settings in that function.

nnoremap <leader>df :call ToggleDiff()<CR> function! ToggleDiff() if &diff diffoff setlocal syntax=on else diffthis setlocal syntax=off endif endfunction 
0
Somebody still uses you MS-DOS

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

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

Источник