كيف يمكنك الخروج من وضع Vimdiff في VIM ، على وجه التحديد ، للهارب؟

StackOverflow https://stackoverflow.com/questions/2703644

  •  01-10-2019
  •  | 
  •  

سؤال

أنا أستخدم VIM مع امتداد هارب. يحتوي على أمر: GDIFF الذي يقودك إلى وضع VIMDIFF ، ولكن ما هي الطريقة الصحيحة/السريعة لإغلاق/الإقلاع عن وضع VIMDIFF؟

أي ، دعنا نقول أنني أقوم بتحرير الملف foobar.txt ضمن مستودع GIT. أنا أطلق النار: 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: تعييناتي الحالية (تغلق نافذة Diff فقط!)

"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

هل كانت مفيدة؟

المحلول

يمكنك التنفيذ windo set nodiff noscrollbind ثم أغلق النافذة الثانية.

تحديث: هناك أ diffoff يأمر. يستخدم windo diffoff, ليس ما كتبته في السطر السابق.

نصائح أخرى

وفق: https://github.com/tpope/vim-fugitive/issues/36

أغلق النافذة الأخرى. أسهل طريقة للقيام بذلك إذا لم تكن قد تحولت إلى التركيز عليه هي <C-W><C-O>, ، مما يعني "اجعل هذه النافذة النافذة الوحيدة."

لم يكن لدي حظ مع diffoff, ، لكنني تعلمت ذلك للتو :Gedit مع عدم وجود حجة ، ستعيدك إلى إصدار الدليل العاملة للملف ، بدلاً من بعض الإصدار السابق الذي كنت تراجعه.

و كما q (لا حاجة الى :q) سوف يغلق الشريط الجانبي فرق ، يمكنك القيام به q تليها :Gedit للتخلص من الشريط الجانبي ثم العودة إلى الإصدار الحالي من الملف.

هذا يعمل بشكل جيد بالنسبة لي ، ويجمع بين بعض الأفكار الحالية هنا:

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>

لقد وجدت حلاً بسيطًا لهذا الغرض. يمكنك التحقق من ذلك هنا: 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

لم يعمل أي من الحلول المذكورة أعلاه بالنسبة لي. انتهى الأمر بفعل هذا بدلاً من ذلك:

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

بديل ل <C-W><C-O>, ، إذا كان لديك نوافذ متعددة ، فستنتقل إلى نافذة الفرق الأخرى وفعلها <C-W>c, والتي تغلق نافذة واحدة فقط.

إذا أغلقت نافذة الفرق الخاطئة افعل أ :Gedit

كن حذرا ولا تخلط <C-W>c مع <C-W><C-C>

هذا ما يجب أن أتركه نوافذ vimdiff بعد استخدام: gdiff

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

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

وضع مختلف تمامًا وأغلق نوافذ فرق أخرى. (ملاحظة: الهارب سوف يحذف تلقائيا المخازن المؤقتة المخفية.)

ستعمل وظيفتي من نافذة 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>

بطريقة أخرى. ما لدي في الهارب.

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
...

افحص ال vimdiff التبديل بين diffthis و diffoff هنافي هذه الصفحة.

الرمز:

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

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

طريقة 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>

إنه يعمل بشكل جيد بالنسبة لي. الخروج من Vimdiff فقط ,q, ، لأنه عادة المؤشر في الملف القديم.

كان يستخدم الرمز أدناه بناءً على https://stackoverflow.com/a/15113951/10999673 :

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

لكنه أعطاني خطأ "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

ادارة :Gwrite بعد الاندماج بما يرضيك ، سيغلق أجزاء الاختلاف الأخرى بالإضافة إلى تحديث ذاكرة التخزين المؤقت GIT لتمييز الملف كما تم دمجه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top