vim: Open tag in new tab

25,160

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
Share:
25,160
Paul Tarjan
Author by

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, 2022

Comments

  • Paul Tarjan
    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
    Paul Tarjan almost 13 years
    sadly, 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
    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
    Paul Tarjan almost 13 years
    It 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
    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 a insert mode mapping using <C-o>
  • Paul Tarjan
    Paul Tarjan over 12 years
    For 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 select foo::bar as one entity. So I usually go into visual mode over foo:bar:baz to jump to it.
  • dorserg
    dorserg over 12 years
    I see. So have these mappings helped? The commands used in them are pretty general, so hopefully they work everywhere without conflicts.
  • Dinesh
    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
    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
    Jake Byman about 5 years
    This 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
    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 use C-])
  • Jake Byman
    Jake Byman about 5 years
    Boom! The set switchbuf=useopen/usetab did the trick! You're my favorite, this is gamechanging
  • g.o.a.t.
    g.o.a.t. almost 5 years
    I tried everything...only solution that worked with NERDTreeTabsToggle. Thank you!!!!!
  • Weekend
    Weekend over 4 years
    It's a combination of two sequences, :help CTRL-W_] and :help CTRL-W_T.
  • maikel
    maikel over 4 years
    And if you use ~/.vim instead of ~/.vimrc then put the line in a file called ~/.vim/plugin/ctags.vim or similar.
  • hasufell
    hasufell over 3 years
    This mapping freezes my vim.