Wie Sie vimdiff Modus in vim verlassen, insbesondere für Fugitive?
-
01-10-2019 - |
Frage
Ich verwende vim mit der flüchtigen Erweiterung . Es hat ein: Gdiff Befehl, die Sie in vimdiff Modus bringt, aber was ist die richtige / schnelle Möglichkeit zu schließen / beenden vimdiff Modus
d., Sagen wir, ich bin der Bearbeitung der Datei FooBar.txt unter Git-Repository. Ich anwerfen: Gdiff, meine Änderungen in vimdiff überprüfen, und dann will ich wieder und weiter bearbeiten FooBar.txt oder jede andere Datei:)
UPDATE1: Ich werde diese schnellen Combos versuchen nächsten Tag arbeiten :)
"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: Meine aktuellen Zuordnungen (! Schließt diff Fenster nur)
"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
Auch mir bitte helfen zu entscheiden, ob die folgenden soll ein anwser sein: https://stackoverflow.com/a/15975201/275980
Lösung
Sie können windo set nodiff noscrollbind
ausführen und schließen Sie dann das zweite Fenster.
Update: Es gibt einen diffoff
Befehl. Verwenden windo diffoff
, nicht das, was ich in vorheriger Zeile geschrieben hat.
Andere Tipps
Nach: https://github.com/tpope/vim-fugitive/issues/36
Schließen Sie das andere Fenster. Der einfachste Weg, dies zu tun, wenn Sie Fokus nicht verschoben haben, um es
<C-W><C-O>
ist, das bedeutet „das Fenster das einzige Fenster machen.“
Ich hatte kein Glück mit diffoff
, aber ich habe gerade erfahren, dass :Gedit
ohne Argument zurück zum Arbeitsverzeichnis Version der Datei bringen, wie zu einer früheren Version im Gegensatz Sie wurden zu überprüfen.
Und wie q
(keine Notwendigkeit für :q
) wird die diff Sidebar schließen, können Sie tun q
von :Gedit
gefolgt von der Seitenleiste, um loszuwerden, und dann auf die aktuelle Version der Datei zurück.
Dies funktioniert gut für mich, hier kombiniert sind einige der vorhandenen Ideen:
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>
Ich habe eine einfache Lösung gefunden. Sie können es hier ansehen: 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
Keine der oben genannten Lösungen für mich gearbeitet. Am Ende tut dies statt:
nnoremap <Leader>D :Gedit<CR><C-w>h :q<CR><C-w>k
Eine Alternative zu <C-W><C-O>
, wenn Sie mehrere Fenster haben, würde Umzug in den anderen diff Fenstern sein und tut <C-W>c
, die in der Nähe nur ein Fenster.
Wenn Sie die falschen diff Fenster tun, um ein :Gedit
schließen
Seien Sie vorsichtig und nicht zu verwechseln mit <C-W>c
<C-W><C-C>
das ist, was ich habe die vimdiff Fenster zu verlassen, nach der Verwendung von: Gdiff
nnoremap gD :q!<CR> :Gedit!<CR>
noremap <leader>do :diffoff \| windo if &diff \| hide \| endif<cr>
Ganz Diff-Modus und schließen andere diff Fenster. (Anmerkung:. Flüchtige wird automatisch seine versteckten Puffer löschen)
Meine Funktion arbeiten beide aus Diff Fenster und Dateifenster. Aber wahrscheinlich behandeln sich nicht mit mehreren diffs geöffnet. Für die Sie verwenden fugitive#buffer(n).path()
benötigen und Spiel zu scannen.
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
Fügen Sie einen Schlüssel Bindung:
nnoremap <silent> <leader>gD :Gdiffoff<CR>
Noch eine andere Art und Weise. Was ich in fugitive.vim haben - zuerst speichern einige Informationen (s: gitbufname), wenn DIFF beginnt:
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
und später, wenn der Pufferschalter Fenster auf den gespeicherten Puffer verlassen und wieder herstellen:
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
...
Überprüfen Sie die vimdiff
Hin- und Herschalten zwischen diffthis
und diffoff
hier
auf dieser Seite .
Der Code:
nnoremap <silent> <Leader>df :call DiffToggle()<CR>
function! DiffToggle()
if &diff
diffoff
else
diffthis
endif
:endfunction
Methode 1:
- öffnen Sie ein zu vergleichen:
:windo diffthis
- schließen sie durch:
:windo diffoff
Methode 2:
Ich empfehle nur den einfachsten Befehl: :q<CR>
, wenn Sie es schnell tun wollen, fügen Sie die Zuordnung:
" Set mapleader
let mapleader = ","
let g:mapleader = ","
und
" Quickly close the current window
nnoremap <leader>q :q<CR>
Es funktioniert gut für mich. Ausfahrt vimdiff nur durch ,q
, weil normalerweise Sie den Cursor in der alten Datei.
Wurde mit dem Code unten basierend auf https://stackoverflow.com/a/15113951/10999673 :
if !exists(":Gdiffoff")
command Gdiffoff bw! fugitive://*
endif
aber es gab mir eine Fehlermeldung „E93: mehr als ein Spiel für ...“ in einem 3-Wege-diff, so dass ich die Antwort von https://stackoverflow.com/a/4867969/10999673 und diese schließlich haben:
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://')
Ich habe gerade gezwickt, kopiert und den Code in meine .vimrc
geklebt Beim Laufen :Gwrite
nach zu Ihrer Zufriedenheit Zusammenführung werden die anderen zwei verschiedene Scheiben zusätzlich zur Aktualisierung des git Cache schließen Sie die Datei zu markieren, wie verschmolzen.