由于这个问题,我大多数时候都避免使用制表符,但是现在我有了一个具有我想要的制表符重复行为的函数。我已经测试过了,但是还没有认真使用它。此工作流程可能存在一些隐藏的缺点。
该函数的一个问题是它不会复制上一个缓冲区-窗口对中的某些状态(例如是否set number
打开)。推测一点,c-w T
可能不会出现此问题,因为不执行任何重复操作,并且窗口可能只是重新父了。
Vim有两个基于1的列表,用于缓冲区,选项卡和窗口等内容。据我所知,它们是基于1的,因为该0
键用于移动到行的开头,因此不可能将零作为数字参数传递。
我们关心用于仿真此功能的三个列表:
- 标签页的全局列表
- 每个[标签页]的窗口列表
- 缓冲区的全局列表
我们保存所有这些值,然后通过“ tabnew”创建一个新标签。新选项卡总是在右侧创建,因此我们要使用的选项卡下面的索引tabnew
均不会无效。(但是,更健壮的方法可能会更好)。
该tabnew
命令还将焦点移至新选项卡以及其中的单个窗口。从那里我们可以使用buffer
命令在最初具有焦点的缓冲区上创建视图。
然后,我们使用原始选项卡的已保存索引将焦点恢复到该选项卡。然后,在很大程度上避免了偏执狂,我们将该选项卡内的焦点设置为原始窗口。Vim似乎记得哪个窗口集中在不可见的选项卡上,但是我不喜欢依赖于此。
(一些风格方面:明确的数字转换0+
,全局变量和断言都是有意的)
function! TabDuplicate()
" set vars, sanity checking
let g:tabdup_win = 0+ winnr()
let g:tabdup_buf = 0+ bufnr('%')
let g:tabdup_tabpage = 0+ tabpagenr()
call assert_true(g:tabdup_win > 0)
call assert_true(g:tabdup_buf > 0)
call assert_true(g:tabdup_tabpage > 0)
" make a new tab page,
" the new tab page will have focus
" none of the indices, which are all
" less than the current index, are
" invalidated by creating a new tab
execute "tabnew"
" visit the buffer we saved
execute "buffer " . g:tabdup_buf
" return to the original tab page
execute "tabnext " . g:tabdup_tabpage
" return focus to original window
execute g:tabdup_win . " windcmd w"
endfunction