How do I edit an existing buffer in a new tab in vim?

51

21

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?

innaM

Posted 2009-11-05T14:33:46.360

Reputation: 9 208

Many of you are probably looking for tabe % which is mentioned in liuyang1's answer below.

– Mateusz Piotrowski – 2017-04-25T13:45:36.973

1

@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 – 2019-05-28T15:57:53.323

Answers

30

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.

DaveParillo

Posted 2009-11-05T14:33:46.360

Reputation: 13 402

Yes, but I want to have tabs. – innaM – 2009-11-05T15:55:22.843

So you already have started vim in a way that you have your files in the vim client, not in a cmd / terminal shell? – DaveParillo – 2009-11-05T15:57:36.770

1I'm not sure what you mean. I use the shell to start vim like described above and then I have a running vim. – innaM – 2009-11-05T16:13:23.570

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 – 2009-11-05T16:42:34.277

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. – DaveParillo – 2009-11-05T17:08:45.860

Same here. vim will give me the "ungraphical" vim in my terminal window. – innaM – 2009-11-05T17:19:42.970

So in that case you'll need to switch between tabs. gt is the fastest, or you can tab switch the same way you switch between buffers - :tabnext (or :tabn 2), :tabprev – DaveParillo – 2009-11-05T17:51:06.057

47

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

Rook

Posted 2009-11-05T14:33:46.360

Reputation: 21 622

1CTRL-w v is the correct command for splitting windows vertically – JRM – 2012-11-10T01:59:46.087

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 – 2009-11-05T15:34:07.423

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 – 2009-11-05T15:37:01.833

Ah! You're right. I was misinterpreting the output of :ls. – innaM – 2009-11-05T15:46:12.127

Also, ctrl-w V splits the window vertically. – Shannon Nelson – 2009-11-05T20:33:29.643

28

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.

rkjnsn

Posted 2009-11-05T14:33:46.360

Reputation: 421

2You don’t need the buffer number, give it an unambiguous part of the buffer name and VIM does the rest for you. – dessert – 2018-08-15T08:44:04.133

1This 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 – 2019-07-29T02:44:29.273

This is not OP's exact question, but was exactly what I was looking for :) – jackcogdill – 2019-11-02T00:10:54.257

25

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.

John Whitley

Posted 2009-11-05T14:33:46.360

Reputation: 455

An similar approach from a previous edit, for posterity, is :bufdo execute "tabnew %". I think the new approach is a bit clearer. – John Whitley – 2012-05-30T01:37:31.173

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. – John Whitley – 2012-05-30T01:52:44.023

12:tab sball seems to work better. – ggustafsson – 2013-01-20T11:07:14.663

6

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

Shamaoke

Posted 2009-11-05T14:33:46.360

Reputation: 466

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 – 2015-03-19T11:32:10.217

1@JonnyLeeds done. – rkjnsn – 2015-03-20T18:33:42.857

9The 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 – 2013-04-02T20:26:27.013

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.

liuyang1

Posted 2009-11-05T14:33:46.360

Reputation: 141

:tabe % is what I've been looking for for a long time, thanks! – pevik – 2017-12-05T16:47:57.727

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 – 2019-05-28T15:49:49.383