Подтвердить что ты не робот

Использование движений нормального режима в режиме командной строки в Vim

Возможно ли изменение модальности в режиме командной строки?

Некоторые примеры:

  • После записи !ls ~/foo/bar я хочу db удалить панель
  • Я выполнил приведенную выше команду, и теперь я хочу изменить ls на mv и вернуться к $
4b9b3361

Ответ 1

По умолчанию вы можете нажать Control + f (или иначе увидеть set cedit), когда в командной строке Vim открывается окно командной строки, где вы можете редактировать команду с помощью клавиш редактирования Vim в обычном режиме. Enter выполнит команду или Control + c вернет вас в стандартную командную строку.

Итак, в вашем конкретном примере вы можете нажать Control + f в командной строке Vim, затем db, и он сделает то, что вы хотите.

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

Подробнее см. :help c_ctrl-f.

Ответ 2

в режиме командной строки vim: <ctrl-w> удаляет слово

в нормальном режиме: q: переходит в историю команд (которые можно редактировать с помощью vim)

см. :help cmdline-editing и :help cmdline-window для получения дополнительных команд.

Ответ 3

Встроенные горячие клавиши для перемещения и редактирования в режиме командной строки

<Esc>        abandon command-line without executing it
CTRL-C       abandon command-line without executing it

CTRL-B       cursor to begin 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

(Извините за совпадение со старыми ответами. Надеюсь, что этот полный °, структурированный обзор полезен.)
° по состоянию на 2014 год - с тех пор могут быть добавлены новые сочетания клавиш

Ответ 4

Найдите :help cmdline-editing в Vim.

Он предоставит список ярлыков, работающих в режиме командной строки.

Экстракт для вашей текущей проблемы:

CTRL-B or <Home>                    *c_CTRL-B* *c_<Home>*
    cursor to beginning of command-line
CTRL-E or <End>                     *c_CTRL-E* *c_<End>*
    cursor to end of command-line
<S-Left> or <C-Left>                    *c_<C-Left>*
    cursor one WORD left
                        *c_<S-Right>*
<S-Right> or <C-Right>                  *c_<C-Right>*
    cursor one WORD right

или используйте q:, как упоминается Rene, который позволяет редактировать предыдущие типизированные команды в разных режимах.

Ответ 5

Плагины для "Нормального режима" - например, редактирование командной строки

emacscommandlineделает режим командной строки более похожим на командную строку Unix, путем добавления сопоставлений в стиле Emacs (например, в оболочке Bash). Некоторые из сопоставления просто сопоставляют существующие команды vim, но остальные реализуют функциональность, которая не доступна изначально.

conomode.vim реализует некий нормальный режим ( "Cmdline-Normal mode" ) поверх командной строки. Цель аналогична cmdline-окну (q:), но навигация и редактирование могут быть выполнены на месте. Конечно, cmdline-окно намного мощнее.

Conomode не заменяет командную строку Vim native emacs style редактируя, он просто добавляет один ключ: CTRL-O (см. ниже).

  • введите c_ (нажмите CTRL-O в режиме командной строки)Индикатор режима
  • представляет собой двоеточие ":", перемещенное вместе с курсором, скрывая под ним char
  • quit to Cmdline-mode с I, i, a, A,: или любым неотображаемым ключом (который затем выполняет или вставляет сам) или ждет 60 секунд.
  • выйти в обычный режим с Esc

(По общему признанию, я не понимаю смысл этого плагина, так как вместо того, чтобы нажимать Ctrl + O, чтобы войти в его режим Cono, вы могли бы так же быстро всплыть окно командной строки с Ctrl + F.)

Там могут быть и другие плагины. → https://www.google.com/webhp?q=command-line+editing+plugin+vim

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

Ответ 6

Пользовательские сопоставления, которые реплицируют команды Нормального режима

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

Например, следующий набор сопоставлений сделает Alt + h в режиме командной строки одним символом слева, Alt + k вызовет предыдущую команду Ex и так далее, аналогично h j k l в нормальном режиме.

" provide hjkl movements in Command-line mode via the <Alt> modifier key
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>'

Поскольку ключ модификатора Alt по умолчанию не отображается (что-то важное), вы можете одним и тем же способом вытащить другие (или все) функции из нормального режима в режим Insert. Например.: Перемещение в начало текущего слова с помощью Alt + b:

" Normal mode command(s) go… --v <-- here
cnoremap <expr> <A-b> &cedit. 'b' .'<C-c>'
cnoremap <expr> <A-w> &cedit. 'w' .'<C-c>'

" <Alt>+<i> changes the first word (typically 
"   the last run Ex :command or the last range, given the case)
cnoremap <expr> <A-i> &cedit. '^cw' .'<C-c>'

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


Вместо того, чтобы "изобретать колесо" или как дополнение к вашим собственным сопоставлениям, вы можете использовать полнофункциональные плагины от других авторов → см. Мой другой ответ.