Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to remap keyboard keys to avoid RSI in VIM

I hope this does not come across as an attempt to spark conversation purely for the sake of doing so.

I use vim a great deal (5-10 hours a day) and I noticed my left wrist is the first to start aching. The standard keyboard layout (see image below) is almost guaranteed to give you arthritis.

Standard Keyboard

Currently, I have remapped

  • Ctrl to Shift
  • Shift to Caps Lock
  • Caps Lock to Ctrl

This helps with common commands such as Ctrlf or Shift2 (@), but I still have to twist my wrist to get at those combinations. Is there anyway to remap the keys so as to avoid this twisting on the left wrist (maybe use the Tab key)? I just find it odd that for a text editor designed specifically for programmers, it would make heavy use of these out of the way keys. I have considered remapping to the old keyboard layout (see below image), but I don't want to learn that if it is going to have the same fundamental problems as my current remapping.

old keyboard layout

like image 845
puk Avatar asked Jul 11 '12 23:07

puk


5 Answers

Note: I am not a doctor, just another typist that suffered from wrist pain.


In my experience, just mapping Caps to Ctrl (or swapping the two if you must have a Caps) and using Ctrl+[ instead of Esc make a big difference. Ctrl+[ does not require an additional mapping in vim as it is equivalent to Esc. If you can teach yourself this small change you reduce your movement by a great deal when you consider how often you use Esc in vim.

The Caps to Ctrl mapping can't be done inside vim and will have to be made system-wide, however, having Ctrl in the more convenient location will also help in other applications that use Ctrl combinations. There are different methods of remapping keys depending on which OS you're using. A few common options are:

  • xmodmap (GNU/Linux)
  • KeyRemap4Macbook (OSX)
  • KeyTweak (Windows)

While this will probably improve your situation you really should consider seeing a doctor and/or purchasing a more ergonomically designed keyboard if your pain persists. I own an older version of the Kinesis Advantage that I picked up used on Ebay for about $100 (USD) and I couldn't be happier. The keys can be programmed directly on the keyboard so no software is needed to swap keys or create your own keyboard macros for frequently used key strokes.


Edit: I see in your post you also mention combinations like Ctrl+f and Shift+2 requiring you to twist your wrist to press. It sounds to me like you're only using the Ctrl and Shift keys on the left side of your keyboard. You should really be using both sets of these keys, using whichever one is on the opposite hand of the key you're modifying. That would negate this wrist movement.

like image 71
Randy Morris Avatar answered Nov 18 '22 07:11

Randy Morris


Use caps as ctrl systemwide. (How often do you cut/copy/paste?)

This also makes ctrl[ work in vim.

Alongside I use the vim 'arpeggio' plugin.

Arpeggio lets you define vim bindings that are activated when two keys are simultanously pressed.
jk pressed serves me as ESC.

Also the 'surround.vim' plugin might be interesting for you.

Eliminated all my wrist pains.

post scriptum:
Use 'vundle'!
Its the best vim plugin manager by far, and you will wonder how you could ever do without, especially if you use a customized vim on several machines. Don't be scared if you have trouble setting it up initially, take your time.

like image 26
sjas Avatar answered Nov 18 '22 08:11

sjas


I switched to a Kinesis Advantage keyboard, and remapped Caps Lock to Esc. This effectively removed any wrist pain I felt as a vim user.Once again not a doctor, but looking at how my hands move, I don't see my wrist twisting even when I hit Shift.

You could probably do some great remappings to the thumb keys to further minimise tension, but to be honest I've never felt the need.

Not a $0 solution, I'm afraid, but it was very effective for me.

like image 40
Yaniv Avatar answered Nov 18 '22 07:11

Yaniv


I mapped both Escape (single tap) and Ctrl (hold) to CapsLock:

xmodmap -e "remove Lock = Caps_Lock"
xmodmap -e "remove Control = Control_L"
xmodmap -e "keysym Control_L = Caps_Lock"
xmodmap -e "keysym Caps_Lock = Control_L"
xmodmap -e "add Control = Control_L"
xcape -t 1000 -e "Control_L=Escape" # Fire nothing if 1000ms hold time out

Probably I'm messing things up here, but xmodmap isn't the best option to modify mappings anyway, so I will change that to pure xkb config.

I have also swapped : with ; and ` with ~, since I use : and ~ more often:

xmodmap -e "keycode 47 = colon semicolon"
xmodmap -e "keycode 49 = asciitilde grave"

I also use Compose Key to be able to type ūmlauts et c.

In vim, the most useful change I have ever made is mapping of space to leader. All kinds of leader-key combinations will make your life easier.

I couldn't get used to H and L for _ and $, since it doesn't seem to work with surround.vim and some other tricks people advise.

Just don't use arrows!

like image 4
phil pirozhkov Avatar answered Nov 18 '22 06:11

phil pirozhkov


I'd make this part a comment to Randy's answer on Esc if I could, but it demands a little more space. There's one important use case where you can't just remap Windows keys: Windows 7 without admin rights. It's common enough in an enterprise environment; at the very least, it describes me and that keyboard in the pic. keymapper's repo has decent info on this issue:

Important note for Windows 7 Users

Windows 7 does not support per-user key mappings. Until the next release of Key Mapper, you will have to manually switch to 'Boot' mappings from the Mappings menu, reboot to change the mappings, and you will need to have Administrative access to your computer to set key mappings that will work in Windows 7.

The same is true for any Microsoft tools, KeyTweak, SharpKey, etc.

So you'll have to use something like AutoHotkey. I personally prefer mapping Caps Lock directly to Esc for Vim, and I've had issues just mapping it to Ctrl:

#IfWinActive ahk_class Vim
*CapsLock::Esc
#IfWinActive

Another alternative I like is inoremap jj <Esc>. Unless you plan to write about a hajj or something it works pretty well.


More to your point

In any case, have you considered doing the above for easy escaping and then remapping some of the hard-to-reach insert mode commands to Alt (hit it with your thumb) and then using mappings to your leader?

let mapleader=","
nnoremap <leader>f <C-F>
like image 2
brymck Avatar answered Nov 18 '22 06:11

brymck