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

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

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

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

Ответ 1

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

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

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

  • вы случайно набрали "accifentally". Нет проблем, последовательность Esc F F r d A исправит ошибку и вернет вас туда, где вы ее редактировали. F F движение вернет вас к первому встреченному символу "f". Сравните с Ctrl + <- -> -> -> -> del d End, что делает практически то же самое в случайном редакторе, но принимает больше нажатий клавиш, заставляет вас перемещать из буквенно-цифрового пространства клавиатуры.
  • вы случайно набрали "вы случайно набрали", но хотите исправить его до "вы намеренно набрали". Затем Esc 2 b c w будет стирать слово, которое вы хотите исправить, и привести его в режим вставки, чтобы вы могли сразу его перепечатать. Чтобы вернуться к редактированию, просто нажмите A вместо End, чтобы достичь того, куда вы должны двигаться.
  • вы случайно набрали "мышь" вместо "мышей". Нет проблем - старый добрый Ctrl + w удалит предыдущее слово, не выходя из режима вставки. И бывает гораздо быстрее стереть небольшое слово, чем исправить ошибки в нем. Я так привык, что закрыл страницу браузера, когда я печатал это сообщение...
  • количество повторений в основном недоиспользуется. Прежде чем совершить движение, вы можете ввести число; и движение будет повторяться это количество раз. Например, 1 5 h вернет вам 15 символов, а 4 j будет прокручивать вас на 4 строки вниз. Начните использовать их, и вы скоро примете их и узнаете, что нажатие клавиши 10 t <- менее быстрое, чем итеративный подход к движущемуся курсору при вводе 1 2 h, обратите внимание, что вы допустили ошибку и немедленно исправьте себя с помощью l l.

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

Ответ 2

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

Движение

hjkl

Несмотря на то, что Павел Швед сказал - что, вероятно, более целесообразно привыкнуть к Esc aping Insert mode - вот примерный набор сопоставлений для быстрой навигации в режиме вставки:

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

Вам нужно скопировать этот код в файл 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 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

Ответ 3

В режиме вставки используйте 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

это приведет к тому, что многие расточительные коммутаторы вернутся в нормальный режим.

Ответ 4

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

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

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

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

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

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

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

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

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

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

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

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

И так...

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

НТН

Ответ 5

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

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

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

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

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

Ответ 6

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

Ответ 7

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

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

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

Для более длинных переходов я предпочитаю следующий перевод по умолчанию:

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

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

Ответ 8

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

Ответ 9

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

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

inoremap jj <Esc>

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

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

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

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

inoremap <C-h> <C-w>

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

nnoremap <C-h> db

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

Ответ 10

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

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

Ответ 11

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

imap h <Left>

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

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