Отменить <CR> в режиме вставки

21

Иногда в режиме вставки я бью <CR>по ошибке, и мне приходится нажимать клавишу Backspace несколько раз (зависит от отступа), чтобы вернуться туда, где я был.

например

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

Курсор []и я нажал <CR>:

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

Теперь мне нужно дважды нажать клавишу Backspace, чтобы вернуться к предыдущей строке (этот случай не так уж и плох, но он не имеет большого отступа).

Знаете ли вы лучший способ сделать?

nobe4
источник
1
ctrl+wкажется, что дважды работать довольно легко
reergymerej 19.09.16

Ответы:

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, он же злой режим , вы можете использовать этот пакет для аналогичного эффекта.

VanLaser
источник
Теперь мне интересно узнать о первой части и о том, как <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
включено,
1
Мне больше нравится это решение, потому что другие решения, основанные на Backspace, Ctrl-W и Ctrl-U, могут не работать в зависимости от того, как установлена backspaceопция.
DoubleDown
4

Я так и делаю Ctrl-wBackspace.

Ctrl-wудалить последнее слово (я забыл, если это стандартный vim или нет), и так как это просто пробелы, я вернусь к началу строки. Затем Backspaceперенесет меня на предыдущую строчку, где я был.

Хуан Энрике Муньос Золотоочин
источник
Милый, я не знал об Ctrl-wиспользовании в режиме вставки. Но Carpetsmoker ♦ все еще быстрее. Таким образом, связывание по умолчанию `Ctrl- \` не кажется таким полезным.
nobe4
1
Ctrl + W является "стандартной Vim" ;-) См: :help i_CTRL-W. А нажатие на нее дважды, кажется, тоже помогает?
Мартин Турной
1
Я только что увидел на странице справки, что <C-u>может быть более полезным, поскольку он удаляет все символы в новой строке
nobe4