В vim, запретить переход каретки назад, когда я выхожу из режима редактирования?

9

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

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

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

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

RomanSt
источник
1
Ответы на этот вопрос хорошие. Я просто хочу отметить, что если они верны в своих предположениях, что вы используете i, чтобы перейти в режим редактирования, то это то, что вызывает движение назад. Если вы используете «а» (не «А»), все будет работать так, как вы ожидаете.
Джонни
@ Джонни, я так не думаю. Я обычно в "нормальном" режиме, перемещаясь по файлу и прочее. Когда мне нужно выполнить редактирование, я сначала позиционирую курсор, затем нажимаю «а» и обнаруживаю, что позиционировал его неправильно, потому что он перемещается вправо. Учитывая, что я трачу 99% своего времени на редактирование в современных редакторах, нет никаких шансов, что я когда-либо не забуду расположить один символ слева, прежде чем нажимать «а». Вот почему я надеялся на макрос или что-то.
RomanSt
Это вопрос привычек. Это действительно раздражает, но только в первые годы. Вы в конце концов научиться нажимать iили aне думать об этом, и может быть даже s, S, ci", и т.д. , а не ограниченная iи a.
Люк Эрмитт
1
Я понимаю ваше разочарование, но. Попробуйте вместо этого подумать о том, что вы делаете. Спросите себя, есть ли лучший способ сделать это (чем использовать Vim как обычный текстовый редактор). Я обнаружил, что с Vim всегда есть лучший способ, Vim. Мы можем помочь, но мы должны знать, что вы делаете, когда сталкиваетесь с проблемами. Например, вы переходите в режим редактирования, когда хотите что-то удалить? Не, есть 'x' для удаления символов. Хотите заменить персонажа, тогда есть «г». Просто подумайте, чего вы хотите достичь.
Джонни
@johnny Я понимаю, о чем ты говоришь, но это требует слишком много переучивания, чтобы иметь смысл для меня. Я провожу 99% своего времени на редактирование в Visual Studio, и мне это нравится. Я просто знаю, что не буду переучивать это, так что нет смысла тратить время.
RomanSt

Ответы:

9

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

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

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

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

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

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

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

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

Heptite
источник
1
Я понимаю, что вы говорите, но "i" / "Esc" / "i" / "Esc" вызывает фактическое общее чистое движение каретки. Я действительно думаю, что VIM просто не для меня.
RomanSt
2
@romkyns: я думаю, что вы должны использовать aвместо i.
Приостановлено до дальнейшего уведомления.
1
@Dennis согласился, «a» немного лучше, потому что он позволяет вставлять каретку перед первым символом и после последнего символа в строке - что «i» произвольно запрещает. Но я попробовал это; происходит то, что я всегда кладу каретку перед нажатием «а» - поэтому я должен немедленно переместить каретку на одну позицию влево. Каждый раз. Это стало утомительным, поэтому я переключился на «я».
RomanSt
@ Hepite Не могли бы вы указать мне на одну такую ​​ошибочную реализацию чего-то, что подавляет движение? Вероятность того, что в будущем я захочу использовать плагины или другие скрипты, практически равна нулю.
RomanSt
1
@romkyns, это (не) работает в обоих направлениях. Переопределение <esc>действительно помешает большинству подключаемых модулей <esc>работать корректно, но также будет продолжать раздражать вас, когда вы будете использовать другие стандартные функции, которые возвращаются в обычный режим тем же способом, <esc>что и вы. Научиться использовать правильную клавишу на лету - это решение, которое масштабируется / работает в долгосрочной перспективе.
Люк Эрмитт
1

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

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

Дэн М.
источник
1

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

 inoremap ii <ESC>l

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

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

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

atomicules
источник
Удивительно простое решение. Лучше всего я сталкивался.
Тайлер Коллиер
1

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

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

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

Стивен Лу
источник
Я не нахожу это забавным :) К счастью, я нашел редактор, который не сводит меня с ума (diakonos), так что это больше не проблема. Тем не менее, проголосовали за тех, кто любит vim.
RomanSt