Как вы выходите из режима Vimdiff в VIM, в частности, для беглеца?
-
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, чтобы пометить файл как объединенный.