[英]Vim tab drop file under cursor
我正在处理一个 c++ 项目并使用 vim 作为编辑器。
从http://vim.wikia.com/wiki/Open_file_under_cursor我知道我可以使用<cw>gf
(Ctrl-w gf) 在光标下打开或在新选项卡中选择,这非常好,除了 1 件事,多个可以打开相同文件的选项卡,而如果已经打开,我更喜欢跳转到它。
:tab drop
可以完成这项工作( http://vim.wikia.com/wiki/Edit_a_file_or_jump_to_it_if_already_open )
但是如何将<cw>gf
与:tab drop
结合起来?
Vim 在光标下打开文件提供了一些线索,但它仅适用于光标下,而不适用于选择(可视模式)。
我知道这是一个非常具体的问题,希望有人能提供帮助!
谢谢!
正如您从我的其他答案中发现的那样,模拟<Cw>gf
命令很困难,并且有很多极端情况。
另一种获得你想要的方法仍然依赖于原始的<Cw>gf
命令(无条件地)打开一个新选项卡,然后检查相同的缓冲区是否已经在另一个选项卡中打开,如果是,则关闭当前(新的)标签页,而是转到另一个。 这会导致一点点闪烁,但应该更加健壮。
nnoremap <C-w>gf <C-w>gf:call FavorExistingTabPage()<CR>
function! FavorExistingTabPage()
let l:bufNr = bufnr('')
for l:i in range(1, tabpagenr('$'))
if l:i == tabpagenr()
continue " Skip current.
endif
let l:winIndex = index(tabpagebuflist(l:i), l:bufNr)
if l:winIndex != -1
" We found the buffer elsewhere.
if l:i >= tabpagenr()
let l:i -= 1 " Adapt to removal of tab page before the current.
endif
close!
execute l:i . 'tabnext'
execute (l:winIndex + 1) . 'wincmd w'
break
endif
endfor
endfunction
注意:这里使用的是它可以找到的第一个标签页中的第一个窗口; 您可以调整算法以更喜欢“最近”的缓冲区而不是当前的缓冲区。
您要求:help 'switchbuf'
功能,即usetab
值:
useopen If included, jump to the first open window that contains the specified buffer (if there is one). [...] usetab Like "useopen", but also consider windows in other tab pages.
不幸的是,该选项不适用于<CW>gf
命令。 但是,您可以重新映射它以使用:tab drop
:
:nnoremap <silent> <C-w>gf :execute 'tab drop' fnameescape(expand('<cfile>'))<CR>
要处理不同的工作目录,必须添加当前文件的目录:
:nnoremap <silent> <C-w>gf :execute 'tab drop' fnameescape(expand('%:h') . '/' . expand('<cfile>'))<CR>
但是,绝对目录将不再起作用。 为了处理这些,我们可以先切换到当前目录:
:nnoremap <silent> <C-w>gf :execute 'cd' fnameescape(expand('%:h')) <Bar> execute 'tab drop' fnameescape(expand('<cfile>'))<CR>
即使这样,我给出的仿真也不是 100% 相同的。 gf
使用'path'
选项来查找文件, <cfile>
不使用。 您必须使用findfile()
自己实现该查找。 一个更简单的替代方法是:help c_CTRL-R_CTRL-P
,但它需要路径扩展,并且对于常规文件失败,而gf
可以处理两者。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.