How do I edit an existing buffer in a new tab in vim?
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
Related videos on Youtube
innaM
Updated on September 17, 2022Comments
-
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 over 14 yearsHmm. 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 over 14 yearsNo. 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 over 14 yearsYes, but I want to have tabs.
-
DaveParillo over 14 yearsSo you already have started vim in a way that you have your files in the vim client, not in a cmd / terminal shell?
-
innaM over 14 yearsI'm not sure what you mean. I use the shell to start vim like described above and then I have a running vim.
-
innaM over 14 yearsAh! 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 over 14 yearsOn my machine,
vim
will launch an editor within the shell. To get the vim graphical user interface I have to usegvim
. And you are correct - buffers are global to the vim application. -
innaM over 14 yearsSame here. vim will give me the "ungraphical" vim in my terminal window.
-
DaveParillo over 14 yearsSo 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 over 14 yearsAlso, ctrl-w V splits the window vertically.
-
JRM over 11 yearsCTRL-w v is the correct command for splitting windows vertically
-
rkjnsn about 11 yearsThe 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 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 about 9 years@JonnyLeeds done.
-
pevik over 6 years
:tabe %
is what I've been looking for for a long time, thanks! -
dessert over 5 yearsYou don’t need the buffer number, give it an unambiguous part of the buffer name and VIM does the rest for you.
-
JoL almost 5 yearsNo,
: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 almost 5 yearsThis 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 over 4 yearsThis is not OP's exact question, but was exactly what I was looking for :)
-
jav over 3 yearsoh man this gave me answer to all my questions. Really appreciated.