"============================================================================= " File: quit_another_window.vim " Author: Dmitry Frank (dimon.frank@gmail.com) " Version: 1.04 "============================================================================= " See documentation in accompanying help file " You may use this code in whatever way you see fit. function! s:getchar() let c = getchar() if c =~ '^\d\+$' let c = nr2char(c) endif return c endfunction function! s:inputtarget() let a = s:getchar() let c = '' while a != ' ' if a =~ '^[hjkl]$' let c = c . a endif let a = s:getchar() endwhile return c endfunction function! QuitWindow(boolBang) if (!a:boolBang) :q else :q! endif endfunction "" function to close other window " @param sWincmd - window movement command(s). " for example, "h" used to close left window, " "j" used to close lower window, " etc. " " You can combine them: " "jl" used to go to lower window, " then go to right window, " then close it. " etc. function! QuitAnotherWindow(sWincmd, boolBang) if empty(a:sWincmd) call QuitWindow(a:boolBang) return endif " remember current winnr, e.g. winnr of starting window " (we need to go to the same winnr after close other window) let l:iCurWinnr = winnr() let l:iIndex = 0 while (l:iIndex < strlen(a:sWincmd)) " move to window that should be closed and get its winnr exec 'wincmd '.a:sWincmd[l:iIndex] let l:iClosedWinnr = winnr() let l:iIndex += 1 endwhile " if its winnr is the same as starting winnr, then do nothing. " (you should use just :q instead) if (l:iCurWinnr == l:iClosedWinnr) return endif " calculate target winnr if (l:iCurWinnr > l:iClosedWinnr) let l:iCurWinnr -= 1 endif " close needed window call QuitWindow(a:boolBang) " go to starting window while (winnr() != l:iCurWinnr) :wincmd w endwhile endfunction " define plugin's commands command! -nargs=? -bang -complete=file Qh call QuitAnotherWindow('h', 0) command! -nargs=? -bang -complete=file Qj call QuitAnotherWindow('j', 0) command! -nargs=? -bang -complete=file Qk call QuitAnotherWindow('k', 0) command! -nargs=? -bang -complete=file Ql call QuitAnotherWindow('l', 0) command! -nargs=? -bang -complete=file Q call QuitAnotherWindow("", 0) nnoremap QAnotherWin :call QuitAnotherWindow(inputtarget(), 0) if !hasmapto("QAnotherWin","n") nmap QAnotherWin endif " define lowercased aliases if possible if exists("loaded_cmdalias") && exists("*CmdAlias") call CmdAlias('qh', 'Qh') call CmdAlias('qj', 'Qj') call CmdAlias('qk', 'Qk') call CmdAlias('ql', 'Ql') call CmdAlias('q', 'Q') endif