Переміщення тексту в режимі вставки


321

Перебуваючи в режимі вставки у Vim, чи є спосіб пересувати текст, рухаючи деякі символи вперед та назад, крім використання клавіш зі стрілками?

Якщо я натискаю h, j, kі в lтой час як в режимі вставки, фактичні символи друкуються на екрані замість переміщення по тексту.

Те, як я це роблю в даний момент, полягає в тому, щоб вдатися до Ctrl+ [( Esc) і переглядати текст потім; але очевидно, що це не є продуктивним.


Як підказка: також корисно, якщо ви перейдете на ближчу комбінацію клавіш (тобто imap jk <Esc>), щоб вам не довелося порушувати свій імпульс і дотягуватися до клавіатури, щоб натиснути клавішу.
tsujin

3
Мені подобається ( <ESC>) відображено kjзамість jk; винен мій товариш Дійкстра !
Д-р Беко

7
У мене є jkі kj, таким чином , я просто натисніть на нього , як велика кнопка з двома пальцями і не має значення , порядок я повернувся на нормальний.
Edu Ruiz

Відповіді:


648

Ви ніби неправильно використовуєте vim, але це, ймовірно, через те, що з ним не дуже знайомі.

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

Ось кілька випадків використання:

  • Ви випадково набрали "акцифентально". Немає проблем, послідовність EscFfrdAвиправить помилку і поверне вас туди, де ви редагували. FfРух буде переміщати курсор назад до першої зіткнулися «F» характер. Порівняйте це з Ctrl+ DeldEnd, що робить практично те саме у випадковому редакторі, але виконує більше натискань клавіш і змушує вас перемістити руку з буквено-цифрової області клавіатури.
  • Ви випадково набрали "Ви випадково набрали", але хочете виправити це "Ви навмисно ввели". Потім Esc2bcwбуде стерто слово, яке ви хочете виправити, і переведе вас у режим вставки, тож ви зможете негайно ввести його знову. Щоб повернутися до редагування, просто натисніть, Aа не End, щоб не рухати рукою, щоб дістатися до Endключа.
  • Ви випадково набрали "мишку" замість "мишей". Немає проблем - старий добрий Ctrl+ wвидалить попереднє слово, не виходячи з режиму вставки. І буває набагато швидше стерти маленьке слово, ніж виправити помилки в ньому. Я настільки звикла до цього, що закрила сторінку браузера, коли вводила це повідомлення ...!
  • Кількість повторень значною мірою не використовується. Перед тим як зробити рух, ви можете набрати число; і рух буде повторено цю кількість разів. Наприклад, 15hповерне курсор 15 символів назад і 4j перемістить курсор на 4 рядки вниз. Почніть користуватися ними, і ви швидко звикнете до цього. Якщо ви зробили помилку десять символів назад від курсору, ви дізнаєтесь, що натискання клавіші 10 разів набагато повільніше, ніж ітеративний підхід до переміщення курсору. Таким чином, ви можете замість цього швидко ввести клавіші 12h(як груба здогадка, скільки символів назад, що вам потрібно перемістити курсор), і відразу двічі рухатися вперед, llщоб швидко виправити помилку.

Але, якщо ви все ще хочете зробити невеликі текстові обходи , не виходячи з режиму вставки, виконайте rson «s рада і використовувати Ctrl+ O. Беручи перший приклад, про який я згадував вище, Ctrl+ OFfпереведе вас до попереднього символу "f" і залишить вас у режимі вставки.


33
+1 Відмінна відповідь і дякую за всі приклади, які ви навели!
Андреас Греч

79
Також варто зазначити, що ви можете використовувати Ctrl+oдля видачі однієї команди в звичайному режимі. Це часом може призвести вас до місця, де ви хочете бути, особливо в поєднанні з командами руху t / T і f / F.
Ренді Морріс

6
"Ви, здається, неправильно використовуєте vim, але це, ймовірно, ви не дуже знайомі з ним" трохи поблажливо. Ні?
Девід Ріверс

17
Це чудове розуміння того, як правильно використовувати Vim. Однак я вважаю, що натискання клавіші "Esc" - це біль, і тому я думаю, що варто зазначити, що ви можете зіставити більш доступну клавішу для цієї функції, наприклад "imap jj <esc>".
Симетричний

25
Для того, щоб виправити опечатку , ви повинні НЕ залишити режим вставки. Vim потужний тим, що ви створюєте атомні, повторювані дії. Вставлення друкарської помилки та її фіксація створює дві окремі дії. Правильний спосіб зафіксувати помилку, щоб це зробити, не виходячи з режиму вставки. Якщо це означає використання клавіш зі стрілками для навігації туди, це добре. Vim має деякі прив'язки клавіш для навігації у режимі вставки. Перевірка :h ins-special-keys. ctrl-h: backspace,: ctrl-wdelete word ,: ctrl-uвидалити до початку рядка alt-b,: повернути слово назад.
everett1992

152

Перебуваючи в режимі вставки , використовуйте CtrlOдля переходу в звичайний режим лише одну команду:

CTRL-O h  move cursor left 
CTRL-O l  move cursor right
CTRL-O j  move cursor down
CTRL-O k  move cursor up

який, мабуть, найпростіший спосіб зробити те, що ви хочете, і легко запам’ятати.

Інші дуже корисні клавіші управління у режимі вставки:

CTRL-W    delete word to the left of cursor
CTRL-O D  delete everything to the right of cursor
CTRL-U    delete everything to the left of cursor
CTRL-H    backspace/delete
CTRL-J    insert newline (easier than reaching for the return key)
CTRL-T    indent current line
CTRL-D    un-indent current line

це позбавить від багатьох марнотратних перемикань повернутися до звичайного режиму.


13
Дякую. Це слід вважати правильною відповіддю. Це насправді корисно.
Atcold

1
Що стосується мого Mac, це нижній регістр o, а не верхній регістр O. Чим він відрізняється від "стандартного vim"? Я бачу багато місць, де вони, як видається, говорять з великої літери (хіба що це просто неохайне написання). Ви можете підтвердити?
Флоріс

Добре, дуже корисно. Однак цікаве поєднання мені важко знайти, і це лінія видалення. Дуже недооцінка, що потрібно зробити у випадку акуратного вставки рядка.
патрік

5
@Floris Vim не розрізняє великі та малі літери для комбінацій ctrl. Ось чому неможливо відобразити ctrl + shift + щось.
Махмуд Аль-Кудсі

92

Режим вставки

Рух

hjkl

Незважаючи на те, що сказав Павло Швед - що, мабуть, доцільніше звикнути до Escвведення режиму Вставка - ось приклад набору відображень для швидкої навігації в режимі Вставка:

" provide hjkl movements in Insert mode via the <Alt> modifier key
inoremap <A-h> <C-o>h
inoremap <A-j> <C-o>j
inoremap <A-k> <C-o>k
inoremap <A-l> <C-o>l

Це призведе до того, що Alt+ hу режимі "Вставка" піде один символ ліворуч, Alt+ jвниз і так далі, аналогічно hjklнормальному режиму.

Ви повинні скопіювати цей код у файл vimrc, щоб він завантажувався щоразу, коли ви запускаєте vim (ви можете відкрити його, набравши :new $myvimrcзапуск у звичайному режимі).


Будь-які рухи у звичайному режимі

Оскільки Altклавіша модифікатора за замовчуванням не відображається (на щось важливе), ви можете таким же чином перетягнути інші (або всі) функції з звичайного режиму в режим вставки. Наприклад:
Перехід до початку поточного слова за допомогою Alt+ b:

inoremap <A-b> <C-o>b
inoremap <A-w> <C-o>w


(Інше використання Altв режимі "Вставка")

Варто зазначити, що Altключ може бути кращим, ніж реплікація поведінки у звичайному режимі: наприклад, тут відображаються відображення для копіювання з сусіднього рядка частини з поточного стовпця до кінця рядка:

" Insert the rest of the line below the cursor.
" Mnemonic: Elevate characters from below line
inoremap <A-e> 
    \<Esc>
    \jl
        \y$
    \hk
        \p
        \a
" Insert the rest of the line above the cursor.
" Mnemonic:  Y depicts a funnel, through which the above line's characters pour onto the current line.
inoremap <A-y> 
    \<Esc>
    \kl
        \y$
    \hj
        \p
        \a

(Я використовував \ продовження рядка та відступ для збільшення чіткості - команди інтерпретуються так, ніби написані в одному рядку.)


Вбудовані гарячі клавіші для редагування

CTRL-H   delete the character  in front of the cursor (same as <Backspace>)
CTRL-W   delete the word       in front of the cursor
CTRL-U   delete all characters in front of the cursor (influenced by the 'backspace' option)

(Немає помітних вбудованих гарячих клавіш для переміщення в режимі Вставка.)

Довідка: :help insert-index


Режим командного рядка

Цей набір відображень робить верхні Alt+ hjkl рухи доступними в командному рядку:

" provide hjkl movements in Command-line mode via the <Alt> modifier key
cnoremap <A-h> <Left>
cnoremap <A-j> <Down>
cnoremap <A-k> <Up>
cnoremap <A-l> <Right>

Крім того, ці відображення додають рухи і в режим Вставка, і в командний рядок за один раз:

" provide hjkl movements in Insert mode and Command-line mode via the <Alt> modifier key
noremap! <A-h> <Left>
noremap! <A-j> <Down>
noremap! <A-k> <Up>
noremap! <A-l> <Right>


Команди відображення для перетягування команд звичайного режиму в режим командного рядка дещо відрізняються від команд відображення режиму вставки (оскільки в режимі командного рядка немає Ctrl+ режиму вставки O):

" Normal mode command(s) go… --v <-- here
cnoremap <expr> <A-h> &cedit. 'h' .'<C-c>'
cnoremap <expr> <A-j> &cedit. 'j' .'<C-c>'
cnoremap <expr> <A-k> &cedit. 'k' .'<C-c>'
cnoremap <expr> <A-l> &cedit. 'l' .'<C-c>'

cnoremap <expr> <A-b> &cedit. 'b' .'<C-c>'
cnoremap <expr> <A-w> &cedit. 'w' .'<C-c>'


Вбудовані гарячі клавіші для переміщення та редагування

CTRL-B       cursor to beginning of command-line
CTRL-E       cursor to end       of command-line

CTRL-F       opens the command-line window (unless a different key is specified in 'cedit')

CTRL-H       delete the character  in front of the cursor (same as <Backspace>)
CTRL-W       delete the word       in front of the cursor
CTRL-U       delete all characters in front of the cursor

CTRL-P       recall previous command-line from history (that matches pattern in front of the cursor)
CTRL-N       recall next     command-line from history (that matches pattern in front of the cursor)
<Up>         recall previous command-line from history (that matches pattern in front of the cursor)
<Down>       recall next     command-line from history (that matches pattern in front of the cursor)
<S-Up>       recall previous command-line from history
<S-Down>     recall next     command-line from history
<PageUp>     recall previous command-line from history
<PageDown>   recall next     command-line from history

<S-Left>     cursor one word left
<C-Left>     cursor one word left
<S-Right>    cursor one word right
<C-Right>    cursor one word right

<LeftMouse>  cursor at mouse click

Довідка: :help ex-edit-index


@YugalJindle: Дякую! :) Зараз я додав інформацію про налаштування режиму командного рядка. (Підхід трохи відрізняється від режиму Insert.)
Аарон Тома

