Skip to content
Go to file


A modal keybinding for emacs (like vim), but based on command frequency and ergonomics.

This is the most efficient editing system in the universe.

home page at

2020-04-18 News: Key Engine Rewrite

Major key engine rewrite by Dan Langlois ( and Will Dey ( . Much doc update will happen in next few days, on how to customize and how the new code works, at xah fly keys home page

The old stable version is available at

QWERTY layout

xah-fly-keys qwerty layout

DVORAK layout

xah-fly-keys dvorak layout


Add the following to .emacs after installing manually or via MELPA:

(require 'xah-fly-keys)
(xah-fly-keys-set-layout "qwerty") ; required

The following keyboard layouts are supported:

  • "azerty"
  • "azerty-be"
  • "colemak"
  • "colemak-mod-dh"
  • "dvorak"
  • "programer-dvorak"
  • "qwerty"
  • "qwerty-abnt"
  • "qwertz"
  • "workman"
  • "norman"


If you want to add keybindings to command-mode, add bindings to xah-fly-command-map. Similarly, to add keybindings to insert-mode, add bindings to xah-fly-insert-map.

In case you want to add bindings available in both command- and insert-mode, define them in xah-fly-shared-map, which is the parent that both xah-fly-command-map and xah-fly-insert-map.

Define these bindings as follows:

(with-eval-after-load 'xah-fly-keys
  ;; Command mode keybindings:
  (define-key xah-fly-command-map (kbd "KEY") #'DEFINITION)

  ;; Insert mode keybindings:
  (define-key xah-fly-insert-map (kbd "KEY") #'DEFINITION))

N.B. For backward compatibility, xah-fly-key-map points to xah-fly-command-map in command-mode and to xah-fly-insert-map in insert-mode, which means if you already have code like this in your config, it will continue to work:

(defun my-xfk-addon-command ()
  "Modify keys for xah fly key command mode keys
To be added to `xah-fly-command-mode-activate-hook'"
  (define-key xah-fly-key-map (kbd "1") 'my-command-abc)
  ;; more here

(add-hook 'xah-fly-command-mode-activate-hook 'my-xfk-addon-command)

(defun my-xfk-addon-insert ()
  "Modify keys for xah fly key command mode keys
To be added to `xah-fly-insert-mode-activate-hook'"
  (define-key xah-fly-key-map (kbd "2") 'my-command-xyz)
  ;; more here

(add-hook 'xah-fly-insert-mode-activate-hook 'my-xfk-addon-insert)

However, you should switch to defining bindings in either xah-fly-command-map or xah-fly-shared-map since they are easier to debug for you, easier to maintain for us, and define bindings only once rather than every mode switch.


A very effective way to change what the command-mode keys do based on the major/minor mode is command remapping. Command remapping will work no matter which keyboard layout you choose to use, and allows you to make the customizations in the major/minor mode’s map rather than the global xah-fly-command-map. Emacs automatically looks up remappings after finding the command bound to a key. Xah Fly Keys defines no command remappings, so they will always be looked up in the normal major and minor mode maps.

To add a remapping, find the command that Xah Fly Keys binds to a key in command mode (e.g. through describe-key), then add a binding in the major/minor mode’s map like so:


For example, to make the ijkl keys scroll a PDF Tools page while in command mode:

(with-eval-after-load 'pdf-view
  (define-key pdf-view-mode-map [remap next-line] #'pdf-view-next-line-or-next-page)
  (define-key pdf-view-mode-map [remap previous-line] #'pdf-view-previous-line-or-previous-page))

Been working on this since 2013, and since 2007 on ergoemacs-mode.

Put in 5 bucks in my patreon.

or pay to



the most efficient keybinding for emacs



No releases published


No packages published
You can’t perform that action at this time.