Bram Moolenaar | 8dff818 | 2006-04-06 20:18:50 +0000 | [diff] [blame] | 1 | *tabpage.txt* For Vim version 7.0c. Last change: 2006 Apr 06 |
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| |
Bram Moolenaar | ba6c052 | 2006-02-25 21:45:02 +0000 | [diff] [blame] | 17 | 5. Setting 'guitablabel' |setting-guitablabel| |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 18 | |
| 19 | {Vi does not have any of these commands} |
| 20 | {not able to use multiple tab pages when the |+windows| feature was disabled |
| 21 | at compile time} |
| 22 | |
| 23 | ============================================================================== |
| 24 | 1. Introduction *tab-page-intro* |
| 25 | |
| 26 | A tab page holds one or more windows. You can easily switch between tab |
| 27 | pages, so that you have several collections of windows to work on different |
| 28 | things. |
| 29 | |
| 30 | Usually you will see a list of labels at the top of the Vim window, one for |
| 31 | each tab page. With the mouse you can click on the label to jump to that tab |
| 32 | page. There are other ways to move between tab pages, see below. |
| 33 | |
| 34 | 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] | 35 | commands, |:windo|, |:all| and |:ball| (when not using the |:tab| modifier). |
| 36 | The commands that are aware of other tab pages than the current one are |
| 37 | mentioned below. |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 38 | |
| 39 | Tabs are also a nice way to edit a buffer temporarily without changing the |
| 40 | current window layout. Open a new tab page, do whatever you want to do and |
| 41 | close the tab page. |
| 42 | |
| 43 | ============================================================================== |
| 44 | 2. Commands *tab-page-commands* |
| 45 | |
| 46 | OPENING A NEW TAB PAGE: |
| 47 | |
| 48 | When starting Vim "vim -p filename ..." opens each file argument in a separate |
Bram Moolenaar | e1438bb | 2006-03-01 22:01:55 +0000 | [diff] [blame] | 49 | tab page (up to 'tabpagemax'). |-p| |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 50 | |
Bram Moolenaar | bfb2d40 | 2006-03-03 22:50:42 +0000 | [diff] [blame] | 51 | A double click with the mouse in the non-GUI tab pages line opens a new, empty |
| 52 | tab page. It is placed left of the position of the click. The first click |
| 53 | may select another tab page first, causing an extra screen update. |
| 54 | |
| 55 | In the GUI tab pages line you can use the right mouse button to open menu. |
| 56 | |tabline-menu|. |
Bram Moolenaar | 80a94a5 | 2006-02-23 21:26:58 +0000 | [diff] [blame] | 57 | |
| 58 | :tabe[dit] *:tabe* *:tabedit* *:tabnew* |
| 59 | :tabnew Open a new tab page with an empty window, after the current |
| 60 | tab page. |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 61 | |
| 62 | :tabe[dit] [++opt] [+cmd] {file} |
Bram Moolenaar | 80a94a5 | 2006-02-23 21:26:58 +0000 | [diff] [blame] | 63 | :tabnew [++opt] [+cmd] {file} |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 64 | Open a new tab page and edit {file}, like with |:edit|. |
| 65 | |
Bram Moolenaar | 2a0449d | 2006-02-20 21:27:21 +0000 | [diff] [blame] | 66 | :tabf[ind] [++opt] [+cmd] {file} *:tabf* *:tabfind* |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 67 | 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 Moolenaar | 80a94a5 | 2006-02-23 21:26:58 +0000 | [diff] [blame] | 72 | :[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 Moolenaar | 8dff818 | 2006-04-06 20:18:50 +0000 | [diff] [blame] | 82 | CTRL-W gf Open a new tab page and edit the file name under the cursor. |
| 83 | See |CTRL-W_gf|. |
| 84 | |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 85 | |
| 86 | CLOSING A TAB PAGE: |
| 87 | |
Bram Moolenaar | 80a94a5 | 2006-02-23 21:26:58 +0000 | [diff] [blame] | 88 | Closing the last window of a tab page closes the tab page too, unless there is |
| 89 | only one tab page. |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 90 | |
| 91 | 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] | 92 | the top right to close the current tab page. A custom |'tabline'| may show |
| 93 | something else. |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 94 | |
| 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 | |
| 119 | SWITCHING TO ANOTHER TAB PAGE: |
| 120 | |
| 121 | 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] | 122 | label to switch to that tab page. Click where there is no label to go to the |
| 123 | next tab page. |'tabline'| |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 124 | |
Bram Moolenaar | 910f66f | 2006-04-05 20:41:53 +0000 | [diff] [blame] | 125 | :tabn[ext] *:tabn* *:tabnext* *gt* |
| 126 | gt *CTRL-<PageDown>* *<C-PageDown>* |
| 127 | <C-PageDown> 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] | 128 | first one. |
| 129 | |
Bram Moolenaar | 80a94a5 | 2006-02-23 21:26:58 +0000 | [diff] [blame] | 130 | :tabn[ext] {count} |
Bram Moolenaar | 910f66f | 2006-04-05 20:41:53 +0000 | [diff] [blame] | 131 | {count}gt *CTRL-<PageUp>* *<C-PageUp>* |
| 132 | <C-PageUp> Go to tab page {count}. The first tab page has number one. |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 133 | |
| 134 | |
Bram Moolenaar | 80a94a5 | 2006-02-23 21:26:58 +0000 | [diff] [blame] | 135 | :tabp[revious] *:tabp* *:tabprevious* *gT* |
| 136 | :tabN[ext] *:tabN* *:tabNext* |
| 137 | gT Go to the previous tab page. Wraps around from the first one |
| 138 | to the last one. |
| 139 | |
| 140 | :tabp[revious] {count} |
| 141 | :tabN[ext] {count} |
| 142 | {count}gT Go {count} tab pages back. Wraps around from the first one |
| 143 | to the last one. |
| 144 | |
Bram Moolenaar | 32466aa | 2006-02-24 23:53:04 +0000 | [diff] [blame] | 145 | :tabr[ewind] *:tabfir* *:tabfirst* *:tabr* *:tabrewind* |
Bram Moolenaar | ba6c052 | 2006-02-25 21:45:02 +0000 | [diff] [blame] | 146 | :tabfir[st] Go to the first tab page. |
Bram Moolenaar | 32466aa | 2006-02-24 23:53:04 +0000 | [diff] [blame] | 147 | |
| 148 | *:tabl* *:tablast* |
| 149 | :tabl[ast] Go to the last tab page. |
| 150 | |
Bram Moolenaar | 80a94a5 | 2006-02-23 21:26:58 +0000 | [diff] [blame] | 151 | |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 152 | Other commands: |
| 153 | *:tabs* |
Bram Moolenaar | 80a94a5 | 2006-02-23 21:26:58 +0000 | [diff] [blame] | 154 | :tabs List the tab pages and the windows they contain. |
| 155 | Shows a ">" for the current window. |
| 156 | Shows a "+" for modified buffers. |
| 157 | |
| 158 | |
| 159 | REORDERING TAB PAGES: |
| 160 | |
| 161 | *:tabm* *:tabmove* |
| 162 | :tabmove N Move the current tab page to after tab page N. Use zero to |
| 163 | make the current tab page the first one. Without N the tab |
| 164 | page is made the last one. |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 165 | |
Bram Moolenaar | 32466aa | 2006-02-24 23:53:04 +0000 | [diff] [blame] | 166 | |
| 167 | LOOPING OVER TAB PAGES: |
| 168 | |
| 169 | *:tabd* *:tabdo* |
| 170 | :tabd[o] {cmd} Execute {cmd} in each tab page. |
| 171 | It works like doing this: > |
| 172 | :tabfirst |
| 173 | :{cmd} |
| 174 | :tabnext |
| 175 | :{cmd} |
| 176 | etc. |
| 177 | < This only operates in the current window of each tab page. |
| 178 | When an error is detected on one tab page, further tab pages |
| 179 | will not be visited. |
| 180 | The last tab page (or where an error occurred) becomes the |
| 181 | current tab page. |
| 182 | {cmd} can contain '|' to concatenate several commands. |
| 183 | {cmd} must not open or close tab pages or reorder them. |
| 184 | {not in Vi} {not available when compiled without the |
| 185 | |+listcmds| feature} |
| 186 | Also see |:windo|, |:argdo| and |:bufdo|. |
| 187 | |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 188 | ============================================================================== |
| 189 | 3. Other items *tab-page-other* |
| 190 | |
Bram Moolenaar | bfb2d40 | 2006-03-03 22:50:42 +0000 | [diff] [blame] | 191 | *tabline-menu* |
| 192 | The GUI tab pages line has a popup menu. It is accessed with a right click. |
| 193 | The entries are: |
| 194 | Close Close the tab page under the mouse pointer. The |
| 195 | current one if there is no label under the mouse |
| 196 | pointer. |
| 197 | New Tab Open a tab page, editing an empty buffer. It appears |
| 198 | to the left of the mouse pointer. |
| 199 | Open Tab... Like "New Tab" and additionaly use a file selector to |
| 200 | select a file to edit. |
| 201 | |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 202 | Diff mode works per tab page. You can see the diffs between several files |
| 203 | within one tab page. Other tab pages can show differences between other |
| 204 | files. |
| 205 | |
Bram Moolenaar | 910f66f | 2006-04-05 20:41:53 +0000 | [diff] [blame] | 206 | Variables local to a tab page start with "t:". |tabpage-variable| |
| 207 | |
Bram Moolenaar | 2a0449d | 2006-02-20 21:27:21 +0000 | [diff] [blame] | 208 | The TabLeave and TabEnter autocommand events can be used to do something when |
| 209 | switching from one tab page to another. The exact order depends on what you |
| 210 | are doing. When creating a new tab page this works as if you create a new |
| 211 | window on the same buffer and then edit another buffer. Thus ":tabnew" |
| 212 | triggers: |
| 213 | WinLeave leave current window |
| 214 | TabLeave leave current tab page |
| 215 | TabEnter enter new tab page |
| 216 | WinEnter enter window in new tab page |
| 217 | BufLeave leave current buffer |
| 218 | BufEnter enter new empty buffer |
| 219 | |
Bram Moolenaar | 030f0df | 2006-02-21 22:02:53 +0000 | [diff] [blame] | 220 | When switching to another tab page the order is: |
Bram Moolenaar | 2a0449d | 2006-02-20 21:27:21 +0000 | [diff] [blame] | 221 | BufLeave |
| 222 | WinLeave |
| 223 | TabLeave |
| 224 | TabEnter |
| 225 | WinEnter |
| 226 | BufEnter |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 227 | |
Bram Moolenaar | 030f0df | 2006-02-21 22:02:53 +0000 | [diff] [blame] | 228 | ============================================================================== |
| 229 | 4. Setting 'tabline' *setting-tabline* |
| 230 | |
Bram Moolenaar | ba6c052 | 2006-02-25 21:45:02 +0000 | [diff] [blame] | 231 | The 'tabline' option specifies what the line with tab pages labels looks like. |
| 232 | It is only used when there is no GUI tab line. |
| 233 | |
Bram Moolenaar | 030f0df | 2006-02-21 22:02:53 +0000 | [diff] [blame] | 234 | You can use the 'showtabline' option to specify when you want the line with |
| 235 | tab page labels to appear: never, when there is more than one tab page or |
| 236 | always. |
| 237 | |
| 238 | The highlighting of the tab pages line is set with the groups TabLine |
| 239 | TabLineSel and TabLineFill. |hl-TabLine| |hl-TabLineSel| |hl-TabLineFill| |
| 240 | |
| 241 | The 'tabline' option allows you to define your preferred way to tab pages |
| 242 | labels. This isn't easy, thus an example will be given here. |
| 243 | |
| 244 | For basics see the 'statusline' option. The same items can be used in the |
| 245 | 'tabline' option. Additionally, the |tabpagebuflist()|, |tabpagenr()| and |
| 246 | |tabpagewinnr()| functions are useful. |
| 247 | |
| 248 | Since the number of tab labels will vary, you need to use an expresion for the |
| 249 | whole option. Something like: > |
| 250 | :set tabline=%!MyTabLine() |
| 251 | |
| 252 | Then define the MyTabLine() function to list all the tab pages labels. A |
| 253 | convenient method is to split it in two parts: First go over all the tab |
| 254 | pages and define labels for them. Then get the label for each tab page. > |
| 255 | |
| 256 | function MyTabLine() |
| 257 | let s = '' |
| 258 | for i in range(tabpagenr('$')) |
Bram Moolenaar | d1f56e6 | 2006-02-22 21:25:37 +0000 | [diff] [blame] | 259 | " select the highlighting |
Bram Moolenaar | 030f0df | 2006-02-21 22:02:53 +0000 | [diff] [blame] | 260 | if i + 1 == tabpagenr() |
| 261 | let s .= '%#TabLineSel#' |
| 262 | else |
| 263 | let s .= '%#TabLine#' |
| 264 | endif |
Bram Moolenaar | d1f56e6 | 2006-02-22 21:25:37 +0000 | [diff] [blame] | 265 | |
| 266 | " set the tab page number (for mouse clicks) |
| 267 | let s .= '%' . (i + 1) . 'T' |
| 268 | |
| 269 | " the label is made by MyTabLabel() |
Bram Moolenaar | 030f0df | 2006-02-21 22:02:53 +0000 | [diff] [blame] | 270 | let s .= ' %{MyTabLabel(' . (i + 1) . ')} ' |
| 271 | endfor |
Bram Moolenaar | d1f56e6 | 2006-02-22 21:25:37 +0000 | [diff] [blame] | 272 | |
| 273 | " after the last tab fill with TabLineFill and reset tab page nr |
| 274 | let s .= '%#TabLineFill#%T' |
| 275 | |
| 276 | " right-align the label to close the current tab page |
| 277 | if tabpagenr('$') > 1 |
| 278 | let s .= '%=%#TabLine#%999Xclose' |
| 279 | endif |
| 280 | |
Bram Moolenaar | 030f0df | 2006-02-21 22:02:53 +0000 | [diff] [blame] | 281 | return s |
| 282 | endfunction |
| 283 | |
| 284 | Now the MyTabLabel() function is called for each tab page to get its label. > |
| 285 | |
| 286 | function MyTabLabel(n) |
| 287 | let buflist = tabpagebuflist(a:n) |
| 288 | let winnr = tabpagewinnr(a:n) |
| 289 | return bufname(buflist[winnr - 1]) |
| 290 | endfunction |
| 291 | |
| 292 | This is just a simplistic example that results in a tab pages line that |
| 293 | resembles the default, but without adding a + for a modified buffer or |
| 294 | trunctating the names. You will want to reduce the width of labels in a |
| 295 | 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] | 296 | space available. |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 297 | |
Bram Moolenaar | ba6c052 | 2006-02-25 21:45:02 +0000 | [diff] [blame] | 298 | ============================================================================== |
| 299 | 5. Setting 'guitablabel' *setting-guitablabel* |
| 300 | |
| 301 | When the GUI tab pages line is displayed, 'guitablabel' can be used to |
| 302 | specify the label to display for each tab page. Unlike 'tabline', which |
| 303 | specifies the whole tab pages line at once, 'guitablabel' is used for each |
| 304 | label separately. |
| 305 | |
| 306 | See the 'statusline' option for the format of the value. |
| 307 | |
| 308 | The "%N" item can be used for the current tab page number. The |v:lnum| |
Bram Moolenaar | a226a6d | 2006-02-26 23:59:20 +0000 | [diff] [blame] | 309 | variable is also set to this number when 'guitablabel' is evaluated. |
| 310 | 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] | 311 | |
| 312 | Note that syntax highlighting is not used for 'guitablabel'. The %T and %X |
Bram Moolenaar | a226a6d | 2006-02-26 23:59:20 +0000 | [diff] [blame] | 313 | items are also ignored. |
Bram Moolenaar | ba6c052 | 2006-02-25 21:45:02 +0000 | [diff] [blame] | 314 | |
Bram Moolenaar | a226a6d | 2006-02-26 23:59:20 +0000 | [diff] [blame] | 315 | A simple example that puts the tab page number and the buffer name in the |
| 316 | label: > |
Bram Moolenaar | ba6c052 | 2006-02-25 21:45:02 +0000 | [diff] [blame] | 317 | :set guitablabel=%N\ %f |
| 318 | |
| 319 | An example that resembles the default: Show the number of windows in the tab |
| 320 | page and a '+' if there is a modifed buffer: > |
| 321 | |
Bram Moolenaar | a226a6d | 2006-02-26 23:59:20 +0000 | [diff] [blame] | 322 | function GuiTabLabel() |
Bram Moolenaar | ba6c052 | 2006-02-25 21:45:02 +0000 | [diff] [blame] | 323 | let label = '' |
| 324 | let bufnrlist = tabpagebuflist(v:lnum) |
| 325 | |
| 326 | " Add '+' if one of the buffers in the tab page is modified |
| 327 | for bufnr in bufnrlist |
| 328 | if getbufvar(bufnr, "&modified") |
| 329 | let label = '+' |
| 330 | break |
| 331 | endif |
| 332 | endfor |
| 333 | |
| 334 | " Append the number of windows in the tab page if more than one |
| 335 | let wincount = tabpagewinnr(v:lnum, '$') |
| 336 | if wincount > 1 |
| 337 | let label .= wincount |
| 338 | endif |
| 339 | if label != '' |
| 340 | let label .= ' ' |
| 341 | endif |
| 342 | |
| 343 | " Append the buffer name |
| 344 | return label . bufname(bufnrlist[tabpagewinnr(v:lnum) - 1]) |
| 345 | endfunction |
Bram Moolenaar | a226a6d | 2006-02-26 23:59:20 +0000 | [diff] [blame] | 346 | |
Bram Moolenaar | ba6c052 | 2006-02-25 21:45:02 +0000 | [diff] [blame] | 347 | set guitablabel=%{GuiTabLabel()} |
Bram Moolenaar | a226a6d | 2006-02-26 23:59:20 +0000 | [diff] [blame] | 348 | |
| 349 | Note that the function must be defined before setting the option, otherwise |
| 350 | you get an error message for the function not being known. |
| 351 | |
Bram Moolenaar | ba6c052 | 2006-02-25 21:45:02 +0000 | [diff] [blame] | 352 | |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 353 | vim:tw=78:ts=8:ft=help:norl: |