@Zen: Що ви маєте на увазі під "вінкі"? У своїй відповіді я не посилався на ключ Windows. Ви маєте на увазі Altключ?
Аарон Тома

Shift - вліво / вправо, щоб перемістити ціле слово !! Як я цього не знав. Дякую.
Флоріс

насправді в термінальному режимі alt автоматично надсилає esc перед вашими командами ........
Fuseteam

26

Якщо ви - пурист, пропустіть читання цієї відповіді. ОТОХ, якщо ви новачок у vim та шукаєте кілька корисних порад, які ви не знайдете у багатьох сотнях навчальних посібників та блогів, читайте далі ... :-)

Кілька неортодоксальних (vim) способів

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

Використовуйте shift + ліворуч або shift + праворуч для переходу слів

Хоча повторення є потужною концепцією vim, я (особисто) мені здається дивним, що використання його або змушує мене рахувати (рядки, символи, слова тощо) або робити здогадки. Мій мозок зазвичай працює на зразок "Я хочу курсор там ", а не як "я хочу курсор _5_words_to_the_left_". Швидко в змозі перемістити курсор і візуально спостерігати, де ця точка вставки таким чином дозволяє мені тримати свою думку про те, що я редагую, замість того, щоб рахувати, скільки хмелів мені потрібно зробити, щоб потрапити туди, де мені потрібно редагувати.

Увімкніть режим миші та використовуйте колесо миші та клацання

... для навігації у великих частинах тексту.

Більшість (усіх) сучасних комп'ютерів мають тачпад , тісно інтегрований з клавіатурою (наприклад, MacBooks). Промислові дизайнери витратили багато років на оптимізацію цих конструкцій, щоб стара проблема відсунути руку від клавіатури вже не була справжньою проблемою. Гаразд, це якщо ви звикли до миші і не любите перемикатися, але для всіх, хто не знайомий з vim (наприклад, тих, хто може знайти цю публікацію за допомогою пошуку), це не повинно бути проблемою.

Як бонус натискання + перетягування переводить вас у візуальний режим

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

І використовуйте колесо прокрутки

Використання миші (колеса) для прокрутки, а клацання для позиціонування курсору (duh) просто працює. Дивіться http://usevim.com/2012/05/16/mouse/ для отримання додаткової інформації про це.

І так ...

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

HTH


6
@MilesRout так, у мене була відмова. Але, якщо говорити серйозно, я думаю, що є хороша частка користувачів vim, які мізки працюють так само, як і я. Тобто ... мій мозок зазвичай працює як "я хочу курсор там", а не як "я хочу курсор 5_words_to_the_left ". І звичайний спосіб vim не так добре працює для цих людей. Я люблю vim за те, що а) він доступний скрізь і б) має потужні функції. Однак я не відчуваю необхідності відповідати усім механізмам за замовчуванням.
Шям Хабаракада

4
@MilesRout Існує багато релігії навколо подібних речей в vim, тому я не буду з вами дискутувати з цього приводу. Метод підрахунку повторень мені не допомагає, і прийнята відповідь також називає це чимось сильно використаним. Я можу лише здогадуватися, чому це так. Використання w, b тощо для навігації по сусідніх місцях - все чудово, але для подальшого руху колесо миші для мене працює набагато краще. Ура.
Shyam Habarakada

4
+1. Я не розумію, що це голосування. Є відмова від відповідальності. Візьміть його, якщо вам це подобається, і пропустіть його, якщо ви цього не зробите.
fangmobile.com

Це дуже корисна відповідь
Слава

1
Як хтось, хто нещодавно перейшов до VIM, я вважаю, що ця відповідь є абсолютно точковою. Можливість миттєво повідомити кількість повторень, необхідних для позиціонування курсору в певному місці, може бути, а може і не бути чимось, з чим досвід. Зараз, як і @ShyamHabarakada, мій мозок просто не працює так. Незалежно від того, наскільки це неортодоксально, я особисто перемалював fn + hjkl на клавіші зі стрілками для дуже невеликих рухів. Для великих рухів я зазвичай наближаю кількість повторень, а потім точно налаштовую їх. Для мене це так швидко, як я можу досягти.
Якосказ

14

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

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

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

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

Vim підтримує багато клавіш навігації в режимі "Вставка". Очевидно, є клавіші зі стрілками, "Головна" та "Кінець", але є також багато інших ярликів. Див :h ins-special-keys.


4

У GVim можна використовувати мишку. Але якщо чесно, що не так у використанні клавіш зі стрілками? Є причина, чому вони знаходяться на клавіатурі.


9
але ця причина не стосується користувачів vim. Однією з головних переваг vim є те, що ви можете робити всілякі речі, не витрачаючи часу, не знімаючи руки з домашнього ряду клавіатури. Зокрема, рухи hjkl.
Аарон Тома

1
Я згоден з @ammoQ. Нічого поганого у використанні клавіш зі стрілками. Якщо використання клавіш зі стрілками дає вам більшу продуктивність, перейдіть до цього.
Пісня Eunwoo

accolade: Я використовую hjkl частіше, ніж клавіші зі стрілками під час використання vi, але перемикання між режимами стало для мене підсвідомою дією.
Еріх Кітцмюллер

4

Щоб мати трохи кращу навігацію у режимі вставки, чому б не зіставити деякі клавіші?

imap <C-b> <Left>
imap <C-f> <Right>
imap <C-e> <End>
imap <C-a> <Home>
" <C-a> is used to repeat last entered text. Override it, if its not needed

Якщо ви можете обійти роботу мета-ключа у своєму терміналі, ви можете знущатися над режимом emacs ще краще. Навігація в звичайному режимі набагато краща, але для коротших рухів це допомагає залишатися у режимі вставки.

Для довших стрибків я віддаю перевагу наступному перекладу за замовчуванням:

<Meta-b>    maps to     <Esc><C-left>

Це переходить у звичайний режим і повертається до слова


2

Я вірю Homeі EndPageUp/ PageDn) також працює нормально, коли знаходиться у режимі вставки, але окрім цього, я не вірю, що для переходу тексту визначені інші стандартні клавіші.


але, можливо, чи не існує способу переміщення тексту, використовуючи лише літерні клавіші?
Андреас Греч

5
Звичайно, якщо ви не хочете мати можливість вводити певні букви ...;)
hobbs

@hobbs Як щодо ctrl + hjkl? Це повинно мати сенс
user4052054

1

Вибачте, але vim не працює так.

Ви повинні перейти в режим «нормальний», перейти та повернутися, щоб знову вставити.


1

Ви можете створити відображення, які працюють у режимі вставки. Спосіб зробити це через inoremap. Зауважте "я" на початку команди (noremap корисно, щоб уникнути зіткнень ключових карт). Висновок є 'n' для 'нормального' режиму. Ви можете припустити, що vim вважає "нормальним";)

ЗАРАЗ, ви дійсно хочете орієнтуватися в тексті в режимі "звичайний". Vim супер у цьому, і вся ця потужність доступна в звичайному режимі. Vim вже пропонує прості способи переходу з звичайного режиму до режиму вставки (наприклад, i, I, a, A, o, O). Хитрість полягає в тому, щоб полегшити перехід у звичайний режим. Спосіб зробити це - перевстановити втечу до більш зручного ключа. Але вам потрібен той, який не суперечить вашому регулярному набору тексту. Я використовую:

inoremap jj <Esc>

Оскільки jj (це 2 j набрано один за одним швидко), схоже, не відображається у моєму словниковому запасі. Інші перейдуть туди, де зручно.

Інша істотна зміна, яку я вношу, - це перемикання клавіш CAPSLOCK і CONTROL на моїй клавіатурі (використовуючи конфігурацію клавіатури хост-комп'ютера), оскільки я майже ніколи не використовую CAPSLOCK, і у неї є така велика, красива кнопка там, де я цього хочу. (Це звичайно для користувачів Emacs. Недоліком є ​​те, коли ви опинитесь на "нефіксованій" клавіатурі! Ааарг!)

Після повторного перезавантаження CAPSLOCK ви можете зручно використовувати наступні перестановки в режимі вставки:

Маючи на увазі, що деякі клавіші вже відображені у режимі вставки (за замовчуванням слово-убиття - це Cw (Control-w) за замовчуванням, можливо, у вас уже є прив’язки, які ви хочете. Тому, я вважаю, що я вважаю за краще Ch так у своєму .vimrc у мене є :

inoremap <C-h> <C-w>

Але, напевно, ви хочете того ж спазму м’язової пам’яті у звичайному режимі, тому я також карта Ch як:

nnoremap <C-h> db

(d) elete (b) ackwards виконує ту саму дію тим самим ключовим акордом. Цей тип швидкого редагування вважаю корисним на практиці для помилок друку. Але дотримуйтесь звичайного режиму для переміщення в тексті і нічого іншого, ніж вбити попереднє слово. Як тільки ви ввійдете в звичку змінювати режими (використовуючи перезапис, звичайно), це стане набагато ефективнішим, ніж перевстановлення режиму вставки.


приємний римейк для втечі - я вважаю, що він буде працювати майже про все, крім транслітерованої арабської!
jjt

0

Ви можете використовувати imapдля відображення будь-якої клавіші в режимі вставки одну з клавіш курсору. Так:

imap h <Left>

Зараз h працює, як у звичайному режимі, переміщуючи курсор. (Зображення h таким чином, очевидно, поганий вибір)

Сказавши, що я не думаю, що стандартний спосіб переміщення тексту в тексті за допомогою VIM "не є продуктивним". Існує безліч дуже потужних способів переходу тексту в звичайному режимі (наприклад, використання w і b, або / і?, Або f і F тощо)


1
Я не сказав, що стандартний спосіб переміщення через текст in vim не є продуктивним; що я сказав, що це було трохи "дратує", щоб вийти з режиму вставки, щоб повернути кілька символів, а потім знову потрібно вставити; але знову ж таки, можливо, це тому, що я ще не дуже звик до vim :)
Andreas Grech

Це рішення, яке я шукав. Я використовую imap <Ch> <Left> (я знаю, що це видаляє знак, але у мене є зворотна область), що все, що мені потрібно, дякую.
користувач4052054

0

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

inoremap <A-$> <C-o>$
inoremap <A-^> <C-o>^
inoremap <A-h> <Left>
inoremap <A-l> <Right>
inoremap <A-O> <C-O>O
inoremap <A-o> <C-o>o
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.