1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-02-04 02:40:04 +08:00
SpaceVim/bundle/vim-choosewin/autoload/choosewin/action.vim
2020-06-13 14:06:35 +08:00

131 lines
2.7 KiB
VimL
Vendored

let s:_ = choosewin#util#get()
" Misc:
function! s:win_swap(tab, win) "{{{1
let [ tab_dst, win_dst ] = [ a:tab, a:win]
let [ tab_src, win_src ] = [ tabpagenr(), winnr() ]
let buf_src = bufnr('')
" go
call s:goto_tabwin(tab_dst, win_dst)
let buf_dst = bufnr('')
call s:goto_tabwin(tab_src, win_src)
silent execute 'hide buffer' buf_dst
call s:goto_tabwin(tab_dst, win_dst)
silent execute 'hide buffer' buf_src
endfunction
function! s:goto_tabwin(tab, win) "{{{1
call s:goto_tab(a:tab)
call s:goto_win(a:win)
endfunction
function! s:goto_tab(num) "{{{1
if a:num is tabpagenr()
return
endif
silent execute 'tabnext' a:num
endfunction
function! s:goto_win(num, ...) "{{{1
if choosewin#noop()
return
endif
silent execute a:num 'wincmd w'
endfunction
"}}}
" Action:
let s:ac = {}
function! s:ac.init(app) "{{{1
let self.app = a:app
return self
endfunction
function! s:ac.do_win(num) "{{{1
call s:goto_win(a:num)
throw 'CHOSE ' . a:num
endfunction
function! s:ac.do_win_land() "{{{1
cal self.do_win(winnr())
endfunction
function! s:ac.do_tab(num) "{{{1
call s:goto_tab(a:num)
call self.app.wins.set(range(1, winnr('$')))
endfunction
function! s:ac.do_tab_first() "{{{1
call self.do_tab(1)
endfunction
function! s:ac.do_tab_prev() "{{{1
call self.do_tab(max([1, tabpagenr() - 1]))
endfunction
function! s:ac.do_tab_next() "{{{1
call self.do_tab(min([tabpagenr('$'), tabpagenr() + 1]))
endfunction
function! s:ac.do_tab_last() "{{{1
call self.do_tab(tabpagenr('$'))
endfunction
function! s:ac.do_tab_close() "{{{1
silent! tabclose
call self.do_tab(tabpagenr())
endfunction
function! s:ac.do_previous() "{{{1
if !has_key(self.app, 'previous')
throw 'NO_PREVIOUS_WINDOW'
endif
let [ tab_dst, win_dst ] = self.app.previous
call s:goto_tabwin(tab_dst, win_dst)
throw 'CHOSE ' . win_dst
endfunction
function! s:ac._swap(tab, win) "{{{1
call s:win_swap(a:tab, a:win)
throw 'SWAP'
endfunction
function! s:ac.do_swap() "{{{1
if self.app.conf['swap']
" if user invoke do_swap() twice then swap with previous window
if empty(self.app.previous)
throw 'NO_PREVIOUS_WINDOW'
endif
let [ tab_dst, win_dst ] = self.app.previous
call self._swap(tab_dst, win_dst)
else
let self.app.conf['swap'] = 1
endif
endfunction
function! s:ac.do_swap_stay() "{{{1
let self.app.conf['swap_stay'] = 1
call self.do_swap()
endfunction
function! s:ac.do_cancel() "{{{1
call s:goto_tab(self.app.src.tab)
throw 'CANCELED'
endfunction
function! s:ac._goto_tabwin(tab, win) "{{{1
call s:goto_tabwin(a:tab, a:win)
endfunction
"}}}
" API:
function! choosewin#action#init(...) "{{{1
return call(s:ac.init, a:000, s:ac)
endfunction
"}}}
" vim: foldmethod=marker