Обход текста в режиме вставки - PullRequest
303 голосов
/ 15 ноября 2009

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

Если я нажму h , j , k и l в режиме вставки, вместо них на экране будут напечатаны действительные символы перемещения по тексту.

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

Ответы [ 12 ]

608 голосов
/ 15 ноября 2009

Вы, кажется, неправильно используете vim, но это, вероятно, из-за того, что вы не очень хорошо с ним знакомы.

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

Вот несколько вариантов использования:

  • Вы случайно набрали «случайно». Нет проблем, последовательность Esc F f r d A исправит ошибка и вернет вас туда, где вы редактировали. Движение F f переместит курсор назад к первому встречному символу "f". Сравните это с Ctrl + & larr; & rarr; & rarr; & rarr; & rarr; Del d End , который делает практически то же самое в обычном редакторе, но требует больше нажатий клавиш и заставляет вас переместить руку из буквенно-цифровой области клавиатура.
  • Вы случайно набрали «Вы случайно набрали», но хотите исправить его на «Вы преднамеренно напечатали». Тогда Esc 2 b c w сотрет слово, которое вы хотите исправить, и переведет вас в режим вставки. , так что вы можете сразу же перепечатать его. Чтобы вернуться к редактированию, просто нажмите A вместо End , чтобы вам не приходилось перемещать руку для достижения клавиши End .
  • Вы случайно набрали «мышь» вместо «мыши». Нет проблем - старый добрый Ctrl + w удалит предыдущее слово, не выходя из режима вставки. И бывает гораздо быстрее стереть маленькое слово, чем исправить ошибки в нем. Я так привык к этому, что закрыл страницу браузера, когда набирал это сообщение ...!
  • Количество повторений в значительной степени недоиспользуется. Прежде чем сделать движение, вы можете набрать номер; и движение будет повторяться это количество раз. Например, 1 5 h вернет курсор на 15 символов назад, а 4 j переместит курсор 4 строки вниз. Начните использовать их, и вы скоро к этому привыкнете. Если вы допустили ошибку в десяти символах от курсора, вы обнаружите, что нажатие клавиши & larr; 10 раз намного медленнее, чем итеративный подход к перемещению курсора. Таким образом, вы можете вместо этого быстро набрать клавиши 1 2 h (как примерное предположение, сколько символов назад вам нужно переместить курсор), и сразу продвиньтесь вперед дважды с помощью l l , чтобы быстро исправить ошибку.

Но, если вы все еще хотите сделать небольшие обходы текста, не выходя из режима вставки, следуйте rson s advice и используйте Ctrl + O . Взяв первый пример, который я упомянул выше, Ctrl + O F f переместит вас к предыдущему символу "f" и оставит Вы в режиме вставки.

125 голосов
/ 29 марта 2013

В режиме вставки используйте Ctrl O , чтобы перейти к нормальному режиму только для одной команды:

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

это устранит много расточительных переключений обратно в нормальный режим.

89 голосов
/ 10 июня 2011

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

Движение

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 вниз и т. Д., Аналогично до ч j k l в обычном режиме.

Вы должны скопировать этот код в файл vimrc, чтобы он загружался при каждом запуске vim (вы можете открыть его, набрав :new $myvimrc, начиная с обычного режима).


Любые движения в нормальном режиме

Поскольку клавиша-модификатор Alt по умолчанию не связана (с чем-то важным), вы можете таким же образом перевести другие (или все) функции из обычного режима в режим вставки. E.g.:
Перемещение к началу текущего слова с помощью 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

24 голосов
/ 10 мая 2014

Если вы vim purist, пропустите чтение этого ответа. 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, одинаково эффективными в зависимости от ваших предпочтений ввода.

НТН

14 голосов
/ 22 апреля 2013

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

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

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

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

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

4 голосов
/ 21 августа 2012

Чтобы иметь немного лучшую навигацию в режиме вставки, почему бы не сопоставить некоторые клавиши?

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>

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

4 голосов
/ 15 ноября 2009

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

2 голосов
/ 15 ноября 2009

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

1 голос
/ 24 января 2013

Вы можете создавать сопоставления, которые работают в режиме вставки. Способ сделать это через 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>

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

nnoremap <C-h> db

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

0 голосов
/ 08 ноября 2018

Для некоторых часто используемых движений и действий я определил следующие отображения. Это сохраняет нажатие клавиш по сравнению с комбинацией 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
...