Другие способы выхода из режима вставки, кроме Escape


74

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

Недавно я узнал, что могу также использовать Ctrl + C, чтобы выйти из режима вставки. Тем не менее, это не совсем улучшение.

Как выйти из режима вставки без того, чтобы мои руки покинули домашний ряд, и без значительного влияния на то, что я могу печатать? Примечание: я использую в основном vanilla vim с раскладкой клавиатуры дворака, хотя я бы тоже хотел услышать решения для раскладки qwerty.


1
Вы можете отобразить любую комбинацию клавиш в любом месте, и вы не можете делать ничего другого. Это то, что вы имели ввиду?
лет»

3
Выучил комбинацию клавиш Ctrl + C THX!
Филипп Гачу

Как насчет отображения Caps Lock как Esc?
Каньон Колоб

@PhillippeGachaud: не используйте Ctrl-C в качестве замены Esc. Ctrl-C - это не то же самое, что Escape, это вынужденный Escape, который может вести себя по-разному при некоторых обстоятельствах.
Ложь Райан

Ответы:


60

Обычная привязка, которую вы увидите, это jj , потому что она хорошо работает для раскладок QWERTY, если вы используете домашнее позиционирование строк.

inoremap jj <ESC>

В этом случае, чтобы набрать литерал jj- вы должны подождать 1 секунду (по умолчанию) между вводом второго символа. ( :help 'timeout'подробности см. )

Есть также, c-oкоторый вытащит вас из вставки, позволит вам выполнить одну обычную команду, а затем вернет вас обратно во вставку.

http://vim.wikia.com/wiki/Avoid_the_escape_key


1
В дворак, jэто cключ. Так что это не так уж плохо (напечатать cc). Я мог также связать hh(qwerty jkey = dvorak h), который загрузил бы меня, только если я печатал shhhhhhhили что-то еще.
durron597

7
cc - это более распространенная двухбуквенная комбинация клавиш, по крайней мере на английском языке. Так что это может быть не лучшим выбором
Ник Адамс

4
Как насчет подражания jk? Найдите две клавиши, которые находятся рядом в Дворжаке, но не являются общими комбинациями на предпочитаемом вами языке. tnНапример, позиционный эквивалент jk.
Дэвид Лорд

1
Мне нравиться иметь jk/ kjвыходить из нормального режима даже в Дворжаке; это клавиши «c» и «v» на QWERTY-клавиатуре, поэтому они удобны для моего левого указателя и среднего пальца.
alxndr

2
Я думаю, что мы можем сделать еще лучше - использовать iiвместо этого. Да, вы должны убрать пальцы с домашнего ряда, но это все еще удобно. И что еще более важно, вы можете переключаться между режимами, не двигая пальцем.
Шридхар Сарнобат

38

Помимо встроенных альтернатив <C-[>и <C-c>к <Esc>ключу цитируемого другими, еще одним популярным решением является переназначить в <CapsLock>качестве дополнительного Escape. Это как на клавиатуре Qwerty, так и на двораке.

Таким образом, вы можете очень легко нажимать Esc левым мизинцем, не отрывая рук от HomeRow (кстати, CapsLock - это то место, где Escape находился на клавиатурах, когда был изобретен vi).

Преобразование может быть сделано:

  • в Windows используется утилита AutoHotKey ;
  • на Mac с помощью утилиты KeyRemap4MacBook и других;
  • в Linux меняется в зависимости от среды рабочего стола. Например, в Linux Mint / Cinnamon достаточно выбрать правильный параметр в меню-> Клавиатура-> Раскладки клавиатуры-> Поведение Caps Lock. В качестве альтернативы, но не так просто, его можно переназначить на уровне Xorg с помощью программы xmodmap и запустить следующий .Xmodmapфайл:

    clear Lock
    keycode 0x42 = Escape
    

    Систему можно настроить так, чтобы она автоматически запускалась при каждом входе в систему, стратегически размещая следующие строки сценариев оболочки (предположительно .Xmodmap, в вашей домашней ~директории) в цепочке файлов с автоматическим источником входа в систему:

    if [ -s ~/.Xmodmap ]; then
      xmodmap ~/.Xmodmap
    fi
    

    Однако это непросто, поскольку файлы на самом деле зависят от используемой среды (рабочего стола). В качестве примера у меня есть xmodmap, называемая записью в Cinnamon «Startup Applications» (что позволяет мне делать больше, чем обычная настройка переназначения ключей GUI).

Некоторые люди идут еще дальше и программируют ключ CapsLock так:

  • как Ctrlключ, нажав и удерживая его,
  • как Escключ, нажав и быстро отпустив его.

Это можно сделать в Windows и Mac, правильно установив / запрограммировав соответствующую утилиту переназначения (в частности, подсказки для AutoHotkey можно найти здесь, а для проверки KeyRemap4MacBook здесь ). На Linux используется программа xcape .


2
Полностью согласен. Наличие клавиши ctrl на домашней строке повышает удобство использования (прокрутка завершений с помощью ctrl + n, прокрутка файла с помощью ctrl + f / ctrl + b, экранирование с помощью ctrl +] и т. Д. Все эти комбинации клавиш легче выполнить таким образом.
Джон ОМ.

1
О нажатии Ctrlклавиши (в обычном положении) без скручивания мизинца: вы можете нажать ее внешней ладонью, как это хорошо описано здесь (я нашел этот хороший умный трюк в сети, время дать ему назад :) и слава тому, кто это придумал)
Джованни Маджорани

