created 2003 · complexity basic · author Yeti · version 6.0
In insert mode, pressing Ctrl-O switches to normal mode for one command, then switches back to insert mode when the command is finished.
For example, do not write mappings like this:
:imap <F5> <Esc>:set number!<CR>a
Instead, use:
:imap <F5> <C-o>:set number!<CR>
One problem with the first mapping is that the cursor moves one character right when it is in the first column. By contrast, the Ctrl-O version has no side effects.
Often you also have a normal-mode mapping, in which case you can write:
:map <F5> :set number!<CR> :imap <F5> <c-o><F5>
When you need to do more than one thing in the mapping, you can
- Use more Ctrl-O, one before each command, or
- Use | to run more commands at once, or
- Define a command (or function) doing everything and map a key to call it.
Ctrl-O sometimes has weird side effects when at the end of the line, in which case you can use <C-\><C-O> instead.
Comments
Anonymous user posted:
You can use Ctrl-O to remap Ctrl-h/j/k/l to move the cursor while in insert mode without using the arrow keys:
:imap <C-h> <C-o>h :imap <C-j> <C-o>j :imap <C-k> <C-o>k :imap <C-l> <C-o>l
- Sure you can, but why? Remapping <C-l> to <Left>, etc. seems to make more sense, and won't do things like move the cursor twice when in the last column in a line. I guess you could get around this with <C-\><C-O>l, but why not just use <Left> in the mapping instead? --Fritzophrenic 22:10, February 5, 2010 (UTC)