Обход текста в режиме вставки

322

В режиме вставки в Vim, можно ли каким-либо образом перемещать текст, перемещая некоторые символы вперед и назад, кроме использования клавиш со стрелками?

Если я нажимаю h, j, kи в lто время как в режиме вставки, фактические символы печатаются на экране вместо перемещения по тексту.

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

Андреас Греч
источник
В качестве подсказки: это также полезно, если вы отображаете escape на более близкую комбинацию клавиш (то есть imap jk <Esc>), чтобы вам не приходилось прерывать импульс и тянуться через клавиатуру, чтобы нажать клавишу.
Цудзин
3
Мне нравится это ( <ESC>) отображается kjвместо jk; мой друг друг Дейкстра виноват!
Доктор Беко
7
У меня есть jkи kj, поэтому я просто нажимаю ее, как большую кнопку двумя пальцами, и не имеет значения, в каком порядке я вернулась в нормальное состояние.
Эду Руис

Ответы:

649

Вы, кажется, неправильно используете 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-wудалить слово 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: Спасибо! :) Теперь я добавил информацию о настройке режима командной строки. (Подход немного отличается от режима вставки.)
Аарон Тома
@Zen: Что вы подразумеваете под "винкей"? Я не ссылался на ключ Windows в своем ответе. Вы имеете в виду Altключ?
Аарон Тома
Shift - влево / вправо, чтобы переместить все слово! Как я этого не знал. Спасибо.
Флорис
фактически в терминальном режиме alt автоматически отправляет esc перед вашими командами ........
Fuseteam
26

Если вы пурист Vim, пропустите чтение этого ответа. OTOH, если вы новичок в vim и ищете несколько полезных советов, которые вы не найдете во многих сотнях уроков и блогов vim, читайте дальше ... :-)

Несколько неортодоксальных (vim) способов

Это 2014 год, и как человек, недавно вернувшийся в прошлое, vimя могу предложить несколько потенциально противоположных точек зрения и советов.

Используйте shift + left или shift + right для перемещения по словам

Хотя повторение является мощным понятием в vim, я (лично) нахожу странным, что его использование заставляет меня считать (строки, символы, слова и т. Д.) Или делать предположения. Мой мозг обычно работает как «Я хочу курсор там », а не как «Я хочу курсор _5_words_to_the_left_». Быстрая возможность перемещать курсор и визуально наблюдать, где точка вставки таким образом, позволяет мне сосредоточиться на том, что я редактирую, вместо того, чтобы подсчитывать, сколько прыжков мне нужно сделать, чтобы добраться туда, где мне нужно редактировать.

Включите режим мыши, и используйте колесо мыши и нажав

... перемещаться по большим текстам.

Большинство (всех) современных компьютеров имеют сенсорную панель, которая тесно интегрирована с клавиатурой (например, MacBook). Промышленные дизайнеры потратили много человеко-лет на оптимизацию этих конструкций, так что старая проблема необходимости отодвигать руку от клавиатуры больше не является реальной проблемой. Ладно, это если вы привыкли к мышке и не любите переключаться, но для любого новичка в vim (например, для тех, кто может найти этот пост через поиск), это не должно быть большой проблемой.

В качестве бонуса клик + перетаскивание переводит вас в визуальный режим

При включенной мыши нажатие и перетаскивание приводит к переключению в визуальный режим и выделению области для дергания.

И используйте колесо прокрутки

Использование мыши (колесика) для прокрутки и щелчка для позиционирования курсора (дух) просто работает. См. Http://usevim.com/2012/05/16/mouse/, чтобы узнать больше об этом.

Так что...

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

НТН

Шьям Хабаракада
источник
6
@MilesRout да, у меня был отказ от ответственности. Но, если серьезно, я думаю, что есть значительная доля пользователей vim, чей мозг работает так же, как мой. То есть ... мой мозг обычно работает как «Я хочу курсор там», а не как «Я хочу курсор 5_words_to_the_left ». И обычный способ vim не работает так хорошо для этих людей. Я люблю vim, потому что а) он доступен везде и б) имеет мощные функции. Однако я не чувствую необходимости соответствовать всем механизмам по умолчанию.
Шьям Хабаракада
4
@MilesRout В vim много подобных религий, поэтому я не буду с вами спорить по этому поводу. Метод подсчета повторений мне не помогает, и принятый ответ также вызывает его как нечто недоиспользуемое. Я могу только догадываться, почему это так. Использование w, b и т. Д. Для навигации по близлежащим местам - это замечательно, но если идти дальше, колесо мыши работает намного лучше для меня. Приветствия.
Шиам Хабаракада
4
+1. Я не понимаю это голосование. Есть отказ от ответственности. Возьми, если тебе нравится, и пропусти, если нет.
fangmobile.com
Это очень полезный ответ
Слава
1
Как кто-то, кто недавно перешел на VIM, я нахожу предпосылку этого ответа абсолютно точной. Возможность мгновенного определения количества повторений, необходимых для позиционирования курсора в данном месте, может или не может быть чем-то, что идет с опыт. Прямо сейчас, как @ShyamHabarakada, мой мозг просто так не работает. Независимо от того, насколько необычным это может быть, я лично переназначил fn + hjkl на клавиши со стрелками для очень маленьких движений. Для больших движений я обычно аппроксимирую количество повторений, а затем подхожу к ним. Для меня это так быстро, как я могу получить.
Jacoscaz
14

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