FWIW KeyRemap4MacBook был переименован в Karabiner: pqrs.org/osx/karabiner/index.html.en
alxndr

Я попробовал это решение, но обнаружил, что случайно нажал Caps Lock, когда несколько раз нажал Shift, что раздражало. Таким образом, ваш пробег может варьироваться в зависимости от того, насколько проворен ваш левый мизинец. :)
Кузнец

2
Если переназначить Ctrlна Alt( Cmd) и наоборот, то <C-[> действительно светит. Пинки слабые, большой палец сильный. На QWERTY вам даже не нужно выходить из дома, для этого на Dvorak это не так хорошо, но приемлемо.
Нэш Бриджес

28

Отображения, которые я использую:

inoremap jk <esc>
inoremap kj <esc>

Таким образом, вы можете просто нажать jи kодновременно, не беспокоясь о том, что вы нажмете первым.


70
Но я пишу книгу об игре Эдсгара Дейкстры в блэкджек в Рейкьявике! ;)
durron597

Оба ужасны, если вы хотите написать любой голландский.
Хильке Валинга

12

<C-[>и <C-c>две родные альтернативы <Esc>.

Смотрите, :help i_<esc>и :help i_ctrl-cчем объясняется разница между <C-c>и <Esc>.


Опять же, это не улучшения, так как Ctrl так же далек от домашней строки, как Escape.
durron597

4
@ durron597 На QWERTY-клавиатуре Ctrl может быть так же далеко от домашнего ряда, но у него есть важное отличие: он находится ниже домашнего ряда. Вы должны только двигать пальцем, чтобы нажать на него, тогда как с Esc вы должны немного повернуть всю руку. Кроме того, он <C-[>имеет хорошую симметрию (оба мизинца движутся в противоположных направлениях).
wchargin

6
Обратите внимание, что <C-c> это не совсем то же самое, что<Esc> .
wchargin

2
Согласовано. Привычное использование <C-c>может тонко сломать плагины и autocmds.
Дэвид Лорд

На моей машине это <C - [> работает, но регистрация занимает полсекунды дольше, чем <Cc>
Александр Миллс

4

Вы можете отобразить Caps Lockна Control без использования каких - либо внешних программ :

  • В Mac OS X зайдите в Системные настройки> Клавиатура -> Клавиши-модификаторы
  • В Linux выполните:setxkbmap -option caps:ctrl_modifier
  • В Windows отредактируйте свой реестр.

Это приносит Controlна дому подряда, что делает его легче нажимать все управление модифицированы инсультов, в том числе Ctrl-[и Ctrl-Cкоторые оба выхода из режима вставки в Vim.

В качестве альтернативы, в нижней части своего ответа Джованни предлагает составить карту Caps Lockдля выполнения и того, Control и другого в Escapeзависимости от длины печати, но это требует установки дополнительного программного обеспечения.

Ctrl-[является предпочтительной альтернативой , так как она всегда работает как Escape.

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

Он также не проверяет сокращения и не вызывает событие InsertLeave. Видеть:help i_CTRL-C


4

Я бы предложил использовать мой плагин vim-easyescape .

Plug "zhou13/vim-easyescape"
let g:easyescape_chars = { "j": 1, "k": 1 }
let g:easyescape_timeout = 100
cnoremap jk <ESC>
cnoremap kj <ESC>

Проблема с простой последовательностью сопоставления inoremap jj <ESC>заключается в том, что Vim будет приостанавливать всякий раз, когда вы печатаете jили kв режиме вставки (он ожидает, когда следующий ключ определит, применять ли сопоставление). Пауза вызывает зрительное отвлечение, которое вы можете заметить или не заметить. vim-easyescape не имеет такой проблемы и поддерживает пользовательское время ожидания.


3

В терминале vi и Vim alt+ single-normal-mode-keyбудет работать для быстрого редактирования в большинстве терминалов.

Это работает, потому что большинство терминалов отправляют модификатор alt в качестве escape-символа. Например, при alt+kвводе эмулятор терминала отправляет два символа в запущенную программу: esc, k. Ви и Вим истолковывают это так, как вы ожидаете; он выходит из режима вставки (из-за выхода) и выполняет команду нормального режима (в примере, перемещая курсор вверх на одну строку).

Это может быть удобным способом выхода из режима вставки, если на клавиатуре есть клавиша alt рядом с пробелом (чтобы ее можно было нажимать большим пальцем, оставляя пальцы на домашнем ряду), если вы используете эмулятор терминала. с таким поведением и не прочь запустить команду нормального режима.


2
Можете ли вы уточнить, что это такое single-normal-mode-key? Вы имеете в виду побег?
Кенорб

Одно нажатие клавиши, которое вы бы использовали в обычном режиме, можно использовать в режиме вставки с помощью клавиши alt. например, Alt + x, чтобы удалить символ.
Ewatt

2
Я тоже не совсем понимаю этот ответ; Alt + x на самом деле, кажется, делает что-то другое, чем Alt в обычном режиме? А некоторые другие клавиши не работают? Но, возможно, я использую это неправильно ..? Возможно, вы могли бы немного расширить свой ответ, чтобы объяснить, как он работает, и ссылка на некоторые документы Vim также была бы полезной :-) Спасибо! :-)
Мартин Турной

это на самом деле зависит от конфигурации вашего терминала и обычно не устанавливается так, как вы предполагаете.
Кристиан Брабандт

1
Я проголосовал за это, затем проверил историю и понял, что по какой-то причине модератор отредактировал ее, чтобы добавить 99% текста из воздуха, а не просто оставить комментарий, как ожидается от остальных. Поэтому мне пришлось отменить свой голос. Конечно, что здесь произошло, выходит за рамки разумных правок? Я получил гораздо меньше разрушительных правок. Новый контент, конечно, великолепен, но не входит в этот ответ. Это должно было быть своим.
underscore_d

3

Я использую:

:map! ;l ^[
:vmap ;l ^[

Это похоже на попадание в Return. Я использую ;как лидер для других отображений в режиме вставки.

Единственный раз, когда мне нужно было набрать ';' + буква это когда код игра в гольф; У меня не было никаких конфликтов в противном случае.


может быть, лучше сопоставить его с побегом, чем сопоставить с ^ [верно? :)
Александр Миллс

2

Я использую Ctrl+ 3уже довольно давно, мне легче набирать текст, чем большинству альтернатив, и, кажется, он работает хорошо (по крайней мере, в Linux). Мой Caps Lockсопоставлен Ctrl, так что очень удобно набирать его.

Я пытался использовать Ctrl+ в cтечение некоторого времени, но у меня были некоторые проблемы, которые я сейчас точно не помню, но я не получал точно такое же поведение Esc, как и сейчас с Ctrl+ 3.


2
Что именно должен делать Ctrl-3?
Кристиан Брабандт

Я не знаю, как это работает, но работает как Escв ванильном Vim. Я нашел это опытным путем, проверяя комбинации, не знаю деталей о том, как работают внутренние устройства.
Элиас

1
Это не vi, работает и на оболочке. Очень полезно, если у вас включен режим vi на вашей оболочке с помощью bindkey -v
golfadas

1

Если у вас есть клавиатура на американском английском языке, нажатие Ctrl- [эквивалентно нажатию Esc. Это обеспечивает простой способ выхода из режима вставки. Также можно использовать Ctrl- c.

Если вы используете vim в легком режиме ( -y), то вы должны нажать Ctrl- l(Control-L), чтобы выйти из режима вставки.

Также есть Ctrl+, oкоторый будет только временно выходить из режима вставки только для того, чтобы выполнить одну команду и вернуться обратно в режим вставки (см . :help i_CTRL-O:)

Или Ctrl+ r, но это только для вставки содержимого регистра или выражения, например Ctrl+ r, =5*5(см .: :help i_CTRL-R, :help c_CTRL-Rи запись stackoverflow ).

Читайте больше на: Избегайте escape-ключа на vim wikia


3
К вашему сведению: Ctrl+rдля вставки реестров (включая выражение =reg). Если вы хотите временно выполнить однократную команду, используйте Ctrl+o.
Sukima

1

Я согласился на <A-e>побег:

noremap  <A-e> <Esc>
snoremap <A-e> <Esc>
inoremap <A-e> <Esc>
tnoremap <A-e> <Esc>

" For some reason in command line mode '\e' is interpreted as Enter.
cnoremap <A-e> <C-c>

Редактировать: только что нашел, <C-\><C\n>который отправляет вас в обычный режим из любого другого режима. Это также имеет лучшее общее поведение. Отображения становятся:

noremap <A-e> <C-\><C-n>
noremap! <A-e> <C-\><C-n>

0
nnoremap <C-I> <C-I>
vnoremap <Tab> <Esc>gV
onoremap <Tab> <Esc>
inoremap <Tab> <Esc>`^

Я переназначаю вкладку для выхода. Исторически сложилось так, что раньше там была клавиша esc, поэтому я использовал ее и никогда не оглядывался назад. Мне почти никогда не нужно вставлять вкладки в документе, и когда я это делаю, я просто нажимаю Shift + Tab. Я ни разу не пропустил первоначальную привязку вкладки.


Абзац о vim и emacs совершенно не нужен ...
Д. Бен Нобл
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.