Как отключить клавиши со стрелками в vim?

24

Я хочу научить себя, используя hjkl больше, чем клавиши со стрелками, чтобы остаться в домашнем ряду. И да, я прекрасно понимаю, что не следует использовать hjkl в качестве основных клавиш навигации. Все же мои привычки довольно сильны, и я даже не понимаю, что заставило это движение руки к клавишам со стрелками, и я хочу отучиться от этого.

Чтобы избавиться от этой привычки: как я могу отключить клавиши со стрелками, чтобы я был вынужден использовать hjkl или какой-либо другой метод навигации?

В качестве бонуса было бы полезно, если бы было показано сообщение, Dont't use this!что оно не является обязательным. Если они не работают, это будет достаточно запутанным для меня, чтобы переосмыслить свои привычки.

k0pernikus
источник
4
Нет абсолютно никакого смысла делать это; HJKL сосут столько же, сколько стрелы.
Ромен
6
Я думаю, что @romainl может указывать на то, что более важно сосредоточиться на использовании мощных движений vim (например, wдля следующего слова, }для следующего абзаца, nдля следующего совпадения результатов поиска, fzдля следующего вхождения zв текущей строке и т. Д.), Чем для перемещения более гранулярно одиночными символами. Я определенно согласен с этим. Тем не менее, HJKL определенно лучше, чем клавиши со стрелками, в том, что вам не нужно отводить руки от домашнего ряда. Я часто буду печатать что-то вроде этого jA, что намного быстрее, чем <Down>A, и на самом деле не может быть побито ни одним движением.
wchargin
4
@romainl: Думаю, я уже обсуждал это с тобой раньше. Невиммеры используются для стрелок, а не для HJKL. В идеале вы не хотите использовать либо; но блокирование стрелок (а не HJKL) заставит людей сделать паузу и задуматься о том, что они делают (при этом оставляя HJKL открытым в качестве альтернативы в случае, если это действительно лучший вариант, или в случае, если пользователь озадачен тем, как это сделать с помощью более мощные движения.). Т.е. речь идет не об изучении HJKL, а о блокировании автоматизма, изученного в других редакторах.
Амадан
1
@Carpetsmoker Что является преимуществом клавиш hjkl, так это отсутствие необходимости покидать домашний ряд. Для клавиш со стрелками рука должна перемещаться по клавиатуре.
k0pernikus
1
@Carpetsmoker Это, безусловно, лучше для меня. ;)
k0pernikus

Ответы:

24

Вы можете установить плагин hardmode и в вашем .vimrcместе в

let g:HardMode_level = 'wannabe'
let g:HardMode_hardmodeMsg = 'Don''t use this!'
autocmd VimEnter,BufNewFile,BufReadPost * silent! call HardMode()

Если вы не хотите использовать плагин, использование (который может быть лучшим выбором, так как вы можете настроить все сами!) nnoremap, vnoremapИ inoremapна <Left>, <Right>, <Up>, <Down>, <PageUp>и <PageDown>, к примеру:

nnoremap <Left> :echo "No left for you!"<CR>
vnoremap <Left> :<C-u>echo "No left for you!"<CR>
inoremap <Left> <C-o>:echo "No left for you!"<CR>
Amadan
источник
1
Там же , <nop>если вы хотите отключить раскладку вообще: nnoremap h <nop>.
Акшай
25

Если вы или кто-то еще, читающий эту тему, просто хотите отключить движения клавиш без текстового предупреждения, введите следующие строки в .vimrc

noremap <Up> <Nop>
noremap <Down> <Nop>
noremap <Left> <Nop>
noremap <Right> <Nop>

Команды отключат движение клавиш только в обычном режиме. Они все еще работают в режиме вставки. Если вы используете inoremap, движение стрелки будет также удалено из режима вставки.

Эта чрезвычайно популярная тема посвящена различиям между noremap, nnoremap, inoremap и т. Д .: переопределение в Vim

Общая идея с переназначением выглядит так:

Choice-of-mode-to-remap <remap this command> <to this action/command instead>

Таким образом, в других приведенных примерах вы переназначаете свою левую команду в текстовое приглашение, которое случайно удаляет действие фактического перемещения курсора. Пример, который я привел выше, просто перераспределяет действия, которые ничего не делают, а не что-то еще. Считайте, что он удаляет, а не заменяет функциональность vim.

Бейер
источник
2

Вы можете добавить это к своему, .vimrcчтобы отключить клавиши со стрелками в командном, вставочном, нормальном и визуальном режимах:

" Remove newbie crutches in Command Mode
cnoremap <Down> <Nop>
cnoremap <Left> <Nop>
cnoremap <Right> <Nop>
cnoremap <Up> <Nop>

" Remove newbie crutches in Insert Mode
inoremap <Down> <Nop>
inoremap <Left> <Nop>
inoremap <Right> <Nop>
inoremap <Up> <Nop>

" Remove newbie crutches in Normal Mode
nnoremap <Down> <Nop>
nnoremap <Left> <Nop>
nnoremap <Right> <Nop>
nnoremap <Up> <Nop>

" Remove newbie crutches in Visual Mode
vnoremap <Down> <Nop>
vnoremap <Left> <Nop>
vnoremap <Right> <Nop>
vnoremap <Up> <Nop>

Примечание. Ознакомьтесь :help map-overviewс более подробной информацией о различных типах картирования.

NonlinearFruit
источник
1
Вы можете уменьшить количество необходимых команд, используя noremap ... ...(для обычного, визуального, выбора и режима ожидания оператора) и noremap! ... ...(для режима вставки и режима командной строки).
Юрген Крамер
Правда. Я думал, что более явное noremapsбудет полезно для тех, кто хочет настроить режимы, на которые влияют
NonlinearFruit