├── assets ├── t-f-j-rotation.png └── no-t-f-j-rotation.png ├── hnei.vim ├── evil-colemak-basics.el └── README.rst /assets/t-f-j-rotation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wbolster/emacs-evil-colemak-basics/HEAD/assets/t-f-j-rotation.png -------------------------------------------------------------------------------- /assets/no-t-f-j-rotation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wbolster/emacs-evil-colemak-basics/HEAD/assets/no-t-f-j-rotation.png -------------------------------------------------------------------------------- /hnei.vim: -------------------------------------------------------------------------------- 1 | " The main magic is done by the following langmap setting. Not only does it 2 | " make Colemak's "hnei" work like QWERTY's "hjkl", but it also covers mappings 3 | " like "gj", "zj", etc. 4 | " 5 | " THE ONLY CAVEAT IS THAT MOST MACROS WILL BE BROKEN! Until this bug is fixed 6 | " in Vim, it is recommended to record a macro with an empty langmap. 7 | " 8 | " The t-f-j rotation is enabled by default but can be disabled using: 9 | "let g:colemak_basics_rotate_t_f_j = 0 10 | if get(g:, 'colemak_basics_rotate_t_f_j', 1) 11 | set langmap=nN;jJ,eE;kK,iI;lL,kK;nN,uU;iI,lL;uU,fF;eE,tT;fF,jJ;tT 12 | else 13 | set langmap=nN;jJ,eE;kK,iI;lL,kK;nN,uU;iI,lL;uU,jJ;eE 14 | endif 15 | 16 | " Do not apply the langmap to characters resulting from a mapping. 17 | set nolangremap 18 | 19 | " Now, we only need to add few remappings not covered by langmap. Note that 20 | " the langmap setting does not apply to "CTRL + ", but fortunately, these 21 | " mappings either have semantics different from those without "CTRL" or may be 22 | " disregarded as there are better alternatives covered by langmap (like 23 | " "CTRL-W CTRL-J", which is mapped to the same function as "CTRL-W j"). 24 | 25 | " Disable timing out on mappings as it makes mapped key sequences unreliable: 26 | " any intermediate delay of more than 1 second would break them. 27 | set notimeout 28 | 29 | " Insert mode remappings. See ":help i_CTRL-G_j" and ":help i_CTRL-G_k". 30 | inoremap n j 31 | inoremap 32 | inoremap e k 33 | inoremap 34 | " Due to some bug in Vim 8.0, the following two tautological lines are also 35 | " necessary for the Insert mode remappings to work. 36 | inoremap j j 37 | inoremap k k 38 | -------------------------------------------------------------------------------- /evil-colemak-basics.el: -------------------------------------------------------------------------------- 1 | ;;; evil-colemak-basics.el --- Basic Colemak key bindings for evil-mode 2 | 3 | ;; Author: Wouter Bolsterlee 4 | ;; Version: 2.2.1 5 | ;; Package-Requires: ((emacs "24.3") (evil "1.2.12") (evil-snipe "2.0.3")) 6 | ;; Keywords: convenience emulations colemak evil 7 | ;; URL: https://github.com/wbolster/evil-colemak-basics 8 | ;; 9 | ;; This file is not part of GNU Emacs. 10 | 11 | ;;; License: 12 | 13 | ;; Licensed under the same terms as Emacs. 14 | 15 | ;;; Commentary: 16 | 17 | ;; This package provides basic key rebindings for evil-mode with the 18 | ;; Colemak keyboard layout. See the README for more information. 19 | ;; 20 | ;; To enable globally, use: 21 | ;; 22 | ;; (global-evil-colemak-basics-mode) 23 | ;; 24 | ;; To enable for just a single buffer, use: 25 | ;; 26 | ;; (evil-colemak-basics-mode) 27 | 28 | ;;; Code: 29 | 30 | (require 'evil) 31 | (require 'evil-snipe) 32 | 33 | (defgroup evil-colemak-basics nil 34 | "Basic key rebindings for evil-mode with the Colemak keyboard layout." 35 | :prefix "evil-colemak-basics-" 36 | :group 'evil) 37 | 38 | (defcustom evil-colemak-basics-layout-mod nil 39 | "Which Colemak layout mod to use. 40 | 41 | Colemak Mod-DH, also known as Colemak Mod-DHm, has m where the h 42 | key is on qwerty. This means we need to swap the h and m 43 | bindings. No other changes are necessary." 44 | :group 'evil-colemak-basics 45 | :type '(choice (const :tag "default" nil) 46 | (const :tag "mod-dh" mod-dh))) 47 | 48 | (defcustom evil-colemak-basics-rotate-t-f-j t 49 | "Whether to keep find-char and end of word jumps at their qwerty position. 50 | 51 | When non-nil, this will rotate the t, f, and j keys, so that f 52 | jumps to the end of the word (qwerty e, same position), t jumps to a 53 | char (qwerty f, same position), and j jumps until a char (qwerty t, 54 | different position)." 55 | :group 'evil-colemak-basics 56 | :type 'boolean) 57 | 58 | (defcustom evil-colemak-basics-char-jump-commands nil 59 | "The set of commands to use for jumping to characters. 60 | 61 | By default, the built-in evil commands evil-find-char (and 62 | variations) are used; when set to the symbol \\='evil-snipe, this 63 | behaves like evil-snipe-override-mode, but adapted to the right 64 | keys. 65 | 66 | This setting is only used when the character jump commands are 67 | rotated; see evil-colemak-basics-rotate-t-f-j." 68 | :group 'evil-colemak-basics 69 | :type '(choice (const :tag "default" nil) 70 | (const :tag "evil-snipe" evil-snipe))) 71 | 72 | (defun evil-colemak-basics--make-keymap () 73 | "Initialise the keymap based on the current configuration." 74 | (let ((keymap (make-sparse-keymap))) 75 | (evil-define-key '(motion normal visual) keymap 76 | "n" 'evil-next-line 77 | "gn" 'evil-next-visual-line 78 | "e" 'evil-previous-line 79 | "E" 'evil-lookup 80 | "ge" 'evil-previous-visual-line 81 | "i" 'evil-forward-char 82 | "I" 'evil-window-bottom 83 | "zi" 'evil-scroll-column-right 84 | "zI" 'evil-scroll-right 85 | "j" 'evil-forward-word-end 86 | "J" 'evil-forward-WORD-end 87 | "gj" 'evil-backward-word-end 88 | "gJ" 'evil-backward-WORD-end 89 | "k" (if (eq evil-search-module 'evil-search) 'evil-ex-search-next 'evil-search-next) 90 | "K" (if (eq evil-search-module 'evil-search) 'evil-ex-search-previous 'evil-search-previous) 91 | "gk" 'evil-next-match 92 | "gK" 'evil-previous-match) 93 | (evil-define-key '(normal visual) keymap 94 | "N" 'evil-join 95 | "gN" 'evil-join-whitespace 96 | "gl" 'evil-downcase 97 | "gL" 'evil-upcase) 98 | (evil-define-key 'normal keymap 99 | "l" 'evil-undo 100 | "u" 'evil-insert 101 | "U" 'evil-insert-line 102 | "gu" 'evil-insert-resume 103 | "gU" 'evil-insert-0-line) 104 | (evil-define-key 'visual keymap 105 | "l" 'evil-downcase 106 | "L" 'evil-upcase 107 | "U" 'evil-insert) 108 | (evil-define-key '(visual operator) keymap 109 | "u" evil-inner-text-objects-map) 110 | (evil-define-key 'operator keymap 111 | "i" 'evil-forward-char) 112 | (when evil-colemak-basics-rotate-t-f-j 113 | (evil-define-key '(motion normal visual) keymap 114 | "f" 'evil-forward-word-end 115 | "F" 'evil-forward-WORD-end 116 | "gf" 'evil-backward-word-end 117 | "gF" 'evil-backward-WORD-end) 118 | (evil-define-key 'normal keymap 119 | "gt" 'find-file-at-point 120 | "gT" 'evil-find-file-at-point-with-line) 121 | (evil-define-key 'visual keymap 122 | "gt" 'evil-find-file-at-point-visual) 123 | (when (featurep 'tab-bar) ; Evil also checks this; see evil-maps.el 124 | (evil-define-key 'normal keymap 125 | "gj" 'tab-bar-switch-to-next-tab 126 | "gJ" 'tab-bar-switch-to-prev-tab)) 127 | (cond 128 | ((eq evil-colemak-basics-char-jump-commands nil) 129 | (evil-define-key '(motion normal visual) keymap 130 | "t" 'evil-find-char 131 | "T" 'evil-find-char-backward 132 | "j" 'evil-find-char-to 133 | "J" 'evil-find-char-to-backward)) 134 | ((eq evil-colemak-basics-char-jump-commands 'evil-snipe) 135 | ;; XXX https://github.com/hlissner/evil-snipe/issues/46 136 | (evil-snipe-def 1 'inclusive "t" "T" 137 | :forward-fn evil-colemak-basics-snipe-t 138 | :backward-fn evil-colemak-basics-snipe-T) 139 | (evil-snipe-def 1 'exclusive "j" "J" 140 | :forward-fn evil-colemak-basics-snipe-j 141 | :backward-fn evil-colemak-basics-snipe-J) 142 | (evil-define-key '(motion normal visual) keymap 143 | "t" 'evil-colemak-basics-snipe-t 144 | "T" 'evil-colemak-basics-snipe-T 145 | "j" 'evil-colemak-basics-snipe-j 146 | "J" 'evil-colemak-basics-snipe-J)) 147 | (t (user-error "Invalid evil-colemak-basics-char-jump-commands configuration")))) 148 | (when (eq evil-colemak-basics-layout-mod 'mod-dh) 149 | (evil-define-key '(motion normal visual) keymap 150 | "m" 'evil-backward-char) 151 | (evil-define-key '(normal visual) keymap 152 | "h" 'evil-set-marker)) 153 | (when evil-respect-visual-line-mode 154 | (evil-define-key '(motion normal visual) keymap 155 | "n" 'evil-next-visual-line 156 | "gn" 'evil-next-line 157 | "e" 'evil-previous-visual-line 158 | "ge" 'evil-previous-line 159 | "0" 'evil-beginning-of-visual-line 160 | "g0" 'evil-beginning-of-line 161 | "$" 'evil-end-of-visual-line 162 | "g$" 'evil-end-of-line 163 | "V" 'evil-visual-screen-line)) 164 | keymap)) 165 | 166 | (defvar evil-colemak-basics-keymap 167 | (evil-colemak-basics--make-keymap) 168 | "Keymap for evil-colemak-basics-mode.") 169 | 170 | (defun evil-colemak-basics--refresh-keymap () 171 | "Refresh the keymap using the current configuration." 172 | (setq evil-colemak-basics-keymap (evil-colemak-basics--make-keymap))) 173 | 174 | ;;;###autoload 175 | (define-minor-mode evil-colemak-basics-mode 176 | "Minor mode with evil-mode enhancements for the Colemak keyboard layout." 177 | :keymap evil-colemak-basics-keymap 178 | :lighter " hnei") 179 | 180 | ;;;###autoload 181 | (define-globalized-minor-mode global-evil-colemak-basics-mode 182 | evil-colemak-basics-mode 183 | (lambda () (evil-colemak-basics-mode t)) 184 | "Global minor mode with evil-mode enhancements for the Colemak keyboard layout.") 185 | 186 | (provide 'evil-colemak-basics) 187 | 188 | ;;; evil-colemak-basics.el ends here 189 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | ====================== 2 | evil-colemak-basics.el 3 | ====================== 4 | 5 | This Emacs package provides basic key bindings for evil-mode_ 6 | optimized for the Colemak_ keyboard layout. (As an extra, there 7 | is also a Vim version of most of the bindings, though Vim is 8 | less hackable than Emacs.) 9 | 10 | .. _evil-mode: https://github.com/emacs-evil/evil 11 | .. _Colemak: https://colemak.com/ 12 | 13 | Designed as a smart hybrid between Colemak and Qwerty, it works 14 | especially well for Colemak converts who have used Vim on a Qwerty 15 | keyboard before they made the switch to Colemak. All keys (except one) 16 | are in their Colemak or Qwerty positions, depending on what provides 17 | the most ergonomic editing experience, and `muscle memory`_ is 18 | retained for many frequently used commands. 19 | 20 | .. _muscle memory: https://en.wikipedia.org/wiki/Muscle_memory 21 | 22 | 23 | Key bindings 24 | ============ 25 | 26 | The starting point is a plain Colemak layout with all keys in their 27 | normal positions. On top of that the following keys are changed for 28 | motion state (``m``), normal state (``n``), visual state (``v``), and 29 | operator-pending state (``o``, inherits from motion state): 30 | 31 | .. list-table:: 32 | :header-rows: 1 33 | 34 | * - Colemak 35 | - Qwerty 36 | - Action 37 | - States 38 | - At Qwerty position? 39 | - Remarks 40 | 41 | * - ``h``, ``n``, ``e``, ``i`` 42 | - ``h``, ``j``, ``k``, ``l`` 43 | - navigate 44 | - ``mnvo`` 45 | - yes 46 | - 47 | 48 | * - ``k``, ``K`` 49 | - ``n``, ``N`` 50 | - search next/previous 51 | - ``mnvo`` 52 | - yes 53 | - 54 | 55 | * - ``u``, ``U`` 56 | - ``i``, ``I`` 57 | - insert 58 | - ``_nv_`` 59 | - yes 60 | - 61 | 62 | * - ``l`` 63 | - ``u`` 64 | - undo 65 | - ``_n__`` 66 | - yes 67 | - 68 | 69 | * - ``N`` 70 | - ``J`` 71 | - join lines 72 | - ``_nv_`` 73 | - yes 74 | - 75 | 76 | * - ``E`` 77 | - ``K`` 78 | - lookup 79 | - ``mnv_`` 80 | - yes 81 | - 82 | 83 | * - ``I`` 84 | - ``L`` 85 | - jump to bottom of window 86 | - ``mnvo`` 87 | - yes 88 | - 89 | 90 | * - ``l``, ``L`` 91 | - ``u``, ``U`` 92 | - downcase/upcase 93 | - ``__v_`` 94 | - no 95 | - also mnemonic 96 | 97 | * - ``u`` 98 | - ``i`` 99 | - inner text object keymap 100 | - ``___o`` 101 | - yes 102 | - 103 | 104 | * - ``f``, ``F`` 105 | - ``e``, ``E`` 106 | - jump to end of word 107 | - ``mnvo`` 108 | - yes 109 | - with ``t-f-j`` rotation 110 | 111 | * - ``t``, ``T`` 112 | - ``f``, ``F`` 113 | - jump to character 114 | - ``mnvo`` 115 | - yes 116 | - with ``t-f-j`` rotation 117 | 118 | * - ``j``, ``J`` 119 | - ``t``, ``T`` 120 | - jump until character 121 | - ``mnvo`` 122 | - no 123 | - with ``t-f-j`` rotation 124 | 125 | * - ``j``, ``J`` 126 | - ``e``, ``E`` 127 | - jump to end of word 128 | - ``mnvo`` 129 | - no 130 | - without ``t-f-j`` rotation 131 | 132 | In addition to the keys listed explicitly above, variations like 133 | ``gn`` and ``ge`` (``gj`` and ``gk`` on Qwerty) to navigate visual 134 | lines instead of real lines also behave as expected. 135 | 136 | The tables below indicate whether a key has its Colemak meaning (⬆️), its 137 | Qwerty meaning (⬇️), the same meaning (↕️), or neither (✖️). 138 | 139 | .. list-table:: 140 | :header-rows: 0 141 | 142 | * - colemak 143 | - q 144 | - w 145 | - f 146 | - p 147 | - g 148 | - j 149 | - l 150 | - u 151 | - y 152 | - ; 153 | 154 | * - 155 | - ↕️ 156 | - ↕️ 157 | - ⬇️ 158 | - ⬆️ 159 | - ⬆️ 160 | - ✖️ 161 | - ⬇️ 162 | - ⬇️ 163 | - ⬆️ 164 | - ⬆️ 165 | 166 | * - qwerty 167 | - q 168 | - w 169 | - e 170 | - r 171 | - t 172 | - y 173 | - u 174 | - i 175 | - o 176 | - p 177 | 178 | .. list-table:: 179 | :header-rows: 0 180 | 181 | * - colemak 182 | - a 183 | - r 184 | - s 185 | - t 186 | - d 187 | - h 188 | - n 189 | - e 190 | - i 191 | - o 192 | 193 | * - 194 | - ↕️ 195 | - ⬆️ 196 | - ⬆️ 197 | - ⬇️ 198 | - ⬆️ 199 | - ↕️ 200 | - ⬇️ 201 | - ⬇️ 202 | - ⬇️ 203 | - ⬆️ 204 | 205 | * - qwerty 206 | - a 207 | - s 208 | - d 209 | - f 210 | - g 211 | - h 212 | - j 213 | - k 214 | - l 215 | - ; 216 | 217 | .. list-table:: 218 | :header-rows: 0 219 | 220 | * - colemak 221 | - z 222 | - x 223 | - c 224 | - v 225 | - b 226 | - k 227 | - m 228 | 229 | * - 230 | - ↕️ 231 | - ↕️ 232 | - ↕️ 233 | - ↕️ 234 | - ↕️ 235 | - ⬇️ 236 | - ↕️ 237 | 238 | * - qwerty 239 | - z 240 | - x 241 | - c 242 | - v 243 | - b 244 | - n 245 | - m 246 | 247 | 248 | .. figure:: assets/t-f-j-rotation.png 249 | :alt: keyboard layout with t-f-j-rotation 250 | 251 | with t-f-j rotation 252 | 253 | 254 | .. figure:: assets/no-t-f-j-rotation.png 255 | :alt: keyboard layout without t-f-j-rotation 256 | 257 | without t-f-j rotation 258 | 259 | 260 | ========= ================== 261 | key color meaning 262 | ========= ================== 263 | ⚪ Colemak and Qwerty 264 | 🔵 Colemak 265 | 🟢 Qwerty 266 | 🔴 neither 267 | ========= ================== 268 | 269 | Design rationale 270 | ================ 271 | 272 | Some other Colemak configurations for Emacs/Evil (and Vim) redefine 273 | big parts of the non-insert states (normal, visual, and so on) by 274 | changing or even completely removing standard Vim commands. Such 275 | changes significantly change the editing experience. This is a no go 276 | for seasoned users who are used to the default Emacs/Evil (and Vim) 277 | key bindings, and just want a new keyboard layout, not a new editor. 278 | 279 | The other extreme is to not change anything at all. While a ‘no 280 | configuration’ approach may work fine for some, others consider it 281 | simply unacceptable to not have ‘arrow navigation’ keys (which are not 282 | mnemonic commands) at their usual ergonomic home row positions, 283 | because it completely breaks their muscle memory, making the switch to 284 | Colemak (from Qwerty) even harder than it already is. 285 | 286 | This package provides a sensible compromise between ‘change 287 | everything’ and ‘change nothing’. It changes a few key bindings, 288 | namely those used for basic navigation (``hnei``), and only makes a 289 | number of additional cascading changes to deal sensibly with the 290 | implications of remapping the navigation keys. No functionality is 291 | lost. 292 | 293 | The design steps to arrive at the key bindings provided by this 294 | package are as follows: 295 | 296 | * The starting point is a standard Colemak keyboard layout. This works 297 | well for many mnemonic keys like ``d`` (delete), ``p`` (put/paste), 298 | ``y`` (yank), and various others. 299 | 300 | * The ``hnei`` (``hjkl`` on Qwerty) keys are used for the familiar 301 | ‘arrow key’ navigation. 302 | 303 | * This means ``n`` (next search match), ``e`` (end of word) and ``i`` 304 | (insert) need a new home. All of these move to their Qwerty 305 | positions. 306 | 307 | * As a consequence, ``u`` (undo), and ``f`` (jump to character) need a 308 | new home. Also move these to their Qwerty positions. 309 | 310 | * At this point only ``t`` (jump until character) needs a new home. It 311 | cannot go to its Qwerty position, since that would cause a cascade 312 | of follow-up changes that would break many mnemonic keys. Therefore 313 | it moves to Colemak ``j``, the only remaining unused spot. This 314 | position is hard to reach, but since this command is not frequently 315 | used, this is an acceptable trade-off. 316 | 317 | * Now all commands are either at their Colemak or Qwerty position, 318 | except for ‘jump until character‘, which is at neither. 319 | 320 | While this may seem complex, the result is that you can happily think 321 | and type in Colemak, while you can use muscle memory for many often 322 | used commands: 323 | 324 | * basic ‘arrow key’ navigation 325 | * insert 326 | * undo 327 | * search match navigation 328 | * end of word 329 | * jump to character 330 | 331 | …in addition to all the keys that already have the same position on 332 | Colemak and Qwerty, such as ``b`` (previous word), ``c`` (change), 333 | ``w`` (next word), and various others. 334 | 335 | As an alternative, a lighter variation of the above scheme is also 336 | available by omitting the ``t-f-j`` rotation. Without that rotation, 337 | ``t`` (jump until character) and ``f`` (jump to character) stay at 338 | their Colemak position, which some may prefer. The downside is that 339 | the ‘end of word’ command ends up at the hard to reach ``j`` position. 340 | 341 | 342 | Installation 343 | ============ 344 | 345 | This package is available from Melpa and can be installed with the 346 | package manager (``package.el``) that comes bundled with Emacs 24+. 347 | With `use-package`, the minimal form looks like like this: 348 | 349 | .. code-block:: elisp 350 | 351 | (use-package evil-colemak-basics) 352 | 353 | Or manually install by running:: 354 | 355 | M-x package-install RET evil-colemak-basics RET 356 | 357 | Alternatively, put the Elisp file somewhere in your loading path and 358 | load it explicitly: 359 | 360 | .. code-block:: elisp 361 | 362 | (require 'evil-colemak-basics) 363 | 364 | Note that this ``(require)`` is not needed when installing from Melpa. 365 | 366 | 367 | Usage 368 | ===== 369 | 370 | To enable globally, use:: 371 | 372 | M-x global-evil-colemak-basics-mode RET 373 | 374 | To enable for just a single buffer, use:: 375 | 376 | M-x evil-colemak-basics-mod RET 377 | 378 | To enable permanently, call ``(global-evil-colemak-basics-mode)`` from 379 | your ``init.el``. With ``use-package`` this looks like this: 380 | 381 | .. code-block:: elisp 382 | 383 | (use-package evil-colemak-basics 384 | :config 385 | (global-evil-colemak-basics-mode)) 386 | 387 | When enabled, a lighter showing ``hnei`` will appear in your mode 388 | line. If you don't like it, use ``rich-minority`` or ``diminish`` to 389 | hide it. 390 | 391 | Note that this package assumes that your operating system is properly 392 | configured for the Colemak keyboard layout. It does not implement the 393 | Colemak layout on top of a Qwerty layout. 394 | 395 | 396 | Configuration 397 | ============= 398 | 399 | Use the customize interface to get more information about the 400 | settings:: 401 | 402 | M-x customize-group RET evil-colemak-basics RET 403 | 404 | However, since the settings *must* be set before loading the package 405 | (since they influence how the keymap is constructed), the most 406 | reliable way is to put ``(setq …)`` in your ``init.el`` file, before 407 | using ``(require …)`` or invoking any of the autoloaded functions like 408 | ``(global-evil-colemak-basics-mode)``. With ``use-package``, use 409 | ``:init`` like this: 410 | 411 | .. code-block:: elisp 412 | 413 | (use-package evil-colemak-basics 414 | :init 415 | (setq evil-colemak-basics-... ...) 416 | :config 417 | (global-evil-colemak-basics-mode)) 418 | 419 | ``t-f-j`` rotation 420 | ------------------ 421 | 422 | The ``t-f-j`` rotation is enabled by default but can be disabled using: 423 | 424 | .. code-block:: elisp 425 | 426 | (setq evil-colemak-basics-rotate-t-f-j nil) 427 | 428 | Mod-DH 429 | ------ 430 | 431 | Support for the Mod-DH variation of Colemak, also known as Mod-DHm, 432 | can be enabled with: 433 | 434 | .. code-block:: elisp 435 | 436 | (setq evil-colemak-basics-layout-mod 'mod-dh) 437 | 438 | This will swap the bindings for ``m`` and ``h``, leaving all other 439 | bindings as is. 440 | 441 | evil-snipe 442 | ---------- 443 | 444 | To use evil-snipe_ for the ‘jump to character’ and ‘jump until 445 | character’ commands, use: 446 | 447 | .. code-block:: elisp 448 | 449 | (setq evil-colemak-basics-char-jump-commands 'evil-snipe) 450 | 451 | .. _evil-snipe: https://github.com/hlissner/evil-snipe 452 | 453 | Note that this package will load ``evil-snipe``, so if you have any 454 | configuration that should be set before ``evil-snipe`` is loaded, such 455 | as ``evil-snipe-auto-disable-substitute``, make sure to configure 456 | ``evil-snipe`` before this package is loaded. With ``use-package`` it 457 | looks like this: 458 | 459 | .. code-block:: elisp 460 | 461 | (use-package evil-colemak-basics 462 | :after evil evil-snipe 463 | :init 464 | (setq evil-colemak-basics-char-jump-commands 'evil-snipe) 465 | :config 466 | (global-evil-colemak-basics-mode)) 467 | 468 | visual-line-mode 469 | ---------------- 470 | 471 | Make movement commands respect `visual-line-mode` with: 472 | 473 | .. code-block:: elisp 474 | 475 | (setq evil-respect-visual-line-mode t) 476 | 477 | 478 | Credits 479 | ======= 480 | 481 | These bindings were inspired by a similar configuration for Vim and 482 | other software by James Pike, available from 483 | https://github.com/ohjames/colemak 484 | --------------------------------------------------------------------------------