Как выйти из режима 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 ]

43 голосов
/ 24 апреля 2010

Вы можете выполнить windo set nodiff noscrollbind и затем закрыть второе окно.

Обновление: есть команда diffoff. Используйте windo diffoff, а не то, что я написал в предыдущей строке.

37 голосов
/ 14 октября 2011

Согласно: https://github.com/tpope/vim-fugitive/issues/36

Закройте другое окно. Самый простой способ сделать это, если вы не сместили фокус на него, это <C-W><C-O>, что означает «сделать это окно единственным окном».

12 голосов
/ 19 февраля 2011

Мне не повезло с diffoff, но я только что узнал, что :Gedit без аргументов вернет вас к версии файла с рабочим каталогом, в отличие от более ранней версии, которую вы просматривали.

И так как q (без необходимости :q) закроет боковую панель diff, вы можете сделать q, затем :Gedit, чтобы избавиться от боковой панели, а затем вернуться к текущей версии файла. .

4 голосов
/ 27 февраля 2013

Я нашел простое решение для этого. Вы можете проверить это здесь: https://gist.github.com/radmen/5048080

" Simple way to turn off Gdiff splitscreen
" works only when diff buffer is focused
if !exists(":Gdiffoff")
  command Gdiffoff diffoff | q | Gedit
endif
4 голосов
/ 04 апреля 2011

Это прекрасно работает для меня, объединяя некоторые из существующих идей здесь:

function! MyCloseDiff()
  if (&diff == 0 || getbufvar('#', '&diff') == 0)
        \ && (bufname('%') !~ '^fugitive:' && bufname('#') !~ '^fugitive:')
    echom "Not in diff view."
    return
  endif

  " close current buffer if alternate is not fugitive but current one is
  if bufname('#') !~ '^fugitive:' && bufname('%') =~ '^fugitive:'
    if bufwinnr("#") == -1
      b #
      bd #
    else
      bd
    endif
  else
    bd #
  endif
endfunction
nnoremap <Leader>gD :call MyCloseDiff()<cr>
3 голосов
/ 24 марта 2011

Ни одно из вышеперечисленных решений не помогло мне. Закончилось этим вместо этого:

nnoremap <Leader>D :Gedit<CR><C-w>h :q<CR><C-w>k

2 голосов
/ 12 апреля 2013

Альтернативой <C-W><C-O>, если у вас есть несколько окон, будет перемещение в другое окно сравнения и выполнение <C-W>c, которое закрывает только одно окно.

Если вы закроете неправильное окно сравнения, выполните :Gedit

Будьте осторожны и не путайте <C-W>c с <C-W><C-C>

1 голос
/ 05 июля 2012

это то, что я должен покинуть окна vimdiff после использования: Gdiff

nnoremap gD :q!<CR> :Gedit!<CR>
0 голосов
/ 03 апреля 2019

Запуск :Gwrite после объединения к вашему удовлетворению закроет две другие панели diff в дополнение к обновлению кеша git, чтобы пометить файл как объединенный.

0 голосов
/ 01 февраля 2019

Использовал код ниже на основе https://stackoverflow.com/a/15113951/10999673:

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

но это дало мне ошибку "E93: более одного совпадения для ..." в 3-х сторонней разнице, поэтому я вместо этого использовал ответ из https://stackoverflow.com/a/4867969/10999673 и наконец получил следующее:

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://')

Я просто подправил, скопировал и вставил код в мой .vimrc

...