Інші способи виходу з режиму Вставка, крім Escape


74

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

Нещодавно я дізнався, що я можу використовувати Ctrl + C, щоб залишити режим вставки. Однак це насправді не є поліпшенням.

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


1
Ви можете зіставити будь-яку комбінацію клавіш де завгодно, і нічого іншого зробити не можна. Це ви маєте на увазі?
йо '

3
Дізнався ярлик Ctrl + c THX!
Філіп Гачуд

Як щодо відображення Caps Lock як Esc?
Калонь Колоб

@PhillippeGachaud: Не використовуйте Ctrl-C в якості заміни Esc. Ctrl-C не такий, як 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, і Dvorak.

Таким чином, ви можете дуже легко натиснути 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 "Запуск програм" (що дозволяє мені зробити більше, ніж у стандартному налаштуванні перестановки ключа 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, що дратувало. Тож ваш пробіг може змінюватися залежно від того, наскільки спритний ваш лівий рожевий. :)
Godsmith

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 як символ втечі. Наприклад, при alt+kвведенні емулятора терміналу надсилається два символи запущеній програмі: esc, k. Vi і Vim трактують це так, як ви очікували; він залишає режим вставки (через втечу) і виконує команду звичайного режиму (наприклад, переміщення курсору вгору на один рядок).

Це може бути зручним способом виходу з режиму вставки, якщо на клавіатурі є клавіша alt поруч із пробілом (щоб її можна було натискати великим пальцем, залишаючи пальці в домашньому рядку), якщо ви використовуєте термінальний емулятор з такою поведінкою і не проти виконувати команду в звичайному режимі.


2
Чи можете ви детальніше зупинитися на тому, що є single-normal-mode-key? Ви маєте на увазі втечу?
kenorb

У режимі вставки за допомогою клавіші alt можна використовувати одне натискання клавіш, яке ви використовували б у звичайному режимі. наприклад, Alt + x для видалення символу.
ewatt

2
Я також не дуже розумію цю відповідь; Alt + x насправді, здається, робить щось інше, ніж Alt у звичайному режимі? А деякі інші клавіші, здається, не працюють? Але, можливо, я його неправильно використовую ..? Можливо, ви могли б трохи розширити свою відповідь, щоб пояснити, як це працює, і посилання на деякі документи Vim також було б добре :-) Дякую! :-)
Мартін Турной

це насправді залежить від конфігурації вашого терміналу і зазвичай не встановлено так, як вам здається.
Крістіан Брабандт

1
Я підтримав це, потім перевірив історію і зрозумів, що чомусь модератор відредагував її, щоб додати 99% тексту з повітря, а не просто залишити коментар, як це очікують інші. Тому мені довелося відмінити свій голос. Напевно, що тут сталося, виходить за межі розумних змін? У мене було відхилено набагато менше руйнівних змін. Новий вміст, безумовно, чудовий, але не відповідає цій відповіді. Це мало бути своїм.
підкреслити_29

3

FWIW я використовую:

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

Це схоже на натискання Return. Я використовую ;як лідер для інших відображень в режимі Insert.

Єдиний раз, коли мені потрібно було набрати ';' + лист є при коді гольфу; У мене інакше не було конфліктів.


можливо, краще зіставити його, щоб уникнути, ніж відобразити його до ^ [так? :)
Олександр Міллз

2

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

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


2
Що саме повинен робити Ctrl-3?
Крістіан Брабандт

Я не знаю, як це працює, але це працює, як Escу ванілі Vim. Я виявив це емпірично, перевіряючи комбінації, не знаю деталей про те, як працює внутрішня.
elias

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 пост ).

Читайте більше на: Уникайте ключа втечі на vim wikia


3
FYI: Ctrl+rпризначений для вставки реєстрів (включаючи =reg reg). Якщо ви хочете тимчасово виконати одноразову команду, використовуйте Ctrl+o.
Сукіма

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 зовсім непотрібний ...
D. Ben Knoble
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.