Note: This entry has been restored from old archives.
Today I finally got peeved enough at typing “
:winc [hjkl]” to work out some new bindings. I don’t often work in multiple
vim windows so have gotten by until now, but I’ve been using them a lot in the last couple of days. The problem is that the default mapping using
[hjkl] doesn’t seem to work for me, I can blame my WM for that I think.
So I tried to create mappings using the arrow keys, yes I know this is very “un-vi” and I should stick to
[hjkl]. Blah, blah. Note that my arrow keys probably aren’t quite as inaccessible as yours though, I have a rather unusual keyboard layout. Here are the mappings:
noremap <silent> <S-Right> :winc l<CR> inoremap <silent> <S-Right> <C-O>:winc l<CR> noremap <silent> <S-Left> :winc h<CR> inoremap <silent> <S-Left> <C-O>:winc h<CR> noremap <silent> <S-Down> :winc j<CR> inoremap <silent> <S-Down> <C-O>:winc j<CR> noremap <silent> <S-Up> :winc k<CR> inoremap <silent> <S-Up> <C-O>:winc k<CR>
This in its self wouldn’t be worth writing about. Where it gets a little more interesting is: the mapping doesn’t work! Argh! Through some hunting around I eventually found that the problem is
vim (or the termcap, or something) not having the right definition for “Left”, “Right”, “Up”, and “Down” — a pain.
The good news is that you can re-define the definitions, stick this in above the mappings:
set <S-Up>=^[[a set <S-Down>=^[[b set <S-Right>=^[[c set <S-Left>=^[[d
Note that that the initial “
^[” is actually a literal escape byte (
0x1b), so a copy-paste of this text will not work! To enter the lines above, taking Shift+Up for example, I type “
set <S-Up>=” then (still in insert mode) Ctrl-v followed by Shift+Up. There’s probably a neater (printable) notation for the escape, but replacing it with the usual
<ESC> doesn’t seem to do the trick. This works and I’m leaving it at that.
Now, a caveat! It turns out that this can change from terminal emulator to terminal emulator. For example, Shift+Up in good old
gnome-terminal gives “
urxvt (what I use) gives “
^[[a“. However, my mappings seem to work in both
rxvt so something somewhere seems to be accounting for this. That’s nice of it!
I wonder if a better fix would be to twiddle the termcap or XDefaults? No time! The mapping works!