Comment quittez un mode vous de vimdiff dans vim, en particulier, pour Fugitive?
-
01-10-2019 - |
Question
J'utilise vim avec l'extension fugitif . Il a une: commande GDIFF qui vous amène en mode vimdiff, mais ce qui est le droit / moyen rapide de fermer / quitter le mode vimdiff
i.e.., Disons que je suis l'édition du fichier FooBar.txt sous dépôt Git. Je lance: GDIFF, passez en revue mes changements dans vimdiff, et je veux revenir et continuer à modifier FooBar.txt ou tout autre fichier:)
Update1: Je vais donner à ces combos rapides essayer le jour ouvrable suivant :)
"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>
MAJ2: Mes applications actuelles (! Ferme la fenêtre diff uniquement)
"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
En outre, s'il vous plaît me aider à décider si ce qui suit devrait être un anwser: https://stackoverflow.com/a/15975201/275980
La solution
Vous pouvez exécuter windo set nodiff noscrollbind
puis fermez la deuxième fenêtre.
Mise à jour: il y a une commande diffoff
. Utilisez windo diffoff
, pas ce que je l'ai écrit dans la ligne précédente.
Autres conseils
Selon: https://github.com/tpope/vim-fugitive/issues/36
A l'autre fenêtre. La meilleure façon de le faire si vous ne l'avez pas changé d'orientation à c'est
<C-W><C-O>
, qui signifie « faire cette fenêtre la seule fenêtre. »
J'ai eu pas de chance avec diffoff
, mais je viens d'apprendre que :Gedit
sans argument vous ramener à la version répertoire de travail du fichier, par opposition à une version antérieure que vous visitez.
Et comme q
(pas besoin de :q
) fermera la barre latérale diff, vous pouvez le faire q
suivi par :Gedit
pour se débarrasser de la barre latérale, puis revenir à la version actuelle du fichier.
Cela fonctionne bien pour moi, en combinant certaines des idées existantes ici:
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>
J'ai trouvé une solution simple pour cela. Vous pouvez le vérifier ici: 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
Aucune des solutions ci-dessus a fonctionné pour moi. Nous avons fini par faire ceci:
nnoremap <Leader>D :Gedit<CR><C-w>h :q<CR><C-w>k
Une alternative à <C-W><C-O>
, si vous avez plusieurs fenêtres, serait passer à l'autre fenêtre diff et ne <C-W>c
, qui ferment une seule fenêtre.
Si vous fermez la mauvaise fenêtre diff faire :Gedit
Soyez prudent et ne confondez pas <C-W>c
avec <C-W><C-C>
est ce que je dois laisser les fenêtres Vimdiff après avoir utilisé: GDIFF
nnoremap gD :q!<CR> :Gedit!<CR>
noremap <leader>do :diffoff \| windo if &diff \| hide \| endif<cr>
Tout diff Mode et fermez les autres fenêtres diff. (Note:. Automatique fugitif supprimera ses tampons cachés)
Ma fonction fonctionnera à la fois de diff fenêtre et fenêtre fichier. Mais sans doute ne se gérer avec plusieurs diffs ouverts. Pour cela, vous aurez besoin d'utiliser fugitive#buffer(n).path()
pour analyser et faire correspondre.
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
Ajoutez une touche de liaison:
nnoremap <silent> <leader>gD :Gdiffoff<CR>
Encore une autre façon. Ce que j'ai en fugitive.vim - premier enregistrement des informations (s) lorsque: gitbufname diff commence:
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
et plus tard en sortant de la fenêtre de changement de tampon au tampon sauvegardé et restauration:
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
...
Vérifier le basculement de vimdiff
entre diffthis
et diffoff
ici
à cette page .
Le code:
nnoremap <silent> <Leader>df :call DiffToggle()<CR>
function! DiffToggle()
if &diff
diffoff
else
diffthis
endif
:endfunction
Méthode 1:
- ouvrir une comparaison par:
:windo diffthis
- close par:
:windo diffoff
Méthode 2:
Je recommande simplement en utilisant la plus simple commande: :q<CR>
quand vous voulez le faire rapidement, ajoutez le mappage:
" Set mapleader
let mapleader = ","
let g:mapleader = ","
et
" Quickly close the current window
nnoremap <leader>q :q<CR>
Il fonctionne bien pour moi. Sortie vimdiff juste en ,q
, parce que normalement votre curseur dans l'ancien fichier.
A été en utilisant le code ci-dessous basé sur https://stackoverflow.com/a/15113951/10999673 :
if !exists(":Gdiffoff")
command Gdiffoff bw! fugitive://*
endif
mais il m'a donné une erreur « E93: plus d'un match pour ... » dans une diff 3 voies, donc je plutôt utilisé la réponse de https://stackoverflow.com/a/4867969/10999673 et enfin avoir ceci:
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://')
Je viens retouché, copié et collé le code dans mon .vimrc
L'exécution :Gwrite
après la fusion à votre entière satisfaction fermera les deux autres volets différents, en plus de mettre à jour le cache git pour marquer le fichier comme fusionné.