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

Я использую vim с расширением fugitive. В нем есть команда: 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


person wik    schedule 24.04.2010    source источник
comment
gDРаботает у меня без :diffoff!<cr>.   -  person blueyed    schedule 04.04.2011
comment
Просто сосредоточение внимания на окне сравнения и :q закрытие его, кажется, помогает. Было бы неплохо, если бы был простой способ сделать это из любого окна.   -  person Aaron Gibralter    schedule 20.02.2014
comment
Кажется, что большинство, если не все ответы относятся к плагину Fugitive и лишь частично работают с более простой конфигурацией Vim.   -  person MarkHu    schedule 05.05.2018


Ответы (15)


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

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

person ZyX    schedule 24.04.2010
comment
также: diffoff! делать то же самое, правда? На эту команду мне указал Тони М. из группы vim_use. - person wik; 25.04.2010
comment
Это не закроет окно, которое открыл :Gdiff, не так ли? - person blueyed; 04.04.2011
comment
@blueyed Да, не будет. Я не использую беглый, но режим сравнения, созданный с помощью VCSVimDiff (VCSCommand плагин) заменяется режимом без различий (который был активен до VCSVimDiff was run) if you run : bw` во втором буфере. Это очень удобно, но это собственная функция плагина VCSCommand, а не то, что vim предоставляет из коробки. Вы можете создать автокоманду с аналогичной функциональностью в вашем vimrc, если хотите. - person ZyX; 04.04.2011
comment
@BjornTipling Что не работает? diffoff отключает режим vimdiff независимо от того, какой плагин его запускал. - person ZyX; 14.10.2012
comment
Он не закрывает окна и не возвращает пользователя туда, где он был до ввода Gdiff, это делает ответ @ jtriley. Это то, чего хотел исходный вопрос: а затем я хочу вернуться и продолжить редактирование FooBar.txt - person Bjorn; 14.10.2012
comment
@BjornTipling, что мне лично не нравится в ‹CW› ‹CO›, так это то, что он закрывает все окна, включая окно состояния git, которое полезно, когда вы проводите более глубокое расследование, например, в окне состояния git есть карта ‹SD›, которая также открытие режима сравнения для выделенного файла - person wik; 05.03.2013

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

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

person jtriley    schedule 14.10.2011
comment
ИМХО это должен быть выбранный ответ - person lkraav; 12.02.2012
comment
Это может вызвать проблемы, если перед входом в Gdiff у вас было открыто несколько окон - Gdiff только добавляет буфер рядом с исходным, не закрывая другие. Вам придется заново открывать все остальное, над чем вы работали. - person matthias; 14.08.2012
comment
что не совсем полезно, когда вы делаете различия из окна состояния git, поскольку оно закрывает все окна ... - person wik; 11.03.2013
comment
Gdiff открывает другой буфер (вкладку) с разделенными окнами. Так что это не сработает. - person Geoffrey; 31.07.2017

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

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

person Henrik N    schedule 18.02.2011
comment
q начнет запись. Так что не уверен, какой тип «q» вы используете. Может быть, это графический интерфейс или что-то в этом роде. - person Bjorn; 14.10.2012
comment
Некоторые плагины переназначают q только в заданный буфер (map <buffer> q ZZ или что-то еще), чтобы закрыть этот буфер. Для меня это происходит на боковой панели Fugitive git blame. Больше не помню, использовалось ли это в каких-либо представлениях различий. - person Henrik N; 16.10.2012
comment
Поведение :Gedit по умолчанию может быть изменено. Теперь он будет редактировать файл corespoding в индексе вместо файла рабочего дерева. - person Bohr; 20.06.2013
comment
@systemovich В этом ответе предлагается сначала сделать :q (или просто q), чтобы закрыть боковую панель diff. - person Henrik N; 31.07.2017

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

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>
person blueyed    schedule 04.04.2011

Я нашел для этого простое решение. Вы можете проверить это здесь: 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
person radmen    schedule 27.02.2013
comment
Мне это нравится. Ex снова командует FTW. Думаю, я воспользуюсь этим - person sehe; 05.11.2013

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

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

person Jens Norrgrann    schedule 24.03.2011
comment
Только что понял: nnoremap g<C-q> ZZ:Gedit<CR> (см. мой собственный вопрос на сегодня). Я думаю, что это несколько лучше, потому что избегает перемещения между окнами. - person sehe; 05.11.2013

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

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

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

person José Luis    schedule 12.04.2013
comment
Это похоже на то, что я сделал в моем картировании gD: nnoremap ‹Leader› gD ‹c-w› h: bd ‹cr› - person wik; 14.04.2013

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

nnoremap gD :q!<CR> :Gedit!<CR>
person Adolfo Abegg    schedule 05.07.2012
comment
Я считаю, что это закроет фактический файл, и вы в конечном итоге отредактируете временный файл diff, где вы в конечном итоге потеряете все свои изменения. Это если вы никогда не перемещали курсор на diff. - person Bjorn; 14.10.2012

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

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

person Bohr    schedule 20.06.2013

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

Еще один способ. То, что у меня есть в 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
...
person cc9cii    schedule 03.04.2015

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

Код:

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

function! DiffToggle()
    if &diff
        diffoff
    else
        diffthis
    endif
:endfunction
person aemonge    schedule 10.01.2013

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

person jack guan    schedule 19.10.2016

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

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

но это дало мне ошибку "E93: более одного совпадения для ..." в трехстороннем различии, поэтому я вместо этого использовал ответ от 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

person wisefool    schedule 01.02.2019

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

person Caleb    schedule 03.04.2019