65

我正在使用带有逃犯扩展名的 vim 。它有一个 :Gdiff 命令可以让您进入 vimdiff 模式,但是关闭/退出 vimdiff 模式的正确/快速方法是什么?

即,假设我正在编辑 Git 存储库下的文件 FooBar.txt。我启动 :Gdiff,查看我在 vimdiff 中的更改,然后我想返回并继续编辑 FooBar.txt 或任何其他文件 :)

更新1:我将在下一个工作日尝试这些快速组合:)

"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

另外,请帮助我确定以下是否应该是一个答案:https ://stackoverflow.com/a/15975201/275980

4

15 回答 15

56

您可以执行windo set nodiff noscrollbind然后关闭第二个窗口。

更新:有一个diffoff命令。使用windo diffoff,而不是我在上一行中写的。

于 2010-04-24T08:24:16.510 回答
39

根据:https ://github.com/tpope/vim-fugitive/issues/36

关闭另一个窗口。如果您没有将焦点转移到它,最简单的方法是<C-W><C-O>,这意味着“使这个窗口成为唯一的窗口”。

于 2011-10-14T02:59:24.023 回答
13

我没有运气diffoff,但我刚刚了解到,:Gedit没有参数会将您带回文件的工作目录版本,而不是您正在查看的某些早期版本。

并且由于q(不需要:q)将关闭差异侧边栏,您可以执行以下操作以摆脱侧边栏,然后返回到文件的当前版本q:Gedit

于 2011-02-18T23:03:18.440 回答
4

以上解决方案都不适合我。最终改为这样做:

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

于 2011-03-24T09:15:41.250 回答
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>
于 2011-04-04T13:12:35.163 回答
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
于 2013-02-27T14:00:20.843 回答
4

<C-W><C-O>如果您有多个窗口,另一种方法是移动到另一个差异窗口并执行<C-W>c,它只关闭一个窗口。

如果您关闭了错误的差异窗口,请执行:Gedit

小心不要<C-W>c混淆<C-W><C-C>

于 2013-04-12T15:22:53.860 回答
1

在此页面上检查和此处 vimdiff之间的切换。diffthisdiffoff

编码:

nnoremap <silent> <Leader>df :call DiffToggle()<CR>

function! DiffToggle()
    if &diff
        diffoff
    else
        diffthis
    endif
:endfunction
于 2013-01-10T11:12:01.547 回答
1

方法一:

  • 通过以下方式打开比较:

:windo diffthis

  • 关闭它:

:windo diffoff

方法二:

我建议只使用最简单的命令::q<CR>

当您想快速完成时,请添加映射:

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

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

这对我来说很有用。退出 vimdiff 只是,q因为通常你的光标在旧文件中。

于 2016-10-19T06:50:40.453 回答
0

这就是我在使用 :Gdiff 后必须离开 vimdiff 窗口的原因

nnoremap gD :q!<CR> :Gedit!<CR>
于 2012-07-05T13:17:14.703 回答
0

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

相当差异模式并关闭其他差异窗口。(注意:逃犯会自动删除其隐藏的缓冲区。)

于 2013-06-20T02:02:03.333 回答
0

我的功能将在差异窗口和文件窗口中工作。但可能不会在打开多个差异时自行处理。为此,您需要使用它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>
于 2014-08-27T15:16:33.837 回答
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
...
于 2015-04-03T00:03:51.800 回答
0

正在使用基于https://stackoverflow.com/a/15113951/10999673的以下代码:

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

但它给了我一个错误“E93: more than one match for ...”,所以我改用了来自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

于 2019-02-01T07:27:21.683 回答
0

合并到您满意后运行:Gwrite将关闭其他两个差异窗格,此外还会更新 git 缓存以将文件标记为已合并。

于 2019-04-03T08:07:42.540 回答