如何在vim中退出vimdiff模式,特别是针对Fugitive?

69

我正在使用vim和fugitive扩展。它有一个: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>

更新2: 我当前的映射(仅关闭差异窗口!)

"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

另外,请帮我决定以下内容是否应该作为答案:https://dev59.com/tnE85IYBdhLWcg3wl0nF#15975201


1
gD对我来说不需要:diffoff!<cr> - blueyed
2
仅关注diff窗口和使用:q关闭它似乎就可以解决问题了。不过,如果有一种简单的方法可以在任何一个窗口中完成这个操作就更好了。 - Aaron Gibralter
看起来大多数,如果不是全部的答案都是针对Fugitive插件的,只有部分适用于更简单的Vim配置。 - MarkHu
15个回答

0

这是我在使用 :Gdiff 命令后离开 vimdiff 窗口的方式。

nnoremap gD :q!<CR> :Gedit!<CR>

我相信这将关闭实际文件并使您最终编辑临时差异文件,在那里您最终会失去所有更改。如果您从未将光标移到差异上,那么就是这样。 - Bjorn

0
在满意合并后运行:Gwrite将关闭其他两个差异窗格,并更新git缓存以标记文件已合并。

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>

0

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

关闭 diff 模式并关闭其他 diff 窗口。(注意:fugitive 将自动删除其隐藏的缓冲区。)


0

我正在使用以下基于https://dev59.com/tnE85IYBdhLWcg3wl0nF#15113951的代码:

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

但在三向差异中,它给了我一个错误“E93:有多个匹配项...”,所以我改用https://dev59.com/4XA75IYBdhLWcg3wsrSD#4867969的答案,最终得到了这个:

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 文件中


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接