Vi
Related Pages
This page is about the editor vim itself. The other related pages are
- Vimrc, which is dedicated to vim configuration settings and to the file ~/.vimrc.
External Links
General
- Official vim homepage
- Vim Tips Wiki
- Vim documentation: help
- Vim documentation: map
- My links on vim on del.icio.us
- List of all commands for each mode:
:help index
Other General
- Vi Lovers home page
- Good post explaining why vi is superior and defeating common misconception (with examples).
- Vi would not be vi without a bit of fun...
Cheat sheets
- Very good graphical keyboard cheatsheet
- Another compact & complete cheatsheet (as folded reference card).
- Real Short Vim Normal-Mode List of Commands (from Dr Chip's)
Guides & Cheat sheets
- New To Vim
- Quick Tips
- Avoiding the ESC key
- Vim map tutorial
- Dr Chip's Vim Page — A tremendous amount of Vim treasures from an expert user
- Efficient editing with vim
- C editing with VIM HOWTO
- Using vim as an IDE all in one
- Browsing programs with tags
- Using Bash completion with ctags and Vim
- Alternative tab navigation
- Seven habits of effective text editing (from author of Vim)
Tips
- Use Ctrl-O instead of Esc in insert mode mappings
- How do I indent multiple lines quickly in vi?
- Replace a word with yanked text
Here we learn that Deleting, Changing and Yanking text copies the affected text to unnamed buffer ("").
But Yanking text also copies the text to buffer 0 ("0) - Search and replace the word under the cursor
- Find in files within Vim
About commands:grep
,:lgrep
,:vimgrep
,:lvimgrep
- Power of g
Examples on how to use the command:rg/pattern/cmd
- Keystroke Saving Substituting and Searching
Plugins (installed)
- snipMate : TextMate-style snippets for Vim
- a.vim : Alternate Files quickly (.c --> .h etc)
- trinity.vim : Build the trinity of srcexpl, taglist, NERD_tree to be a good IDE
- Source Explorer (srcexpl.vim) : A Source code Explorer based on tags works like context window in Source Insight
- taglist.vim : Source code browser (supports C/C++, java, perl, python, tcl, sql, php, etc)
- The NERD tree : A tree explorer plugin for navigating the filesystem
- AutoTag : Updates entries in a tags file automatically when saving
- surround.vim : Delete/change/add parentheses/quotes/XML-tags/much more with ease
- tComment : An extensible & universal comment plugin that also handles embedded filetypes
- mru.vim : Plugin to manage Most Recently Used (MRU) files
- Smart Tabs : Use tabs for indent, spaces for alignment
- See also Indent with tabs & align with spaces
- cpp.vim: General C++ Settings (no indentation for namespace...) (disabled highlight of leading tabs, line length overruns, unit test header test + nice
- diffchanges.vim : Show changes made to current buffer since the last save
{{{content}}}
{{{content}}}
{{{content}}}
AlterColour
function that computes new colour...)
Plugins (not yet installed)
- OmniCppComplete : C/C++ omni-completion with ctags database
- c.vim : C/C++ IDE -- Write and run programs. Insert statements, idioms, comments etc.
- CScope
- See the tutorial here
- Cscope on Vim Wiki
- One can also use cscope and ctags together
- winmanager : A windows style IDE for Vim 6.0 (Referenced in TagList plugin help)
- bufexplorer.zip : Buffer Explorer / Browser
- neocomplcache : Ultimate auto completion system for Vim
- FuzzyFinder : buffer/file/command/tag/etc explorer with fuzzy matching
- matchit.zip : extended % matching for HTML, LaTeX, and many other languages
- LustyExplorer : Dynamic filesystem and buffer explore
- project.tar.gz : Organize/Navigate projects of files (like IDE/buffer explorer)
Some videos that illustrates those plugins:
- Top Vim Plugins (YouTube), showing Surround, SnipMate, TComment, MRU, FuzzyFinder, NerdTree, MatchIt
Plugins (uninstalled)
- easytags.vim : Automated tag file generation and syntax highlighting of tags in Vim
- Replaced by AutoTag — syntax highlighting of tags is limited to c files; moreover AutoTag has a clever way to look for the tags file in project hierarchy.
- minibufexpl.vim : Elegant buffer explorer - takes very little screen space
- No real tab support. Seems to interfere with trinity plugin. Interesting key bindings inside though. To reassess...
Invocation
vi -p file1.txt file2.txt # Open each file in a different tab
vi -t tagname # Open file and move cursor at specified tag (requires ctags)
view file.txt # View file in vim, with syntax highlighting... (read-only)
vimdiff file1.txt file2.txt # View differences in vim
Simple C/C++ IDE using plugin TagList
Thanks to plugin TagList, it is possible to turn Vim into a simple yet efficient development IDE. The basic idea is to use the TagList window as a simple file explorer. We use a session file to add all files in the project to the TagList window. For C/C++ projects, we add our common settings/mapping defined in our cpp.vim.
Here an example session file Session.vim:
set tags=/win/d/projects/noekeon64/nk_fasttrails/tags
TlistAddFiles src/*.cpp
TlistAddFiles src/*.h
" Source our custom cpp script
source ~/.vim/cpp.vim
Create the tag and cscope files:
ctags -R .
cscope -Rb
Then start the IDE session with:
gvim -S
Use the mappings A-Up / A-Down to switch the current window to the next/previous file. These mappings simply move and center the cursor in the TagList window to the previous/next file, open the file and put the cursor to its last position.
To build the project (assuming you have a valid Makefile in the project directory), just issue the command
:make
To easily navigate between the compilation errors, open the quickfix window:
" Open the window when there are compilation errors:
:cw
" Or open it always:
:cope
Keyboard & Mouse Shortcuts
- ! If keys HJKLM have been remapped to MHJKL, shortcut below must be changed accordingly !
- Mouse shortcuts requires
:set mouse=a
. - Customer shortcuts are underlined
Custom Cheatsheets
Cheatsheet & plugin summary
Window management
Plugin - taglist window (:help taglist-keys)
Plugin - tComment
Plugin - Surround
|
Plugin - MRU
Plugin - diffchanges
Mouse
Insert
Miscellaneous
Plugin - a
|
Operator & motion
Operators in Vim acts
- on the current selection (visual mode like v, V or ^v) when there is such a selection,
- or must be followed by a motion indicating which part of the text must be modified.
Operators
|
The motion is either one of the motion key (like >% for shift right until match) or an operator motion (like diB for delete inner {} block). See :help operator.
Frequently-used operator motion
iw iW |
inner word inner WORD |
aw aW |
a word a WORD |
i[ ib i( |
inner [] block inner () block |
a[ ab a( |
a [] block a () block |
i" i' |
inner "" string inner '' string |
a" a' |
a "" string a '' string |
Commands
" Search & replace - current line
:s/search/replace/g
" Search & replace - global scope
:%s/search/replace/g
" Set Vim option (here textwidth)
:set {option}=70
" Show value of {option}
:echo &{option}
:set {option}?
" Search / replace in all opened buffers
:bufdo %s/pattern/substitution/ge | update
" Replace current line with register content
VP
Tips for Efficient Editing
- Substitute current line — Use S ( or cc) to replace the current line, while keeping current indentation (instead of ddO to delete current line and open new one)
- Quick variable renaming — Use the following mapping to search for last deleted word
- Rename a variable with ciw for instance, and type the new variable name (use ^R- to start from old name)
- Look for next occurent of the replaced variable with F3 (or ù)
- Repeat replacement with . (dot key)
- Repeat from step 2 (or use n), or N for previous occurrence.
" F3 (an improved UltraEdit F3 ;-) ) search for next occurrence of replaced word (actually register -) - handy for refactorizing code
" Also mapped to ù (AZERTY power!)
nnoremap <F3> /\<<C-R>-\><CR>
nnoremap ù /\<<C-R>-\><CR>
Using this mapping, one can:
This tip works better than using range:s/pattern
, because you don't have to type the name of replaced variable, nor use the word delimiter \<
...\>
, and you don't have to specify a range in advance.
Miscellaneous Tips and Tricks
- Inserting only a single character (http://vim.wikia.com/wiki/Insert_a_single_character).
- Macro
- qq to start recording a macro q. End macro with q again.
- @q to replay macro, followed by . to replay it again.
- Visual Block
- Ctrl-v to start VISUAL BLOCK mode.
- Shift-I to insert some text at the start of each line of selected block.
- wrap-around
- Set option whichwrap or ww that allows specified keys that move the cursor left/right to move to the previous/next line when the cursor is on the first/last character in the line.
- In Vim, <space> and <backspace> are set to wrap-around by default.
- Read-only viewer (with syntax highlighting):
$ vi -R sensitive_file
$ view sensitive_file
- Retab
- To convert tabs in current file to current tab settings, use command
:retab
[2]. For instance to convert tabs into space
:set expandtab :retab
- View differences in vim
vimdiff file1.txt file2.txt
- Interaction with X Clipboard
- vim can use the X clipboard if it has been compiled with the clipboard feature (run
vim --version
and see if you have +clipboard in the output). In that case, yanking to the+
register, or simply selecting with the mouse, will actually copy in the X clipboard, hence allowing other applications, or even other instances of vim to exchange text snippets. Also, it will ease the copy-paste of indented text, since in that case, vim will first disable autoindentation before pasting the text (see optionpaste
). - On system like Ubuntu, you need to install an instance of gvim (like package vim-gnome or vim-gtk) to have feature
+clipboard
turned on (i.e. installing package vim is not enough). - When
set mouse=a
, use shift-mouse to still use the xterm copy/paste (see mouse-using).
set incsearch
, moves cursor as search pattern is typed. Ctrl-L to type letter under cursor, Ctrl-R Ctrl-W to type current word.- References:
- type
:help ctrl<C-D>
, to get a list of all ctrl sequence. Type <C-D> in command line for auto-completion. - Support 256 colors in gnome-terminal: add
set t_Co=256
in ~/.vimrc ([3]) - Use
:make
and:grep
instead of:!make
or:!grep
. Then use:cwin
or:copen
to view the results of either make or grep in a coloured list (from [4]). - (from [5]), The
:g
command is useful to apply a command to all lines matching a search.
" delete all lines matching pattern
:g/pattern/d
" delete all lines *NOT* matching pattern (:v same as :g!)
:g!/pattern/d
:v/pattern/d
- Write the following in files ~/.vim/after/syntax/c.vim and ~/.vim/after/syntax/cpp.vim (or symlink) to highlight C/++ delimiters (see [6]):
syn match cDelimiter "[&\.!^,;:<>=|+%*-]"
syn match cParenDelimiter "[][(){}]"
hi def link cDelimiter Delimiter
hi def link cParenDelimiter Delimiter
- Replace a word with yanked text (see tip [7])
yiw " Yank word under cursor "
... " Move to next word "
viwp " Replace current word with yanked text. "
...
viwp
...
Plugins
SnipMate
C
main main() inc #include <...> Inc #include "..." Def #ifndef ... #define ... #endif def #define ifdef #ifdef ... #endif #if #if ... #endif once #ifndef HEADER_H .... # define HEADER_H ... #endif (Header Include-Guard) if If (...) { ... } el else { ... } t ... ? ... : ... (tertiary conditional) do do ... while ( ... ) wh while (...) { ... } for for (... = 0; ...; ...) { ... } forr for (... = ...; ...; ...) { ... } fun ... function(...) { ... } fund ... function(...;) td typedef st struct tds typedef struct tde typedef enum pr printf fpr fprintf . [ ... ] un unsigned
CPP
readfile snippet for reading file map std::map<... , ...> map... vector std::vector<...> v... ns namespace ... { ... } cl class { public: ... private: };
To Do
- Done Find a way to prevent vim to mess up with my register when deleting text.
- Auto-complete, use cursor keys instead of up/down to search in the drop down list.
- Look at Virtual-edit (see http://vim.wikia.com/wiki/Add_trailing_blanks_to_lines_for_easy_visual_blocks)
- Other links:
- http://www.faqs.org/docs/Linux-HOWTO/C-editing-with-VIM-HOWTO.html
- http://www.ibiblio.org/pub/linux/docs/howto/translations/nl/onehtml/Vim-HOWTO-NL.html
Bugs
- [2010-07-22] - (to bugs@vim.org) 'winfixheight' not honored when botright split is closed.
{{{content}}}