Перемещение текста в режиме вставки
В режиме Вставить в 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 и End (и PageUp/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 и т.д.)