blob: 0b961150411b9a377083633088704b8286398027 [file] [log] [blame]
Bram Moolenaar26967612019-03-17 17:13:16 +01001*windows.txt* For Vim version 8.1. Last change: 2019 Mar 17
Bram Moolenaar071d4272004-06-13 20:20:40 +00002
3
4 VIM REFERENCE MANUAL by Bram Moolenaar
5
6
7Editing with multiple windows and buffers. *windows* *buffers*
8
9The commands which have been added to use multiple windows and buffers are
10explained here. Additionally, there are explanations for commands that work
11differently when used in combination with more than one window.
12
13The basics are explained in chapter 7 and 8 of the user manual |usr_07.txt|
14|usr_08.txt|.
15
161. Introduction |windows-intro|
172. Starting Vim |windows-starting|
183. Opening and closing a window |opening-window|
194. Moving cursor to other windows |window-move-cursor|
205. Moving windows around |window-moving|
216. Window resizing |window-resize|
227. Argument and buffer list commands |buffer-list|
238. Do a command in all buffers or windows |list-repeat|
249. Tag or file name under the cursor |window-tag|
2510. The preview window |preview-window|
2611. Using hidden buffers |buffer-hidden|
2712. Special kinds of buffers |special-buffers|
28
29{Vi does not have any of these commands}
30{not able to use multiple windows when the |+windows| feature was disabled at
31compile time}
32{not able to use vertically split windows when the |+vertsplit| feature was
33disabled at compile time}
34
35==============================================================================
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000361. Introduction *windows-intro* *window*
Bram Moolenaar071d4272004-06-13 20:20:40 +000037
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +010038Summary:
39 A buffer is the in-memory text of a file.
40 A window is a viewport on a buffer.
41 A tab page is a collection of windows.
42
Bram Moolenaar071d4272004-06-13 20:20:40 +000043A window is a viewport onto a buffer. You can use multiple windows on one
44buffer, or several windows on different buffers.
45
46A buffer is a file loaded into memory for editing. The original file remains
47unchanged until you write the buffer to the file.
48
49A buffer can be in one of three states:
50
51 *active-buffer*
52active: The buffer is displayed in a window. If there is a file for this
53 buffer, it has been read into the buffer. The buffer may have been
54 modified since then and thus be different from the file.
55 *hidden-buffer*
56hidden: The buffer is not displayed. If there is a file for this buffer, it
57 has been read into the buffer. Otherwise it's the same as an active
58 buffer, you just can't see it.
59 *inactive-buffer*
60inactive: The buffer is not displayed and does not contain anything. Options
61 for the buffer are remembered if the file was once loaded. It can
62 contain marks from the |viminfo| file. But the buffer doesn't
63 contain text.
64
65In a table:
66
67state displayed loaded ":buffers" ~
68 in window shows ~
69active yes yes 'a'
70hidden no yes 'h'
71inactive no no ' '
72
73Note: All CTRL-W commands can also be executed with |:wincmd|, for those
74places where a Normal mode command can't be used or is inconvenient.
75
Bram Moolenaar7e8fd632006-02-18 22:14:51 +000076The main Vim window can hold several split windows. There are also tab pages
77|tab-page|, each of which can hold multiple windows.
Bram Moolenaare4a3bcf2016-08-26 19:52:37 +020078 *window-ID* *winid* *windowid*
Bram Moolenaarc95a3022016-06-12 23:01:46 +020079Each window has a unique identifier called the window ID. This identifier
80will not change within a Vim session. The |win_getid()| and |win_id2tabwin()|
81functions can be used to convert between the window/tab number and the
82identifier. There is also the window number, which may change whenever
83windows are opened or closed, see |winnr()|.
Bram Moolenaarba3ff532018-11-04 14:45:49 +010084The window number is only valid in one specific tab. The window ID is valid
85across tabs. For most functions that take a window ID or a window number, the
86window number only applies to the current tab, while the window ID can refer
87to a window in any tab.
Bram Moolenaarc95a3022016-06-12 23:01:46 +020088
89Each buffer has a unique number and the number will not change within a Vim
90session. The |bufnr()| and |bufname()| functions can be used to convert
91between a buffer name and the buffer number.
92
Bram Moolenaar071d4272004-06-13 20:20:40 +000093==============================================================================
942. Starting Vim *windows-starting*
95
96By default, Vim starts with one window, just like Vi.
97
98The "-o" and "-O" arguments to Vim can be used to open a window for each file
99in the argument list. The "-o" argument will split the windows horizontally;
100the "-O" argument will split the windows vertically. If both "-o" and "-O"
101are given, the last one encountered will be used to determine the split
102orientation. For example, this will open three windows, split horizontally: >
103 vim -o file1 file2 file3
104
105"-oN", where N is a decimal number, opens N windows split horizontally. If
106there are more file names than windows, only N windows are opened and some
107files do not get a window. If there are more windows than file names, the
108last few windows will be editing empty buffers. Similarly, "-ON" opens N
109windows split vertically, with the same restrictions.
110
111If there are many file names, the windows will become very small. You might
112want to set the 'winheight' and/or 'winwidth' options to create a workable
113situation.
114
115Buf/Win Enter/Leave |autocommand|s are not executed when opening the new
116windows and reading the files, that's only done when they are really entered.
117
118 *status-line*
119A status line will be used to separate windows. The 'laststatus' option tells
120when the last window also has a status line:
121 'laststatus' = 0 never a status line
122 'laststatus' = 1 status line if there is more than one window
123 'laststatus' = 2 always a status line
124
125You can change the contents of the status line with the 'statusline' option.
Bram Moolenaarb5bf5b82004-12-24 14:35:23 +0000126This option can be local to the window, so that you can have a different
127status line in each window.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000128
129Normally, inversion is used to display the status line. This can be changed
130with the 's' character in the 'highlight' option. For example, "sb" sets it to
131bold characters. If no highlighting is used for the status line ("sn"), the
132'^' character is used for the current window, and '=' for other windows. If
133the mouse is supported and enabled with the 'mouse' option, a status line can
134be dragged to resize windows.
135
136Note: If you expect your status line to be in reverse video and it isn't,
137check if the 'highlight' option contains "si". In version 3.0, this meant to
138invert the status line. Now it should be "sr", reverse the status line, as
139"si" now stands for italic! If italic is not available on your terminal, the
140status line is inverted anyway; you will only see this problem on terminals
141that have termcap codes for italics.
142
143==============================================================================
1443. Opening and closing a window *opening-window* *E36*
145
146CTRL-W s *CTRL-W_s*
147CTRL-W S *CTRL-W_S*
148CTRL-W CTRL-S *CTRL-W_CTRL-S*
Bram Moolenaar7b449342014-03-25 13:03:48 +0100149:[N]sp[lit] [++opt] [+cmd] [file] *:sp* *:split*
Bram Moolenaar071d4272004-06-13 20:20:40 +0000150 Split current window in two. The result is two viewports on
Bram Moolenaar7b449342014-03-25 13:03:48 +0100151 the same file.
152
153 Make the new window N high (default is to use half the height
154 of the current window). Reduces the current window height to
155 create room (and others, if the 'equalalways' option is set,
156 'eadirection' isn't "hor", and one of them is higher than the
157 current or the new window).
158
159 If [file] is given it will be edited in the new window. If it
160 is not loaded in any buffer, it will be read. Else the new
161 window will use the already loaded buffer.
162
Bram Moolenaar071d4272004-06-13 20:20:40 +0000163 Note: CTRL-S does not work on all terminals and might block
164 further input, use CTRL-Q to get going again.
165 Also see |++opt| and |+cmd|.
166
167CTRL-W CTRL-V *CTRL-W_CTRL-V*
168CTRL-W v *CTRL-W_v*
169:[N]vs[plit] [++opt] [+cmd] [file] *:vs* *:vsplit*
Bram Moolenaar67f71312007-08-12 14:55:56 +0000170 Like |:split|, but split vertically. The windows will be
171 spread out horizontally if
172 1. a width was not specified,
173 2. 'equalalways' is set,
174 3. 'eadirection' isn't "ver", and
Bram Moolenaarc1a11ed2008-06-24 22:09:24 +0000175 4. one of the other windows is wider than the current or new
Bram Moolenaar67f71312007-08-12 14:55:56 +0000176 window.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000177 Note: In other places CTRL-Q does the same as CTRL-V, but here
178 it doesn't!
179
180CTRL-W n *CTRL-W_n*
181CTRL-W CTRL_N *CTRL-W_CTRL-N*
182:[N]new [++opt] [+cmd] *:new*
183 Create a new window and start editing an empty file in it.
184 Make new window N high (default is to use half the existing
185 height). Reduces the current window height to create room (and
186 others, if the 'equalalways' option is set and 'eadirection'
187 isn't "hor").
188 Also see |++opt| and |+cmd|.
189 If 'fileformats' is not empty, the first format given will be
190 used for the new buffer. If 'fileformats' is empty, the
191 'fileformat' of the current buffer is used. This can be
192 overridden with the |++opt| argument.
193 Autocommands are executed in this order:
194 1. WinLeave for the current window
195 2. WinEnter for the new window
196 3. BufLeave for the current buffer
197 4. BufEnter for the new buffer
Bram Moolenaar53bfca22012-04-13 23:04:47 +0200198 This behaves like a ":split" first, and then an ":enew"
199 command.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000200
201:[N]vne[w] [++opt] [+cmd] [file] *:vne* *:vnew*
202 Like |:new|, but split vertically. If 'equalalways' is set
203 and 'eadirection' isn't "ver" the windows will be spread out
204 horizontally, unless a width was specified.
205
206:[N]new [++opt] [+cmd] {file}
207:[N]sp[lit] [++opt] [+cmd] {file} *:split_f*
Bram Moolenaar53bfca22012-04-13 23:04:47 +0200208 Create a new window and start editing file {file} in it. This
209 behaves like a ":split" first, and then an ":e" command.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000210 If [+cmd] is given, execute the command when the file has been
211 loaded |+cmd|.
212 Also see |++opt|.
213 Make new window N high (default is to use half the existing
214 height). Reduces the current window height to create room
215 (and others, if the 'equalalways' option is set).
216
217:[N]sv[iew] [++opt] [+cmd] {file} *:sv* *:sview* *splitview*
218 Same as ":split", but set 'readonly' option for this buffer.
219
220:[N]sf[ind] [++opt] [+cmd] {file} *:sf* *:sfind* *splitfind*
Bram Moolenaarc236c162008-07-13 17:41:49 +0000221 Same as ":split", but search for {file} in 'path' like in
222 |:find|. Doesn't split if {file} is not found.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000223
224CTRL-W CTRL-^ *CTRL-W_CTRL-^* *CTRL-W_^*
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100225CTRL-W ^ Split the current window in two and edit the alternate file.
226 When a count N is given, split the current window and edit
227 buffer N. Similar to ":sp #" and ":sp #N", but it allows the
228 other buffer to be unnamed. This command matches the behavior
229 of |CTRL-^|, except that it splits a window first.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000230
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +0200231 *CTRL-W_:*
Bram Moolenaard2f3a8b2018-06-19 14:35:59 +0200232CTRL-W : Does the same as typing |:| - enter a command line. Useful in a
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +0200233 terminal window, where all Vim commands must be preceded with
Bram Moolenaard2f3a8b2018-06-19 14:35:59 +0200234 CTRL-W or 'termwinkey'.
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +0200235
Bram Moolenaar071d4272004-06-13 20:20:40 +0000236Note that the 'splitbelow' and 'splitright' options influence where a new
237window will appear.
238
239 *:vert* *:vertical*
240:vert[ical] {cmd}
241 Execute {cmd}. If it contains a command that splits a window,
242 it will be split vertically.
Bram Moolenaar756ec0f2007-05-05 17:59:48 +0000243 Doesn't work for |:execute| and |:normal|.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000244
245:lefta[bove] {cmd} *:lefta* *:leftabove*
246:abo[veleft] {cmd} *:abo* *:aboveleft*
247 Execute {cmd}. If it contains a command that splits a window,
248 it will be opened left (vertical split) or above (horizontal
249 split) the current window. Overrules 'splitbelow' and
250 'splitright'.
Bram Moolenaar756ec0f2007-05-05 17:59:48 +0000251 Doesn't work for |:execute| and |:normal|.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000252
253:rightb[elow] {cmd} *:rightb* *:rightbelow*
254:bel[owright] {cmd} *:bel* *:belowright*
255 Execute {cmd}. If it contains a command that splits a window,
256 it will be opened right (vertical split) or below (horizontal
257 split) the current window. Overrules 'splitbelow' and
258 'splitright'.
Bram Moolenaar756ec0f2007-05-05 17:59:48 +0000259 Doesn't work for |:execute| and |:normal|.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000260
261 *:topleft* *E442*
262:to[pleft] {cmd}
263 Execute {cmd}. If it contains a command that splits a window,
264 it will appear at the top and occupy the full width of the Vim
265 window. When the split is vertical the window appears at the
266 far left and occupies the full height of the Vim window.
Bram Moolenaar756ec0f2007-05-05 17:59:48 +0000267 Doesn't work for |:execute| and |:normal|.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000268
Bram Moolenaarbc8801c2016-08-02 21:04:33 +0200269 *:bo* *:botright*
Bram Moolenaar071d4272004-06-13 20:20:40 +0000270:bo[tright] {cmd}
271 Execute {cmd}. If it contains a command that splits a window,
272 it will appear at the bottom and occupy the full width of the
273 Vim window. When the split is vertical the window appears at
274 the far right and occupies the full height of the Vim window.
Bram Moolenaar756ec0f2007-05-05 17:59:48 +0000275 Doesn't work for |:execute| and |:normal|.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000276
277These command modifiers can be combined to make a vertically split window
278occupy the full height. Example: >
Bram Moolenaar5302d9e2011-09-14 17:55:08 +0200279 :vertical topleft split tags
Bram Moolenaar071d4272004-06-13 20:20:40 +0000280Opens a vertically split, full-height window on the "tags" file at the far
281left of the Vim window.
282
283
284Closing a window
285----------------
286
Bram Moolenaarb96a7f32014-11-27 16:22:48 +0100287:q[uit]
288:{count}q[uit]
Bram Moolenaar071d4272004-06-13 20:20:40 +0000289CTRL-W q *CTRL-W_q*
290CTRL-W CTRL-Q *CTRL-W_CTRL-Q*
Bram Moolenaarb96a7f32014-11-27 16:22:48 +0100291 Without {count}: Quit the current window. If {count} is
292 given quit the {count} window.
293
294 When quitting the last window (not counting a help window),
295 exit Vim.
296
Bram Moolenaar071d4272004-06-13 20:20:40 +0000297 When 'hidden' is set, and there is only one window for the
Bram Moolenaarb96a7f32014-11-27 16:22:48 +0100298 current buffer, it becomes hidden. When 'hidden' is not set,
299 and there is only one window for the current buffer, and the
300 buffer was changed, the command fails.
301
Bram Moolenaared32d942014-12-06 23:33:00 +0100302 (Note: CTRL-Q does not work on all terminals).
303
304 If [count] is greater than the last window number the last
305 window will be closed: >
Bram Moolenaarb96a7f32014-11-27 16:22:48 +0100306 :1quit " quit the first window
307 :$quit " quit the last window
308 :9quit " quit the last window
Bram Moolenaar46fceaa2016-10-23 21:21:08 +0200309 " if there are fewer than 9 windows opened
310 :-quit " quit the previous window
Bram Moolenaarb96a7f32014-11-27 16:22:48 +0100311 :+quit " quit the next window
Bram Moolenaared32d942014-12-06 23:33:00 +0100312 :+2quit " quit the second next window
Bram Moolenaarb96a7f32014-11-27 16:22:48 +0100313<
314:q[uit]!
315:{count}q[uit]!
316 Without {count}: Quit the current window. If {count} is
317 given quit the {count} window.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000318
Bram Moolenaarb96a7f32014-11-27 16:22:48 +0100319 If this was the last window for a buffer, any changes to that
320 buffer are lost. When quitting the last window (not counting
321 help windows), exit Vim. The contents of the buffer are lost,
322 even when 'hidden' is set.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000323
Bram Moolenaarb96a7f32014-11-27 16:22:48 +0100324:clo[se][!]
325:{count}clo[se][!]
Bram Moolenaar071d4272004-06-13 20:20:40 +0000326CTRL-W c *CTRL-W_c* *:clo* *:close*
Bram Moolenaarb96a7f32014-11-27 16:22:48 +0100327 Without {count}: Close the current window. If {count} is
328 given close the {count} window.
329
330 When the 'hidden' option is set, or when the buffer was
331 changed and the [!] is used, the buffer becomes hidden (unless
332 there is another window editing it).
333
Bram Moolenaar7e8fd632006-02-18 22:14:51 +0000334 When there is only one window in the current tab page and
335 there is another tab page, this closes the current tab page.
336 |tab-page|.
Bram Moolenaarb96a7f32014-11-27 16:22:48 +0100337
Bram Moolenaar071d4272004-06-13 20:20:40 +0000338 This command fails when: *E444*
339 - There is only one window on the screen.
340 - When 'hidden' is not set, [!] is not used, the buffer has
341 changes, and there is no other window on this buffer.
342 Changes to the buffer are not written and won't get lost, so
343 this is a "safe" command.
344
345CTRL-W CTRL-C *CTRL-W_CTRL-C*
346 You might have expected that CTRL-W CTRL-C closes the current
347 window, but that does not work, because the CTRL-C cancels the
348 command.
349
350 *:hide*
Bram Moolenaarb96a7f32014-11-27 16:22:48 +0100351:hid[e]
352:{count}hid[e]
Bram Moolenaarc572da52017-08-27 16:52:01 +0200353 Without {count}: Quit the current window, unless it is the
354 last window on the screen.
355 If {count} is given quit the {count} window.
Bram Moolenaarb96a7f32014-11-27 16:22:48 +0100356
357 The buffer becomes hidden (unless there is another window
Bram Moolenaared32d942014-12-06 23:33:00 +0100358 editing it or 'bufhidden' is "unload", "delete" or "wipe").
359 If the window is the last one in the current tab page the tab
360 page is closed. |tab-page|
Bram Moolenaarb96a7f32014-11-27 16:22:48 +0100361
362 The value of 'hidden' is irrelevant for this command. Changes
363 to the buffer are not written and won't get lost, so this is a
364 "safe" command.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000365
366:hid[e] {cmd} Execute {cmd} with 'hidden' is set. The previous value of
367 'hidden' is restored after {cmd} has been executed.
368 Example: >
369 :hide edit Makefile
370< This will edit "Makefile", and hide the current buffer if it
371 has any changes.
372
Bram Moolenaarb96a7f32014-11-27 16:22:48 +0100373:on[ly][!]
374:{count}on[ly][!]
Bram Moolenaar071d4272004-06-13 20:20:40 +0000375CTRL-W o *CTRL-W_o* *E445*
376CTRL-W CTRL-O *CTRL-W_CTRL-O* *:on* *:only*
Bram Moolenaarb96a7f32014-11-27 16:22:48 +0100377 Make the current window the only one on the screen. All other
378 windows are closed. For {count} see |:quit| command.
379
Bram Moolenaar071d4272004-06-13 20:20:40 +0000380 When the 'hidden' option is set, all buffers in closed windows
381 become hidden.
Bram Moolenaarb96a7f32014-11-27 16:22:48 +0100382
Bram Moolenaar071d4272004-06-13 20:20:40 +0000383 When 'hidden' is not set, and the 'autowrite' option is set,
384 modified buffers are written. Otherwise, windows that have
385 buffers that are modified are not removed, unless the [!] is
386 given, then they become hidden. But modified buffers are
387 never abandoned, so changes cannot get lost.
388
389==============================================================================
3904. Moving cursor to other windows *window-move-cursor*
391
392CTRL-W <Down> *CTRL-W_<Down>*
393CTRL-W CTRL-J *CTRL-W_CTRL-J* *CTRL-W_j*
394CTRL-W j Move cursor to Nth window below current one. Uses the cursor
395 position to select between alternatives.
396
397CTRL-W <Up> *CTRL-W_<Up>*
398CTRL-W CTRL-K *CTRL-W_CTRL-K* *CTRL-W_k*
399CTRL-W k Move cursor to Nth window above current one. Uses the cursor
400 position to select between alternatives.
401
402CTRL-W <Left> *CTRL-W_<Left>*
403CTRL-W CTRL-H *CTRL-W_CTRL-H*
404CTRL-W <BS> *CTRL-W_<BS>* *CTRL-W_h*
405CTRL-W h Move cursor to Nth window left of current one. Uses the
406 cursor position to select between alternatives.
407
408CTRL-W <Right> *CTRL-W_<Right>*
409CTRL-W CTRL-L *CTRL-W_CTRL-L* *CTRL-W_l*
410CTRL-W l Move cursor to Nth window right of current one. Uses the
411 cursor position to select between alternatives.
412
413CTRL-W w *CTRL-W_w* *CTRL-W_CTRL-W*
414CTRL-W CTRL-W Without count: move cursor to window below/right of the
415 current one. If there is no window below or right, go to
416 top-left window.
417 With count: go to Nth window (windows are numbered from
418 top-left to bottom-right). To obtain the window number see
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +0100419 |bufwinnr()| and |winnr()|. When N is larger than the number
420 of windows go to the last window.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000421
422 *CTRL-W_W*
423CTRL-W W Without count: move cursor to window above/left of current
424 one. If there is no window above or left, go to bottom-right
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +0100425 window. With count: go to Nth window, like with CTRL-W w.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000426
427CTRL-W t *CTRL-W_t* *CTRL-W_CTRL-T*
428CTRL-W CTRL-T Move cursor to top-left window.
429
430CTRL-W b *CTRL-W_b* *CTRL-W_CTRL-B*
431CTRL-W CTRL-B Move cursor to bottom-right window.
432
433CTRL-W p *CTRL-W_p* *CTRL-W_CTRL-P*
434CTRL-W CTRL-P Go to previous (last accessed) window.
435
436 *CTRL-W_P* *E441*
437CTRL-W P Go to preview window. When there is no preview window this is
438 an error.
439 {not available when compiled without the |+quickfix| feature}
440
441If Visual mode is active and the new window is not for the same buffer, the
442Visual mode is ended. If the window is on the same buffer, the cursor
443position is set to keep the same Visual area selected.
444
445 *:winc* *:wincmd*
446These commands can also be executed with ":wincmd":
447
448:[count]winc[md] {arg}
449 Like executing CTRL-W [count] {arg}. Example: >
450 :wincmd j
451< Moves to the window below the current one.
452 This command is useful when a Normal mode cannot be used (for
453 the |CursorHold| autocommand event). Or when a Normal mode
454 command is inconvenient.
455 The count can also be a window number. Example: >
456 :exe nr . "wincmd w"
457< This goes to window "nr".
458
459==============================================================================
4605. Moving windows around *window-moving*
461
462CTRL-W r *CTRL-W_r* *CTRL-W_CTRL-R* *E443*
463CTRL-W CTRL-R Rotate windows downwards/rightwards. The first window becomes
464 the second one, the second one becomes the third one, etc.
465 The last window becomes the first window. The cursor remains
466 in the same window.
467 This only works within the row or column of windows that the
468 current window is in.
469
470 *CTRL-W_R*
471CTRL-W R Rotate windows upwards/leftwards. The second window becomes
472 the first one, the third one becomes the second one, etc. The
473 first window becomes the last window. The cursor remains in
474 the same window.
475 This only works within the row or column of windows that the
476 current window is in.
477
478CTRL-W x *CTRL-W_x* *CTRL-W_CTRL-X*
479CTRL-W CTRL-X Without count: Exchange current window with next one. If there
480 is no next window, exchange with previous window.
481 With count: Exchange current window with Nth window (first
482 window is 1). The cursor is put in the other window.
483 When vertical and horizontal window splits are mixed, the
484 exchange is only done in the row or column of windows that the
485 current window is in.
486
487The following commands can be used to change the window layout. For example,
488when there are two vertically split windows, CTRL-W K will change that in
489horizontally split windows. CTRL-W H does it the other way around.
490
491 *CTRL-W_K*
492CTRL-W K Move the current window to be at the very top, using the full
493 width of the screen. This works like closing the current
494 window and then creating another one with ":topleft split",
495 except that the current window contents is used for the new
496 window.
497
498 *CTRL-W_J*
499CTRL-W J Move the current window to be at the very bottom, using the
500 full width of the screen. This works like closing the current
501 window and then creating another one with ":botright split",
502 except that the current window contents is used for the new
503 window.
504
505 *CTRL-W_H*
506CTRL-W H Move the current window to be at the far left, using the
507 full height of the screen. This works like closing the
508 current window and then creating another one with
509 ":vert topleft split", except that the current window contents
510 is used for the new window.
Bram Moolenaardb84e452010-08-15 13:50:43 +0200511 {not available when compiled without the |+vertsplit| feature}
Bram Moolenaar071d4272004-06-13 20:20:40 +0000512
513 *CTRL-W_L*
514CTRL-W L Move the current window to be at the far right, using the full
515 height of the screen. This works like closing the
516 current window and then creating another one with
517 ":vert botright split", except that the current window
518 contents is used for the new window.
Bram Moolenaardb84e452010-08-15 13:50:43 +0200519 {not available when compiled without the |+vertsplit| feature}
Bram Moolenaar071d4272004-06-13 20:20:40 +0000520
Bram Moolenaar4c3f5362006-04-11 21:38:50 +0000521 *CTRL-W_T*
522CTRL-W T Move the current window to a new tab page. This fails if
523 there is only one window in the current tab page.
524 When a count is specified the new tab page will be opened
525 before the tab page with this index. Otherwise it comes after
526 the current tab page.
527
Bram Moolenaar071d4272004-06-13 20:20:40 +0000528==============================================================================
5296. Window resizing *window-resize*
530
531 *CTRL-W_=*
532CTRL-W = Make all windows (almost) equally high and wide, but use
533 'winheight' and 'winwidth' for the current window.
Bram Moolenaar756ec0f2007-05-05 17:59:48 +0000534 Windows with 'winfixheight' set keep their height and windows
535 with 'winfixwidth' set keep their width.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000536
537:res[ize] -N *:res* *:resize* *CTRL-W_-*
538CTRL-W - Decrease current window height by N (default 1).
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200539 If used after |:vertical|: decrease width by N.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000540
541:res[ize] +N *CTRL-W_+*
542CTRL-W + Increase current window height by N (default 1).
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200543 If used after |:vertical|: increase width by N.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000544
545:res[ize] [N]
546CTRL-W CTRL-_ *CTRL-W_CTRL-_* *CTRL-W__*
547CTRL-W _ Set current window height to N (default: highest possible).
548
549z{nr}<CR> Set current window height to {nr}.
550
551 *CTRL-W_<*
552CTRL-W < Decrease current window width by N (default 1).
553
554 *CTRL-W_>*
555CTRL-W > Increase current window width by N (default 1).
556
557:vertical res[ize] [N] *:vertical-resize* *CTRL-W_bar*
558CTRL-W | Set current window width to N (default: widest possible).
559
560You can also resize a window by dragging a status line up or down with the
561mouse. Or by dragging a vertical separator line left or right. This only
562works if the version of Vim that is being used supports the mouse and the
563'mouse' option has been set to enable it.
564
565The option 'winheight' ('wh') is used to set the minimal window height of the
566current window. This option is used each time another window becomes the
567current window. If the option is '0', it is disabled. Set 'winheight' to a
568very large value, e.g., '9999', to make the current window always fill all
569available space. Set it to a reasonable value, e.g., '10', to make editing in
570the current window comfortable.
571
572The equivalent 'winwidth' ('wiw') option is used to set the minimal width of
573the current window.
574
575When the option 'equalalways' ('ea') is set, all the windows are automatically
576made the same size after splitting or closing a window. If you don't set this
577option, splitting a window will reduce the size of the current window and
578leave the other windows the same. When closing a window, the extra lines are
579given to the window above it.
580
581The 'eadirection' option limits the direction in which the 'equalalways'
582option is applied. The default "both" resizes in both directions. When the
583value is "ver" only the heights of windows are equalized. Use this when you
584have manually resized a vertically split window and want to keep this width.
585Likewise, "hor" causes only the widths of windows to be equalized.
586
587The option 'cmdheight' ('ch') is used to set the height of the command-line.
588If you are annoyed by the |hit-enter| prompt for long messages, set this
589option to 2 or 3.
590
591If there is only one window, resizing that window will also change the command
592line height. If there are several windows, resizing the current window will
593also change the height of the window below it (and sometimes the window above
594it).
595
596The minimal height and width of a window is set with 'winminheight' and
597'winminwidth'. These are hard values, a window will never become smaller.
598
599==============================================================================
6007. Argument and buffer list commands *buffer-list*
601
602 args list buffer list meaning ~
6031. :[N]argument [N] 11. :[N]buffer [N] to arg/buf N
6042. :[N]next [file ..] 12. :[N]bnext [N] to Nth next arg/buf
6053. :[N]Next [N] 13. :[N]bNext [N] to Nth previous arg/buf
6064. :[N]previous [N] 14. :[N]bprevious [N] to Nth previous arg/buf
6075. :rewind / :first 15. :brewind / :bfirst to first arg/buf
6086. :last 16. :blast to last arg/buf
6097. :all 17. :ball edit all args/buffers
610 18. :unhide edit all loaded buffers
611 19. :[N]bmod [N] to Nth modified buf
612
613 split & args list split & buffer list meaning ~
61421. :[N]sargument [N] 31. :[N]sbuffer [N] split + to arg/buf N
61522. :[N]snext [file ..] 32. :[N]sbnext [N] split + to Nth next arg/buf
61623. :[N]sNext [N] 33. :[N]sbNext [N] split + to Nth previous arg/buf
61724. :[N]sprevious [N] 34. :[N]sbprevious [N] split + to Nth previous arg/buf
61825. :srewind / :sfirst 35. :sbrewind / :sbfirst split + to first arg/buf
61926. :slast 36. :sblast split + to last arg/buf
Bram Moolenaar13fcaaf2005-04-15 21:13:42 +000062027. :sall 37. :sball edit all args/buffers
Bram Moolenaar071d4272004-06-13 20:20:40 +0000621 38. :sunhide edit all loaded buffers
622 39. :[N]sbmod [N] split + to Nth modified buf
623
62440. :args list of arguments
62541. :buffers list of buffers
626
627The meaning of [N] depends on the command:
Bram Moolenaar24a98a02017-09-27 22:23:55 +0200628 [N] is the number of buffers to go forward/backward on 2/12/22/32,
629 3/13/23/33, and 4/14/24/34
Bram Moolenaar071d4272004-06-13 20:20:40 +0000630 [N] is an argument number, defaulting to current argument, for 1 and 21
631 [N] is a buffer number, defaulting to current buffer, for 11 and 31
632 [N] is a count for 19 and 39
633
634Note: ":next" is an exception, because it must accept a list of file names
635for compatibility with Vi.
636
637
638The argument list and multiple windows
639--------------------------------------
640
641The current position in the argument list can be different for each window.
642Remember that when doing ":e file", the position in the argument list stays
643the same, but you are not editing the file at that position. To indicate
644this, the file message (and the title, if you have one) shows
645"(file (N) of M)", where "(N)" is the current position in the file list, and
646"M" the number of files in the file list.
647
648All the entries in the argument list are added to the buffer list. Thus, you
649can also get to them with the buffer list commands, like ":bnext".
650
651:[N]al[l][!] [N] *:al* *:all* *:sal* *:sall*
652:[N]sal[l][!] [N]
653 Rearrange the screen to open one window for each argument.
654 All other windows are closed. When a count is given, this is
655 the maximum number of windows to open.
Bram Moolenaarfd2ac762006-03-01 22:09:21 +0000656 With the |:tab| modifier open a tab page for each argument.
657 When there are more arguments than 'tabpagemax' further ones
658 become split windows in the last tab page.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000659 When the 'hidden' option is set, all buffers in closed windows
660 become hidden.
661 When 'hidden' is not set, and the 'autowrite' option is set,
662 modified buffers are written. Otherwise, windows that have
663 buffers that are modified are not removed, unless the [!] is
664 given, then they become hidden. But modified buffers are
665 never abandoned, so changes cannot get lost.
666 [N] is the maximum number of windows to open. 'winheight'
667 also limits the number of windows opened ('winwidth' if
668 |:vertical| was prepended).
669 Buf/Win Enter/Leave autocommands are not executed for the new
670 windows here, that's only done when they are really entered.
671
672:[N]sa[rgument][!] [++opt] [+cmd] [N] *:sa* *:sargument*
673 Short for ":split | argument [N]": split window and go to Nth
674 argument. But when there is no such argument, the window is
675 not split. Also see |++opt| and |+cmd|.
676
677:[N]sn[ext][!] [++opt] [+cmd] [file ..] *:sn* *:snext*
678 Short for ":split | [N]next": split window and go to Nth next
679 argument. But when there is no next file, the window is not
680 split. Also see |++opt| and |+cmd|.
681
682:[N]spr[evious][!] [++opt] [+cmd] [N] *:spr* *:sprevious*
683:[N]sN[ext][!] [++opt] [+cmd] [N] *:sN* *:sNext*
684 Short for ":split | [N]Next": split window and go to Nth
685 previous argument. But when there is no previous file, the
686 window is not split. Also see |++opt| and |+cmd|.
687
688 *:sre* *:srewind*
689:sre[wind][!] [++opt] [+cmd]
690 Short for ":split | rewind": split window and go to first
691 argument. But when there is no argument list, the window is
692 not split. Also see |++opt| and |+cmd|.
693
694 *:sfir* *:sfirst*
Bram Moolenaar26a60b42005-02-22 08:49:11 +0000695:sfir[st] [++opt] [+cmd]
Bram Moolenaar071d4272004-06-13 20:20:40 +0000696 Same as ":srewind".
697
698 *:sla* *:slast*
699:sla[st][!] [++opt] [+cmd]
700 Short for ":split | last": split window and go to last
701 argument. But when there is no argument list, the window is
702 not split. Also see |++opt| and |+cmd|.
703
704 *:dr* *:drop*
Bram Moolenaared39e1d2008-08-09 17:55:22 +0000705:dr[op] [++opt] [+cmd] {file} ..
Bram Moolenaar071d4272004-06-13 20:20:40 +0000706 Edit the first {file} in a window.
707 - If the file is already open in a window change to that
708 window.
709 - If the file is not open in a window edit the file in the
710 current window. If the current buffer can't be |abandon|ed,
711 the window is split first.
Bram Moolenaar51628222016-12-01 23:03:28 +0100712 - Windows that are not in the argument list or are not full
713 width will be closed if possible.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000714 The |argument-list| is set, like with the |:next| command.
715 The purpose of this command is that it can be used from a
716 program that wants Vim to edit another file, e.g., a debugger.
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000717 When using the |:tab| modifier each argument is opened in a
718 tab page. The last window is used if it's empty.
Bram Moolenaared39e1d2008-08-09 17:55:22 +0000719 Also see |++opt| and |+cmd|.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000720
721==============================================================================
7228. Do a command in all buffers or windows *list-repeat*
723
724 *:windo*
Bram Moolenaara162bc52015-01-07 16:54:21 +0100725:[range]windo {cmd} Execute {cmd} in each window or if [range] is given
726 only in windows for which the window number lies in
727 the [range]. It works like doing this: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000728 CTRL-W t
729 :{cmd}
730 CTRL-W w
731 :{cmd}
732 etc.
Bram Moolenaar32466aa2006-02-24 23:53:04 +0000733< This only operates in the current tab page.
Bram Moolenaar7e8fd632006-02-18 22:14:51 +0000734 When an error is detected on one window, further
Bram Moolenaar071d4272004-06-13 20:20:40 +0000735 windows will not be visited.
736 The last window (or where an error occurred) becomes
737 the current window.
738 {cmd} can contain '|' to concatenate several commands.
739 {cmd} must not open or close windows or reorder them.
Bram Moolenaar0751f512018-03-29 16:37:16 +0200740 {not in Vi}
Bram Moolenaaraa23b372015-09-08 18:46:31 +0200741 Also see |:tabdo|, |:argdo|, |:bufdo|, |:cdo|, |:ldo|,
742 |:cfdo| and |:lfdo|
Bram Moolenaar071d4272004-06-13 20:20:40 +0000743
744 *:bufdo*
Bram Moolenaara162bc52015-01-07 16:54:21 +0100745:[range]bufdo[!] {cmd} Execute {cmd} in each buffer in the buffer list or if
746 [range] is given only for buffers for which their
Bram Moolenaar681baaf2016-02-04 20:57:07 +0100747 buffer number is in the [range]. It works like doing
Bram Moolenaara162bc52015-01-07 16:54:21 +0100748 this: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000749 :bfirst
750 :{cmd}
751 :bnext
752 :{cmd}
753 etc.
754< When the current file can't be |abandon|ed and the [!]
755 is not present, the command fails.
756 When an error is detected on one buffer, further
757 buffers will not be visited.
758 Unlisted buffers are skipped.
759 The last buffer (or where an error occurred) becomes
760 the current buffer.
761 {cmd} can contain '|' to concatenate several commands.
762 {cmd} must not delete buffers or add buffers to the
763 buffer list.
764 Note: While this command is executing, the Syntax
765 autocommand event is disabled by adding it to
766 'eventignore'. This considerably speeds up editing
767 each buffer.
Bram Moolenaar0751f512018-03-29 16:37:16 +0200768 {not in Vi}
Bram Moolenaaraa23b372015-09-08 18:46:31 +0200769 Also see |:tabdo|, |:argdo|, |:windo|, |:cdo|, |:ldo|,
770 |:cfdo| and |:lfdo|
Bram Moolenaar071d4272004-06-13 20:20:40 +0000771
772Examples: >
773
774 :windo set nolist nofoldcolumn | normal zn
775
776This resets the 'list' option and disables folding in all windows. >
777
778 :bufdo set fileencoding= | update
779
780This resets the 'fileencoding' in each buffer and writes it if this changed
781the buffer. The result is that all buffers will use the 'encoding' encoding
782(if conversion works properly).
783
784==============================================================================
7859. Tag or file name under the cursor *window-tag*
786
787 *:sta* *:stag*
788:sta[g][!] [tagname]
789 Does ":tag[!] [tagname]" and splits the window for the found
790 tag. See also |:tag|.
791
792CTRL-W ] *CTRL-W_]* *CTRL-W_CTRL-]*
793CTRL-W CTRL-] Split current window in two. Use identifier under cursor as a
Bram Moolenaar3a991dd2014-10-02 01:41:41 +0200794 tag and jump to it in the new upper window.
795 In Visual mode uses the Visually selected text as a tag.
796 Make new window N high.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000797
798 *CTRL-W_g]*
799CTRL-W g ] Split current window in two. Use identifier under cursor as a
800 tag and perform ":tselect" on it in the new upper window.
Bram Moolenaar3a991dd2014-10-02 01:41:41 +0200801 In Visual mode uses the Visually selected text as a tag.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000802 Make new window N high.
803
804 *CTRL-W_g_CTRL-]*
805CTRL-W g CTRL-] Split current window in two. Use identifier under cursor as a
Bram Moolenaar3a991dd2014-10-02 01:41:41 +0200806 tag and perform ":tjump" on it in the new upper window.
807 In Visual mode uses the Visually selected text as a tag.
808 Make new window N high.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000809
810CTRL-W f *CTRL-W_f* *CTRL-W_CTRL-F*
811CTRL-W CTRL-F Split current window in two. Edit file name under cursor.
Bram Moolenaar8dff8182006-04-06 20:18:50 +0000812 Like ":split gf", but window isn't split if the file does not
Bram Moolenaar071d4272004-06-13 20:20:40 +0000813 exist.
814 Uses the 'path' variable as a list of directory names where to
815 look for the file. Also the path for current file is
816 used to search for the file name.
817 If the name is a hypertext link that looks like
818 "type://machine/path", only "/path" is used.
819 If a count is given, the count'th matching file is edited.
820 {not available when the |+file_in_path| feature was disabled
821 at compile time}
822
Bram Moolenaard1f56e62006-02-22 21:25:37 +0000823CTRL-W F *CTRL-W_F*
824 Split current window in two. Edit file name under cursor and
825 jump to the line number following the file name. See |gF| for
826 details on how the line number is obtained.
Bram Moolenaar57657d82006-04-21 22:12:41 +0000827 {not available when the |+file_in_path| feature was disabled
828 at compile time}
Bram Moolenaard1f56e62006-02-22 21:25:37 +0000829
Bram Moolenaar8dff8182006-04-06 20:18:50 +0000830CTRL-W gf *CTRL-W_gf*
831 Open a new tab page and edit the file name under the cursor.
832 Like "tab split" and "gf", but the new tab page isn't created
833 if the file does not exist.
834 {not available when the |+file_in_path| feature was disabled
835 at compile time}
836
Bram Moolenaar57657d82006-04-21 22:12:41 +0000837CTRL-W gF *CTRL-W_gF*
838 Open a new tab page and edit the file name under the cursor
839 and jump to the line number following the file name. Like
840 "tab split" and "gF", but the new tab page isn't created if
841 the file does not exist.
842 {not available when the |+file_in_path| feature was disabled
843 at compile time}
844
Bram Moolenaar26967612019-03-17 17:13:16 +0100845CTRL-W gt *CTRL-W_gt*
846 Go to next tab page, same as `gt`.
847
848CTRL-W gT *CTRL-W_gT*
849 Go to previous tab page, same as `gT`.
850
Bram Moolenaar071d4272004-06-13 20:20:40 +0000851Also see |CTRL-W_CTRL-I|: open window for an included file that includes
852the keyword under the cursor.
853
854==============================================================================
85510. The preview window *preview-window*
856
857The preview window is a special window to show (preview) another file. It is
858normally a small window used to show an include file or definition of a
859function.
860{not available when compiled without the |+quickfix| feature}
861
Bram Moolenaarc270d802006-03-11 21:29:41 +0000862There can be only one preview window (per tab page). It is created with one
863of the commands below. The 'previewheight' option can be set to specify the
864height of the preview window when it's opened. The 'previewwindow' option is
865set in the preview window to be able to recognize it. The 'winfixheight'
866option is set to have it keep the same height when opening/closing other
867windows.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000868
869 *:pta* *:ptag*
870:pta[g][!] [tagname]
871 Does ":tag[!] [tagname]" and shows the found tag in a
872 "Preview" window without changing the current buffer or cursor
Bram Moolenaar13fcaaf2005-04-15 21:13:42 +0000873 position. If a "Preview" window already exists, it is re-used
Bram Moolenaar071d4272004-06-13 20:20:40 +0000874 (like a help window is). If a new one is opened,
875 'previewheight' is used for the height of the window. See
876 also |:tag|.
877 See below for an example. |CursorHold-example|
878 Small difference from |:tag|: When [tagname] is equal to the
879 already displayed tag, the position in the matching tag list
880 is not reset. This makes the CursorHold example work after a
881 |:ptnext|.
882
883CTRL-W z *CTRL-W_z*
884CTRL-W CTRL-Z *CTRL-W_CTRL-Z* *:pc* *:pclose*
885:pc[lose][!] Close any "Preview" window currently open. When the 'hidden'
886 option is set, or when the buffer was changed and the [!] is
887 used, the buffer becomes hidden (unless there is another
888 window editing it). The command fails if any "Preview" buffer
889 cannot be closed. See also |:close|.
890
891 *:pp* *:ppop*
892:[count]pp[op][!]
893 Does ":[count]pop[!]" in the preview window. See |:pop| and
894 |:ptag|. {not in Vi}
895
896CTRL-W } *CTRL-W_}*
897 Use identifier under cursor as a tag and perform a :ptag on
Bram Moolenaar13fcaaf2005-04-15 21:13:42 +0000898 it. Make the new Preview window (if required) N high. If N is
Bram Moolenaar071d4272004-06-13 20:20:40 +0000899 not given, 'previewheight' is used.
900
901CTRL-W g } *CTRL-W_g}*
902 Use identifier under cursor as a tag and perform a :ptjump on
Bram Moolenaar13fcaaf2005-04-15 21:13:42 +0000903 it. Make the new Preview window (if required) N high. If N is
Bram Moolenaar071d4272004-06-13 20:20:40 +0000904 not given, 'previewheight' is used.
905
906 *:ped* *:pedit*
907:ped[it][!] [++opt] [+cmd] {file}
908 Edit {file} in the preview window. The preview window is
909 opened like with |:ptag|. The current window and cursor
910 position isn't changed. Useful example: >
911 :pedit +/fputc /usr/include/stdio.h
912<
913 *:ps* *:psearch*
914:[range]ps[earch][!] [count] [/]pattern[/]
915 Works like |:ijump| but shows the found match in the preview
916 window. The preview window is opened like with |:ptag|. The
917 current window and cursor position isn't changed. Useful
918 example: >
919 :psearch popen
920< Like with the |:ptag| command, you can use this to
921 automatically show information about the word under the
922 cursor. This is less clever than using |:ptag|, but you don't
923 need a tags file and it will also find matches in system
924 include files. Example: >
925 :au! CursorHold *.[ch] nested exe "silent! psearch " . expand("<cword>")
926< Warning: This can be slow.
927
928Example *CursorHold-example* >
929
930 :au! CursorHold *.[ch] nested exe "silent! ptag " . expand("<cword>")
931
932This will cause a ":ptag" to be executed for the keyword under the cursor,
933when the cursor hasn't moved for the time set with 'updatetime'. The "nested"
934makes other autocommands be executed, so that syntax highlighting works in the
935preview window. The "silent!" avoids an error message when the tag could not
936be found. Also see |CursorHold|. To disable this again: >
937
938 :au! CursorHold
939
940A nice addition is to highlight the found tag, avoid the ":ptag" when there
941is no word under the cursor, and a few other things: >
942
943 :au! CursorHold *.[ch] nested call PreviewWord()
944 :func PreviewWord()
945 : if &previewwindow " don't do this in the preview window
946 : return
947 : endif
948 : let w = expand("<cword>") " get the word under cursor
949 : if w =~ '\a' " if the word contains a letter
950 :
951 : " Delete any existing highlight before showing another tag
952 : silent! wincmd P " jump to preview window
953 : if &previewwindow " if we really get there...
954 : match none " delete existing highlight
955 : wincmd p " back to old window
956 : endif
957 :
958 : " Try displaying a matching tag for the word under the cursor
959 : try
960 : exe "ptag " . w
961 : catch
962 : return
963 : endtry
964 :
965 : silent! wincmd P " jump to preview window
966 : if &previewwindow " if we really get there...
967 : if has("folding")
968 : silent! .foldopen " don't want a closed fold
969 : endif
970 : call search("$", "b") " to end of previous line
971 : let w = substitute(w, '\\', '\\\\', "")
972 : call search('\<\V' . w . '\>') " position cursor on match
973 : " Add a match highlight to the word at this position
974 : hi previewWord term=bold ctermbg=green guibg=green
975 : exe 'match previewWord "\%' . line(".") . 'l\%' . col(".") . 'c\k*"'
976 : wincmd p " back to old window
977 : endif
978 : endif
979 :endfun
980
981==============================================================================
98211. Using hidden buffers *buffer-hidden*
983
984A hidden buffer is not displayed in a window, but is still loaded into memory.
985This makes it possible to jump from file to file, without the need to read or
986write the file every time you get another buffer in a window.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000987
988 *:buffer-!*
989If the option 'hidden' ('hid') is set, abandoned buffers are kept for all
990commands that start editing another file: ":edit", ":next", ":tag", etc. The
991commands that move through the buffer list sometimes make the current buffer
992hidden although the 'hidden' option is not set. This happens when a buffer is
993modified, but is forced (with '!') to be removed from a window, and
994'autowrite' is off or the buffer can't be written.
995
996You can make a hidden buffer not hidden by starting to edit it with any
997command. Or by deleting it with the ":bdelete" command.
998
999The 'hidden' is global, it is used for all buffers. The 'bufhidden' option
1000can be used to make an exception for a specific buffer. It can take these
1001values:
1002 <empty> Use the value of 'hidden'.
1003 hide Hide this buffer, also when 'hidden' is not set.
1004 unload Don't hide but unload this buffer, also when 'hidden'
1005 is set.
1006 delete Delete the buffer.
1007
1008 *hidden-quit*
1009When you try to quit Vim while there is a hidden, modified buffer, you will
1010get an error message and Vim will make that buffer the current buffer. You
1011can then decide to write this buffer (":wq") or quit without writing (":q!").
1012Be careful: there may be more hidden, modified buffers!
1013
1014A buffer can also be unlisted. This means it exists, but it is not in the
1015list of buffers. |unlisted-buffer|
1016
1017
Bram Moolenaard51cb702015-07-21 15:03:06 +02001018:files[!] [flags] *:files*
1019:buffers[!] [flags] *:buffers* *:ls*
1020:ls[!] [flags]
1021 Show all buffers. Example:
Bram Moolenaar071d4272004-06-13 20:20:40 +00001022
Bram Moolenaar97d62492012-11-15 21:28:22 +01001023 1 #h "/test/text" line 1 ~
1024 2u "asdf" line 0 ~
1025 3 %a + "version.c" line 1 ~
Bram Moolenaar071d4272004-06-13 20:20:40 +00001026
1027 When the [!] is included the list will show unlisted buffers
1028 (the term "unlisted" is a bit confusing then...).
1029
1030 Each buffer has a unique number. That number will not change,
Bram Moolenaar0122c402015-02-03 19:13:34 +01001031 thus you can always go to a specific buffer with ":buffer N"
1032 or "N CTRL-^", where N is the buffer number.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001033
1034 Indicators (chars in the same column are mutually exclusive):
1035 u an unlisted buffer (only displayed when [!] is used)
1036 |unlisted-buffer|
1037 % the buffer in the current window
1038 # the alternate buffer for ":e #" and CTRL-^
1039 a an active buffer: it is loaded and visible
1040 h a hidden buffer: It is loaded, but currently not
1041 displayed in a window |hidden-buffer|
1042 - a buffer with 'modifiable' off
1043 = a readonly buffer
Bram Moolenaarc572da52017-08-27 16:52:01 +02001044 R a terminal buffer with a running job
1045 F a terminal buffer with a finished job
Bram Moolenaar37c64c72017-09-19 22:06:03 +02001046 ? a terminal buffer without a job: `:terminal NONE`
Bram Moolenaar071d4272004-06-13 20:20:40 +00001047 + a modified buffer
1048 x a buffer with read errors
1049
Bram Moolenaard51cb702015-07-21 15:03:06 +02001050 [flags] can be a combination of the following characters,
1051 which restrict the buffers to be listed:
1052 + modified buffers
1053 - buffers with 'modifiable' off
1054 = readonly buffers
1055 a active buffers
Bram Moolenaare392eb42015-11-19 20:38:09 +01001056 u unlisted buffers (overrides the "!")
Bram Moolenaard51cb702015-07-21 15:03:06 +02001057 h hidden buffers
1058 x buffers with a read error
1059 % current buffer
1060 # alternate buffer
Bram Moolenaar0751f512018-03-29 16:37:16 +02001061 R terminal buffers with a running job
1062 F terminal buffers with a finished job
1063 ? terminal buffers without a job: `:terminal NONE`
Bram Moolenaard51cb702015-07-21 15:03:06 +02001064 Combining flags means they are "and"ed together, e.g.:
1065 h+ hidden buffers which are modified
1066 a+ active buffers which are modified
1067
Bram Moolenaare4a3bcf2016-08-26 19:52:37 +02001068 When using |:filter| the pattern is matched against the
1069 displayed buffer name, e.g.: >
1070 filter /\.vim/ ls
1071<
Bram Moolenaar071d4272004-06-13 20:20:40 +00001072 *:bad* *:badd*
1073:bad[d] [+lnum] {fname}
1074 Add file name {fname} to the buffer list, without loading it.
1075 If "lnum" is specified, the cursor will be positioned at that
Bram Moolenaar13fcaaf2005-04-15 21:13:42 +00001076 line when the buffer is first entered. Note that other
Bram Moolenaar071d4272004-06-13 20:20:40 +00001077 commands after the + will be ignored.
1078
1079:[N]bd[elete][!] *:bd* *:bdel* *:bdelete* *E516*
1080:bd[elete][!] [N]
1081 Unload buffer [N] (default: current buffer) and delete it from
1082 the buffer list. If the buffer was changed, this fails,
1083 unless when [!] is specified, in which case changes are lost.
1084 The file remains unaffected. Any windows for this buffer are
1085 closed. If buffer [N] is the current buffer, another buffer
1086 will be displayed instead. This is the most recent entry in
1087 the jump list that points into a loaded buffer.
1088 Actually, the buffer isn't completely deleted, it is removed
1089 from the buffer list |unlisted-buffer| and option values,
1090 variables and mappings/abbreviations for the buffer are
Bram Moolenaar4d84d932014-11-30 14:50:16 +01001091 cleared. Examples: >
1092 :.,$-bdelete " delete buffers from the current one to
1093 " last but one
1094 :%bdelete " delete all buffers
1095<
Bram Moolenaar071d4272004-06-13 20:20:40 +00001096
1097:bdelete[!] {bufname} *E93* *E94*
Bram Moolenaar15142e22018-04-30 22:19:58 +02001098 Like ":bdelete[!] [N]", but buffer given by name, see
1099 |{bufname}|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001100
1101:bdelete[!] N1 N2 ...
1102 Do ":bdelete[!]" for buffer N1, N2, etc. The arguments can be
1103 buffer numbers or buffer names (but not buffer names that are
1104 a number). Insert a backslash before a space in a buffer
1105 name.
1106
1107:N,Mbdelete[!] Do ":bdelete[!]" for all buffers in the range N to M
1108 |inclusive|.
1109
1110:[N]bw[ipeout][!] *:bw* *:bwipe* *:bwipeout* *E517*
1111:bw[ipeout][!] {bufname}
1112:N,Mbw[ipeout][!]
1113:bw[ipeout][!] N1 N2 ...
Bram Moolenaardf1bdc92006-02-23 21:32:16 +00001114 Like |:bdelete|, but really delete the buffer. Everything
1115 related to the buffer is lost. All marks in this buffer
1116 become invalid, option settings are lost, etc. Don't use this
Bram Moolenaar4d84d932014-11-30 14:50:16 +01001117 unless you know what you are doing. Examples: >
1118 :.+,$bwipeout " wipe out all buffers after the current
1119 " one
1120 :%bwipeout " wipe out all buffers
1121<
Bram Moolenaar071d4272004-06-13 20:20:40 +00001122
1123:[N]bun[load][!] *:bun* *:bunload* *E515*
1124:bun[load][!] [N]
1125 Unload buffer [N] (default: current buffer). The memory
1126 allocated for this buffer will be freed. The buffer remains
1127 in the buffer list.
1128 If the buffer was changed, this fails, unless when [!] is
1129 specified, in which case the changes are lost.
1130 Any windows for this buffer are closed. If buffer [N] is the
1131 current buffer, another buffer will be displayed instead.
1132 This is the most recent entry in the jump list that points
1133 into a loaded buffer.
1134
1135:bunload[!] {bufname}
Bram Moolenaar15142e22018-04-30 22:19:58 +02001136 Like ":bunload[!] [N]", but buffer given by name.
1137 Also see |{bufname}|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001138
1139:N,Mbunload[!] Do ":bunload[!]" for all buffers in the range N to M
1140 |inclusive|.
1141
1142:bunload[!] N1 N2 ...
1143 Do ":bunload[!]" for buffer N1, N2, etc. The arguments can be
1144 buffer numbers or buffer names (but not buffer names that are
1145 a number). Insert a backslash before a space in a buffer
1146 name.
1147
Bram Moolenaar9c8d9e12014-09-19 20:07:26 +02001148:[N]b[uffer][!] [+cmd] [N] *:b* *:bu* *:buf* *:buffer* *E86*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001149 Edit buffer [N] from the buffer list. If [N] is not given,
1150 the current buffer remains being edited. See |:buffer-!| for
1151 [!]. This will also edit a buffer that is not in the buffer
1152 list, without setting the 'buflisted' flag.
Bram Moolenaar12969c02015-09-08 23:36:10 +02001153 Also see |+cmd|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001154
Bram Moolenaar15142e22018-04-30 22:19:58 +02001155:[N]b[uffer][!] [+cmd] {bufname} *{bufname}*
1156 Edit buffer for {bufname} from the buffer list. A partial
1157 name also works, so long as it is unique in the list of
1158 buffers.
1159 Note that a buffer whose name is a number cannot be referenced
1160 by that name; use the buffer number instead.
1161 Insert a backslash before a space in a buffer name.
1162 See |:buffer-!| for [!].
1163 This will also edit a buffer that is not in the buffer list,
1164 without setting the 'buflisted' flag.
Bram Moolenaar12969c02015-09-08 23:36:10 +02001165 Also see |+cmd|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001166
Bram Moolenaar9c8d9e12014-09-19 20:07:26 +02001167:[N]sb[uffer] [+cmd] [N] *:sb* *:sbuffer*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001168 Split window and edit buffer [N] from the buffer list. If [N]
1169 is not given, the current buffer is edited. Respects the
1170 "useopen" setting of 'switchbuf' when splitting. This will
1171 also edit a buffer that is not in the buffer list, without
1172 setting the 'buflisted' flag.
Bram Moolenaar12969c02015-09-08 23:36:10 +02001173 Also see |+cmd|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001174
Bram Moolenaar9c8d9e12014-09-19 20:07:26 +02001175:[N]sb[uffer] [+cmd] {bufname}
Bram Moolenaar15142e22018-04-30 22:19:58 +02001176 Split window and edit buffer for |{bufname}| from the buffer
Bram Moolenaar071d4272004-06-13 20:20:40 +00001177 list. This will also edit a buffer that is not in the buffer
1178 list, without setting the 'buflisted' flag.
Bram Moolenaar280f1262006-01-30 00:14:18 +00001179 Note: If what you want to do is split the buffer, make a copy
1180 under another name, you can do it this way: >
1181 :w foobar | sp #
Bram Moolenaar12969c02015-09-08 23:36:10 +02001182< Also see |+cmd|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001183
Bram Moolenaar9c8d9e12014-09-19 20:07:26 +02001184:[N]bn[ext][!] [+cmd] [N] *:bn* *:bnext* *E87*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001185 Go to [N]th next buffer in buffer list. [N] defaults to one.
1186 Wraps around the end of the buffer list.
1187 See |:buffer-!| for [!].
Bram Moolenaar12969c02015-09-08 23:36:10 +02001188 Also see |+cmd|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001189 If you are in a help buffer, this takes you to the next help
1190 buffer (if there is one). Similarly, if you are in a normal
1191 (non-help) buffer, this takes you to the next normal buffer.
1192 This is so that if you have invoked help, it doesn't get in
Bram Moolenaar13fcaaf2005-04-15 21:13:42 +00001193 the way when you're browsing code/text buffers. The next three
Bram Moolenaar071d4272004-06-13 20:20:40 +00001194 commands also work like this.
1195
Bram Moolenaar9c8d9e12014-09-19 20:07:26 +02001196
Bram Moolenaar071d4272004-06-13 20:20:40 +00001197 *:sbn* *:sbnext*
Bram Moolenaar9c8d9e12014-09-19 20:07:26 +02001198:[N]sbn[ext] [+cmd] [N]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001199 Split window and go to [N]th next buffer in buffer list.
1200 Wraps around the end of the buffer list. Uses 'switchbuf'
Bram Moolenaar12969c02015-09-08 23:36:10 +02001201 Also see |+cmd|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001202
Bram Moolenaar9c8d9e12014-09-19 20:07:26 +02001203:[N]bN[ext][!] [+cmd] [N] *:bN* *:bNext* *:bp* *:bprevious* *E88*
1204:[N]bp[revious][!] [+cmd] [N]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001205 Go to [N]th previous buffer in buffer list. [N] defaults to
1206 one. Wraps around the start of the buffer list.
1207 See |:buffer-!| for [!] and 'switchbuf'.
Bram Moolenaar12969c02015-09-08 23:36:10 +02001208 Also see |+cmd|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001209
Bram Moolenaar9c8d9e12014-09-19 20:07:26 +02001210:[N]sbN[ext] [+cmd] [N] *:sbN* *:sbNext* *:sbp* *:sbprevious*
1211:[N]sbp[revious] [+cmd] [N]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001212 Split window and go to [N]th previous buffer in buffer list.
1213 Wraps around the start of the buffer list.
1214 Uses 'switchbuf'.
Bram Moolenaar12969c02015-09-08 23:36:10 +02001215 Also see |+cmd|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001216
Bram Moolenaar9c8d9e12014-09-19 20:07:26 +02001217:br[ewind][!] [+cmd] *:br* *:brewind*
1218 Go to first buffer in buffer list. If the buffer list is
Bram Moolenaar071d4272004-06-13 20:20:40 +00001219 empty, go to the first unlisted buffer.
1220 See |:buffer-!| for [!].
1221
Bram Moolenaar9c8d9e12014-09-19 20:07:26 +02001222:bf[irst] [+cmd] *:bf* *:bfirst*
1223 Same as |:brewind|.
1224 Also see |+cmd|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001225
Bram Moolenaar9c8d9e12014-09-19 20:07:26 +02001226:sbr[ewind] [+cmd] *:sbr* *:sbrewind*
1227 Split window and go to first buffer in buffer list. If the
Bram Moolenaar071d4272004-06-13 20:20:40 +00001228 buffer list is empty, go to the first unlisted buffer.
1229 Respects the 'switchbuf' option.
Bram Moolenaar9c8d9e12014-09-19 20:07:26 +02001230 Also see |+cmd|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001231
Bram Moolenaar9c8d9e12014-09-19 20:07:26 +02001232:sbf[irst] [+cmd] *:sbf* *:sbfirst*
1233 Same as ":sbrewind".
Bram Moolenaar071d4272004-06-13 20:20:40 +00001234
Bram Moolenaar9c8d9e12014-09-19 20:07:26 +02001235:bl[ast][!] [+cmd] *:bl* *:blast*
1236 Go to last buffer in buffer list. If the buffer list is
Bram Moolenaar071d4272004-06-13 20:20:40 +00001237 empty, go to the last unlisted buffer.
1238 See |:buffer-!| for [!].
1239
Bram Moolenaar9c8d9e12014-09-19 20:07:26 +02001240:sbl[ast] [+cmd] *:sbl* *:sblast*
1241 Split window and go to last buffer in buffer list. If the
Bram Moolenaar071d4272004-06-13 20:20:40 +00001242 buffer list is empty, go to the last unlisted buffer.
1243 Respects 'switchbuf' option.
1244
Bram Moolenaar9c8d9e12014-09-19 20:07:26 +02001245:[N]bm[odified][!] [+cmd] [N] *:bm* *:bmodified* *E84*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001246 Go to [N]th next modified buffer. Note: this command also
1247 finds unlisted buffers. If there is no modified buffer the
1248 command fails.
1249
Bram Moolenaar9c8d9e12014-09-19 20:07:26 +02001250:[N]sbm[odified] [+cmd] [N] *:sbm* *:sbmodified*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001251 Split window and go to [N]th next modified buffer.
1252 Respects 'switchbuf' option.
1253 Note: this command also finds buffers not in the buffer list.
1254
1255:[N]unh[ide] [N] *:unh* *:unhide* *:sun* *:sunhide*
1256:[N]sun[hide] [N]
1257 Rearrange the screen to open one window for each loaded buffer
1258 in the buffer list. When a count is given, this is the
1259 maximum number of windows to open.
1260
1261:[N]ba[ll] [N] *:ba* *:ball* *:sba* *:sball*
1262:[N]sba[ll] [N] Rearrange the screen to open one window for each buffer in
1263 the buffer list. When a count is given, this is the maximum
1264 number of windows to open. 'winheight' also limits the number
1265 of windows opened ('winwidth' if |:vertical| was prepended).
1266 Buf/Win Enter/Leave autocommands are not executed for the new
1267 windows here, that's only done when they are really entered.
Bram Moolenaar756ec0f2007-05-05 17:59:48 +00001268 When the |:tab| modifier is used new windows are opened in a
Bram Moolenaarfd2ac762006-03-01 22:09:21 +00001269 new tab, up to 'tabpagemax'.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001270
1271Note: All the commands above that start editing another buffer, keep the
1272'readonly' flag as it was. This differs from the ":edit" command, which sets
1273the 'readonly' flag each time the file is read.
1274
1275==============================================================================
127612. Special kinds of buffers *special-buffers*
1277
1278Instead of containing the text of a file, buffers can also be used for other
1279purposes. A few options can be set to change the behavior of a buffer:
1280 'bufhidden' what happens when the buffer is no longer displayed
1281 in a window.
1282 'buftype' what kind of a buffer this is
1283 'swapfile' whether the buffer will have a swap file
1284 'buflisted' buffer shows up in the buffer list
1285
1286A few useful kinds of a buffer:
1287
Bram Moolenaar280f1262006-01-30 00:14:18 +00001288quickfix Used to contain the error list or the location list. See
1289 |:cwindow| and |:lwindow|. This command sets the 'buftype'
1290 option to "quickfix". You are not supposed to change this!
1291 'swapfile' is off.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001292
1293help Contains a help file. Will only be created with the |:help|
1294 command. The flag that indicates a help buffer is internal
1295 and can't be changed. The 'buflisted' option will be reset
1296 for a help buffer.
1297
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +02001298terminal A terminal window buffer, see |terminal|. The contents cannot
1299 be read or changed until the job ends.
1300
Bram Moolenaar677ee682005-01-27 14:41:15 +00001301directory Displays directory contents. Can be used by a file explorer
Bram Moolenaar071d4272004-06-13 20:20:40 +00001302 plugin. The buffer is created with these settings: >
Bram Moolenaar8ada17c2006-01-19 22:16:24 +00001303 :setlocal buftype=nowrite
1304 :setlocal bufhidden=delete
1305 :setlocal noswapfile
Bram Moolenaar071d4272004-06-13 20:20:40 +00001306< The buffer name is the name of the directory and is adjusted
1307 when using the |:cd| command.
1308
1309scratch Contains text that can be discarded at any time. It is kept
1310 when closing the window, it must be deleted explicitly.
1311 Settings: >
Bram Moolenaar8ada17c2006-01-19 22:16:24 +00001312 :setlocal buftype=nofile
1313 :setlocal bufhidden=hide
1314 :setlocal noswapfile
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +01001315< The buffer name can be used to identify the buffer, if you
1316 give it a meaningful name.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001317
1318 *unlisted-buffer*
1319unlisted The buffer is not in the buffer list. It is not used for
1320 normal editing, but to show a help file, remember a file name
1321 or marks. The ":bdelete" command will also set this option,
1322 thus it doesn't completely delete the buffer. Settings: >
Bram Moolenaar8ada17c2006-01-19 22:16:24 +00001323 :setlocal nobuflisted
Bram Moolenaar071d4272004-06-13 20:20:40 +00001324<
1325
Bram Moolenaard473c8c2018-08-11 18:00:22 +02001326 vim:tw=78:ts=8:noet:ft=help:norl: