it-swarm.com.de

Wie beenden Sie den vimdiff-Modus in vim, insbesondere für Fugitive?

Ich verwende vim mit der flüchtigen Erweiterung . Es hat einen: Gdiff-Befehl, der Sie in den Vimdiff-Modus bringt, aber was ist der richtige/schnelle Weg, den Vimdiff-Modus zu schließen/zu beenden?

Nehmen wir an, ich bearbeite die Datei FooBar.txt unter Git-Repository. Ich feuere auf: Gdiff, überprüfe meine Änderungen in vimdiff und dann möchte ich zurückkehren und die Bearbeitung von FooBar.txt oder einer anderen Datei fortsetzen :)

UPDATE1: Ich werde diese Schnellkombinationen am nächsten Arbeitstag ausprobieren :) 

"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 nur das Diff-Fenster!)

"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

Bitte helfen Sie mir auch bei der Entscheidung, ob es sich bei der Antwort um eine Antwort handeln sollte: https://stackoverflow.com/a/15975201/275980

54
wik

Sie können windo set nodiff noscrollbind ausführen und dann das zweite Fenster schließen.

Update: Es gibt einen diffoff Befehl. Verwenden Sie windo diffoff, nicht das, was ich in der vorherigen Zeile geschrieben habe.

39
ZyX

Gemäß: https://github.com/tpope/vim-fugitive/issues/36

Schließen Sie das andere Fenster. Der einfachste Weg, dies zu tun, wenn Sie den Fokus nicht darauf verschoben haben, ist <C-W><C-O>, was bedeutet, "machen Sie dieses Fenster zum einzigen Fenster".

35
jtriley

Ich hatte kein Glück mit diffoff, aber ich habe gerade erfahren, dass :Gedit ohne Argument zur Arbeitsverzeichnisversion der Datei zurückkehren wird, im Gegensatz zu einer früheren Version, die Sie überprüft haben.

Und da q (keine Notwendigkeit für :q) die diff-Seitenleiste schließt, können Sie q gefolgt von :Gedit ausführen, um die Seitenleiste zu löschen und zur aktuellen Version der Datei zurückzukehren.

12
Henrik N

Das funktioniert gut für mich und kombiniert einige der vorhandenen Ideen hier:

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>
4
blueyed

Ich habe dafür eine einfache Lösung gefunden. Sie können es hier überprüfen: 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
4
radmen

Keine der oben genannten Lösungen funktionierte für mich. Am Ende tat dies stattdessen:

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

3
Jens Norrgrann

Eine Alternative zu <C-W><C-O> wäre, wenn Sie mehrere Fenster haben, zum anderen diff-Fenster und <C-W>c, die nur ein Fenster schließen.

Wenn Sie das falsche Diff-Fenster schließen, führen Sie einen :Gedit aus.

Seien Sie vorsichtig und verwechseln Sie <C-W>c nicht mit <C-W><C-C>

2
José Luis

dies ist, was ich die Vimdiff-Fenster nach der Verwendung verlassen muss: Gdiff

nnoremap Gd :q!<CR> :Gedit!<CR>
1
Adolfo Abegg

Wenn Sie :Gwrite nach dem Zusammenführen zu Ihrer Zufriedenheit ausführen, werden die beiden anderen Bereiche geschlossen und der Git-Cache aktualisiert, um die Datei als zusammengeführt zu markieren.

0
Caleb

Noch ein anderer Weg. Was ich in fugitive.vim habe - speichern Sie zuerst einige Informationen (s: gitbufname), wenn diff gestartet wird:

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 Sie das Pufferwechselfenster im gespeicherten Puffer verlassen und wiederherstellen:

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

Verwendete den folgenden Code basierend auf https://stackoverflow.com/a/15113951/10999673 :

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

aber es gab mir einen Fehler "E93: mehr als eine Übereinstimmung für ..." in einem 3-Wege-Diff, sodass ich stattdessen die Antwort von https://stackoverflow.com/a/4867969/10999673 und schließlich verwendete Nimm das:

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 den Code einfach angepasst, kopiert und in meine .vimrc eingefügt

0
wisefool

Meine Funktion funktioniert sowohl vom Diff-Fenster als auch vom Dateifenster aus. Aber wird wahrscheinlich nicht mit mehreren geöffneten Diffs umgehen. Dafür müssen Sie fugitive#buffer(n).path() zum Scannen und Abgleichen verwenden.

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 eine Schlüsselbindung hinzu:

nnoremap <silent> <leader>Gd :Gdiffoff<CR>
0
Rafi B.

Überprüfen Sie das vimdiff-Umschalten 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
0
aemonge

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

Ganzer Diff-Modus und andere Diff-Fenster schließen. (Hinweis: flugitive löscht automatisch die versteckten Puffer.)

0
Bohr

Methode 1:

  • einen Vergleich öffnen durch:

:windo diffthis

  • schließen Sie es durch:

:windo diffoff

Methode 2:

Ich empfehle nur den einfachsten Befehl zu verwenden: :q<CR>

wenn Sie es schnell machen wollen, fügen Sie das Mapping hinzu:

" Set mapleader
let mapleader = ","
let g:mapleader = ","

und

" Quickly close the current window
nnoremap <leader>q :q<CR>

Es funktioniert gut für mich. Beenden Sie vimdiff nur durch ,q, da sich normalerweise der Cursor in der alten Datei befindet.

0
jack guan