web-dev-qa-db-ja.com

Fugitiveの場合、vimでvimdiffモードを終了するにはどうすればよいですか?

逃亡的拡張 でvimを使用しています。 :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/27598

58
wik

windo set nodiff noscrollbindを実行してから、2番目のウィンドウを閉じることができます。

更新:diffoffコマンドがあります。前の行で書いたものではなく、windo diffoffを使用してください。

45
ZyX

によると: https://github.com/tpope/vim-fugitive/issues/36

別のウィンドウを閉じます。フォーカスを移動していない場合、これを行う最も簡単な方法は<C-W><C-O>は、「このウィンドウを唯一のウィンドウにする」ことを意味します。

37
jtriley

diffoffには運がありませんでしたが、:Geditを引数なしで指定すると、以前のバージョンのレビューとは対照的に、ファイルの作業ディレクトリバージョンに戻ります。

そしてqとして(:q)diffサイドバーを閉じます。qの後に:Geditサイドバーを削除して、ファイルの現在のバージョンに戻ります。

12
Henrik N

これは、既存のアイデアのいくつかをここに組み合わせてうまく機能します。

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
blueyed

これに対する簡単な解決策を見つけました。こちらで確認できます: https://Gist.github.com/radmen/504808

" Simple way to turn off Gdiff splitscreen
" works only when diff buffer is focused
if !exists(":Gdiffoff")
  command Gdiffoff diffoff | q | Gedit
endif
4
radmen

上記の解決策のどれも私にとってはうまくいきませんでした。代わりにこれを行うことになりました:

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

3
Jens Norrgrann

複数のウィンドウがある場合、<C-W><C-O>の代わりに別のdiffウィンドウに移動し、1つのウィンドウのみを閉じる<C-W>cを実行します。

間違った差分ウィンドウを閉じた場合は、:Geditを実行してください

<C-W>c<C-W><C-C>を混同しないように注意してください

2
José Luis

これは、:Gdiffを使用した後にvimdiffウィンドウを終了する必要があるものです

nnoremap Gd :q!<CR> :Gedit!<CR>
1
Adolfo Abegg

必要に応じて:Gwriteを実行すると、gitキャッシュを更新してファイルをマージ済みとしてマークすることに加えて、他の2つの異なるペインを閉じます。

0
Caleb

さらに別の方法。 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
...
0
cc9cii

https://stackoverflow.com/a/15113951/1099967 に基づいて以下のコードを使用していました:

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

しかし、3方向の差分で「E93:...に複数の一致」というエラーが出たので、代わりに https://stackoverflow.com/a/4867969/1099967 からの回答を使用しました=そして最後にこれを持っています:

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に貼り付けました。

0
wisefool

私の機能は、差分ウィンドウとファイルウィンドウの両方で機能します。ただし、複数の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
Rafi B.

vimdiffdiffthisdiffoffの間で切り替えられていることを確認してください このページで

コード:

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

function! DiffToggle()
    if &diff
        diffoff
    else
        diffthis
    endif
:endfunction
0
aemonge

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

かなり差分モードで、他の差分ウィンドウを閉じます。 (注:逃亡者は、隠されたバッファを自動的に削除します。)

0
Bohr

方法1:

  • 比較を開く:

:windo diffthis

  • 閉じます:

:windo diffoff

方法2:

最も単純なコマンド:q<CR>を使用することをお勧めします

すぐに実行したい場合は、マッピングを追加します。

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

そして

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

それは私のためにうまく機能します。通常はカーソルが古いファイルにあるため、,qだけでvimdiffを終了します。

0
jack guan