├── .gitignore ├── README.md ├── doc └── hardmode.txt └── plugin └── hardmode.vim /.gitignore: -------------------------------------------------------------------------------- 1 | /doc/tags -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | VIM: Hard Mode 2 | ============== 3 | 4 | Hard Mode is a plugin which disables the arrow keys, the hjkl keys, 5 | the page up/down keys, and a handful of other keys which allow one 6 | to rely on character-wise navigation. The philosophy behind Hard Mode 7 | is that you'll never master Vim's advanced motion and search functionality 8 | if you can fall back on the anti-pattern of fumbling around your code with 9 | the arrow keys. 10 | 11 | MAPPINGS 12 | -------- 13 | 14 | To enable it: 15 | 16 | :call HardMode() 17 | 18 | To disable it: 19 | 20 | :call EasyMode() 21 | 22 | To enable it by default, add this to your vimrc: 23 | 24 | autocmd VimEnter,BufNewFile,BufReadPost * silent! call HardMode() 25 | 26 | You may also wish to add the following to line to your vimrc: 27 | 28 | nnoremap h :call ToggleHardMode() 29 | 30 | With that line added, presuming your leader is still the `\` key, you 31 | can toggle Hard Mode by pressing `\h` while in Normal-mode. 32 | 33 | Installation 34 | ------------ 35 | 36 | If you don't have a preferred installation method, I recommend 37 | installing [pathogen.vim](https://github.com/tpope/vim-pathogen), and 38 | then simply copy and paste: 39 | 40 | cd ~/.vim/bundle 41 | git clone git://github.com/wikitopian/hardmode.git 42 | 43 | Once help tags have been generated, you can view the manual with 44 | `:help hardmode`. 45 | 46 | Project Authors 47 | --------------- 48 | 49 | [Matt Parrott](https://github.com/wikitopian) and [Xeross](https://github.com/xeross) 50 | 51 | License 52 | ------- 53 | 54 | GPLv2 55 | -------------------------------------------------------------------------------- /doc/hardmode.txt: -------------------------------------------------------------------------------- 1 | *hardmode.txt* Plugin for enforcing Vim motion best practices 2 | 3 | Authors: Matt Parrott , Xeross 4 | License: GPLv2 5 | 6 | This plugin is only available if 'compatible' is not set. 7 | 8 | INTRODUCTION *hardmode* 9 | 10 | Hard Mode is a plugin which disables the arrow keys, the hjkl keys, 11 | the page up/down keys, and a handful of other keys which allow one 12 | to rely on character-wise navigation. The philosophy behind Hard Mode 13 | is that you'll never master Vim's advanced motion and search functionality 14 | if you can fall back on the anti-pattern of fumbling around your code with 15 | the arrow keys. 16 | 17 | MAPPINGS *hardmode-mappings* 18 | 19 | To enable it: 20 | :call HardMode() 21 | 22 | To disable it: 23 | :call EasyMode() 24 | 25 | To toggle it: 26 | :call ToggleHardMode() 27 | 28 | To enable it by default, add this to your |vimrc|: 29 | autocmd VimEnter,BufNewFile,BufReadPost * silent! call HardMode() 30 | 31 | You may also wish to add the following to line to your |vimrc|: 32 | nnoremap h :call ToggleHardMode() 33 | 34 | With that line added, presuming your leader is still the \ key, you 35 | can toggle Hard Mode by pressing \h while in |Normal-mode|. 36 | 37 | OPTIONS *hardmode-options* 38 | 39 | |'g:HardMode_echo'| Enable/disable messages 40 | 41 | |'g:HardMode_hardmodeMsg'| message to display when enabling hardmode 42 | 43 | |'g:HardMode_easymodeMsg'| message to display when enabling easymode 44 | 45 | |'g:HardMode_level'| If set to 'wannabe' arrow keys disabled, but not 46 | hjkl etc. 47 | 48 | vim:tw=78:ts=8:ft=help:norl: 49 | -------------------------------------------------------------------------------- /plugin/hardmode.vim: -------------------------------------------------------------------------------- 1 | " hardmode.vim - Vim: HARD MODE!!! 2 | " Authors: Matt Parrott , Xeross 3 | " Version: 1.0 4 | 5 | if exists('g:HardMode_loaded') 6 | finish 7 | endif 8 | let g:HardMode_loaded = 1 9 | 10 | if !exists('g:HardMode_currentMode') 11 | let g:HardMode_currentMode = 'easy' 12 | end 13 | 14 | if !exists('g:HardMode_level') 15 | let g:HardMode_level = 'advanced' 16 | end 17 | 18 | if !exists('g:HardMode_echo') 19 | let g:HardMode_echo = 1 20 | end 21 | 22 | if !exists('g:HardMode_hardmodeMsg') 23 | let g:HardMode_hardmodeMsg = "VIM: Hard Mode [ ':call EasyMode()' to exit ]" 24 | end 25 | if !exists('g:HardMode_easymodeMsg') 26 | let g:HardMode_easymodeMsg = "You are weak..." 27 | end 28 | 29 | " Only echo if g:HardMode_echo = 1 30 | fun! HardModeEcho(message) 31 | if g:HardMode_echo 32 | echo a:message 33 | end 34 | endfun 35 | 36 | fun! NoArrows() 37 | 38 | nnoremap :call HardModeEcho(g:HardMode_hardmodeMsg) 39 | nnoremap :call HardModeEcho(g:HardMode_hardmodeMsg) 40 | nnoremap :call HardModeEcho(g:HardMode_hardmodeMsg) 41 | nnoremap :call HardModeEcho(g:HardMode_hardmodeMsg) 42 | nnoremap :call HardModeEcho(g:HardMode_hardmodeMsg) 43 | nnoremap :call HardModeEcho(g:HardMode_hardmodeMsg) 44 | 45 | inoremap :call HardModeEcho(g:HardMode_hardmodeMsg) 46 | inoremap :call HardModeEcho(g:HardMode_hardmodeMsg) 47 | inoremap :call HardModeEcho(g:HardMode_hardmodeMsg) 48 | inoremap :call HardModeEcho(g:HardMode_hardmodeMsg) 49 | inoremap :call HardModeEcho(g:HardMode_hardmodeMsg) 50 | inoremap :call HardModeEcho(g:HardMode_hardmodeMsg) 51 | 52 | vnoremap :call HardModeEcho(g:HardMode_hardmodeMsg) 53 | vnoremap :call HardModeEcho(g:HardMode_hardmodeMsg) 54 | vnoremap :call HardModeEcho(g:HardMode_hardmodeMsg) 55 | vnoremap :call HardModeEcho(g:HardMode_hardmodeMsg) 56 | vnoremap :call HardModeEcho(g:HardMode_hardmodeMsg) 57 | vnoremap :call HardModeEcho(g:HardMode_hardmodeMsg) 58 | 59 | endfun 60 | 61 | fun! NoLetters() 62 | 63 | vnoremap h :call HardModeEcho(g:HardMode_hardmodeMsg) 64 | vnoremap j :call HardModeEcho(g:HardMode_hardmodeMsg) 65 | vnoremap k :call HardModeEcho(g:HardMode_hardmodeMsg) 66 | vnoremap l :call HardModeEcho(g:HardMode_hardmodeMsg) 67 | vnoremap - :call HardModeEcho(g:HardMode_hardmodeMsg) 68 | vnoremap + :call HardModeEcho(g:HardMode_hardmodeMsg) 69 | 70 | " Display line motions 71 | vnoremap gj :call HardModeEcho(g:HardMode_hardmodeMsg) 72 | vnoremap gk :call HardModeEcho(g:HardMode_hardmodeMsg) 73 | nnoremap gk :call HardModeEcho(g:HardMode_hardmodeMsg) 74 | nnoremap gj :call HardModeEcho(g:HardMode_hardmodeMsg) 75 | 76 | nnoremap h :call HardModeEcho(g:HardMode_hardmodeMsg) 77 | nnoremap j :call HardModeEcho(g:HardMode_hardmodeMsg) 78 | nnoremap k :call HardModeEcho(g:HardMode_hardmodeMsg) 79 | nnoremap l :call HardModeEcho(g:HardMode_hardmodeMsg) 80 | nnoremap - :call HardModeEcho(g:HardMode_hardmodeMsg) 81 | nnoremap + :call HardModeEcho(g:HardMode_hardmodeMsg) 82 | 83 | endfun 84 | 85 | fun! NoBackspace() 86 | 87 | set backspace=0 88 | 89 | endfun 90 | 91 | fun! HardMode() 92 | 93 | call NoArrows() 94 | 95 | if g:HardMode_level != 'wannabe' 96 | call NoLetters() 97 | call NoBackspace() 98 | end 99 | 100 | let g:HardMode_currentMode = 'hard' 101 | 102 | call HardModeEcho(g:HardMode_hardmodeMsg) 103 | endfun 104 | 105 | fun! EasyMode() 106 | set backspace=indent,eol,start 107 | 108 | silent! nunmap 109 | silent! nunmap 110 | silent! nunmap 111 | silent! nunmap 112 | silent! nunmap 113 | silent! nunmap 114 | 115 | silent! iunmap 116 | silent! iunmap 117 | silent! iunmap 118 | silent! iunmap 119 | silent! iunmap 120 | silent! iunmap 121 | 122 | silent! vunmap 123 | silent! vunmap 124 | silent! vunmap 125 | silent! vunmap 126 | silent! vunmap 127 | silent! vunmap 128 | 129 | silent! vunmap h 130 | silent! vunmap j 131 | silent! vunmap k 132 | silent! vunmap l 133 | silent! vunmap - 134 | silent! vunmap + 135 | 136 | silent! nunmap h 137 | silent! nunmap j 138 | silent! nunmap k 139 | silent! nunmap l 140 | silent! nunmap - 141 | silent! nunmap + 142 | 143 | let g:HardMode_currentMode = 'easy' 144 | 145 | call HardModeEcho(g:HardMode_easymodeMsg) 146 | endfun 147 | 148 | fun! ToggleHardMode() 149 | if g:HardMode_currentMode == 'hard' 150 | call EasyMode() 151 | else 152 | call HardMode() 153 | end 154 | endfun 155 | --------------------------------------------------------------------------------