Чому `ESC` переміщує курсор назад у vim?


62

У vim, коли я натискаю, ESCщоб повернутися до командного режиму, курсор переміщує один символ ліворуч. На це я б не сподівався, я час від часу негайно натискаю, lщоб повернутися до того місця, можливо, щоб видалити персонажа.

Чи є причина такої поведінки? Чи зручно це для моделі використання, якої мені не вистачає?


1
Я ніколи навіть цього не помічав до цих пір ... і щодня використовую vim. Я поняття не маю, чому, але мені цікаво почути відповіді.
габе.

5
повертаючись до режиму вставки, ви можете натиснути "a" для додавання замість "i" для вставки. Потім ви повернетеся до положення, в якому ви були, перш ніж натиснути втечу.
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натискань клавіш?
Warren Young

4
Перейти в режим вставки, нічого не вставляючи, а потім залишити його - не справедливий тест. Чому б ти був у режимі вставки, якщо ти щось не вставив. Якщо ви щось вставите, повернення до звичайного режиму залишає вас із вибраним вами символом. Дуже інтуїтивно зрозумілий.
Калеб

4
Йдеться не про "справедливу", а про роз'яснювальну силу. Якщо ваша теорія функціонування не пояснює всю поведінку, то вона неповна або поведінка vi невідповідна. Я вважаю за краще вважати, що vi досконалий у всіх відношеннях, а тому послідовний. :)
Warren Young

9
@Warren Поведінка, що рухається назад i, ESCє функцією iі повністю незалежна від ESC; конкретно, при ударі iви просите vim вставити символ, який за визначенням означає "вставити символ до того, на якому я перебуваю", на відміну від a"додавання символу після цього".
Кромей

3
Загалом, після кожної зміни, коли я залишаю цю зміну, я закінчую цю зміну, і наступне, що я хотів би зробити, ймовірно, передбачає внесення інших змін. Таким чином, для мене, виходячи з режиму вставки (незалежно від того, як я ввійшов у нього), я б переважно віддав перевагу курсору наступний символ, тому я готовий до наступної зміни, а не готовий змінити те, що я просто вставлено.
Кайл Странд

6

Наберіть Alt+, Lщоб повернутися до командного режиму.

Він не вимагає зміни в конфігурації або перестановки vim. Це працює , тому що в більшості емуляторів терміналів Alt+ KEYпосилає Escпотім KEY(на XTerm вам може знадобитися , щоб додати Xterm*metaSendsEscape: trueрядок в файл ~ / .Xdefaults). Така поведінка дозволяє навіть "створювати" інші комбінації режимів вставки, які працюють прямо з поля - як Alt+ Sдо Backspace.

До речі, мати курсор зверху на написаному вами символі може бути дуже незручно. Наприклад, Escdwне видалить слово після тексту, який ви тільки що вставили.


Незручності, на яку ви посилаєтесь, можна уникнути, завжди ввівши пробіл у режимі вставки перед виходом. Потім курсор, що виходить з режиму вставки, кладеться на пробіл, і ви можете ввести Esc d eслово, щоб видалити слово спереду. Я повернувся до поведінки за замовчуванням, бо відчув, що це змінило інші форми поведінки, які вже закодовані в моїй голові.
mljrg

4

Ось моє рішення.

Це більш стислий варіант рішення, запропонованого на цьому веб-сайті .

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

+1 також тут, якщо ви посилаєтесь на сторінку wiki, хоча користувач насправді не просив способу змінити цю поведінку.
Кайл Странд

Ви зауважите, якщо ви досить добре зануритесь у Vim, що багато плагінів покладаються на поведінку за замовчуванням (злегка неінтуїтивне), тож якщо ви побачите, що деякі речі випадково їдять або погладжують одного символу, це може бути викликано цим. Я не використовую цей автокоманд сам; це добре працює, хоча.
Стівен Лу
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.