vim: Open tag in new tab
Solution 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...
Solution 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:
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-]>
Solution 3
You can set up a keyboard shortcut, 'g' followed by CONTROL-], in ~/.vimrc as follows:
nmap g<C-]> :execute 'tab tag '.expand('<cword>')<CR>
nmap means 'when in normal mode'
g<C-j> is the shortcut, 'g' followed by CTRL-]
execute is a means of executing a command passed as a string
tab tag means "open a new tab and run 'ta'"
expand is used to expansion of a vim item
<cword> means a word the same as used for '*'. See also <cWORD>
You can test "tab ta" via :tab tag functionname
Solution 4
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
Paul Tarjan
I'm a Distinguished Engineer at Robinhood. I used to be the Tech Lead of Developer Productivity at Stripe where I built Sorbet. Before that I was the CTO and cofounder at Trimian. Before that I was a Software Engineer at Facebook on HHVM and the Open Graph. Before that I was the Tech Lead for Yahoo! SearchMonkey. See my homepage for more.
Updated on July 08, 2022Comments
-
Paul Tarjan almost 2 years
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.
-
Paul Tarjan almost 13 yearssadly, if the tag operation halts for any reason, this doesn't work. For example, if there are multiple tags and I have to pick between them. Any solution?
-
sehe almost 13 years@uɐɾɹɐʇ ןnɐd: that will depend on your definition of
<C-w><C-]>
- with me it appears to always jump to the tag with highest prio without asking (as documented). Perhaps you have interfering mappings, see:verbose map <C-w>
,:verbose imap <C-w>
etc -
Paul Tarjan almost 13 yearsIt breaks when the tag jump fails for some reason or another. Maybe there are multiple files I have to choose from, or the file is open in another buffer. Any ideas how to deal with that?
-
sehe almost 13 years@uɐɾɹɐʇ ןnɐd: what I said in my previous comment... docs; Did you try mapping ex commands, instead of
normal mode
commands? You could use:stag!
instead, or even:silent! stag!
. Tip: Sneak in ex commands in ainsert mode
mapping using<C-o>
-
Paul Tarjan over 12 yearsFor visual mode mapping, our codebase has some classes in them named
foo:bar:baz
but my ctags breaks on:
since I don't want to selectfoo::bar
as one entity. So I usually go into visual mode overfoo:bar:baz
to jump to it. -
dorserg over 12 yearsI see. So have these mappings helped? The commands used in them are pretty general, so hopefully they work everywhere without conflicts.
-
Dinesh almost 9 years:nnoremap <silent><Leader><C-]> <C-w><C-]><C-w>T is not working for me so tried :nnoremap <C-]> <C-w><C-]><C-w>T its working but the arrow keys misbehaves can you help me on this
-
Dylanthepiguy almost 6 years@PaulTarjan What about having the mapping press <C-w>g<C-]><C-w>T instead? That solves the problem if there are multiple tags, but not if there is no tag
-
Jake Byman about 5 yearsThis is awesome. One issue I found was that you jump to a new tab no matter what, even if the definition is in the current tab. Is there a way around that?
-
sehe about 5 years@JakeByman not readily. Perhaps
:tj
with:se switchbuf=useopen,usetab
could be a start (but I haven't tried. I use YouCompleteMe for 90% navigation of navigation tasks, and when jumping inside a file will just useC-]
) -
Jake Byman about 5 yearsBoom! The
set switchbuf=useopen/usetab
did the trick! You're my favorite, this is gamechanging -
g.o.a.t. almost 5 yearsI tried everything...only solution that worked with NERDTreeTabsToggle. Thank you!!!!!
-
Weekend over 4 yearsIt's a combination of two sequences,
:help CTRL-W_]
and:help CTRL-W_T
. -
maikel over 4 yearsAnd if you use
~/.vim
instead of~/.vimrc
then put the line in a file called~/.vim/plugin/ctags.vim
or similar. -
hasufell over 3 yearsThis mapping freezes my vim.