在Vim中使用命令行模式中的正常模式运动

时间:2011-08-25 07:58:28

标签: vim vi

在命令行模式下是否可以进行模态编辑?

一些例子:

  • 写完!ls ~/foo/bar后我想db删除 bar
  • 我执行了上述命令,现在我想将ls更改为mv并跳回$

6 个答案:

答案 0 :(得分:97)

默认情况下,您可以在Vim命令行上按Control + f(或以其他方式查看set cedit),这将打开命令行窗口,您可以在其中使用正常模式Vim编辑编辑命令键。 Enter将运行该命令,或Control + c将返回标准命令行。

因此,在您的具体示例中,您可以在Vim命令行上按Control + f,然后按db,它就可以执行您想要的操作。

当我必须执行更复杂的编辑命令时,我使用上述方法,因为我对Vim编辑键更熟悉,而不是替代方法。我还发现普通模式的vim键更强大。

有关详细信息,请参阅:help c_ctrl-f

答案 1 :(得分:25)

vim 的命令行模式下

<ctrl-w>删除了一个单词

正常模式下的

q:转到命令历史记录(可以使用 vim命令)

有关更多命令,请参阅:help cmdline-editing:help cmdline-window

答案 2 :(得分:12)

用于在命令行模式下移动和编辑的内置热键

<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年 - 此后可能添加了新的键盘快捷键

答案 3 :(得分:8)

在Vim中搜索:help cmdline-editing

它将提供在命令行模式下工作的快捷方式列表。

您当前问题的摘录:

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

或使用Rene提到的q:,它允许您以不同的模式编辑以前键入的命令。

答案 4 :(得分:4)

“正常模式”插件 - 类似于命令行编辑

  

emacscommandline   使命令行模式更像Unix命令行,   通过添加Emacs样式的映射(如在Bash shell中)。某些   映射只是映射现有的vim命令,但其余的实现   本机无法使用的功能。

  

conomode.vim实现了一种普通模式(“Cmdline-Normal模式”)   命令行。目的类似于cmdline-window(q :),但是   导航和编辑可以就地完成。当然了   cmdline-window功能更强大。

     

Conomode不会取代Vim的本机emacs风格的命令行   编辑时,它只添加一个键:CTRL-O(见下文)。

     
      
  • 使用c_输入(在命令行模式下按CTRL-O)
  •   
  • 模式指示符是冒号“:”,随光标移动,隐藏其下的字符
  •   
  • 使用I,i,a,A,或任何未映射的密钥(然后执行或插入自身)退出到Cmdline模式,或等待60秒。
  •   
  • 使用Esc
  • 退出正常模式   

(不可否认,我不明白这个插件的重点,因为不是按 Ctrl + O 进入其Cono模式,你可以尽快使用 Ctrl + F 弹出命令行窗口。)

可能还有其他插件。 →https://www.google.com/webhp?q=command-line+editing+plugin+vim

您可以定义您自己的映射,而不是使用完整的插件或作为其补充。 →查看我的其他answer

答案 5 :(得分:1)

复制正常模式命令的自定义映射

您可以在命令行模式下手动将特定的Normal命令映射到击键。

例如,以下一组映射将使命令行模式中的 Alt + h 向左移动一个字符, Alt + k 回忆起前一个Ex命令,依此类推,类似于 h j k l in正常模式。

" 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修饰键未映射(对重要的事物),您可以以相同的方式将其他(或全部)功能从普通模式拉到插入模式。例如。: 使用 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来打开它。)


您可以使用其他作者的全功能插件→查看我的其他answer,而不是“重新发明轮子”或作为您自己的映射的补充。