我正在使用vim fugitive extension。它有一个:Gdiff命令,它带你进入vimdiff模式,但关闭/退出vimdiff模式的正确/快速方法是什么?
即,我要说我正在编辑Git存储库下的文件FooBar.txt。我启动:Gdiff,检查我在vimdiff中的更改,然后我想回来继续编辑FooBar.txt或任何其他文件:)
UPDATE1:我将在下一个工作日尝试使用这些快速组合:)
"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://stackoverflow.com/a/15975201/275980
答案 0 :(得分:43)
您可以执行 windo set nodiff noscrollbind
,然后关闭第二个窗口。
更新:有一个diffoff
命令。使用windo diffoff
,而不是我在上一行中写的内容。
答案 1 :(得分:37)
根据:https://github.com/tpope/vim-fugitive/issues/36
关闭另一个窗口。如果你没有将焦点转移到它,最简单的方法是
<C-W><C-O>
,这意味着“将此窗口设为唯一窗口。”
答案 2 :(得分:12)
我对diffoff
没有运气,但我刚刚了解到:Gedit
没有参数会带你回到文件的工作目录版本,而不是你正在审查的早期版本
由于q
(不需要:q
)会关闭差异侧边栏,您可以执行q
后跟:Gedit
以删除侧边栏然后转到回到当前版本的文件。
答案 3 :(得分:4)
这对我来说很好,结合了现有的一些想法:
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 :(得分:4)
我找到了一个简单的解决方案。您可以在此处查看: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
答案 5 :(得分:3)
以上解决方案均不适合我。结束了这样做:
nnoremap <Leader>D :Gedit<CR><C-w>h :q<CR><C-w>k
答案 6 :(得分:2)
<C-W><C-O>
的替代方案,如果你有多个窗口,将移动到另一个差异窗口并执行<C-W>c
,它只关闭一个窗口。
如果你关闭错误的差异窗口,请执行:Gedit
请注意,不要将<C-W>c
与<C-W><C-C>
答案 7 :(得分:1)
这是使用后我必须离开vimdiff窗口:Gdiff
nnoremap gD :q!<CR> :Gedit!<CR>
答案 8 :(得分:0)
在此处查看vimdiff
和diffthis
之间的diffoff
切换
at this page
代码:
nnoremap <silent> <Leader>df :call DiffToggle()<CR>
function! DiffToggle()
if &diff
diffoff
else
diffthis
endif
:endfunction
答案 9 :(得分:0)
noremap <leader>do :diffoff \| windo if &diff \| hide \| endif<cr>
相当差异模式并关闭其他差异窗口。 (注意:逃犯会自动删除其隐藏的缓冲区。)
答案 10 :(得分:0)
我的功能将同时来自diff窗口和文件窗口。但是可能不会打开多个差异来处理自己。为此,您需要使用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>
答案 11 :(得分:0)
又一种方式。我在fugitive.vim中有什么 - 首先在diff启动时保存一些信息(s:gitbufname):
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
...
答案 12 :(得分:0)
:windo diffthis
:windo diffoff
我建议只使用最简单的命令::q<CR>
如果您想快速完成,请添加映射:
" Set mapleader
let mapleader = ","
let g:mapleader = ","
和
" Quickly close the current window
nnoremap <leader>q :q<CR>
对我来说效果很好。只需,q
退出vimdiff,因为通常光标位于旧文件中。
答案 13 :(得分:0)
使用下面基于https://stackoverflow.com/a/15113951/10999673的代码:
if !exists(":Gdiffoff")
command Gdiffoff bw! fugitive://*
endif
但是它在3种差异中给了我一个错误“ E93:多个匹配项...”,所以我改而使用了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
答案 14 :(得分:0)
在合并后运行<?php
exec('task1.sh', $output, $retval);
if ($retval !== 0) {
// task 1 failed
exit('Error running task1: ' . implode("<br/>\n", $output));
}
exec('task2.sh', $output, $retval);
if ($retval !== 0) {
// task 2 failed
exit('Error running task1: ' . implode("<br/>\n", $output));
}
exec('task3.sh', $output, $retval);
if ($retval !== 0) {
// task 3 failed
exit('Error running task1: ' . implode("<br/>\n", $output));
}
会使您满意,除了更新git缓存以将文件标记为已合并之外,还将关闭其他两个差异窗格。