Подтвердить что ты не робот

Как выйти из режима vimdiff в vim, в частности, для Fugitive?

Я использую 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

Кроме того, пожалуйста, помогите мне решить, должен ли следующий быть ответчиком: qaru.site/info/107496/...

4b9b3361

Ответ 1

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

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

Ответ 2

В соответствии с: https://github.com/tpope/vim-fugitive/issues/36

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

Ответ 3

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

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

Ответ 4

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

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>

Ответ 5

Я нашел для этого простое решение. Вы можете проверить это здесь: 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

Ответ 6

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

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

Ответ 7

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

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

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

Ответ 8

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

nnoremap gD :q!<CR> :Gedit!<CR>

Ответ 9

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

Код:

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

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

Ответ 10

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

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

Ответ 11

Моя функция будет работать как из окна diff, так и из окна файла. Но, вероятно, он не справится с открытием нескольких diff. Для этого вам нужно будет использовать 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>

Ответ 12

Еще один способ. Что у меня есть в 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
...

Ответ 13

Способ 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, потому что обычно ваш курсор в старом файле.

Ответ 14

Использовал код ниже, основанный на fooobar.com/questions/107496/...:

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

но это дало мне ошибку "E93: более одного совпадения для..." в 3-х сторонней разнице, поэтому я вместо этого использовал ответ из fooobar.com/questions/69626/... и, наконец, получил это:

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

Ответ 15

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