Почему `ESC` перемещает курсор назад в vim?

62

В vim, когда я нажимаю, ESCчтобы вернуться в командный режим, курсор перемещается на один символ влево. Это не то, на что я надеюсь, иногда я сразу же нажимаю, lчтобы вернуться к этому месту, возможно, чтобы удалить персонажа.

Есть ли причина для такого поведения? Это удобно для шаблона использования, который я пропускаю?

Эрик Уилсон
источник
1
Я никогда не замечал этого до сих пор ... и я использую vim каждый день. Понятия не имею почему, но мне интересно услышать ответы.
таращиться
5
возвращаясь в режим вставки, вы можете нажать «a» для добавления вместо «i» для вставки. Затем вы вернетесь в положение, в котором вы находились, прежде чем нажимать клавишу escape.
penguin359

Ответы:

40

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

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

Я полагаю, что Escповедение имеет смысл. Часто вы печатаете в конце строки, и там Escможно идти только влево. Таким образом, общее поведение является наиболее распространенным поведением.

Думайте о символе под курсором как о последнем интересном символе, а о команде вставки - a. Вы можете повторить, a Escне перемещая курсор, за исключением того, что вы будете ударены на одну позицию вправо, если вы начнете с начала непустой строки.

Жиль "ТАК - перестань быть злым"
источник
21

Визуально это имеет больше смысла в gvim:

При редактировании курсор находится между символами:
введите описание изображения здесь

В обычном режиме он находится над последним символом:
введите описание изображения здесь

Так что это на самом деле не вернуться характер, только от того , между r и , sчтобы быть на r

Мартин Уединг
источник
1
Отличная картина. Честно говоря, я в лагере, который говорит, что персонаж mдолжен оставаться выделенным после возвращения в нормальный режим ...
Стивен Лу
К сожалению. ссылки на изображения теперь мертвы.
Стивен Лу
1
ссылки на изображения теперь мертвы.
Стивен Лу
1
Да, размещение ваших изображений вручную более удобно и менее надежно, чем использование инструмента в редакторе уценок на этом сайте.
Стивен Лу
1
С ними все в порядке? Это «Курсор», что они напечатали, и ваш текст упоминает «J»
Poige
15

Это поведение является редактируемым, как здесь ответили , но остановитесь и подумайте о том, что происходит на секунду. Когда вы находитесь в режиме вставки, вы на самом деле находитесь не над символом, а между ними. Когда вы вставляете что-то, курсор переходит к концу того, что вы вставили, так что следующая вставленная вещь будет после этого. Теперь подумайте, если вы только что набрали письмо, то хотите что-то с ним сделать. Нажатие Escбудет помещать курсор выбора непосредственно над последним вставленным символом. Если бы он этого не делал, это было бы довольно неловко.

Ситуация, о которой вы, вероятно, думаете, это когда вы в режиме вставки перемещаетесь, как если бы вы были в нормальном режиме, а затем переключаетесь. В этом случае кажется, что курсор возвращается на один символ назад, но если вы так думаете, он показывает, что вы были в режиме вставки, и последнее, что вы сделали, - НЕ вставили. Может быть, вам следует проводить больше времени в обычном режиме?

Калеб
источник
15
Это не имеет смысла для меня. Как вы объясните поведение повторяющихся iи ESCнажатий клавиш?
Уоррен Янг
4
Переход в режим вставки, не вставка чего-либо, а затем выход из него не является честным тестом. Зачем вам быть в режиме вставки, если вы не вставили что-то. Если вы вставляете что-то, возвращаясь к нормальному режиму, вы выбираете выбранный вами символ. Очень интуитивно понятно
Калеб
4
Дело не в «честности», а в объяснительной силе. Если ваша теория работы не объясняет всего поведения, оно либо неполное, либо поведение vi не согласовано. Я предпочитаю верить, что vi идеален во всех отношениях и, следовательно, непротиворечив. :)
Уоррен Янг
9
@Warren Поведение «идти назад», iсопровождаемое последующим, ESCявляется функцией iи полностью не зависит от ESC; в частности, когда вы нажимаете, iвы просите vim вставить символ, что по определению означает «вставить символ перед тем, на котором я нахожусь», а не a«добавить символ после этого».
Кромей
3
В общем, после каждого изменения, когда я оставляю это изменение, я закончу с этим изменением, и следующее, что я хотел бы сделать, вероятно, будет включать внесение другого изменения. Таким образом, для меня, выйдя из режима вставки (независимо от того, как я его ввел), я бы предпочел, чтобы курсор был на следующем символе, поэтому я готов к следующему изменению, а не готов изменить то, что я просто вставлено.
Кайл Стрэнд,
6

Введите Alt+, Lчтобы вернуться в командный режим.

Не требует переназначения или изменения конфигурации vim. Это работает, потому что на большинстве терминальных эмуляторов Alt+ KEYотправляет Escсопровождаемое KEY(на xterm вам может понадобиться добавить Xterm*metaSendsEscape: trueстроку в ваш файл ~ / .Xdefaults). Такое поведение позволяет вам даже «создавать» другие комбинации режимов вставки, которые работают прямо из коробки - как Alt+ Sto Backspace.

Кстати, курсор на вершине только что написанного символа может быть очень неудобным. Например, Escdwне удалит слово после текста, который вы только что вставили.

user79932
источник
Чтобы избежать неудобств, на которые вы ссылаетесь, всегда вводите пробел в режиме вставки перед выходом. Затем курсор, выходящий из режима вставки, помещается над пробелом, и вы можете ввести Esc d eслово перед ним. Я вернулся к поведению по умолчанию, потому что почувствовал, что оно изменило поведение, уже закодированное в моей голове.
mljrg
4

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

Это более краткая версия решения, предложенного на странице вики об этом .

au InsertLeave * call cursor([getpos('.')[1], getpos('.')[2]+1])
Стивен Лу
источник
+1 и здесь, за цитирование вики-страницы, хотя пользователь на самом деле не спрашивал, как изменить это поведение.
Кайл Стрэнд,
Вы заметите, если вы будете копаться в Vim достаточно глубоко, что многие плагины используют стандартное (слегка неинтуитивное) поведение, поэтому, если вы видите, что некоторые вещи случайно едят или искажают один символ, это может быть вызвано этим. Я не использую эту автокоманду сам; это работает хорошо, хотя.
Стивен Лу