Vim Tips Wiki
Tip 1197 Printable Monobook Previous Next

created 2006 · complexity basic · author Eric Arnold · version 5.7

I've decided to swap the ; and : keys since I use the : key much more often.

I also made a mapping so that ;; puts you directly into the command line edit window. My fingers always get into a knot when entering a lot of :ex commands and editing them often.

" nothing but '<C-V><C-F>' worked, including combinations of "\<C-F"
" cnoremap ; <C-R>= getcmdpos() == 1 ? '<C-V><C-F>A' : ';' <CR>
cnoremap <expr> ; (getcmdpos() == 1 && getcmdtype() =~ '\v^:') ? '<C-F>A' : ';'
silent! nunmap ;
silent! nunmap :
nnoremap <unique> ; :
nnoremap <unique> : ;


See 1111 Map semicolon to colon.

Ummm. Don't map ":" to anything, it's a bad idea!

I haven't figured out which key I want to use to replace ; I tried to set a mapping like:

noremap ff ;

but the problem was that for some reason, it would succeed in triggering the 'f' command always as 'f' as the target, but goes ahead and does a ";" command also.

Oops. The previous anon was mine. Anyway, comment out the map for ":".

It isn't quite right to have ";" put you info edit mode from search "/" . cmap governs all the different command window inputs. Hmm. Any ideas?

I really meant this:

cnoremap <expr> ; getcmdpos() == 1 ? '<C-F>kA' : ';'
cnoremap <expr> ; getcmdpos() == 1 ? '<C-F>k$' : ';'

so it puts you at the end of the previous command in the edit window.

I have basically the same settings, except that I didn't clobber the : command. Instead, I just mapped ;; to ; -- I use it rarely enough that it isn't a problem to hit it twice:

noremap ;; ;
map ; :
" edit command-line
map q; q:

I chose to use map rather than nmap for the ; mapping to allow it to work in visual mode also, which is very useful.

Here is another version that works in Vim6. The <expr> thing was added with Vim7.

if v:version >= 700
  cnoremap <expr> ; getcmdpos() == 1 ? '<C-F>k$' : ';'
  cnoremap ; <C-R>=getcmdpos() == 1 ? '<C-V><C-F>k$' : ';'<CR>

I guess this idea is really for those that spend a lot of time in the command line. When I'm writing Vim script, I use the command line a zillion times a minute. The ;; map works, but the operator-pending wait, with maps of more than one char, gets annoying if you're using it every few seconds.

BTW, here's another map that's ergonomically fast for re-doing the previous command.

nmap <Leader>. :<C-P><CR>

> nmap <Leader>. :<C-P><CR>

Isn't it the same as @: ?

The delay with ;; only becomes apparent if you actually WAIT for the command-line to show up after you hit the first ;... I usually know what command I'm going to type so just type something like ;saveas or something, without actually waiting for the command-line. There's no delay because there is no ambiguity: the instant I hit the second key, the command-line appears with the key I had typed put in place.

I, too, use the command-line for everything. I wouldn't have put forth the ;; mapping if it actually caused a problem in everyday use.