Навигация в режиме вставки

20

Я наконец решил отказаться от клавиш со стрелками для навигации в пользу hjkl. Я использовал Vim hardmodeплагин для отключения клавиш со стрелками.

Я довольно быстро привык к навигации, но оказывается, что навигация в режиме вставки внезапно невозможна.

Есть ли решение для этого? (существующий режим вставки не является решением).

STDCALL
источник
8
Да: используйте клавиши со стрелками :-) Вот для чего они здесь ;-)
Мартин Турной
@Carpetsmoker, если доступны клавиши со стрелками, я бы использовал их вместо hjkl ....
stdcall
5
Но идея состоит в том, что выход из режима вставки (а именно, использование его только для того, для чего он предназначен, то есть для небольших вставок, перемежающихся с другими командами) является именно решением. Если я не ошибаюсь, я видел это в справке, если я найду ссылку, я отправлю это. Кажется, ты слишком привык к этому, а не к клавишам со стрелками.
Ви
Вы можете привязать свою клавиатуру, чтобы использовать стрелки в качестве ярлыка, например, <kbd> super </ kbd> + <kbd> j </ kbd> для перемещения вниз. <kbd> super </ kbd> может быть любой кнопкой, например <kbd> Caps Lock </ kbd> довольно распространен
ivanjermakov

Ответы:

26

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

Вы никогда не должны снова использовать клавиши со стрелками! Каждый раз, когда вы используете клавиши со стрелками, вы тратите 3 минуты времени, щенок умирает, и кто-то переключается на Emacs!

(Очевидно, я шучу) Однако, есть цель для клавиш со стрелками. Они чрезвычайно полезны для навигации:

  • В режиме вставки

  • В командной строке

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

Вариант № 2 - переназначить, ctrl-hjklчтобы действовать как клавиши курсора. Это хорошо, потому что вы можете оставаться на родине, и это хорошо сочетается с мышечной памятью, которую вы уже освоили hjklв обычном режиме. На самом деле, это то, что я делаю . Основным недостатком этого подхода является то, что в терминале vim может возникнуть проблема с настройкой, поскольку он <C-j>создает NULбайт. Я обхожу это с помощью Gvim. Я не знаю, есть ли простое решение для консоли VIM или нет.

Вариант № 3 - использовать <C-o>для небольших движений в нормальном режиме. Например, если вы печатаете

Hello world!
     cursor^

и вы понимаете, что забыли запятую, вместо того, чтобы делать leftleftleftleftleftleft, вы можете просто сделать <C-o>b<C-o>hили <C-o>2Fo, или любую другую комбинацию движений в нормальном режиме, которая вам нравится.

Конечно, еще один вариант, который мне очень нравится, - это просто Escсделать несколько небольших движений, прежде чем вернуться в обычный режим. Вы упомянули, что не хотите этого делать, но иногда это действительно самый эффективный способ.

Возможно, есть и другие подходы, но мне они понравились.

DJMcMayhem
источник
2
Интересно - отмечу, вы используете <c-o>gkи <c-o>gjвместо <Up>и <Down>. Это почему?
Кайл Стрэнд
4
@kylestrand gkи gjвизуально идти вверх и вниз по линии, даже если строка обернута.
DJMcMayhem
4
Я не думаю, что этого достаточно, чтобы гарантировать ответ самостоятельно, но мне нравится отключать клавиши со стрелками в обычном режиме (что заставило меня изучать HJKL) и включать во всех других режимах ( noremap <Up> <NOP>...) , В обычном режиме вы проводите достаточно времени, чтобы выучить HJKL, но они там, когда вам это нужно. Или, по крайней мере, я считаю, что это удобная середина между тем, чтобы оставлять их всегда выключенными или всегда включенными, и это не требует переназначения других клавиш (многим людям нравится Ctrl-HJKL для перемещения между панелями).
Итай Фербер
Кстати, BASH и др. Поддерживают привязки клавиш vi. С помощью этих сопоставлений вы можете <ESC> и использовать hjkl для просмотра истории cmd (вверх / вниз) или для изменения текущей команды (влево / вправо)
Рольф
9

Мне нравится использовать клавишу Control, чтобы превратить hjklклавиши управления в «универсальные» клавиши управления движением. Вот соответствующая часть моего .vimrc:

" In insert or command mode, move normally by using Ctrl
inoremap <C-h> <Left>
inoremap <C-j> <Down>
inoremap <C-k> <Up>
inoremap <C-l> <Right>
cnoremap <C-h> <Left>
cnoremap <C-j> <Down>
cnoremap <C-k> <Up>
cnoremap <C-l> <Right>

В inoremapместозаполнителях в режиме вставки, в то время как cnoremapте , применяются в командном режиме. (Я использовал это отображение так долго, что забыл, есть ли способ перемещаться по истории командного режима без него.)

(Изменить: я вижу, что другой ответ уже упоминал эту возможность. Тем не менее, может быть полезно увидеть фактические команды отображения.)

Кайл Стрэнд
источник
3

Нажмите, escзатем используйте hjklи wWbBи любые другие навигации, которые вы хотели бы сделать. Весь смысл сложного режима состоит в том, чтобы научить вас перемещаться с помощью более сложных движений vim. Сделайте небольшие правки, затем перейдите в новое место, используя обычный режим.

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

Archangel33
источник
3

Если вы хотите переместиться более чем на одну или две позиции ...

... лучший выбор - нажать ESC, переместиться и снова вернуться в режим вставки.

Нет смысла создавать сопоставления, например, <C-h>перемещаться влево, а затем начинать нажимать его слишком много раз ... как пользователь vim, вы не должны нажимать одну и ту же клавишу несколько раз для достижения разумного движения.

(Если ESCключ не находится рядом с вашими пальцами, было бы неплохо создать для него сопоставление.)

Если вы хотите переместить ОДИН или ДВЕ позиции в режиме вставки ...

... хорошим выбором было бы определить некоторые движения, используя ваш <Leader>ключ:

(Я использую в ,качестве <Leader>ключа, так как он чувствует себя близко и удобно для моих пальцев)

noremap! <Leader>h <left>   "move cursor left
noremap! <Leader>j <down>   "move cursor down
noremap! <Leader>k <up>     "move cursor up   
noremap! <Leader>l <right>  "move cursor right
noremap! <Leader>w <esc>wi  "move one word forward
noremap! <Leader>e <esc>ei  "move forward to the end of word
noremap! <Leader>b <esc>bi  "move one word backward
rossijonas
источник
1

Если вам просто нужно изменить небольшое количество текста или слова, вы можете использовать <Ctrl-O>h/j/k/l.

<Ctrl-O> возвращает вас в обычный режим только для этой команды, а затем переводит обратно в режим вставки, так что он экономит некоторое количество нажатий клавиш, если вам нужно перейти в обычный режим для небольшого движения.

Ссылка: 1. http://vim.wikia.com/wiki/Use_Ctrl-O_instead_of_Esc_in_insert_mode_mappings

alpha_989
источник