web-dev-qa-db-ja.com

Vim内でvimdiffを呼び出すときに配色を変更する

VCSCommand プラグインを使用しています。

:VCSVimDiffを呼び出して、Vim内でVimDiffユーティリティを呼び出しています。

vimrcにあります:

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

コンソールからvimdiffを呼び出すと機能しますが、VCSを使用してVimから呼び出すと機能しません。

これはプラグインの問題ですか、それともvimrc構成がありませんか?

garyjohn 、お時間をいただきありがとうございますが、解決策を見つけました。できます!

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

ソース

Vimは起動時にvimrcを1回読み取ります。 if &diffステートメントは、'diff'の状態が変化するたびにではなく、読み取られたときに実行されます。 :VCSVimDiffを実行するときにこれらのカラーコマンドを実行する1つの方法は、次のように、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

これらのコマンドは何年にもわたって進化してきましたが、これが矛盾の言い訳です。

6
garyjohn

残念ながら、Vimには明示的なdiffモードイベントがありません。あなたは他の答えからの提案でそれをある程度ハックすることができます。

そのアプローチの代わりに、diffthisdiffoffをラップする関数を作成し、その関数の設定を変更することができます。

nnoremap <leader>df :call ToggleDiff()<CR>

function! ToggleDiff()
    if &diff
        diffoff
        setlocal syntax=on
    else
        diffthis
        setlocal syntax=off
    endif
endfunction
1
Jonathan Potter