blob: 566c802ad2189c8148e26dbb09ea8a9e4ce4aaa6 [file] [log] [blame]
Bram Moolenaarb21e5842006-04-16 18:30:08 +00001*tabpage.txt* For Vim version 7.0e. Last change: 2006 Apr 13
Bram Moolenaar7e8fd632006-02-18 22:14:51 +00002
3
4 VIM REFERENCE MANUAL by Bram Moolenaar
5
6
Bram Moolenaar2a0449d2006-02-20 21:27:21 +00007Editing with windows in multiple tab pages. *tab-page* *tabpage*
Bram Moolenaar7e8fd632006-02-18 22:14:51 +00008
9The commands which have been added to use multiple tab pages are explained
10here. Additionally, there are explanations for commands that work differently
11when used in combination with more than one tab page.
12
Bram Moolenaar030f0df2006-02-21 22:02:53 +0000131. Introduction |tab-page-intro|
142. Commands |tab-page-commands|
153. Other items |tab-page-other|
164. Setting 'tabline' |setting-tabline|
Bram Moolenaarba6c0522006-02-25 21:45:02 +0000175. Setting 'guitablabel' |setting-guitablabel|
Bram Moolenaar7e8fd632006-02-18 22:14:51 +000018
19{Vi does not have any of these commands}
20{not able to use multiple tab pages when the |+windows| feature was disabled
21at compile time}
22
23==============================================================================
241. Introduction *tab-page-intro*
25
26A tab page holds one or more windows. You can easily switch between tab
27pages, so that you have several collections of windows to work on different
28things.
29
30Usually you will see a list of labels at the top of the Vim window, one for
31each tab page. With the mouse you can click on the label to jump to that tab
32page. There are other ways to move between tab pages, see below.
33
34Most commands work only in the current tab page. That includes the |CTRL-W|
Bram Moolenaare1438bb2006-03-01 22:01:55 +000035commands, |:windo|, |:all| and |:ball| (when not using the |:tab| modifier).
36The commands that are aware of other tab pages than the current one are
37mentioned below.
Bram Moolenaar7e8fd632006-02-18 22:14:51 +000038
39Tabs are also a nice way to edit a buffer temporarily without changing the
40current window layout. Open a new tab page, do whatever you want to do and
41close the tab page.
42
43==============================================================================
442. Commands *tab-page-commands*
45
46OPENING A NEW TAB PAGE:
47
48When starting Vim "vim -p filename ..." opens each file argument in a separate
Bram Moolenaare1438bb2006-03-01 22:01:55 +000049tab page (up to 'tabpagemax'). |-p|
Bram Moolenaar7e8fd632006-02-18 22:14:51 +000050
Bram Moolenaarbfb2d402006-03-03 22:50:42 +000051A double click with the mouse in the non-GUI tab pages line opens a new, empty
52tab page. It is placed left of the position of the click. The first click
53may select another tab page first, causing an extra screen update.
54
55In the GUI tab pages line you can use the right mouse button to open menu.
56|tabline-menu|.
Bram Moolenaar80a94a52006-02-23 21:26:58 +000057
58:tabe[dit] *:tabe* *:tabedit* *:tabnew*
59:tabnew Open a new tab page with an empty window, after the current
60 tab page.
Bram Moolenaar7e8fd632006-02-18 22:14:51 +000061
62:tabe[dit] [++opt] [+cmd] {file}
Bram Moolenaar80a94a52006-02-23 21:26:58 +000063:tabnew [++opt] [+cmd] {file}
Bram Moolenaar7e8fd632006-02-18 22:14:51 +000064 Open a new tab page and edit {file}, like with |:edit|.
65
Bram Moolenaar2a0449d2006-02-20 21:27:21 +000066:tabf[ind] [++opt] [+cmd] {file} *:tabf* *:tabfind*
Bram Moolenaar7e8fd632006-02-18 22:14:51 +000067 Open a new tab page and edit {file} in 'path', like with
68 |:find|.
69 {not available when the |+file_in_path| feature was disabled
70 at compile time}
71
Bram Moolenaar80a94a52006-02-23 21:26:58 +000072:[count]tab {cmd} *:tab*
73 Execute {cmd} and when it opens a new window open a new tab
74 page instead. Doesn't work for |:diffsplit| or |:diffpatch|.
75 When [count] is omitted the tab page appears after the current
76 one. When [count] is specified the new tab page comes after
77 tab page [count]. Use ":0tab cmd" to get the new tab page as
78 the first one. Examples: >
79 :tab split " opens current buffer in new tab page
80 :tab help gt " opens tab page with help for "gt"
81
Bram Moolenaar8dff8182006-04-06 20:18:50 +000082CTRL-W gf Open a new tab page and edit the file name under the cursor.
83 See |CTRL-W_gf|.
84
Bram Moolenaar7e8fd632006-02-18 22:14:51 +000085
86CLOSING A TAB PAGE:
87
Bram Moolenaar80a94a52006-02-23 21:26:58 +000088Closing the last window of a tab page closes the tab page too, unless there is
89only one tab page.
Bram Moolenaar7e8fd632006-02-18 22:14:51 +000090
91Using the mouse: If the tab page line is displayed you can click in the "X" at
Bram Moolenaar80a94a52006-02-23 21:26:58 +000092the top right to close the current tab page. A custom |'tabline'| may show
93something else.
Bram Moolenaar7e8fd632006-02-18 22:14:51 +000094
95 *:tabc* *:tabclose*
96:tabc[lose][!] Close current tab page.
97 This command fails when:
98 - There is only one tab page on the screen. *E784*
99 - When 'hidden' is not set, [!] is not used, a buffer has
100 changes, and there is no other window on this buffer.
101 Changes to the buffer are not written and won't get lost, so
102 this is a "safe" command.
103
104:tabc[lose][!] {count}
105 Close tab page {count}. Fails in the same way as ':tabclose"
106 above.
107
108 *:tabo* *:tabonly*
109:tabo[nly][!] Close all other tab pages.
110 When the 'hidden' option is set, all buffers in closed windows
111 become hidden.
112 When 'hidden' is not set, and the 'autowrite' option is set,
113 modified buffers are written. Otherwise, windows that have
114 buffers that are modified are not removed, unless the [!] is
115 given, then they become hidden. But modified buffers are
116 never abandoned, so changes cannot get lost.
117
118
119SWITCHING TO ANOTHER TAB PAGE:
120
121Using the mouse: If the tab page line is displayed you can click in a tab page
Bram Moolenaar80a94a52006-02-23 21:26:58 +0000122label to switch to that tab page. Click where there is no label to go to the
123next tab page. |'tabline'|
Bram Moolenaar7e8fd632006-02-18 22:14:51 +0000124
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000125:tabn[ext] *:tabn* *:tabnext* *gt*
126gt *CTRL-<PageDown>* *<C-PageDown>*
Bram Moolenaar7fc904b2006-04-13 20:37:35 +0000127<C-PageDown> *i_CTRL-<PageDown>* *i_<C-PageDown>*
128 Go to the next tab page. Wraps around from the last to the
Bram Moolenaar7e8fd632006-02-18 22:14:51 +0000129 first one.
130
Bram Moolenaar7fc904b2006-04-13 20:37:35 +0000131:tabn[ext] {count} *CTRL-<PageUp>* *<C-PageUp>*
132{count}gt *i_CTRL-<PageUp>* *i_<C-PageUp>*
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000133<C-PageUp> Go to tab page {count}. The first tab page has number one.
Bram Moolenaar7e8fd632006-02-18 22:14:51 +0000134
135
Bram Moolenaar80a94a52006-02-23 21:26:58 +0000136:tabp[revious] *:tabp* *:tabprevious* *gT*
137:tabN[ext] *:tabN* *:tabNext*
138gT Go to the previous tab page. Wraps around from the first one
139 to the last one.
140
141:tabp[revious] {count}
142:tabN[ext] {count}
143{count}gT Go {count} tab pages back. Wraps around from the first one
144 to the last one.
145
Bram Moolenaar32466aa2006-02-24 23:53:04 +0000146:tabr[ewind] *:tabfir* *:tabfirst* *:tabr* *:tabrewind*
Bram Moolenaarba6c0522006-02-25 21:45:02 +0000147:tabfir[st] Go to the first tab page.
Bram Moolenaar32466aa2006-02-24 23:53:04 +0000148
149 *:tabl* *:tablast*
150:tabl[ast] Go to the last tab page.
151
Bram Moolenaar80a94a52006-02-23 21:26:58 +0000152
Bram Moolenaar7e8fd632006-02-18 22:14:51 +0000153Other commands:
154 *:tabs*
Bram Moolenaar80a94a52006-02-23 21:26:58 +0000155:tabs List the tab pages and the windows they contain.
156 Shows a ">" for the current window.
157 Shows a "+" for modified buffers.
158
159
160REORDERING TAB PAGES:
161
162 *:tabm* *:tabmove*
163:tabmove N Move the current tab page to after tab page N. Use zero to
164 make the current tab page the first one. Without N the tab
165 page is made the last one.
Bram Moolenaar7e8fd632006-02-18 22:14:51 +0000166
Bram Moolenaar32466aa2006-02-24 23:53:04 +0000167
168LOOPING OVER TAB PAGES:
169
170 *:tabd* *:tabdo*
171:tabd[o] {cmd} Execute {cmd} in each tab page.
172 It works like doing this: >
173 :tabfirst
174 :{cmd}
175 :tabnext
176 :{cmd}
177 etc.
178< This only operates in the current window of each tab page.
179 When an error is detected on one tab page, further tab pages
180 will not be visited.
181 The last tab page (or where an error occurred) becomes the
182 current tab page.
183 {cmd} can contain '|' to concatenate several commands.
184 {cmd} must not open or close tab pages or reorder them.
185 {not in Vi} {not available when compiled without the
186 |+listcmds| feature}
187 Also see |:windo|, |:argdo| and |:bufdo|.
188
Bram Moolenaar7e8fd632006-02-18 22:14:51 +0000189==============================================================================
1903. Other items *tab-page-other*
191
Bram Moolenaarbfb2d402006-03-03 22:50:42 +0000192 *tabline-menu*
193The GUI tab pages line has a popup menu. It is accessed with a right click.
194The entries are:
195 Close Close the tab page under the mouse pointer. The
196 current one if there is no label under the mouse
197 pointer.
198 New Tab Open a tab page, editing an empty buffer. It appears
199 to the left of the mouse pointer.
200 Open Tab... Like "New Tab" and additionaly use a file selector to
201 select a file to edit.
202
Bram Moolenaar7e8fd632006-02-18 22:14:51 +0000203Diff mode works per tab page. You can see the diffs between several files
204within one tab page. Other tab pages can show differences between other
205files.
206
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000207Variables local to a tab page start with "t:". |tabpage-variable|
208
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000209Currently there is only one option local to a tab page: 'cmdheight'.
210
Bram Moolenaar2a0449d2006-02-20 21:27:21 +0000211The TabLeave and TabEnter autocommand events can be used to do something when
212switching from one tab page to another. The exact order depends on what you
213are doing. When creating a new tab page this works as if you create a new
214window on the same buffer and then edit another buffer. Thus ":tabnew"
215triggers:
216 WinLeave leave current window
217 TabLeave leave current tab page
218 TabEnter enter new tab page
219 WinEnter enter window in new tab page
220 BufLeave leave current buffer
221 BufEnter enter new empty buffer
222
Bram Moolenaar030f0df2006-02-21 22:02:53 +0000223When switching to another tab page the order is:
Bram Moolenaar2a0449d2006-02-20 21:27:21 +0000224 BufLeave
225 WinLeave
226 TabLeave
227 TabEnter
228 WinEnter
229 BufEnter
Bram Moolenaar7e8fd632006-02-18 22:14:51 +0000230
Bram Moolenaar030f0df2006-02-21 22:02:53 +0000231==============================================================================
2324. Setting 'tabline' *setting-tabline*
233
Bram Moolenaarba6c0522006-02-25 21:45:02 +0000234The 'tabline' option specifies what the line with tab pages labels looks like.
235It is only used when there is no GUI tab line.
236
Bram Moolenaar030f0df2006-02-21 22:02:53 +0000237You can use the 'showtabline' option to specify when you want the line with
238tab page labels to appear: never, when there is more than one tab page or
239always.
240
241The highlighting of the tab pages line is set with the groups TabLine
242TabLineSel and TabLineFill. |hl-TabLine| |hl-TabLineSel| |hl-TabLineFill|
243
244The 'tabline' option allows you to define your preferred way to tab pages
245labels. This isn't easy, thus an example will be given here.
246
247For basics see the 'statusline' option. The same items can be used in the
248'tabline' option. Additionally, the |tabpagebuflist()|, |tabpagenr()| and
249|tabpagewinnr()| functions are useful.
250
251Since the number of tab labels will vary, you need to use an expresion for the
252whole option. Something like: >
253 :set tabline=%!MyTabLine()
254
255Then define the MyTabLine() function to list all the tab pages labels. A
256convenient method is to split it in two parts: First go over all the tab
257pages and define labels for them. Then get the label for each tab page. >
258
259 function MyTabLine()
260 let s = ''
261 for i in range(tabpagenr('$'))
Bram Moolenaard1f56e62006-02-22 21:25:37 +0000262 " select the highlighting
Bram Moolenaar030f0df2006-02-21 22:02:53 +0000263 if i + 1 == tabpagenr()
264 let s .= '%#TabLineSel#'
265 else
266 let s .= '%#TabLine#'
267 endif
Bram Moolenaard1f56e62006-02-22 21:25:37 +0000268
269 " set the tab page number (for mouse clicks)
270 let s .= '%' . (i + 1) . 'T'
271
272 " the label is made by MyTabLabel()
Bram Moolenaar030f0df2006-02-21 22:02:53 +0000273 let s .= ' %{MyTabLabel(' . (i + 1) . ')} '
274 endfor
Bram Moolenaard1f56e62006-02-22 21:25:37 +0000275
276 " after the last tab fill with TabLineFill and reset tab page nr
277 let s .= '%#TabLineFill#%T'
278
279 " right-align the label to close the current tab page
280 if tabpagenr('$') > 1
281 let s .= '%=%#TabLine#%999Xclose'
282 endif
283
Bram Moolenaar030f0df2006-02-21 22:02:53 +0000284 return s
285 endfunction
286
287Now the MyTabLabel() function is called for each tab page to get its label. >
288
289 function MyTabLabel(n)
290 let buflist = tabpagebuflist(a:n)
291 let winnr = tabpagewinnr(a:n)
292 return bufname(buflist[winnr - 1])
293 endfunction
294
295This is just a simplistic example that results in a tab pages line that
296resembles the default, but without adding a + for a modified buffer or
297trunctating the names. You will want to reduce the width of labels in a
298clever way when there is not enough room. Check the 'columns' option for the
Bram Moolenaard1f56e62006-02-22 21:25:37 +0000299space available.
Bram Moolenaar7e8fd632006-02-18 22:14:51 +0000300
Bram Moolenaarba6c0522006-02-25 21:45:02 +0000301==============================================================================
3025. Setting 'guitablabel' *setting-guitablabel*
303
304When the GUI tab pages line is displayed, 'guitablabel' can be used to
305specify the label to display for each tab page. Unlike 'tabline', which
306specifies the whole tab pages line at once, 'guitablabel' is used for each
307label separately.
308
309See the 'statusline' option for the format of the value.
310
311The "%N" item can be used for the current tab page number. The |v:lnum|
Bram Moolenaara226a6d2006-02-26 23:59:20 +0000312variable is also set to this number when 'guitablabel' is evaluated.
313The items that use a file name refer to the current window of the tab page.
Bram Moolenaarba6c0522006-02-25 21:45:02 +0000314
315Note that syntax highlighting is not used for 'guitablabel'. The %T and %X
Bram Moolenaara226a6d2006-02-26 23:59:20 +0000316items are also ignored.
Bram Moolenaarba6c0522006-02-25 21:45:02 +0000317
Bram Moolenaara226a6d2006-02-26 23:59:20 +0000318A simple example that puts the tab page number and the buffer name in the
319label: >
Bram Moolenaarba6c0522006-02-25 21:45:02 +0000320 :set guitablabel=%N\ %f
321
322An example that resembles the default: Show the number of windows in the tab
323page and a '+' if there is a modifed buffer: >
324
Bram Moolenaara226a6d2006-02-26 23:59:20 +0000325 function GuiTabLabel()
Bram Moolenaarba6c0522006-02-25 21:45:02 +0000326 let label = ''
327 let bufnrlist = tabpagebuflist(v:lnum)
328
329 " Add '+' if one of the buffers in the tab page is modified
330 for bufnr in bufnrlist
331 if getbufvar(bufnr, "&modified")
332 let label = '+'
333 break
334 endif
335 endfor
336
337 " Append the number of windows in the tab page if more than one
338 let wincount = tabpagewinnr(v:lnum, '$')
339 if wincount > 1
340 let label .= wincount
341 endif
342 if label != ''
343 let label .= ' '
344 endif
345
346 " Append the buffer name
347 return label . bufname(bufnrlist[tabpagewinnr(v:lnum) - 1])
348 endfunction
Bram Moolenaara226a6d2006-02-26 23:59:20 +0000349
Bram Moolenaarba6c0522006-02-25 21:45:02 +0000350 set guitablabel=%{GuiTabLabel()}
Bram Moolenaara226a6d2006-02-26 23:59:20 +0000351
352Note that the function must be defined before setting the option, otherwise
353you get an error message for the function not being known.
354
Bram Moolenaarba6c0522006-02-25 21:45:02 +0000355
Bram Moolenaar7e8fd632006-02-18 22:14:51 +0000356 vim:tw=78:ts=8:ft=help:norl: