In vim, не дозволяти кареті повертатися назад, коли я виходжу з режиму редагування?


9

У vim, якщо я входжу і виходжу з режиму редагування, не роблячи нічого, карета закінчується одним символом зліва. І якщо я ввійду і вийду з режиму додавання, карета рухається вперед, а потім назад.

Будь-який спосіб налаштувати vim, щоб залишити карету в спокої в цих випадках?

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

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


1
Відповіді на це питання хороші. Я просто хочу зазначити, що якщо вони правильні в своїх припущеннях, що ви використовуєте i, щоб перейти в режим редагування, то саме це викликає рух назад. Якщо ви використовуєте "a" (не A), воно буде працювати, як ви очікували.
johnny

@johnny Я не думаю, що це буде. Я, як правило, у «нормальному» режимі, пересуваюся по файлу та іншим. Коли мені потрібно змінити, я спершу розміщую карету, потім натискаю "a", а потім виявляю, що я неправильно розмістив її, оскільки вона рухається праворуч. Зважаючи на те, що я 99% свого часу редагування проводжу в сучасних редакторах, немає жодного шансу, що я коли-небудь пам’ятаю, щоб розташувати один знак ліворуч перед натисканням «а». Саме тому я сподівався на макрос чи щось таке.
RomanSt

Це питання звичок. Це справді дратує, але лише перші роки. Ви в кінці кінців навчитися натискати iабо aне думати про це, і може бути навіть s, S, ci", і т.д. , а не обмежена iі a.
Люк Ермітт

1
Я розумію ваше розчарування, але. Спробуйте замість цього подумати, що ви робите. Запитайте себе, чи є кращий спосіб зробити це (ніж використовувати Vim як звичайний текстовий редактор, тобто). Я виявив, що у Vim завжди є кращий спосіб, Vim спосіб робити речі. Ми можемо допомогти, але ми маємо знати, що ти робиш, коли стикаєшся з проблемами. Ви, наприклад, переходите в режим редагування, коли хочете щось видалити? Не потрібно, для видалення символів є "x". Хочете замінити символ, тоді є 'r'. Подумайте лише, чого ви хочете досягти.
johnny

@johnny Я розумію, про що ти говориш, але це вимагає занадто багато переучування, щоб мати сенс для мене. Я витрачаю 99% свого часу на редагування у Visual Studio і мені це подобається. Я просто знаю, що не буду цього вчитися, тому немає сенсу витрачати час.
RomanSt

Відповіді:


9

Це запитання часто задається серед нових користувачів vi / Vim, і відповідь полягає в тому, що, перебуваючи у звичайному режимі, курсор завжди є "увімкненим" символом, але у режимі вставки курсор завжди "між" двома символами (пам'ятайте, кінець -of-line - символ). Це дійсно не видно, як це показано також у консолі Vim, але в графічному інтерфейсі ви помітите, що курсор стає смужкою між двома символами, коли ви переходите в режим вставки, замість блоку над символом, коли ви перебуваєте у звичайному режимі.

Отже, те, що ви бачите, - це не обов'язково курсор, який переміщує одного символу назад, коли ви виходите з режиму вставки, а просто переміщується на символ. Єдиний безпечний напрямок руху - вліво (або назад). Таким чином, у вас є кілька способів переходу в режим вставки:

  • "a" переходить у режим вставки з курсором "між" символом, на якому курсор був, та наступним символом праворуч.
  • "i" переходить у режим вставки з курсором "між" символом, на якому курсор був, та попереднім символом зліва.

Деякі люди доклали зусиль, щоб придушити цей "рух", який їм не подобається, але це неминуче заважає плагінам та іншим скриптам Vim, які вони хочуть запустити в майбутньому.

Моя пропозиція - звикнути використовувати команди "a" і "i" (і "A" і "I") у відповідних обставинах.

Команди "o" та "O" також корисні для вивчення. Подивитися:

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

Редагувати: Якщо ви все ще налаштовані змінити цю поведінку, спробуйте цю пораду: не допускайте переміщення курсору на один символ ліворуч


1
Я розумію, що ви говорите, але "i" / "Esc" / "i" / "Esc" спричиняє фактичний загальний чистий рух карети. Я дійсно думаю, що VIM просто не для мене.
RomanSt

2
@romkyns: Я думаю, що вам слід скористатися aзамість цього i.
Призупинено до подальшого повідомлення.

1
@ Денніс погодився, "a" трохи краще, оскільки він дозволяє кареті бути перед першим символом та після останнього символу в рядку, який "i" довільно відключає. Але я спробував це; що трапляється так, що я завжди переставляю карету перед натисканням "а" - тому мені доведеться негайно перемістити карету на одну позицію вліво. Кожен раз. Це стало втомлювальним, тому я перейшов на "я".
RomanSt

@Heptite Чи не могли б ви вказати мені на таке недосконале виконання чогось, що пригнічує рух? Шанси мене в майбутньому хочу використовувати плагіни чи інші сценарії, по суті, нульові.
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$видалити до кінця рядка тощо.


Дивовижне просте рішення. Найкраще, що я натрапив.
Тайлер Коллієр

1

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

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

Смішно. Це ж питання існує на всіх трьох сайтах: SO, SU, Unix + Linux.


Мені це не смішно :) На щастя, я знайшов редактора, який не зводить мене з гайки (diakonos), тому це вже не проблема. І все-таки прихильний для тих, хто любить vim.
RomanSt
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.