Enabling vim features using KeyRemap4MacBook
KeyRemap4MacBook provides a wide
range of keyboard customisations.
In particular I was interested in enabling Vim style keybindings across more
programs so that I could minimise the need to move the hand from the touch
This post describes several KeyRemap4MacBook customisations that I explored.
I concluded that several customisations that appeared at first to be good were
not good. The main problem is that customisations often interfere too much with
existing keyboard functionality. Ultimately, the only customisations that I have
Simultaneous Vi Mode and modifications to
key repeat settings.
Thus, I describe these first, before discussing customisations that I tried but
did not persist with (i.e.,
Ubiquitous Vim Bindings and
Complete Vi Mode).
If there is one take home point it is this: simultaneous vi mode quickly becomes awesome for touch typists.
Simultaneous Vi Mode
This mode involves pressing s and d keys together and then
using h, j, k, and l for vim style
I also added “Change F to FN”. This means that HJKL correspond to Home,
PageDown, PageUp, and End. This gives a lot more navigational power.
It’s also possible to simultaneously hold down s, d, and modifier keys like cmd,
alt, and shift to do other forms of navigation and selection.
This is much less full featured than Complete
Vi Mode, but it does not cause mode confusion or conflict. It is activated and then
deactivated naturally when the task switches. It wont interfere with any
I lowered the simultaneous key presses threshold to 30 milliseconds. This seemed
to enable me to still be able to type
asdf fairly quickly, yet it
was not so quick that I was accidentally typing
sd when trying to press both
keys simultaneously. That said, by enabling this shortcut, I have realised just
how frequently I pound out
I also suppressed messages in Growl from the program as it was annoying being
informed every time I simultaneously held down s and d.
After using this customisation for a few weeks it has become intuitive and
really powerful. I use it most commonly when performing search and select type
tasks. For example, when searching the help menu for a command using
Cmd+Shift+/, you need to then cursor down to the selection and press enter. As
a touch typer the
j combination to navigate down quickly becomes
automatic and less attention demanding than moving the hands from the home row
Other useful examples:
- Navigating Finder with the keyboard using the touch typing position
- Selecting items in Spotlight
- Selecting items in Alfred. Even though Alfred has some nice support for
selecting items, I often find the
j approach quicker.
- Browsing a PDF
- Selecting a particular URL from a list in the Chrome address bar
- Selecting an auto-completion option in Excel
- Selecting code complete in various IDEs such as RStudio
However there are times when I don’t use it:
- For most tasks in Chrome, there is Vimium
- For the terminal there are Vi customisations to
.inputrc (see here
- For text editing there is Vim.
In summary, I’m really happy with this customisation.
Key repeat settings
I also found it useful to adjust the following key repeat settings
- Key repeat wait: 30ms
- Key repeat initial wait: 350ms
I have not adopted the remaining settings, but I figured the discussion might be worth recording for others interested in such customisations.
Ubiquitous Vim Bindings
This setting allows editing of text in a wide range of programs on the Mac using
many Vim key bindings. The documentation provides details of what keys are
For example, you can edit text in Chrome browser text boxes (e.g., gmail,
stackoverflow, tumblr), Word, Excel.
Fortunately the program is smart enough to not operate in terminal applications,
Firefox , emacs, vi and vim. For the terminal I have existing customisation
I first configured the program with the following settings
- Enabled Insert Mode Commands
- Esc toggles Normal Mode
- Esc does not exit normal model
This corresponds to how I actually use Vim in Vim. However, this means that
actually pressing escape requires holding down the escape key. This is quite
disruptive as escape key presses are often not registered especially if you are
in the habit of activating.
Insert mode commands can also cause conflicts. In particular, Control +U
conflicts with Excel cell edit.
This is a real trade-off. On the one hand, Vim key bindings are awesome for when
they are needed, but overriding the escape key is unacceptable.
I also turned off “Enable Tab key” as it appeared to interfere with navigating
menus with the keyboard.
I experimented with configuring two versions of KeyRemap. A default configuration that
does not support Vim text editing, and a configuration that I call “Vim” that
does support Vim editing. However, it seemed at first that toggling versions
would require the mouse which seemed to defeat the purpose of the efficiency
savings. However, I have since found out that it is possible to toggle settings
using the command-line. I asked on the github issue tracker for the project about switching between settings using a keyboard shortcut.
Details on switching preferences are provided here.
Thus, the possibility of switching modes using a keyboard shortcut might make this customisation worthy of further consideration, but for now, I have disabled this option.
Complete Vi Mode
This provides Vi style navigation in a wide range of applications. This includes
a wide range of keys This means that many more things can be done without moving
the hand from the home row position.
- Scroll up and down webpages
- Move between cells in Excel
- Navigate forms and dialog boxes with the keyboard
- Navigate the menus
- Navigate deskbars such as Spotlight
I initially tried using “simultaneous key presses” (i.e., pressing both left and right cmd).
However, my first impression was that you often forget to switch between modes.
There is no visual indicator of what mode you are in. Thus, it is fairly
disruptive. This is compounded by the fact that there is often no clear
indicator on a task for when you might be finished with Vi command mode, and
when you might want to shift to regular use of the keyboard.