Vim наиболее эффективен, когда вы используете его инструменты для создания атомарных, повторяемых действий или находок.

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

Если вы допустили ошибку при вводе текста и вышли из режима вставки, чтобы исправить это, вы не сможете повторить намеченное действие, .повторите исправление.

Vim поддерживает множество клавиш навигации в режиме вставки. Очевидно, есть клавиши со стрелками, Home и End, но есть и много других сочетаний клавиш. См :h ins-special-keys.

everett1992
источник
4

В GVim вы можете использовать мышь. Но, честно говоря, что не так с использованием клавиш со стрелками? Есть причина, почему они на клавиатуре.

Эрих Кицмюллер
источник
9
но эта причина не обслуживается пользователями vim. Одна из главных сильных сторон vim - это то, что вы можете делать все, не тратя времени на снятие рук с клавиатуры. В частности, движения hjkl.
Аарон Тома
1
Я согласен с @ammoQ. Ничего плохого в использовании клавиш со стрелками. Если использование клавиш со стрелками даст вам большую производительность, идти с ним.
Eunwoo Song
награда: я использую 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>

Это переходит в нормальный режим и возвращает слово

Alex
источник
2

Я считаю, Homeи EndPageUp/ PageDn) также нормально работают в режиме вставки, но, кроме этого, я не верю, что существуют какие-либо другие стандартные ключи, определенные для обхода текста.

янтарный
источник
но, возможно, нет ли способа обойти текст, используя только буквенные ключи?
Андреас Греч
5
Конечно, есть, если вы не хотите, чтобы иметь возможность печатать определенные буквы ...;)
Хоббс
@hobbs Как насчет Ctrl + HJKL? Это должно иметь смысл
user4052054
1

Извините, но Вим так не работает.

Вы должны переключиться в «нормальный» режим, перейти и затем вернуться, чтобы вставить снова.

Johan
источник
1

Вы можете создавать сопоставления, которые работают в режиме вставки. Способ сделать это через inoremap. Обратите внимание на 'i' в начале команды (noremap полезно, чтобы избежать коллизий карты ключей). Следствием является «n» для «нормального» режима. Вы можете догадаться, что vim считает «нормальным»;)

ОДНАКО, вы действительно хотите перемещаться по тексту, используя «нормальный» режим. Vim превосходен в таких вещах, и вся эта сила доступна в обычном режиме. Vim уже предоставляет простые способы перехода из обычного режима в режим вставки (например, i, I, a, A, o, O). Хитрость заключается в том, чтобы облегчить переход в обычный режим. Способ сделать это состоит в том, чтобы переназначить escape на более удобный ключ. Но вам нужен тот, который не будет противоречить вашей обычной печати. Я использую:

inoremap jj <Esc>

Поскольку jj (это 2 j набираются один за другим быстро), кажется, не появляется в моем словаре. Другие будут переназначаться туда, где это удобно.

Другое существенное изменение, которое я делаю, - это переключение клавиш CAPSLOCK и CONTROL на моей клавиатуре (используя конфигурацию клавиатуры главного компьютера), поскольку я почти никогда не использую CAPSLOCK, и у него есть эта большая, красивая кнопка там, где я хочу. (Это характерно для пользователей Emacs. Недостатком является то, что вы оказались на «нефиксированной» клавиатуре! Аааааа!)

После переназначения CAPSLOCK вы можете удобно использовать следующие переназначения режима вставки:

Помня, что некоторые ключи уже сопоставлены в режиме вставки (по умолчанию back-kill-word - Cw (Control-w), у вас уже могут быть нужные привязки. При этом я предпочитаю Ch, так что в моем .vimrc у меня есть :

inoremap <C-h> <C-w>

НО, вы, вероятно, хотите такой же спазм мышечной памяти в нормальном режиме, поэтому я также сопоставляю Ch как:

nnoremap <C-h> db

(d) elete (b) ackwards выполняет одно и то же с одним и тем же клавишным аккордом. Этот вид быстрого редактирования - тот, который я считаю полезным на практике для опечаток. Но придерживайтесь обычного режима для перемещения по тексту и для чего-то большего, чем убийство предыдущего слова. Как только вы привыкнете менять режимы (используя, конечно, переназначение), это будет намного эффективнее, чем переназначение режима вставки.

pfries
источник
хороший перевод для побега - я полагаю, что это будет работать практически для всего, кроме транслитерированного арабского!
JJT
0

Вы могли бы использовать imap для привязки любой клавиши в режиме вставки к одной из клавиш курсора. Вот так:

imap h <Left>

Теперь h работает как в обычном режиме, перемещая курсор. (Отображение h таким способом, очевидно, является плохим выбором)

Сказав, что я не думаю, что стандартный способ перемещения по тексту с использованием VIM "не продуктивен". Есть много очень мощных способов обхода текста в обычном режиме (например, используя w и b, или / и?, Или f и F и т. Д.)

Питер ван дер Хейден
источник
1
Я не говорил, что стандартный способ перемещения по тексту в vim не продуктивен; то, что я сказал, было немного «раздражающим» - выходить из режима вставки, чтобы вернуться назад на несколько символов, а затем вернуться, чтобы вставить снова; но опять же, может быть, это потому, что я еще не совсем привык к vim :)
Андреас Греч
Это решение, которое я искал. Я использую imap <Ch> <Left> (я знаю, что он удаляет символ, но у меня есть пробел), и это все, что мне нужно, спасибо.
user4052054
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
Александр ван Трижеффель
источник