8

В vim, если я вхожу и покидаю режим редактирования, ничего не делая, каретка заканчивается на один символ слева. И если я вхожу и покидаю режим добавления, каретка перемещается вперед и затем назад.

Есть ли способ настроить vim, чтобы в этих случаях оставить каретку в покое?

В идеале я просто хочу всегда входить в режим добавления, но без перемещения каретки, когда я вхожу или покидаю режим.

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

4 ответа4

8

Этот вопрос часто задают среди новых пользователей vi/Vim, и ответ таков: в обычном режиме курсор всегда находится "на" символе, а в режиме вставки курсор всегда "между" двумя символами (помните, конец офлайн это персонаж). Вы не можете увидеть это наглядно в консоли Vim, но в графическом интерфейсе вы заметите, что курсор становится полосой между двумя символами, когда вы входите в режим вставки, вместо блока над символом, когда вы находитесь в обычном режиме.

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

  • "a" входит в режим вставки с курсором "между" символом, на котором был курсор, и следующим символом справа.
  • "i" входит в режим вставки с курсором "между" символом, на котором был курсор, и предыдущим символом слева.

Некоторые люди пытались подавить это "движение", которое им не нравится, но оно неизбежно мешает плагинам и другим скриптам Vim, которые они хотят запустить в будущем.

Мое предложение состоит в том, чтобы привыкнуть к использованию команд "a" и "i" (и "A" и "I") в соответствующих обстоятельствах.

Команды "o" и "O" также полезны для изучения. Увидеть:

:help a
:help i
:help A
:help I
:help o
:help O

Изменить: Если вы все еще решили изменить это поведение, попробуйте следующий совет: не допускайте перемещения курсора на один символ влево

1

Вот мое решение:

au InsertLeave * call cursor([getpos('.')[1], getpos('.')[2]+1])

Это забавно. Этот же вопрос существует на всех трех сайтах: SO, SU, Unix+Linux.

1

Поскольку переназначение <ESC> считается «рискованным», я просто комбинирую его с одним из подходов Avoid escape-ключа и получаю в моем .vimrc:

 inoremap ii <ESC>l

Примечание. Убедитесь, что в конце строки нет пробелов.

Простой, но полностью сертифицированный как "отлично работает для меня", поскольку это именно то, что в противном случае мне пришлось бы печатать вручную.

Использовать ли я или a , я все еще получаю каретка движется назад поведение и это ошибки ад из меня чаще , чем нет , то следующая вещь , которую я хочу , чтобы набираться i удалить до конца строки и т.д.

1

Я думаю, что в каратах вы подразумеваете свой курсор, и если вы используете "i", это вставит непосредственно туда, где находится ваш курсор, "a" (который, я полагаю, вы ищете) перемещает курсор на один символ вправо. Также shift-i (I) пойдет в начало строки, а shift-a (A) пойдет до конца строки.

Если я неправильно понял ваш вопрос, прошу прощения.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .