Подтвердить что ты не робот

Vim: почему нет: "normal! I" введите режим вставки?

В vim, если я выполнил следующее из командной строки

:normal! i

vim не входит в режим вставки. Аналогично команда

:normal! A

переместит курсор в конец строки, но курсор останется в режиме вставки.

Любые идеи, почему это не работает? В противном случае я хотел бы узнать альтернативный способ ввода режима вставки из тела функции vimscript (и режим вставки сохраняется после возврата функции, конечно).

Edit: Похоже, что :startinsert заполнит вторую часть вопроса, но мне все еще интересно, как я могу сделать что-то вроде :normal! A или :normal! A и почему они работают не так, как ожидалось. Имитация "добавить" с движениями стрелок является плохим решением из-за таких вещей, как пустые строки и т.д.

4b9b3361

Ответ 1

Обычная команда считает завершение в режиме вставки неполной командой и прерывается. От help normal:

{commands} должна быть полной командой. Если {команды} не завершите команду, последняя будет прервана, как если бы <Esc> или <C-C>был напечатан. Дисплей не обновляется, пока ": normal" занят. Эта подразумевает, что команда вставки должна быть завершена (чтобы запустить Insert mode, см. startinsert)

:startinsert может быть командой, которую вы ищете.

:normal A может быть достигнуто добавлением взрыва (!) в startinsert, как было предложено Инго Каркатом. От help startinsert:

Когда! включен он работает как "A", присоединяется к строке.

Ответ 2

В дополнение к уже упомянутому startinsert вы можете использовать feedkeys():

call feedkeys('A', 'n')

сделает то, что вы хотите, но добавленный вами ключ будет обработан только после завершения текущего script/function/mapping/etc.

Ответ 3

Вместо :normal A используйте :startinsert!!). Он упоминается в справке.

Для :normal A переместите курсор вправо, затем :startinsert.

Ответ 4

перейти к определенному типу линии

vim -c "30"

Теперь вы будете в строке 30, введите режим вставки

vim -c "30" -c startinsert

Теперь вы находитесь в режиме вставки, удалите эту строку

vim -c "30" -c startinsert -c d1