Как выйти из режима vimdiff в vim, в частности, для беглеца?
Я использую 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: мои текущие сопоставления (закрывает только окно diff!)
"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://stackoverflow.com/a/15975201/275980
13 ответов
согласно: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>
, Если у вас есть несколько окон, будет двигаться в другое окно diff и делать <C-W>c
, которые закрывают только одно окно.
если вы закрываете неправильное окно diff, сделайте :Gedit
будьте осторожны и не путайте <C-W>c
С <C-W><C-C>
это то, что я должен оставить окна vimdiff после использования: Gdiff
nnoremap gD :q!<CR> :Gedit!<CR>
noremap <leader>do :diffoff \| windo if &diff \| hide \| endif<cr>
режим Quite diff и закройте другие окна 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>
еще один способ. Что у меня в бегах.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
...
Регистрация 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
, потому что обычно курсор в старый файл.