22Finding the file to edit
Files can be found everywhere. So how do you find them? Vim offers various ways to browse the directory tree. There are commands to jump to a file that is mentioned in another. And Vim remembers which files have been edited before.
- The file browser
- The current directory
- Finding a file
- The buffer list
Table of contents
22.1The file browser
Vim has a plugin that makes it possible to edit a directory. Try this:
Through the magic of autocommands and Vim scripts, the window will be filled with the contents of the directory. It looks like this:
" ============================================================================ " Netrw Directory Listing (netrw v109) " Sorted by name " Sort sequence: [\/]$,\.h$,\.c$,\.cpp$,*,\.info$,\.swp$,\.o$\.obj$,\.bak$ " Quick Help: <F1>:help -:go up dir D:delete R:rename s:sort-by x:exec " ============================================================================ ../ ./ check/ Makefile autocmd.txt change.txt eval.txt~ filetype.txt~ help.txt.info
You can see these items:
The name of the browsing tool and its version number
The name of the browsing directory
The method of sorting (may be by name, time, or size)
How names are to be sorted (directories first, then *.h files, *.c files, etc)
How to get help (use the <F1> key), and an abbreviated listing of available commands
A listing of files, including
../, which allows one to list the parent directory.
If you have syntax highlighting enabled, the different parts are highlighted so as to make it easier to spot them.
You can use Normal mode Vim commands to move around in the text. For example, move the cursor atop a file and press <Enter>; you will then be editing that file. To go back to the browser use
:edit . again, or use
:Explore. CTRL‑O also works.
Try using <Enter> while the cursor is atop a directory name. The result is that the file browser moves into that directory and displays the items found there. Pressing <Enter> on the first directory
../ moves you one level higher. Pressing
- does the same thing, without the need to move to the
../ item first.
You can press <F1> to get help on the things you can do in the netrw file browser. This is what you get:
|9. Directory Browsing||netrw-browse netrw-dir netrw-list netrw-help|
|<del>............Deleting Files or Directories..............netrw‑delete|
|a................Hiding Files or Directories................netrw‑a|
|mb...............Bookmarking a Directory....................netrw‑mb|
|gb...............Changing to a Bookmarked Directory.........netrw‑gb|
|c................Make Browsing Directory The Current Dir....netrw‑c|
|d................Make A New Directory.......................netrw‑d|
|D................Deleting Files or Directories..............netrw‑D|
|i................Change Listing Style.......................netrw‑i|
|<c-l>............Refreshing the Listing.....................netrw‑ctrl‑l|
|o................Browsing with a Horizontal Split...........netrw‑o|
|p................Use Preview Window.........................netrw‑p|
|P................Edit in Previous Window....................netrw‑p|
|q................Listing Bookmarks and History..............netrw‑qb|
|r................Reversing Sorting Order....................netrw‑r|
The <F1> key thus brings you to a netrw directory browsing contents help page. It's a regular help page; use the usual CTRL‑] to jump to tagged help items and CTRL‑O to jump back.
To select files for display and editing: (with the cursor is atop a filename)
<enter> Open the file in the current window. |netrw-cr| o Horizontally split window and display file |netrw-o| v Vertically split window and display file |netrw-v| p Use the |preview-window| |netrw-p| P Edit in the previous window |netrw-P| t Open file in a new tab |netrw-t|
The following normal-mode commands may be used to control the browser display:
|Controls listing style (thin, long, wide, and tree). The long listing includes size and date information.|
|Repeatedly pressing s will change the way the files are sorted; one may sort on name, modification time, or size.|
|Reverse the sorting order.|
As a sampling of extra normal-mode commands:
|Change Vim's notion of the current directory to be the same as the browser directory. (see g:netrw_keepdir to control this, too)|
|Rename the file or directory under the cursor; a prompt will be issued for the new name.|
|Delete the file or directory under the cursor; a confirmation request will be issued.|
|mb gb||Make |
One may also use command mode; again, just a sampling:
|A comprehensive list of your current netrw settings with help linkage.|
The netrw browser is not limited to just your local machine; one may use urls such as: (that trailing
/ is important)
:Explore ftp://somehost/path/to/dir/ :e scp://somehost/path/to/dir/
See netrw‑browse for more.
22.2The current directory
Just like the shell, Vim has the concept of a current directory. Suppose you are in your home directory and want to edit several files in a directory
VeryLongFileName. You could do:
:edit VeryLongFileName/file1.txt :edit VeryLongFileName/file2.txt :edit VeryLongFileName/file3.txt
To avoid much of the typing, do this:
:cd VeryLongFileName :edit file1.txt :edit file2.txt :edit file3.txt
:cd command changes the current directory. You can see what the current directory is with the
Vim remembers the last directory that you used. Use "cd -" to go back to it. Example:
:pwd /home/Bram/VeryLongFileName :cd /etc :pwd /etc :cd - :pwd /home/Bram/VeryLongFileName :cd - :pwd /etc
#Window local directory
When you split a window, both windows use the same current directory. When you want to edit a number of files somewhere else in the new window, you can make it use a different directory, without changing the current directory in the other window. This is called a local directory.
:pwd /home/Bram/VeryLongFileName :split :lcd /etc :pwd /etc CTRL-W w :pwd /home/Bram/VeryLongFileName
So long as no
:lcd command has been used, all windows share the same current directory. Doing a
:cd command in one window will also change the current directory of the other window.
For a window where
:lcd has been used a different current directory is remembered. Using
:lcd in other windows will not change it.
When using a
:cd command in a window that uses a different current directory, it will go back to using the shared directory.
#Tab local directory
When you open a new tab page, it uses the directory of the window in the previous tab page from which the new tab page was opened. You can change the directory of the current tab page using the
:tcd command. All the windows in a tab page share this directory except for windows with a window-local directory. Any new windows opened in this tab page will use this directory as the current working directory. Using a
:cd command in a tab page will not change the working directory of tab pages which have a tab local directory. When the global working directory is changed using the
:cd command in a tab page, it will also change the current tab page working directory.
22.3Finding a file
You are editing a C program that contains this line:
You want to see what is in that
inits.h file. Move the cursor on the name of the file and type:
Vim will find the file and edit it.
What if the file is not in the current directory? Vim will use the path option to find the file. This option is a list of directory names where to look for your file.
Suppose you have your include files located in
c:/prog/include. This command will add it to the path option:
This directory is an absolute path. No matter where you are, it will be the same place. What if you have located files in a subdirectory, below where the file is? Then you can specify a relative path name. This starts with a dot:
This tells Vim to look in the directory
proto, below the directory where the file in which you use
gf is. Thus using
inits.h will make Vim look for
proto/inits.h, starting in the directory of the file.
proto, Vim would look in the
proto directory below the current directory. And the current directory might not be where the file that you are editing is located.
The path option allows specifying the directories where to search for files in many more ways. See the help on the path option.
The isfname option is used to decide which characters are included in the file name, and which ones are not (e.g., the " character in the example above).
When you know the file name, but it's not to be found in the file, you can type it:
Vim will then use the path option to try and locate the file. This is the same as the
:edit command, except for the use of path.
To open the found file in a new window use
CTRL‑W f instead of
gf, or use
:sfind instead of
A nice way to directly start Vim to edit a file somewhere in the path:
vim "+find stdio.h"
This finds the file
stdio.h in your value of path. The quotes are necessary to have one argument ‑+c.
22.4The buffer list
The Vim editor uses the term buffer to describe a file being edited. Actually, a buffer is a copy of the file that you edit. When you finish changing the buffer, you write the contents of the buffer to the file. Buffers not only contain file contents, but also all the marks, settings, and other stuff that goes with it.
Suppose you are editing the file
one.txt and need to edit the file
two.txt. You could simply use
:edit , but since you made changes to
one.txt that won't work. You also don't want to write
one.txt yet. Vim has a solution for you:
:hide edit two.txt
one.txt disappears from the screen, but Vim still knows that you are editing this buffer, so it keeps the modified text. This is called a hidden buffer: The buffer contains text, but you can't see it.
The argument of
:hide is another command.
:hide makes that command behave as if the hidden option was set. You could also set this option yourself. The effect is that when any buffer is abandoned, it becomes hidden.
Be careful! When you have hidden buffers with changes, don't exit Vim without making sure you have saved all the buffers.
When a buffer has been used once, Vim remembers some information about it. When it is not displayed in a window and it is not hidden, it is still in the buffer list. This is called an inactive buffer. Overview:
|Appears in a window, text loaded.|
|Not in a window, text loaded.|
|Not in a window, no text loaded.|
The inactive buffers are remembered, because Vim keeps information about them, like marks. And remembering the file name is useful too, so that you can see which files you have edited. And edit them again.
View the buffer list with this command:
A command which does the same, is not so obvious to list buffers, but is much shorter to type:
The output could look like this:
1 #h "help.txt" line 62 2 %a + "usr_21.txt" line 1 3 "usr_toc.txt" line 1
The first column contains the buffer number. You can use this to edit the buffer without having to type the name, see below.
After the buffer number come the flags. Then the name of the file and the line number where the cursor was the last time.
The flags that can appear are these (from left to right):
|Buffer is unlisted unlisted‑buffer.|
|Buffer is loaded and displayed.|
|Buffer is loaded but hidden.|
|Buffer is read-only.|
|Buffer is not modifiable, the modifiable option is off.|
|Buffer has been modified.|
#Editing a buffer
You can edit a buffer by its number. That avoids having to type the file name:
But the only way to know the number is by looking in the buffer list. You can use the name, or part of it, instead:
Vim will find the best match for the name you type. If there is only one buffer that matches the name, it will be used. In this case
To open a buffer in a new window:
This works with a name as well.
#Using the buffer list
You can move around in the buffer list with these commands:
|go to next buffer|
|go to previous buffer|
|go to the first buffer|
|go to the last buffer|
To remove a buffer from the list, use this command:
Again, this also works with a name.
If you delete a buffer that was active (visible in a window), that window will be closed. If you delete the current buffer, the current window will be closed. If it was the last window, Vim will find another buffer to edit. You can't be editing nothing!
Even after removing the buffer with
:bdelete Vim still remembers it. It's actually made
unlisted, it no longer appears in the list from
:buffers! command will list unlisted buffers (yes, Vim can do the impossible). To really make Vim forget about a buffer, use
:bwipe. Also see the buflisted option.