vim is a text editor, common on many *nix platforms. gvim is its GUI. All of the notes have been tested with gvim, but should also be applicable to vim.
Here's a good intro to the basics of navigation and editing: Efficient Editing With Vim.
Index
- Opening files
- Tabs and buffers
- Editing and Navigation
- Command history
- Completion and intelligent completion with Omni-completion
- Switches
- rc files
- Ruby on Rails
- Diff and merge
- References
Opening files | Go to top
Open several files in tabs:
gvim -p [file1] [file2]
If you run this command again, with different files, you will get a new gvim window.
To open other files in the existing gvim window, in new tabs:
gvim --remote-tab-silent [file3] [file4]
I created a bash alias to do this. See Bash aliases.
Because error output is suppressed with the -silent suffix on the --remote-tab-silent flag, this flag can be used instead of the -p flag to open a new window when one doesn't already exist. In other words, just use this last example and don't bother using the first.
Tabs and buffers | Go to top
| Key binding | Action |
|---|---|
| :tabnew | Open a new tab |
| :tabnew [filename] | Open [filename] in a new tab |
| :tabf [filename] | Search for [filename] in your current path and open it in a new tab |
| :bn | Next buffer |
| :bp | Previous buffer |
| :ls | List buffers |
| :b[n] | Open buffer [n] |
| :bd | Close buffer |
| ctrl-w | Switch viewport |
Editing and Navigation | Go to top
I have a graphical cheatsheet printed out and stuck in from of my monitor. There are loads available - just search for 'vim cheatsheet' in your favourite search engine (the one I use is from Graphical vi-vim Cheat Sheet and Tutorial). The list below contains some of the less commonly listed shortcuts and combinations - ones that aren't explicitly on the cheatsheet or those that I'm most likely to forget.
From insert mode, hit escape then the key binding.
| Key binding | Action |
|---|---|
| $ | Go to end of line. |
| f[char] | Move forward to the next occurence of [char]. A semicolon ; repeats the command. |
| F[char] | Move backward to the previous occurence of [char]. A semicolon ; repeats the command. |
| y$ | Copy, i.e. yank, the text from the cursor to the end of the line. Paste with p. |
| yw | Copy a word. |
| :tabdo [action] | Perform an [action] across files in all tabs. e.g. :tabdo %s/foo/bar/g to replace foo with bar in all files. |
| ctrl-r | Redo |
| [[ | Go to top of file |
| ]] | Go to bottom of file |
| :[n],[m]d | Delete from line [n] to line [m] |
| [n],[m]dd | Delete from line [n] to line [n]+[m] |
| ctrl-f | Page up (forward) |
| ctrl-b | Page down (backward) |
| ctrl-u | 1/2 page up |
| ctrl-d | 1/2 page down |
| % | Jump from an open brace to its matching closing brace, or vice versa |
| [{ | Jump to the "{" at the start of the current code block |
| ]} | jump to the "}" at the end of the current code block |
| q[char] | Start recording macro [char] |
| q | Stop recording macro |
| @[char] | Playback macro [char] |
| @@ | Repeat macro playback |
| m[char] | Create a mark [char] |
| y'[char] | Yank from mark [char] to current cursor position (operations other than yank can also be performed) |
| "+y | Yank to clipboard so that you can paste into an external application (operations other than yank can also be performed) |
| "+p | Paste from clipboard (also see "+y above) |
| "[char]y | Yank to buffer named [char] (operations other than yank can also be performed) |
| "[char]p | Paste from buffer named [char] (also see "[char]y above) |
| :.,$ s/[old]/[new]/g | Replace all occurrences of [old] with [new], between the current line and the end of file. Note that the .,$ is the range, where . is the current line and $ is the EOF. |
| :.,.+[n] s/[old]/[new]/g | Replace all occurrences of [old] with [new], between the current line and the current line plus [n] lines. Note that .,.+[n] is the range, where . is the current line and .+[n] is the current line plus [n] lines. e.g. .,.+3 is the current line and the next 3 lines. |
Command history | Go to top
You can view and navigate a list of previously entered commands.
Type q: to open the command history in a small viewport (note that you can edit the history as you would any other document). Navigate to a command and hit enter to execute it. Typing : again will place you back in the command mode, so you can execute a command like q to close the command history or [num] to quickly jump to command number [num].
Completion and intelligent completion with Omni-completion | Go to top
Vim comes with a set of completion configuration scripts for a variety of languages. For Vim 7 on Gentoo Linux they are in /usr/share/vim/vim70/autoload/. These scripts allow you to start typing the beginning of a language's word, like <ht and have Vim complete it for you, in this example by adding the ml to make <html.
Start typing the word (in insert mode) and then hit one of the following key combinations to complete the word:
| ctrl-x-o | Complete the word by taking context into account. This is intelligent completion, aka omni completion. |
| ctrl-n | Complete the word using the first match of available words. Continue hitting ctrl-n to scroll through the possibilities. |
| ctrl-p | Complete the word using the last match of available words. Continue hitting ctrl-n to scroll through the possibilities. |
Switches | Go to top
vim has lots of useful switches that can be activated from the editor.
Most of these switches can be disabled using the prefix 'no', for example :set numbers will show line numbers and :set nonumbers will hide line numbers.
Information
Show line numbers:
:set number
Search
Show the first match for the pattern, while you are still typing it:
:set incsearch
Ignore case:
:set ignorecase
Highlight all the search pattern matches in a file:
:set hlsearch
Formatting
For line wrapping:
:set wrap
The wrap option will split words. For wrapping that keeps keep words intact, also set the linebreak option when you set wrap:
:set wrap :set lbr
For no wrap or line breaks:
:set nowrap :set nolbr
Note that the wrap and line break options are for display only - neither will actually insert <EOL> (newline) characters into the file. If you want to wrap the lines and have <EOL>s inserted, set the textwidth option.
To disable text width, set it to 0:
:set textwidth=0
Show invisible characters - tabs as ^I and end of line as $.
:set list
rc files | Go to top
Most vim options can be set in either /etc/vim/vimrc to apply the options to all users, or in /home/[username]/.vimrc to apply the options for the user [username].
You can add comments to the rc file using the " (double quote) character.
For example, I added the following to the end of my /etc/vim/vimrc file to set various search and formatting options.
set ignorecase set incsearch " Highlight search terms as you type. set hlsearch " Highlight all matched search terms. set nolbr " No line break. set wrap set number
Ruby on Rails | Go to top
There are a number of helper scripts that can be used to aid development of Ruby or Ruby on Rails applications.
First, check out HowtoUseVimWithRails. Of the suggestions in this article, I only use the rails.vim so far. See my page on vim with the rails.vim plugin for further information.
Diff and merge | Go to top
You can use vim as a diff and merge tool. See Diff and merge using vim (or gvim)
References | Go to top
- Vim online
- Vim documentation: options
- Efficient Editing With Vim
- Graphical vi-vim Cheat Sheet and Tutorial
- VIM Useful Commands
- Omni completion. Vim documentation: Version 7
- Tip #14: Highlighting all the search pattern matches : vim online
- HowtoUseVimWithRails
- rails.vim
- Linux.com | Vim tips: Using tabs
- Linux.com | Vim tips
- Best of VIM Tips, gVIM's Key Features
- C editing with VIM HOWTO: 4. Auto-Completing Words
- Tip #312: Copy, Cut, and Paste : vim online
- Vim documentation: gui_x11
- Vim Regular Expressions 101
- December 2002 Linux Productivity Magazine: VI and Vim
