Hirohito Higashi | 651edf3 | 2025-07-01 22:07:50 +0200 | [diff] [blame] | 1 | *tabpage.txt* For Vim version 9.1. Last change: 2025 Jul 01 |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 2 | |
| 3 | |
| 4 | VIM REFERENCE MANUAL by Bram Moolenaar |
| 5 | |
| 6 | |
Bram Moolenaar | 2a0449d | 2006-02-20 21:27:21 +0000 | [diff] [blame] | 7 | Editing with windows in multiple tab pages. *tab-page* *tabpage* |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 8 | |
| 9 | The commands which have been added to use multiple tab pages are explained |
| 10 | here. Additionally, there are explanations for commands that work differently |
| 11 | when used in combination with more than one tab page. |
| 12 | |
Bram Moolenaar | 030f0df | 2006-02-21 22:02:53 +0000 | [diff] [blame] | 13 | 1. Introduction |tab-page-intro| |
| 14 | 2. Commands |tab-page-commands| |
| 15 | 3. Other items |tab-page-other| |
| 16 | 4. Setting 'tabline' |setting-tabline| |
Naruhiko Nishino | be5bd4d | 2025-05-14 21:20:28 +0200 | [diff] [blame] | 17 | 5. Setting 'tabpanel' |setting-tabpanel| |
| 18 | 6. Setting 'guitablabel' |setting-guitablabel| |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 19 | |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 20 | {not able to use multiple tab pages when the |+windows| feature was disabled |
| 21 | at compile time} |
Hirohito Higashi | 651edf3 | 2025-07-01 22:07:50 +0200 | [diff] [blame] | 22 | {not able to use |tabpanel| feature when the |+tabpanel| feature was disabled |
| 23 | at compile time} |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 24 | |
| 25 | ============================================================================== |
| 26 | 1. Introduction *tab-page-intro* |
| 27 | |
| 28 | A tab page holds one or more windows. You can easily switch between tab |
| 29 | pages, so that you have several collections of windows to work on different |
| 30 | things. |
| 31 | |
| 32 | Usually you will see a list of labels at the top of the Vim window, one for |
| 33 | each tab page. With the mouse you can click on the label to jump to that tab |
| 34 | page. There are other ways to move between tab pages, see below. |
| 35 | |
| 36 | Most commands work only in the current tab page. That includes the |CTRL-W| |
Bram Moolenaar | e1438bb | 2006-03-01 22:01:55 +0000 | [diff] [blame] | 37 | commands, |:windo|, |:all| and |:ball| (when not using the |:tab| modifier). |
| 38 | The commands that are aware of other tab pages than the current one are |
| 39 | mentioned below. |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 40 | |
| 41 | Tabs are also a nice way to edit a buffer temporarily without changing the |
| 42 | current window layout. Open a new tab page, do whatever you want to do and |
| 43 | close the tab page. |
| 44 | |
| 45 | ============================================================================== |
| 46 | 2. Commands *tab-page-commands* |
| 47 | |
| 48 | OPENING A NEW TAB PAGE: |
| 49 | |
| 50 | When starting Vim "vim -p filename ..." opens each file argument in a separate |
Bram Moolenaar | 58f0a1f | 2010-07-17 16:30:42 +0200 | [diff] [blame] | 51 | tab page (up to 'tabpagemax'). See |-p| |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 52 | |
Bram Moolenaar | bfb2d40 | 2006-03-03 22:50:42 +0000 | [diff] [blame] | 53 | A double click with the mouse in the non-GUI tab pages line opens a new, empty |
| 54 | tab page. It is placed left of the position of the click. The first click |
| 55 | may select another tab page first, causing an extra screen update. |
| 56 | |
Bram Moolenaar | f193fff | 2006-04-27 00:02:13 +0000 | [diff] [blame] | 57 | This also works in a few GUI versions, esp. Win32 and Motif. But only when |
| 58 | clicking right of the labels. |
| 59 | |
Bram Moolenaar | bfb2d40 | 2006-03-03 22:50:42 +0000 | [diff] [blame] | 60 | In the GUI tab pages line you can use the right mouse button to open menu. |
| 61 | |tabline-menu|. |
Bram Moolenaar | 80a94a5 | 2006-02-23 21:26:58 +0000 | [diff] [blame] | 62 | |
Bram Moolenaar | 46fceaa | 2016-10-23 21:21:08 +0200 | [diff] [blame] | 63 | For the related autocommands see |tabnew-autocmd|. |
| 64 | |
Bram Moolenaar | a26559b | 2010-07-31 14:59:19 +0200 | [diff] [blame] | 65 | :[count]tabe[dit] *:tabe* *:tabedit* *:tabnew* |
| 66 | :[count]tabnew |
| 67 | Open a new tab page with an empty window, after the current |
Bram Moolenaar | b96a7f3 | 2014-11-27 16:22:48 +0100 | [diff] [blame] | 68 | tab page. If [count] is given the new tab page appears after |
| 69 | the tab page [count] otherwise the new tab page will appear |
| 70 | after the current one. > |
| 71 | :tabnew " opens tabpage after the current one |
| 72 | :.tabnew " as above |
| 73 | :+tabnew " opens tabpage after the next tab page |
| 74 | " note: it is one further than :tabnew |
| 75 | :-tabnew " opens tabpage before the current one |
| 76 | :0tabnew " opens tabpage before the first one |
| 77 | :$tabnew " opens tabpage after the last one |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 78 | |
Bram Moolenaar | a26559b | 2010-07-31 14:59:19 +0200 | [diff] [blame] | 79 | :[count]tabe[dit] [++opt] [+cmd] {file} |
| 80 | :[count]tabnew [++opt] [+cmd] {file} |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 81 | Open a new tab page and edit {file}, like with |:edit|. |
Bram Moolenaar | b96a7f3 | 2014-11-27 16:22:48 +0100 | [diff] [blame] | 82 | For [count] see |:tabnew| above. |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 83 | |
Bram Moolenaar | a26559b | 2010-07-31 14:59:19 +0200 | [diff] [blame] | 84 | :[count]tabf[ind] [++opt] [+cmd] {file} *:tabf* *:tabfind* |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 85 | Open a new tab page and edit {file} in 'path', like with |
Bram Moolenaar | b96a7f3 | 2014-11-27 16:22:48 +0100 | [diff] [blame] | 86 | |:find|. For [count] see |:tabnew| above. |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 87 | |
Bram Moolenaar | 80a94a5 | 2006-02-23 21:26:58 +0000 | [diff] [blame] | 88 | :[count]tab {cmd} *:tab* |
| 89 | Execute {cmd} and when it opens a new window open a new tab |
Bram Moolenaar | dd2a3cd | 2007-05-05 17:10:09 +0000 | [diff] [blame] | 90 | page instead. Doesn't work for |:diffsplit|, |:diffpatch|, |
| 91 | |:execute| and |:normal|. |
Bram Moolenaar | 9b7f8ce | 2016-08-21 19:07:17 +0200 | [diff] [blame] | 92 | If [count] is given the new tab page appears after the tab |
| 93 | page [count] otherwise the new tab page will appear after the |
| 94 | current one. |
Bram Moolenaar | a26559b | 2010-07-31 14:59:19 +0200 | [diff] [blame] | 95 | Examples: > |
Bram Moolenaar | 9b7f8ce | 2016-08-21 19:07:17 +0200 | [diff] [blame] | 96 | :tab split " opens current buffer in new tab page |
| 97 | :tab help gt " opens tab page with help for "gt" |
| 98 | :.tab help gt " as above |
| 99 | :+tab help " opens tab page with help after the next |
| 100 | " tab page |
| 101 | :-tab help " opens tab page with help before the |
| 102 | " current one |
| 103 | :0tab help " opens tab page with help before the |
| 104 | " first one |
| 105 | :$tab help " opens tab page with help after the last |
| 106 | " one |
Bram Moolenaar | 80a94a5 | 2006-02-23 21:26:58 +0000 | [diff] [blame] | 107 | |
Bram Moolenaar | 8dff818 | 2006-04-06 20:18:50 +0000 | [diff] [blame] | 108 | CTRL-W gf Open a new tab page and edit the file name under the cursor. |
| 109 | See |CTRL-W_gf|. |
| 110 | |
Bram Moolenaar | 57657d8 | 2006-04-21 22:12:41 +0000 | [diff] [blame] | 111 | CTRL-W gF Open a new tab page and edit the file name under the cursor |
| 112 | and jump to the line number following the file name. |
| 113 | See |CTRL-W_gF|. |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 114 | |
| 115 | CLOSING A TAB PAGE: |
| 116 | |
Bram Moolenaar | 80a94a5 | 2006-02-23 21:26:58 +0000 | [diff] [blame] | 117 | Closing the last window of a tab page closes the tab page too, unless there is |
| 118 | only one tab page. |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 119 | |
| 120 | Using the mouse: If the tab page line is displayed you can click in the "X" at |
Bram Moolenaar | 80a94a5 | 2006-02-23 21:26:58 +0000 | [diff] [blame] | 121 | the top right to close the current tab page. A custom |'tabline'| may show |
| 122 | something else. |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 123 | |
| 124 | *:tabc* *:tabclose* |
| 125 | :tabc[lose][!] Close current tab page. |
| 126 | This command fails when: |
| 127 | - There is only one tab page on the screen. *E784* |
| 128 | - When 'hidden' is not set, [!] is not used, a buffer has |
| 129 | changes, and there is no other window on this buffer. |
| 130 | Changes to the buffer are not written and won't get lost, so |
Bram Moolenaar | b96a7f3 | 2014-11-27 16:22:48 +0100 | [diff] [blame] | 131 | this is a "safe" command. > |
| 132 | :tabclose " close the current tab page |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 133 | |
Bram Moolenaar | b96a7f3 | 2014-11-27 16:22:48 +0100 | [diff] [blame] | 134 | :{count}tabc[lose][!] |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 135 | :tabc[lose][!] {count} |
Bram Moolenaar | 9b45125 | 2012-08-15 17:43:31 +0200 | [diff] [blame] | 136 | Close tab page {count}. Fails in the same way as `:tabclose` |
Bram Moolenaar | b96a7f3 | 2014-11-27 16:22:48 +0100 | [diff] [blame] | 137 | above. > |
| 138 | :-tabclose " close the previous tab page |
| 139 | :+tabclose " close the next tab page |
| 140 | :1tabclose " close the first tab page |
| 141 | :$tabclose " close the last tab page |
Bram Moolenaar | 8a3b805 | 2022-06-26 12:21:15 +0100 | [diff] [blame] | 142 | :tabclose -2 " close the 2nd previous tab page |
Bram Moolenaar | 3df0173 | 2017-02-17 22:47:16 +0100 | [diff] [blame] | 143 | :tabclose + " close the next tab page |
| 144 | :tabclose 3 " close the third tab page |
| 145 | :tabclose $ " close the last tab page |
Bram Moolenaar | 94f4ffa | 2020-08-10 19:21:15 +0200 | [diff] [blame] | 146 | :tabclose # " close the last accessed tab page |
Bram Moolenaar | a2baa73 | 2022-02-04 16:09:54 +0000 | [diff] [blame] | 147 | |
LemonBoy | 5247b0b | 2024-07-12 19:30:58 +0200 | [diff] [blame] | 148 | When a tab is closed the next tab page will become the current one. This |
| 149 | behaviour can be customized using the 'tabclose' option. |
Bram Moolenaar | a2baa73 | 2022-02-04 16:09:54 +0000 | [diff] [blame] | 150 | |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 151 | *:tabo* *:tabonly* |
| 152 | :tabo[nly][!] Close all other tab pages. |
| 153 | When the 'hidden' option is set, all buffers in closed windows |
| 154 | become hidden. |
| 155 | When 'hidden' is not set, and the 'autowrite' option is set, |
| 156 | modified buffers are written. Otherwise, windows that have |
| 157 | buffers that are modified are not removed, unless the [!] is |
| 158 | given, then they become hidden. But modified buffers are |
Bram Moolenaar | b96a7f3 | 2014-11-27 16:22:48 +0100 | [diff] [blame] | 159 | never abandoned, so changes cannot get lost. > |
| 160 | :tabonly " close all tab pages except the current |
Bram Moolenaar | 9b7f8ce | 2016-08-21 19:07:17 +0200 | [diff] [blame] | 161 | " one |
Bram Moolenaar | b96a7f3 | 2014-11-27 16:22:48 +0100 | [diff] [blame] | 162 | |
| 163 | :{count}tabo[nly][!] |
Bram Moolenaar | 3df0173 | 2017-02-17 22:47:16 +0100 | [diff] [blame] | 164 | :tabo[nly][!] {count} |
| 165 | Close all tab pages except {count} one. > |
Bram Moolenaar | 9b7f8ce | 2016-08-21 19:07:17 +0200 | [diff] [blame] | 166 | :.tabonly " as above |
Bram Moolenaar | b96a7f3 | 2014-11-27 16:22:48 +0100 | [diff] [blame] | 167 | :-tabonly " close all tab pages except the previous |
| 168 | " one |
| 169 | :+tabonly " close all tab pages except the next one |
| 170 | :1tabonly " close all tab pages except the first one |
| 171 | :$tabonly " close all tab pages except the last one |
Bram Moolenaar | 3df0173 | 2017-02-17 22:47:16 +0100 | [diff] [blame] | 172 | :tabonly - " close all tab pages except the previous |
| 173 | " one |
| 174 | :tabonly +2 " close all tab pages except the two next |
| 175 | " one |
| 176 | :tabonly 1 " close all tab pages except the first one |
| 177 | :tabonly $ " close all tab pages except the last one |
Bram Moolenaar | 94f4ffa | 2020-08-10 19:21:15 +0200 | [diff] [blame] | 178 | :tabonly # " close all tab pages except the last |
| 179 | " accessed one |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 180 | |
| 181 | |
| 182 | SWITCHING TO ANOTHER TAB PAGE: |
| 183 | |
| 184 | Using the mouse: If the tab page line is displayed you can click in a tab page |
Bram Moolenaar | 80a94a5 | 2006-02-23 21:26:58 +0000 | [diff] [blame] | 185 | label to switch to that tab page. Click where there is no label to go to the |
| 186 | next tab page. |'tabline'| |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 187 | |
Bram Moolenaar | 910f66f | 2006-04-05 20:41:53 +0000 | [diff] [blame] | 188 | :tabn[ext] *:tabn* *:tabnext* *gt* |
Bram Moolenaar | dd2a3cd | 2007-05-05 17:10:09 +0000 | [diff] [blame] | 189 | <C-PageDown> *CTRL-<PageDown>* *<C-PageDown>* |
| 190 | gt *i_CTRL-<PageDown>* *i_<C-PageDown>* |
Bram Moolenaar | 7fc904b | 2006-04-13 20:37:35 +0000 | [diff] [blame] | 191 | Go to the next tab page. Wraps around from the last to the |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 192 | first one. |
| 193 | |
Bram Moolenaar | 3df0173 | 2017-02-17 22:47:16 +0100 | [diff] [blame] | 194 | :{count}tabn[ext] |
Bram Moolenaar | dd2a3cd | 2007-05-05 17:10:09 +0000 | [diff] [blame] | 195 | :tabn[ext] {count} |
Bram Moolenaar | 3df0173 | 2017-02-17 22:47:16 +0100 | [diff] [blame] | 196 | Go to tab page {count}. The first tab page has number one. > |
| 197 | :-tabnext " go to the previous tab page |
| 198 | :+tabnext " go to the next tab page |
| 199 | :+2tabnext " go to the two next tab page |
| 200 | :1tabnext " go to the first tab page |
| 201 | :$tabnext " go to the last tab page |
| 202 | :tabnext $ " as above |
zeertzjq | 076faac | 2024-03-25 16:41:06 +0100 | [diff] [blame] | 203 | :tabnext # " go to the last accessed tab page |
Bram Moolenaar | 3df0173 | 2017-02-17 22:47:16 +0100 | [diff] [blame] | 204 | :tabnext - " go to the previous tab page |
| 205 | :tabnext -1 " as above |
| 206 | :tabnext + " go to the next tab page |
| 207 | :tabnext +1 " as above |
| 208 | |
Bram Moolenaar | dd2a3cd | 2007-05-05 17:10:09 +0000 | [diff] [blame] | 209 | {count}<C-PageDown> |
| 210 | {count}gt Go to tab page {count}. The first tab page has number one. |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 211 | |
| 212 | |
Bram Moolenaar | dd2a3cd | 2007-05-05 17:10:09 +0000 | [diff] [blame] | 213 | :tabp[revious] *:tabp* *:tabprevious* *gT* *:tabN* |
| 214 | :tabN[ext] *:tabNext* *CTRL-<PageUp>* |
| 215 | <C-PageUp> *<C-PageUp>* *i_CTRL-<PageUp>* *i_<C-PageUp>* |
Bram Moolenaar | 80a94a5 | 2006-02-23 21:26:58 +0000 | [diff] [blame] | 216 | gT Go to the previous tab page. Wraps around from the first one |
| 217 | to the last one. |
| 218 | |
| 219 | :tabp[revious] {count} |
| 220 | :tabN[ext] {count} |
Bram Moolenaar | dd2a3cd | 2007-05-05 17:10:09 +0000 | [diff] [blame] | 221 | {count}<C-PageUp> |
Bram Moolenaar | 80a94a5 | 2006-02-23 21:26:58 +0000 | [diff] [blame] | 222 | {count}gT Go {count} tab pages back. Wraps around from the first one |
Bram Moolenaar | 0b0f099 | 2018-05-22 21:41:30 +0200 | [diff] [blame] | 223 | to the last one. Note that the use of {count} is different |
| 224 | from |:tabnext|, where it is used as the tab page number. |
Bram Moolenaar | 80a94a5 | 2006-02-23 21:26:58 +0000 | [diff] [blame] | 225 | |
Bram Moolenaar | 32466aa | 2006-02-24 23:53:04 +0000 | [diff] [blame] | 226 | :tabr[ewind] *:tabfir* *:tabfirst* *:tabr* *:tabrewind* |
Bram Moolenaar | ba6c052 | 2006-02-25 21:45:02 +0000 | [diff] [blame] | 227 | :tabfir[st] Go to the first tab page. |
Bram Moolenaar | 32466aa | 2006-02-24 23:53:04 +0000 | [diff] [blame] | 228 | |
| 229 | *:tabl* *:tablast* |
| 230 | :tabl[ast] Go to the last tab page. |
| 231 | |
Christian Brabandt | fed0196 | 2024-05-15 21:04:33 +0200 | [diff] [blame] | 232 | <C-Tab> *g<Tab>* *CTRL-W_g<Tab>* *<C-Tab>* |
| 233 | g<Tab> |
| 234 | CTRL-W g<Tab> Go to the last accessed tab page. |
Bram Moolenaar | 80a94a5 | 2006-02-23 21:26:58 +0000 | [diff] [blame] | 235 | |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 236 | Other commands: |
| 237 | *:tabs* |
Bram Moolenaar | 80a94a5 | 2006-02-23 21:26:58 +0000 | [diff] [blame] | 238 | :tabs List the tab pages and the windows they contain. |
| 239 | Shows a ">" for the current window. |
| 240 | Shows a "+" for modified buffers. |
Bram Moolenaar | 7e1479b | 2016-09-11 15:07:27 +0200 | [diff] [blame] | 241 | For example: |
| 242 | Tab page 1 ~ |
| 243 | + tabpage.txt ~ |
| 244 | ex_docmd.c ~ |
| 245 | Tab page 2 ~ |
| 246 | > main.c ~ |
Bram Moolenaar | 80a94a5 | 2006-02-23 21:26:58 +0000 | [diff] [blame] | 247 | |
| 248 | |
| 249 | REORDERING TAB PAGES: |
| 250 | |
Bram Moolenaar | 551dbcc | 2006-04-25 22:13:59 +0000 | [diff] [blame] | 251 | :tabm[ove] [N] *:tabm* *:tabmove* |
Bram Moolenaar | 8cb8dca | 2012-07-06 18:27:39 +0200 | [diff] [blame] | 252 | :[N]tabm[ove] |
Bram Moolenaar | 551dbcc | 2006-04-25 22:13:59 +0000 | [diff] [blame] | 253 | Move the current tab page to after tab page N. Use zero to |
Bram Moolenaar | d473c8c | 2018-08-11 18:00:22 +0200 | [diff] [blame] | 254 | make the current tab page the first one. N is counted before |
| 255 | the move, thus if the second tab is the current one, |
zeertzjq | 076faac | 2024-03-25 16:41:06 +0100 | [diff] [blame] | 256 | `:tabmove 1` and `:tabmove 2` have no effect. |
Bram Moolenaar | d473c8c | 2018-08-11 18:00:22 +0200 | [diff] [blame] | 257 | Without N the tab page is made the last one. > |
Bram Moolenaar | 40ce3a4 | 2015-04-21 18:08:39 +0200 | [diff] [blame] | 258 | :.tabmove " do nothing |
Bram Moolenaar | b96a7f3 | 2014-11-27 16:22:48 +0100 | [diff] [blame] | 259 | :-tabmove " move the tab page to the left |
Bram Moolenaar | 40ce3a4 | 2015-04-21 18:08:39 +0200 | [diff] [blame] | 260 | :+tabmove " move the tab page to the right |
zeertzjq | 076faac | 2024-03-25 16:41:06 +0100 | [diff] [blame] | 261 | :0tabmove " move the tab page to the first |
Bram Moolenaar | 40ce3a4 | 2015-04-21 18:08:39 +0200 | [diff] [blame] | 262 | :tabmove 0 " as above |
| 263 | :tabmove " move the tab page to the last |
| 264 | :$tabmove " as above |
| 265 | :tabmove $ " as above |
Bram Moolenaar | cb80aa2 | 2020-10-26 21:12:46 +0100 | [diff] [blame] | 266 | :tabmove # " move the tab page after the last accessed |
Bram Moolenaar | 94f4ffa | 2020-08-10 19:21:15 +0200 | [diff] [blame] | 267 | " tab page |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 268 | |
Bram Moolenaar | 8cb8dca | 2012-07-06 18:27:39 +0200 | [diff] [blame] | 269 | :tabm[ove] +[N] |
| 270 | :tabm[ove] -[N] |
| 271 | Move the current tab page N places to the right (with +) or to |
Bram Moolenaar | 40ce3a4 | 2015-04-21 18:08:39 +0200 | [diff] [blame] | 272 | the left (with -). > |
| 273 | :tabmove - " move the tab page to the left |
| 274 | :tabmove -1 " as above |
| 275 | :tabmove + " move the tab page to the right |
| 276 | :tabmove +1 " as above |
| 277 | |
Bram Moolenaar | 8cb8dca | 2012-07-06 18:27:39 +0200 | [diff] [blame] | 278 | |
| 279 | Note that although it is possible to move a tab behind the N-th one by using |
Bram Moolenaar | 40ce3a4 | 2015-04-21 18:08:39 +0200 | [diff] [blame] | 280 | :Ntabmove. And move it by N places by using :+Ntabmove. For clarification what |
| 281 | +N means in this context see |[range]|. |
Bram Moolenaar | 8cb8dca | 2012-07-06 18:27:39 +0200 | [diff] [blame] | 282 | |
Bram Moolenaar | 32466aa | 2006-02-24 23:53:04 +0000 | [diff] [blame] | 283 | |
| 284 | LOOPING OVER TAB PAGES: |
| 285 | |
| 286 | *:tabd* *:tabdo* |
Bram Moolenaar | a162bc5 | 2015-01-07 16:54:21 +0100 | [diff] [blame] | 287 | :[range]tabd[o] {cmd} |
| 288 | Execute {cmd} in each tab page or if [range] is given only in |
| 289 | tab pages which tab page number is in the [range]. It works |
| 290 | like doing this: > |
Bram Moolenaar | 32466aa | 2006-02-24 23:53:04 +0000 | [diff] [blame] | 291 | :tabfirst |
| 292 | :{cmd} |
| 293 | :tabnext |
| 294 | :{cmd} |
| 295 | etc. |
| 296 | < This only operates in the current window of each tab page. |
| 297 | When an error is detected on one tab page, further tab pages |
| 298 | will not be visited. |
| 299 | The last tab page (or where an error occurred) becomes the |
| 300 | current tab page. |
| 301 | {cmd} can contain '|' to concatenate several commands. |
| 302 | {cmd} must not open or close tab pages or reorder them. |
Bram Moolenaar | aa23b37 | 2015-09-08 18:46:31 +0200 | [diff] [blame] | 303 | Also see |:windo|, |:argdo|, |:bufdo|, |:cdo|, |:ldo|, |:cfdo| |
| 304 | and |:lfdo| |
Bram Moolenaar | 32466aa | 2006-02-24 23:53:04 +0000 | [diff] [blame] | 305 | |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 306 | ============================================================================== |
| 307 | 3. Other items *tab-page-other* |
| 308 | |
Bram Moolenaar | bfb2d40 | 2006-03-03 22:50:42 +0000 | [diff] [blame] | 309 | *tabline-menu* |
| 310 | The GUI tab pages line has a popup menu. It is accessed with a right click. |
| 311 | The entries are: |
| 312 | Close Close the tab page under the mouse pointer. The |
| 313 | current one if there is no label under the mouse |
| 314 | pointer. |
| 315 | New Tab Open a tab page, editing an empty buffer. It appears |
| 316 | to the left of the mouse pointer. |
Bram Moolenaar | dd2a3cd | 2007-05-05 17:10:09 +0000 | [diff] [blame] | 317 | Open Tab... Like "New Tab" and additionally use a file selector to |
Bram Moolenaar | bfb2d40 | 2006-03-03 22:50:42 +0000 | [diff] [blame] | 318 | select a file to edit. |
| 319 | |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 320 | Diff mode works per tab page. You can see the diffs between several files |
| 321 | within one tab page. Other tab pages can show differences between other |
| 322 | files. |
| 323 | |
Bram Moolenaar | 910f66f | 2006-04-05 20:41:53 +0000 | [diff] [blame] | 324 | Variables local to a tab page start with "t:". |tabpage-variable| |
| 325 | |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 326 | Currently there is only one option local to a tab page: 'cmdheight'. |
| 327 | |
Bram Moolenaar | 46fceaa | 2016-10-23 21:21:08 +0200 | [diff] [blame] | 328 | *tabnew-autocmd* |
Bram Moolenaar | 2a0449d | 2006-02-20 21:27:21 +0000 | [diff] [blame] | 329 | The TabLeave and TabEnter autocommand events can be used to do something when |
| 330 | switching from one tab page to another. The exact order depends on what you |
| 331 | are doing. When creating a new tab page this works as if you create a new |
| 332 | window on the same buffer and then edit another buffer. Thus ":tabnew" |
| 333 | triggers: |
| 334 | WinLeave leave current window |
| 335 | TabLeave leave current tab page |
Bram Moolenaar | 2a0449d | 2006-02-20 21:27:21 +0000 | [diff] [blame] | 336 | WinEnter enter window in new tab page |
Bram Moolenaar | a162bc5 | 2015-01-07 16:54:21 +0100 | [diff] [blame] | 337 | TabEnter enter new tab page |
Bram Moolenaar | 2a0449d | 2006-02-20 21:27:21 +0000 | [diff] [blame] | 338 | BufLeave leave current buffer |
| 339 | BufEnter enter new empty buffer |
| 340 | |
Bram Moolenaar | 030f0df | 2006-02-21 22:02:53 +0000 | [diff] [blame] | 341 | When switching to another tab page the order is: |
Bram Moolenaar | 2a0449d | 2006-02-20 21:27:21 +0000 | [diff] [blame] | 342 | BufLeave |
| 343 | WinLeave |
| 344 | TabLeave |
| 345 | TabEnter |
| 346 | WinEnter |
| 347 | BufEnter |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 348 | |
Bram Moolenaar | 030f0df | 2006-02-21 22:02:53 +0000 | [diff] [blame] | 349 | ============================================================================== |
| 350 | 4. Setting 'tabline' *setting-tabline* |
| 351 | |
Bram Moolenaar | ba6c052 | 2006-02-25 21:45:02 +0000 | [diff] [blame] | 352 | The 'tabline' option specifies what the line with tab pages labels looks like. |
| 353 | It is only used when there is no GUI tab line. |
| 354 | |
Bram Moolenaar | 030f0df | 2006-02-21 22:02:53 +0000 | [diff] [blame] | 355 | You can use the 'showtabline' option to specify when you want the line with |
| 356 | tab page labels to appear: never, when there is more than one tab page or |
| 357 | always. |
| 358 | |
| 359 | The highlighting of the tab pages line is set with the groups TabLine |
| 360 | TabLineSel and TabLineFill. |hl-TabLine| |hl-TabLineSel| |hl-TabLineFill| |
| 361 | |
Bram Moolenaar | dd2a3cd | 2007-05-05 17:10:09 +0000 | [diff] [blame] | 362 | A "+" will be shown for a tab page that has a modified window. The number of |
| 363 | windows in a tabpage is also shown. Thus "3+" means three windows and one of |
| 364 | them has a modified buffer. |
| 365 | |
Bram Moolenaar | 030f0df | 2006-02-21 22:02:53 +0000 | [diff] [blame] | 366 | The 'tabline' option allows you to define your preferred way to tab pages |
| 367 | labels. This isn't easy, thus an example will be given here. |
| 368 | |
| 369 | For basics see the 'statusline' option. The same items can be used in the |
Naruhiko Nishino | be5bd4d | 2025-05-14 21:20:28 +0200 | [diff] [blame] | 370 | 'tabline' and 'tabpanel' option. Additionally, the |tabpagebuflist()|, |
| 371 | |tabpagenr()| and |tabpagewinnr()| functions are useful. |
Bram Moolenaar | 030f0df | 2006-02-21 22:02:53 +0000 | [diff] [blame] | 372 | |
Bram Moolenaar | dd2a3cd | 2007-05-05 17:10:09 +0000 | [diff] [blame] | 373 | Since the number of tab labels will vary, you need to use an expression for |
| 374 | the whole option. Something like: > |
Bram Moolenaar | 030f0df | 2006-02-21 22:02:53 +0000 | [diff] [blame] | 375 | :set tabline=%!MyTabLine() |
| 376 | |
| 377 | Then define the MyTabLine() function to list all the tab pages labels. A |
| 378 | convenient method is to split it in two parts: First go over all the tab |
| 379 | pages and define labels for them. Then get the label for each tab page. > |
| 380 | |
| 381 | function MyTabLine() |
| 382 | let s = '' |
| 383 | for i in range(tabpagenr('$')) |
Bram Moolenaar | d1f56e6 | 2006-02-22 21:25:37 +0000 | [diff] [blame] | 384 | " select the highlighting |
Bram Moolenaar | 030f0df | 2006-02-21 22:02:53 +0000 | [diff] [blame] | 385 | if i + 1 == tabpagenr() |
Bram Moolenaar | c51cf03 | 2022-02-26 12:25:45 +0000 | [diff] [blame] | 386 | let s ..= '%#TabLineSel#' |
Bram Moolenaar | 030f0df | 2006-02-21 22:02:53 +0000 | [diff] [blame] | 387 | else |
Bram Moolenaar | c51cf03 | 2022-02-26 12:25:45 +0000 | [diff] [blame] | 388 | let s ..= '%#TabLine#' |
Bram Moolenaar | 030f0df | 2006-02-21 22:02:53 +0000 | [diff] [blame] | 389 | endif |
Bram Moolenaar | d1f56e6 | 2006-02-22 21:25:37 +0000 | [diff] [blame] | 390 | |
| 391 | " set the tab page number (for mouse clicks) |
Bram Moolenaar | c51cf03 | 2022-02-26 12:25:45 +0000 | [diff] [blame] | 392 | let s ..= '%' .. (i + 1) .. 'T' |
Bram Moolenaar | d1f56e6 | 2006-02-22 21:25:37 +0000 | [diff] [blame] | 393 | |
| 394 | " the label is made by MyTabLabel() |
Bram Moolenaar | c51cf03 | 2022-02-26 12:25:45 +0000 | [diff] [blame] | 395 | let s ..= ' %{MyTabLabel(' .. (i + 1) .. ')} ' |
Bram Moolenaar | 030f0df | 2006-02-21 22:02:53 +0000 | [diff] [blame] | 396 | endfor |
Bram Moolenaar | d1f56e6 | 2006-02-22 21:25:37 +0000 | [diff] [blame] | 397 | |
| 398 | " after the last tab fill with TabLineFill and reset tab page nr |
Bram Moolenaar | c51cf03 | 2022-02-26 12:25:45 +0000 | [diff] [blame] | 399 | let s ..= '%#TabLineFill#%T' |
Bram Moolenaar | d1f56e6 | 2006-02-22 21:25:37 +0000 | [diff] [blame] | 400 | |
| 401 | " right-align the label to close the current tab page |
| 402 | if tabpagenr('$') > 1 |
Bram Moolenaar | c51cf03 | 2022-02-26 12:25:45 +0000 | [diff] [blame] | 403 | let s ..= '%=%#TabLine#%999Xclose' |
Bram Moolenaar | d1f56e6 | 2006-02-22 21:25:37 +0000 | [diff] [blame] | 404 | endif |
| 405 | |
Bram Moolenaar | 030f0df | 2006-02-21 22:02:53 +0000 | [diff] [blame] | 406 | return s |
| 407 | endfunction |
| 408 | |
| 409 | Now the MyTabLabel() function is called for each tab page to get its label. > |
| 410 | |
| 411 | function MyTabLabel(n) |
| 412 | let buflist = tabpagebuflist(a:n) |
| 413 | let winnr = tabpagewinnr(a:n) |
| 414 | return bufname(buflist[winnr - 1]) |
| 415 | endfunction |
| 416 | |
| 417 | This is just a simplistic example that results in a tab pages line that |
| 418 | resembles the default, but without adding a + for a modified buffer or |
Bram Moolenaar | dd2a3cd | 2007-05-05 17:10:09 +0000 | [diff] [blame] | 419 | truncating the names. You will want to reduce the width of labels in a |
Bram Moolenaar | 030f0df | 2006-02-21 22:02:53 +0000 | [diff] [blame] | 420 | clever way when there is not enough room. Check the 'columns' option for the |
Bram Moolenaar | d1f56e6 | 2006-02-22 21:25:37 +0000 | [diff] [blame] | 421 | space available. |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 422 | |
Bram Moolenaar | ba6c052 | 2006-02-25 21:45:02 +0000 | [diff] [blame] | 423 | ============================================================================== |
Naruhiko Nishino | be5bd4d | 2025-05-14 21:20:28 +0200 | [diff] [blame] | 424 | 5. Setting 'tabpanel' *tabpanel* *setting-tabpanel* |
| 425 | |
| 426 | The tabpanel is a vertical sidebar that displays tab page labels along the |
| 427 | side of the window. It looks like this: |
| 428 | > |
| 429 | +-----------+---------------------------------- |
| 430 | |(1) |text text text text text text text |
| 431 | | ~/aaa.txt|text text text text text text text |
| 432 | |(2) |text text text text text text text |
| 433 | | ~/.vimrc |text text text text text text text |
| 434 | |(3) |text text text text text text text |
| 435 | | ~/bbb.js |text text text text text text text |
| 436 | | ~/ccc.css|text text text text text text text |
| 437 | | |text text text text text text text |
| 438 | | |text text text text text text text |
| 439 | | |text text text text text text text |
| 440 | < |
Christ van Willegen | d65cdad | 2025-05-30 16:05:58 +0200 | [diff] [blame] | 441 | To configure the tabpanel, use the following options: 'tabpanel', |
| 442 | 'showtabpanel' and 'tabpanelopt'. |
Hirohito Higashi | 651edf3 | 2025-07-01 22:07:50 +0200 | [diff] [blame] | 443 | The 'tabpanel' option functions similar to 'statusline' or 'tabline', and the |
| 444 | 'showtabpanel' option functions similar to 'laststatus' or 'showtabline'. |
Naruhiko Nishino | be5bd4d | 2025-05-14 21:20:28 +0200 | [diff] [blame] | 445 | |
Hirohito Higashi | 8f7256a | 2025-06-07 18:31:42 +0200 | [diff] [blame] | 446 | The "columns:" item of 'tabpanelopt' option specifies the width of the |
| 447 | tabpanel: |
Naruhiko Nishino | be5bd4d | 2025-05-14 21:20:28 +0200 | [diff] [blame] | 448 | > |
Hirohito Higashi | 651edf3 | 2025-07-01 22:07:50 +0200 | [diff] [blame] | 449 | +------ This width |
| 450 | | |
| 451 | <----+-----> |
Naruhiko Nishino | be5bd4d | 2025-05-14 21:20:28 +0200 | [diff] [blame] | 452 | +-----------+---------------------------------- |
| 453 | |(1) |text text text text text text text |
| 454 | | ~/aaa.txt|text text text text text text text |
| 455 | |(2) |text text text text text text text |
| 456 | < |
Hirohito Higashi | 8f7256a | 2025-06-07 18:31:42 +0200 | [diff] [blame] | 457 | The "align:" item of the 'tabpanelopt' option determines whether the tabpanel |
| 458 | will be displayed on the left or right side of the window: |
Naruhiko Nishino | be5bd4d | 2025-05-14 21:20:28 +0200 | [diff] [blame] | 459 | > |
| 460 | +----------------------------------+----------- |
| 461 | |text text text text text text text|(1) |
| 462 | |text text text text text text text| ~/aaa.txt |
| 463 | |text text text text text text text|(2) |
| 464 | < |
Hirohito Higashi | 8f7256a | 2025-06-07 18:31:42 +0200 | [diff] [blame] | 465 | The "vert" item of the 'tabpanelopt' option specifies whether a vertical |
| 466 | separator should be displayed between the tabpanel and the display part of the |
| 467 | window: |
Naruhiko Nishino | be5bd4d | 2025-05-14 21:20:28 +0200 | [diff] [blame] | 468 | > |
Hirohito Higashi | 651edf3 | 2025-07-01 22:07:50 +0200 | [diff] [blame] | 469 | +------ This is |
| 470 | | |
| 471 | v |
Naruhiko Nishino | be5bd4d | 2025-05-14 21:20:28 +0200 | [diff] [blame] | 472 | +-----------+---------------------------------- |
| 473 | |(1) |text text text text text text text |
| 474 | | ~/aaa.txt|text text text text text text text |
| 475 | |(2) |text text text text text text text |
| 476 | < |
Hirohito Higashi | 8f7256a | 2025-06-07 18:31:42 +0200 | [diff] [blame] | 477 | The vertical separator character is taken from "tpl_vert" in 'fillchars'. |
Naruhiko Nishino | be5bd4d | 2025-05-14 21:20:28 +0200 | [diff] [blame] | 478 | |
| 479 | You can customize the appearance of the tab page labels using the highlight |
| 480 | groups: |hl-TabPanel| |hl-TabPanelSel| |hl-TabPanelFill| |
| 481 | |
| 482 | ============================================================================== |
| 483 | 6. Setting 'guitablabel' *setting-guitablabel* |
Bram Moolenaar | ba6c052 | 2006-02-25 21:45:02 +0000 | [diff] [blame] | 484 | |
| 485 | When the GUI tab pages line is displayed, 'guitablabel' can be used to |
| 486 | specify the label to display for each tab page. Unlike 'tabline', which |
| 487 | specifies the whole tab pages line at once, 'guitablabel' is used for each |
| 488 | label separately. |
| 489 | |
Bram Moolenaar | 57657d8 | 2006-04-21 22:12:41 +0000 | [diff] [blame] | 490 | 'guitabtooltip' is very similar and is used for the tooltip of the same label. |
| 491 | This only appears when the mouse pointer hovers over the label, thus it |
| 492 | usually is longer. Only supported on some systems though. |
| 493 | |
Bram Moolenaar | ba6c052 | 2006-02-25 21:45:02 +0000 | [diff] [blame] | 494 | See the 'statusline' option for the format of the value. |
| 495 | |
| 496 | The "%N" item can be used for the current tab page number. The |v:lnum| |
Bram Moolenaar | 57657d8 | 2006-04-21 22:12:41 +0000 | [diff] [blame] | 497 | variable is also set to this number when the option is evaluated. |
Bram Moolenaar | a226a6d | 2006-02-26 23:59:20 +0000 | [diff] [blame] | 498 | The items that use a file name refer to the current window of the tab page. |
Bram Moolenaar | ba6c052 | 2006-02-25 21:45:02 +0000 | [diff] [blame] | 499 | |
Bram Moolenaar | 57657d8 | 2006-04-21 22:12:41 +0000 | [diff] [blame] | 500 | Note that syntax highlighting is not used for the option. The %T and %X |
Bram Moolenaar | a226a6d | 2006-02-26 23:59:20 +0000 | [diff] [blame] | 501 | items are also ignored. |
Bram Moolenaar | ba6c052 | 2006-02-25 21:45:02 +0000 | [diff] [blame] | 502 | |
Bram Moolenaar | a226a6d | 2006-02-26 23:59:20 +0000 | [diff] [blame] | 503 | A simple example that puts the tab page number and the buffer name in the |
| 504 | label: > |
Bram Moolenaar | ba6c052 | 2006-02-25 21:45:02 +0000 | [diff] [blame] | 505 | :set guitablabel=%N\ %f |
| 506 | |
Bram Moolenaar | 57657d8 | 2006-04-21 22:12:41 +0000 | [diff] [blame] | 507 | An example that resembles the default 'guitablabel': Show the number of |
Bram Moolenaar | dd2a3cd | 2007-05-05 17:10:09 +0000 | [diff] [blame] | 508 | windows in the tab page and a '+' if there is a modified buffer: > |
Bram Moolenaar | ba6c052 | 2006-02-25 21:45:02 +0000 | [diff] [blame] | 509 | |
Bram Moolenaar | a226a6d | 2006-02-26 23:59:20 +0000 | [diff] [blame] | 510 | function GuiTabLabel() |
Bram Moolenaar | ba6c052 | 2006-02-25 21:45:02 +0000 | [diff] [blame] | 511 | let label = '' |
| 512 | let bufnrlist = tabpagebuflist(v:lnum) |
| 513 | |
| 514 | " Add '+' if one of the buffers in the tab page is modified |
| 515 | for bufnr in bufnrlist |
| 516 | if getbufvar(bufnr, "&modified") |
| 517 | let label = '+' |
| 518 | break |
| 519 | endif |
| 520 | endfor |
| 521 | |
| 522 | " Append the number of windows in the tab page if more than one |
| 523 | let wincount = tabpagewinnr(v:lnum, '$') |
| 524 | if wincount > 1 |
Bram Moolenaar | c51cf03 | 2022-02-26 12:25:45 +0000 | [diff] [blame] | 525 | let label ..= wincount |
Bram Moolenaar | ba6c052 | 2006-02-25 21:45:02 +0000 | [diff] [blame] | 526 | endif |
| 527 | if label != '' |
Bram Moolenaar | c51cf03 | 2022-02-26 12:25:45 +0000 | [diff] [blame] | 528 | let label ..= ' ' |
Bram Moolenaar | ba6c052 | 2006-02-25 21:45:02 +0000 | [diff] [blame] | 529 | endif |
| 530 | |
| 531 | " Append the buffer name |
Bram Moolenaar | c51cf03 | 2022-02-26 12:25:45 +0000 | [diff] [blame] | 532 | return label .. bufname(bufnrlist[tabpagewinnr(v:lnum) - 1]) |
Bram Moolenaar | ba6c052 | 2006-02-25 21:45:02 +0000 | [diff] [blame] | 533 | endfunction |
Bram Moolenaar | a226a6d | 2006-02-26 23:59:20 +0000 | [diff] [blame] | 534 | |
Bram Moolenaar | ba6c052 | 2006-02-25 21:45:02 +0000 | [diff] [blame] | 535 | set guitablabel=%{GuiTabLabel()} |
Bram Moolenaar | a226a6d | 2006-02-26 23:59:20 +0000 | [diff] [blame] | 536 | |
| 537 | Note that the function must be defined before setting the option, otherwise |
| 538 | you get an error message for the function not being known. |
| 539 | |
Bram Moolenaar | d68071d | 2006-05-02 22:08:30 +0000 | [diff] [blame] | 540 | If you want to fall back to the default label, return an empty string. |
| 541 | |
| 542 | If you want to show something specific for a tab page, you might want to use a |
| 543 | tab page local variable. |t:var| |
| 544 | |
Bram Moolenaar | ba6c052 | 2006-02-25 21:45:02 +0000 | [diff] [blame] | 545 | |
Bram Moolenaar | 91f84f6 | 2018-07-29 15:07:52 +0200 | [diff] [blame] | 546 | vim:tw=78:ts=8:noet:ft=help:norl: |