Is there a plugin or script to open ctags entries in a new tab? I'd like to put my cursor over a function, press ctrl+] and have the entry open in another tab. I'd also like if I visually select an entry, for ctrl+] to still work and open in a new vim tab.
问题:
回答1:
You can
C-wC-]C-wT
To achieve that effect
Then you can also map that:
:nnoremap <silent><Leader><C-]> <C-w><C-]><C-w>T
Edit: also, depending on what you actually want, don't forget you can open tags in preview (:ptag
) with e.g. C-w}. Just mentioning it in case...
回答2:
Here are two pretty ad-hoc mappings (in case your tags are generated by ctags
):
nnoremap <C-]> :tabnew %<CR>g<C-]>
vnoremap <C-]> <Esc>:tabnew %<CR>gvg<C-]>
First we open current buffer in a new tab; then we try to jump to a tag under cursor (g<C-]>
, which is equal to :tjump
, jumps to the tag directly if there's only one match, or provides a list of matches if there are many).
Pros:
- "works on my machine" ©
Cons:
- if you exit from list of matches without choosing any of them, the newly created tab will remain open
- the same happens if there are no matches at all
P.S. Could you provide a use case for visual mode mapping?
P.P.S. If you generate tags with cscope (which is better than ctags
) and use its vim mappings, replace the above mappings with the following ones:
nnoremap <C-]> :tabnew %<CR><C-]>
vnoremap <C-]> <Esc>tabnew %<CR>gv<C-]>
回答3:
In case somebody is still looking for a solution. On this solution when no tag is found no more blank tab will be left.
function! w:GoToTag(tagWord)
let l:tagfile = &tags
:tabe
execute 'set tags=' . l:tagfile
execute ':silent tjump ' . a:tagWord
let l:tagFilename = expand('%:t')
if l:tagFilename == ''
:tabclose
:tabprevious
endif
endfunction