71

Suppose I have started vim like this:

vim foo bar

Now I decide that I want each of those files in its own tab. Is there a way to do that without exiting vim and adding the -p option to my command line?

2
  • Many of you are probably looking for tabe % which is mentioned in liuyang1's answer below. Apr 25, 2017 at 13:45
  • 2
    @MateuszPiotrowski Like I mentioned in this comment to that answer, :tabe % doesn't work with buffers that have no valid filepath. :tab sb works everytime.
    – JoL
    May 28, 2019 at 15:57

7 Answers 7

66

You wish to open a buffer in a new tab ?

Split up the screen (Ctrl-W s), take up a window, and Ctrl-W T

5
  • Hmm. Not quite what I had in mind, but not bad for a start. I didn't know about Ctrl-w T yet. Of course, the first tab will still have two buffers that way.
    – innaM
    Nov 5, 2009 at 15:34
  • No. After you split the screen into two windows, and open one of them in a new tab, it goes away from the first tab. It won't remain (at least it doesn't on my gvim72). As far as buffers go, they are not connected to windows/tabs ... they are more like memory where vim stores file contents.
    – Rook
    Nov 5, 2009 at 15:37
  • Ah! You're right. I was misinterpreting the output of :ls.
    – innaM
    Nov 5, 2009 at 15:46
  • Also, ctrl-w V splits the window vertically. Nov 5, 2009 at 20:33
  • 1
    CTRL-w v is the correct command for splitting windows vertically
    – JRM
    Nov 10, 2012 at 1:59
44

You can accomplish this by combining the tab command with the sb[uffer] command.

First you'll need to know the buffer id of the buffer you wish to open in a new tab. You can find this out with the ls command:

:ls
  1 %a   "foo"                          line 1
  2      "bar"                          line 0

Once you have the id, you can easily open it in a new tab using:

:tab sb 2

The sb command normally opens the given buffer in a new split window, but the tab command causes it to open in a new tab, instead.

The tab command also allows you to specify where in the tab list the new tab should be created. For example, :0tab sb 2 would result in the new ‘bar’ tab appearing at the beginning of the list instead of after the current tab.

3
  • 4
    You don’t need the buffer number, give it an unambiguous part of the buffer name and VIM does the rest for you.
    – dessert
    Aug 15, 2018 at 8:44
  • 1
    This was so the answer I was looking for and needed. I was dismayed when :tab buffer part-of-name did not open a new tab! But :tab sb part-of-name worked like a charm. Thank you!!!!
    – Sukima
    Jul 29, 2019 at 2:44
  • This is not OP's exact question, but was exactly what I was looking for :) Nov 2, 2019 at 0:10
36

When you start vim like that, you don't get a vim client, the text editor is using the terminal or cmd prompt - the two files are in two different buffers. Use :ls to list the buffers:

:ls
  1 %a   "foo"                 line 6
  2      "bar"             line 0

The %a is the active buffer. You can use :b2 to switch to buffer 2 or use :bn to cycle to the next or :bp for previous. I prefer (CTRL-W v) to split windows vertically, rather than (CTRL-W s), which splits horizontally.

If you have 2 files loaded & no tabs (yet), you can, :tabnew and in the new tab type :b2

If you want to always have buffers loaded into their own tabs, check out this article.

8
  • Yes, but I want to have tabs.
    – innaM
    Nov 5, 2009 at 15:55
  • So you already have started vim in a way that you have your files in the vim client, not in a cmd / terminal shell? Nov 5, 2009 at 15:57
  • 1
    I'm not sure what you mean. I use the shell to start vim like described above and then I have a running vim.
    – innaM
    Nov 5, 2009 at 16:13
  • Ah! I guess I never really understood that buffers aren't local to tabs. I always thought (without thinking really much) that each tab has its own buffer list.
    – innaM
    Nov 5, 2009 at 16:42
  • On my machine, vim will launch an editor within the shell. To get the vim graphical user interface I have to use gvim. And you are correct - buffers are global to the vim application. Nov 5, 2009 at 17:08
32

A better way to accomplish what OP asked for is this:

:bufdo tab split

This will open each buffer into a tab of its own, no matter how many there are. If you use this much, it's easy to make into a mapping in your .vimrc. Combined with something like this little vim plugin the following will open every item from :grep (or :Ack) in a tab of its own:

:grep foo
:QuickFixOpenAll
:bufdo tab split

Of course, when resorting to a plugin it would be easy enough to modify it to open the quickfix list contents in directly into tabs.

UPDATE: I've really got to give a shout-out to ggustafsson's comment below. It's far and away the best answer of the lot and beautifully illustrates Vim's tendency towards compositional behavior. The suggestion is:

 :tab sball

It's well worth looking up the Vim help for :tab and :sball to see what's going on here.

3
  • An similar approach from a previous edit, for posterity, is :bufdo execute "tabnew %". I think the new approach is a bit clearer. May 30, 2012 at 1:37
  • One caveat: if the starting buffer in vim isn't empty, this seems to open the last buffer twice. I'll post an update if I find a simple fix. May 30, 2012 at 1:52
  • 17
    :tab sball seems to work better. Jan 20, 2013 at 11:07
8

1. Open two files in Vim.

$ vim foo bar

2. Check the numbers of buffers.

:ls
  1%a "foo"
  2   "bar"

3. Chain two commands: tabnew to open a new tab and b <buffer_number> to load the desired buffer in the tab.

:tabnew | b 2
3
  • 9
    The problem with step 3 is that it first creates a new tab with an empty buffer, and then opens buffer 2, resulting in an extra untitled buffer in the buffer list. Better to use :tab sb 2
    – rkjnsn
    Apr 2, 2013 at 20:26
  • 1
    @rkjnsn you should post that as an answer - it best answers the question 'how do I edit an existing buffer in a new tab in vim?'
    – JonnyRaa
    Mar 19, 2015 at 11:32
  • 1
    @JonnyLeeds done.
    – rkjnsn
    Mar 20, 2015 at 18:33
4

Just add some point which other guys didn't mention.

  • current window to new tab

If have multiple window, <C-W>T will move this window to new tab. However, this shortcut only for "Window", not "buffer". If prefer this style, :sp or <C-W>s to duplicate current buffer to one more window, then <C-W>T to move it to new tab.

4 keystrokes or 7 keystrokes.

  • current buffer to new tab

:tabe % to open new tab for current buffer.

7 keystrokes.

  • buffer to new tab

If use CtrlP plugin, also could use "CtrlPBuffer", then with <C-t> shortcut to open it with new tab page. This style, easily to switch to different buffers.

With shortcut of "CtrlPBuffer", 4 keystrokes or more.

2
  • :tabe % is what I've been looking for for a long time, thanks!
    – pevik
    Dec 5, 2017 at 16:47
  • No, :tabe % doesn't really open a new tab for current buffer. What happens is that % gets expanded to the filepath of the current buffer and :tabe opens that path. Vim will see you're trying to open a file you already have open and will reuse the buffer you have. This means that this doesn't work with buffers that have no filepath. If you open up a new file with :new and you haven't saved it, you can't put it on a new tab with this. The real command you need is what rkjnsn put in their answer: :tab sb % or shorter: :tab sb
    – JoL
    May 28, 2019 at 15:49
1

If you are using fzf.vim plugin. You could list the buffers using :Buffers, then select the specific buffer with <C-j/k> (or filter by typing buffer number or file name), then use <C-t> to open the selected buffer in new tab.

I use below mapping to quickly list the buffers:

nnoremap <leader>b :Buffers<CR>
1
  • The best way ever !
    – LRDPRDX
    Feb 13 at 9:25

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .