Как выйти из режима vimdiff в vim, в частности, для Fugitive? - PullRequest
57 голосов
/ 24 апреля 2010

Я использую vim с беглым расширением . У него есть команда: Gdiff, которая переводит вас в режим vimdiff, но какой правильный / быстрый способ закрыть / выйти из режима vimdiff?

Т.е., скажем, я редактирую файл FooBar.txt в репозитории Git. Я запускаю: Gdiff, просматриваю мои изменения в vimdiff, а затем хочу вернуться и продолжить редактирование FooBar.txt или любого другого файла

ОБНОВЛЕНИЕ 1: Я собираюсь попробовать эти быстрые комбо на следующий рабочий день :)

"vimdiff current vs git head (fugitive extension)
nnoremap <Leader>gd :Gdiff<cr> 
"switch back to current file and closes fugitive buffer
nnoremap <Leader>gD :diffoff!<cr><c-w>h:bd<cr>

ОБНОВЛЕНИЕ2: Мои текущие сопоставления (закрывает только окно сравнения!)

"vimdiff current vs git head (fugitive extension)
nnoremap <Leader>gd :Gdiff<cr> 
"switch back to current file and closes fugitive buffer
nnoremap <Leader>gD <c-w>h<c-w>c

Также, пожалуйста, помогите мне решить, должен ли следующий ответ: https://stackoverflow.com/a/15975201/275980

Ответы [ 15 ]

0 голосов
/ 19 октября 2016

Метод 1:

  • открыть сравнение по:

:windo diffthis

  • закрыть его:

:windo diffoff

Метод 2:

Я рекомендую использовать самую простую команду: :q<CR>

, если вы хотите сделать это быстро, добавьте отображение:

" Set mapleader
let mapleader = ","
let g:mapleader = ","

и

" Quickly close the current window
nnoremap <leader>q :q<CR>

Это хорошо работает для меня. Выйдите из vimdiff просто на ,q, потому что обычно ваш курсор в старом файле.

0 голосов
/ 03 апреля 2015

Еще один способ. Что у меня есть в fugitive.vim - сначала сохраните некоторую информацию (s: gitbufname) при запуске diff:

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

и позже при выходе из окна переключения буфера в сохраненный буфер и восстановлении:

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 голосов
/ 27 августа 2014

Моя функция будет работать как из окна сравнения, так и из окна файла. Но, вероятно, не справится сам с открытием нескольких различий. Для этого вам нужно будет использовать fugitive#buffer(n).path() для сканирования и сопоставления.

command! Gdiffoff call Gdiffoff()
function! Gdiffoff()
    let diffbufnr = bufnr('^fugitive:')
    if diffbufnr > -1 && &diff
        diffoff | q
        if bufnr('%') == diffbufnr | Gedit | endif
        setlocal nocursorbind
    else
        echo 'Error: Not in diff or file'
    endif
endfunction

Добавить связывание ключей:

nnoremap <silent> <leader>gD :Gdiffoff<CR>
0 голосов
/ 20 июня 2013

noremap <leader>do :diffoff \| windo if &diff \| hide \| endif<cr>

Довольно разностный режим и закройте другие разностные окна. (Примечание: беглец автоматически удалит свои скрытые буферы.)

0 голосов
/ 10 января 2013

Отметьте здесь переключатель vimdiff между diffthis и diffoff на этой странице .

код:

nnoremap <silent> <Leader>df :call DiffToggle()<CR>

function! DiffToggle()
    if &diff
        diffoff
    else
        diffthis
    endif
:endfunction
...