mirror of
https://github.com/SpaceVim/SpaceVim.git
synced 2025-02-03 12:10:05 +08:00
131 lines
2.7 KiB
VimL
131 lines
2.7 KiB
VimL
|
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
|