¿Cómo se sale del modo vimdiff en vim, en concreto, a un fugitivo?
-
01-10-2019 - |
Pregunta
Estoy usando vim con el fugitivo extensión . Tiene un:? Gdiff de comandos, que le lleva al modo vimdiff, pero lo que es la derecha / forma rápida de cerrar / salir del modo de vimdiff
es decir., Digamos que estoy editando el archivo bajo FooBar.txt repositorio Git. Me fuego hasta: Gdiff, revise mis cambios en vimdiff, y luego quiero volver y continuar con la edición FooBar.txt o cualquier otro archivo:)
Actualización 1: voy a dar a estos combos rápidos intentarlo el próximo día laborable :)
"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: Mis asignaciones actuales (! Cierra la ventana diff solamente)
"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
También, por favor me ayude a decidir si el siguiente debe ser un anwser: https://stackoverflow.com/a/15975201/275980
Solución
Puede ejecutar windo set nodiff noscrollbind
y luego cerrar la segunda ventana.
Actualización: hay un comando diffoff
. Uso windo diffoff
, no lo que escribí en la línea anterior.
Otros consejos
De acuerdo con: https://github.com/tpope/vim-fugitive/issues/36
Cerrar la otra ventana. La manera más fácil de hacer este enfoque si no se ha desplazado a es
<C-W><C-O>
, que significa "hacen de esta ventana la única ventana."
No tuve suerte con diffoff
, pero me acabo de enterar de que :Gedit
sin argumentos le llevará de nuevo a la versión en el directorio de trabajo del archivo, en lugar de una versión anterior que estaba revisando.
Y como q
(sin necesidad de :q
) cerrará la barra lateral de diferencias, se puede hacer q
seguido por :Gedit
para deshacerse de la barra lateral y luego volver a la versión actual del archivo.
Esta bien que funciona para mí, la combinación de algunas de las ideas existentes aquí:
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>
He encontrado una solución simple para esto. Se puede ver aquí: 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
Ninguna de las soluciones anteriores funcionó para mí. Terminamos haciendo esto en su lugar:
nnoremap <Leader>D :Gedit<CR><C-w>h :q<CR><C-w>k
Una alternativa a <C-W><C-O>
, si tiene varias ventanas, sería traslado a la otra ventana de diferencias y hacer <C-W>c
, que se cierran sólo una ventana.
Si cierra la ventana diff mal hacer un :Gedit
Tenga cuidado y no hay que confundir con <C-W>c
<C-W><C-C>
Esto es lo que tengo que dejar las ventanas vimdiff después de usar: Gdiff
nnoremap gD :q!<CR> :Gedit!<CR>
noremap <leader>do :diffoff \| windo if &diff \| hide \| endif<cr>
Muy a modo de diff y cerrar otras ventanas diff. (Nota:. Fugitivo automático borrará sus memorias intermedias ocultos)
Mi función se activará tanto desde diff ventana de la ventana y el archivo. Pero probablemente no va a manejarse con múltiples diferenciaciones abiertas. Para que usted necesita para su uso fugitive#buffer(n).path()
para escanear y combinar.
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
Agregar una asociación de teclas:
nnoremap <silent> <leader>gD :Gdiffoff<CR>
Sin embargo, otra manera. Lo que tengo en fugitive.vim - primer salvado algo de información (s): gitbufname cuando se inicia 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
y más tarde al salir de la ventana de cambio de búfer en el búfer de salvado y restaurar:
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
...
Comprobar la conmutación entre vimdiff
diffthis
y diffoff
aquí
en esta página .
El código:
nnoremap <silent> <Leader>df :call DiffToggle()<CR>
function! DiffToggle()
if &diff
diffoff
else
diffthis
endif
:endfunction
Método 1:
- abrir una comparación por:
:windo diffthis
- cerrar por:
:windo diffoff
Método 2:
Yo recomiendo simplemente usando el comando más simple: :q<CR>
cuando se desea hacerlo rápidamente, añadir el mapeo:
" Set mapleader
let mapleader = ","
let g:mapleader = ","
y
" Quickly close the current window
nnoremap <leader>q :q<CR>
Funciona bien para mí. Salir vimdiff con sólo ,q
, porque normalmente el cursor en el archivo de edad.
Fue con el siguiente código https://stackoverflow.com/a/15113951/10999673 :
if !exists(":Gdiffoff")
command Gdiffoff bw! fugitive://*
endif
pero me dio un error "E93: más de un partido de ..." en un diff de 3 vías, así que en vez utilicé la respuesta de https://stackoverflow.com/a/4867969/10999673 y finalmente tener este aspecto:
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://')
Yo sólo pellizcado, copiar y pegar el código en mi .vimrc
Running :Gwrite
después de la fusión a su satisfacción cerrará los otros dos paneles diferentes además de la actualización de la memoria caché de git para marcar el archivo como fusionado.