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?
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
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.
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.
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.
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
Just add some point which other guys didn't mention.
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.
:tabe % to open new tab for current buffer.
7 keystrokes.
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.
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>