Скасуйте <CR> у режимі вставки


21

Іноді в режимі вставки я потрапляю <CR>помилково, і мені доводиться натискати на простір кілька разів (залежить від відступу), щоб повернутися туди, де я був.

напр

<div>
  <p> This is some text []</p>
</div>

Курсор є, []і я натиснув <CR>:

<div>
  <p> This is some text 
  []</p>
</div>

Тепер мені потрібно двічі натиснути назад, щоб повернутися до попереднього рядка (цей випадок не так вже й поганий, але він не має великого відступу).

Чи знаєте ви кращий спосіб зробити?


1
ctrl+wЗдається, двічі працювати і бути досить легко
reergymerej

Відповіді:


10

Як щодо:

inoremap <C-\> <C-o>:left 0<Cr><BS>

<C-o>виконає команду звичайного режиму ( :left 0), яка видалить увесь відступ, це також поставить ваш курсор на початку рядка. <BS>поверне вас до останнього рядка.

Це трохи схоже на "назад J".

На жаль, відображення Shift + Enter або Ctrl + Enter не здається можливим, тому я вибираю <C-\>як "біля входу".


"Поблизу входу" залежить від вашої клавіатури: у Великобританії є `` поруч із лівою зміною :-)
TripeHound

2
Чому б не використовувати <C-u>замість <C-o>:left 0<CR>?
jamessan

@jamessan Це працює як "назад J": Так foo<CR>bar<C-\>ви залишите вас foobar. ІМХО це корисніше, але YMMV.
Мартін Турноїй

Так, але то , що я хочу сказати, що <C-u>(тобто i_CTRL-U ) повинна бути такою ж , як <C-o>:left 0<CR>.
Jamessan

1
@jamessan Ну, це залежить від положення курсору. Введення тексту foo<CR>bar<C-u>залишить вас foo<CR>(+ будь-який автоматичний відступ, який, можливо, додав Vim). <C-o>:left 0<CR>завжди буде поводитись однаково незалежно від положення курсору.
Мартін Турноїй

21

У мене це є vimrc, друга частина є актуальною:

inoremap <expr> <silent> <cr> pumvisible() ? "<c-y>" : "<c-g>u<cr>"

Що це робить: кожен раз, коли ви натискаєте Enterв режимі вставки, він також "порушує послідовність скасування, почне нову зміну" (див. h: i_CTRL-G_u). Це означає, що якщо ви потрапили Enterпомилково, тепер ви можете скасувати зміни, не видаляючи попередні вставлені рядки, або з ESC u a, або з Ctrl-o u, як запропонував Statox. В основному кожен рядок можна скасувати окремо.

джерело

РЕДАКТУВАННЯ / ОНОВЛЕННЯ: Якщо вам трапляється використовувати емуляцію Vim в Emacs, також злий режим , ви можете використовувати цей пакет для подібного ефекту.


Зараз мені цікаво перша частина та те, як <c-y>стосується спливаючого меню.
8bittree

2
Дивіться цю відповідь: vi.stackexchange.com/a/3844/1800 . Ctrl-yу режимі вставки завершиться поточний вибір спливаючих вікон, і вищезазначене відображення дозволить Enterтакож виконати.
VanLaser

Гарний трюк. Однак я, мабуть, замінюю останню частину "<c-g>u<cr>"на &paste ? "<cr>" : "<c-g>u<cr>", інакше наступного разу, коли помилково вставимо 200 рядків HTML, ви будете дуже весело скасовувати її. :)
lcd047

2
... і пояснення: коли pasteввімкнено, відображення режимів "Вставити" вимкнено (відповідно до допомоги Vim)
VanLaser

1
Мені подобається це рішення краще, тому що інші рішення, що спираються на Backspace, Ctrl-W і Ctrl-U, можуть не працювати, залежно від того, як встановлено backspaceпараметр.
подвійнеDown

4

Як я це роблю Ctrl-wBackspace.

Ctrl-wвидалити останнє слово (я забув, стандартний це vim чи ні), і оскільки це просто пробіли, це поверне мене до початку рядка. Потім Backspaceповерне мене до попереднього рядка, де я був.


Солодко, я не знав про Ctrl-wвикористання в режимі вставки. Але Carpetsmoker ♦ все-таки швидше. Таким чином, прив'язка клавіш `Ctrl- \` не здається корисною.
nobe4

1
Ctrl + w - "стандартний Vim" ;-) Див.: :help i_CTRL-W. І натискання на нього двічі, здається, теж спрацює?
Мартін Турноїй

1
Щойно я побачив на сторінці довідки, що <C-u>може бути кориснішим, оскільки вона видаляє всіх символів у новому рядку
nobe4

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