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

28,847

Solution 1

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

Solution 2

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.

Solution 3

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.

Solution 4

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.

Solution 5

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
Share:
28,847

Related videos on Youtube

innaM
Author by

innaM

Updated on September 17, 2022

Comments

  • innaM
    innaM over 1 year

    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
    innaM over 14 years
    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.
  • Rook
    Rook over 14 years
    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.
  • innaM
    innaM over 14 years
    Yes, but I want to have tabs.
  • DaveParillo
    DaveParillo over 14 years
    So you already have started vim in a way that you have your files in the vim client, not in a cmd / terminal shell?
  • innaM
    innaM over 14 years
    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
    innaM over 14 years
    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.
  • DaveParillo
    DaveParillo over 14 years
    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.
  • innaM
    innaM over 14 years
    Same here. vim will give me the "ungraphical" vim in my terminal window.
  • DaveParillo
    DaveParillo over 14 years
    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
  • Shannon Nelson
    Shannon Nelson over 14 years
    Also, ctrl-w V splits the window vertically.
  • JRM
    JRM over 11 years
    CTRL-w v is the correct command for splitting windows vertically
  • rkjnsn
    rkjnsn about 11 years
    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
  • JonnyRaa
    JonnyRaa about 9 years
    @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?'
  • rkjnsn
    rkjnsn about 9 years
    @JonnyLeeds done.
  • pevik
    pevik over 6 years
    :tabe % is what I've been looking for for a long time, thanks!
  • dessert
    dessert over 5 years
    You don’t need the buffer number, give it an unambiguous part of the buffer name and VIM does the rest for you.
  • JoL
    JoL almost 5 years
    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
  • Sukima
    Sukima almost 5 years
    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!!!!
  • jackcogdill
    jackcogdill over 4 years
    This is not OP's exact question, but was exactly what I was looking for :)
  • jav
    jav over 3 years
    oh man this gave me answer to all my questions. Really appreciated.