Как вы выходите из режима Vimdiff в VIM, в частности, для беглеца?

StackOverflow https://stackoverflow.com/questions/2703644

  •  01-10-2019
  •  | 
  •  

Вопрос

Я использую Vim с беглечное расширение. Отказ Он имеет A: GDIFF Command, которая подводит вас в режим 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>

Update2: Мои текущие сопоставления (только закрывает различие в окне!)

"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

Кроме того, пожалуйста, помогите мне решить, должен ли следующее быть Anwser: https://stackovlow.com/a/15975201/275980.

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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>

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

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

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

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

Если вы закроете неверное окно разных :Gedit

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

Это то, что мне нужно покинуть Wimdiff Windows после использования: GDIFF

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

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

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

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

Еще один способ. Что у меня в Fugite.VIM - сначала сохранить некоторую информацию (S: GitBufname), когда Shiff запускается:

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
...

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

Код:

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top