How do you exit vimdiff mode in vim, specifically, for Fugitive?

后端 未结 15 1868
日久生厌
日久生厌 2021-01-30 05:01

I am using vim with the fugitive extension. It has a :Gdiff command which brings you into vimdiff mode, but what is the right/quick way to close/quit vimdiff mode?

I.e.,

相关标签:
15条回答
  • 2021-01-30 05:47

    An alternative to <C-W><C-O>, if you have multiple windows, would be move to the other diff window and do <C-W>c, which close only one window.

    If you close the wrong diff window do a :Gedit

    Be careful and don't confuse <C-W>c with <C-W><C-C>

    0 讨论(0)
  • 2021-01-30 05:48

    Yet another way. What I have in fugitive.vim - first save some info (s:gitbufname) when diff starts:

    function! s:Diff(vert,...) abort
      call sy#toggle()
      let s:startcol = winwidth(0)
      let &columns=(winwidth(0) * 2 - 20)
    ...
        if getwinvar('#', '&diff')
          let s:gitbufname = bufname("%")
          wincmd p
          call feedkeys(winnr."\<C-W>w", 'n')
        endif
    ...
    endfunction
    

    and later when leaving the buffer switch window to the saved buffer and restore:

    augroup fugitive_diff
    autocmd!
    autocmd BufWinLeave *
      \ if s:can_diffoff(+expand('<abuf>')) && s:diff_window_count() == 2 |
      \   if exists('s:gitbufname') && winnr() != bufwinnr(s:gitbufname) |
      \     let nr = bufnr("%") | exe bufwinnr(s:gitbufname).'wincmd w' | exe 'buf'.nr |
      \   endif |
      \   call s:diffoff_all(getbufvar(+expand('<abuf>'), 'git_dir')) |
      \   call sy#toggle() |
      \   call airline#load_theme() | call airline#update_statusline() |
      \   let &columns=s:startcol |
      \ endif
    ...
    
    0 讨论(0)
  • 2021-01-30 05:50

    Was using the code below based on https://stackoverflow.com/a/15113951/10999673 :

        if !exists(":Gdiffoff")
            command Gdiffoff bw! fugitive://*
        endif
    

    but it gave me an error "E93: more than one match for ..." in a 3 way diff, so i instead used the answer from https://stackoverflow.com/a/4867969/10999673 and finally have this:

    function! GetBufferList()
        return filter(range(1,bufnr('$')), 'buflisted(v:val)')
    endfunction
    
    function! GetMatchingBuffers(pattern)
        return filter(GetBufferList(), 'bufname(v:val) =~ a:pattern')
    endfunction
    
    function! WipeMatchingBuffers(pattern)
        let l:matchList = GetMatchingBuffers(a:pattern)
    
        let l:count = len(l:matchList)
        if l:count < 1
            echo 'No buffers found matching pattern ' . a:pattern
            return
        endif
    
        if l:count == 1
            let l:suffix = ''
        else
            let l:suffix = 's'
        endif
    
        exec 'bw ' . join(l:matchList, ' ')
    
        echo 'Wiped ' . l:count . ' buffer' . l:suffix . '.'
    endfunction
    
    command! -nargs=1 Gdiffoff call WipeMatchingBuffers('fugitive://')
    
    

    I just tweaked, copied and pasted the code into my .vimrc

    0 讨论(0)
提交回复
热议问题