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

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

一些例子:

  • 写完以后!ls ~/foo/bar我想用db来删除
  • 我执行了上面的命令,现在我想把ls改成mv并跳回到$

在默认情况下,您可以在Vim命令行上按Control + f (或者另外参阅set cedit ),这会打开命令行窗口,您可以在其中使用常规模式Vim编辑键编辑该命令。 Enter将运行该命令,或者Control + c将返回到标准命令行。

所以在你的具体例子中,你可以在Vim命令行上按Control + f ,然后按db ,它就可以做你想做的事情。

当我不得不做更复杂的编辑命令时,我使用上面的方法,因为我更熟悉Vim编辑键,而不是使用替代方法。 我也发现正常模式的VIM键更强大。

请参阅:help c_ctrl-f以获取更多信息。

vim的命令行模式下: <ctrl-w>删除一个单词

正常模式下q:进入命令历史logging(可以使用vim命令编辑)

请参阅:help cmdline-editing:help cmdline-window以获取更多命令。

在Vim中search: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 

或者使用q:如Rene所提到的,它允许你在不同的模式下编辑以前input的命令。

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

 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

(对不起,旧的答案重叠。希望这个完整的和结构化的概述是有用的然而。)

像“正常模式”的命令行编辑插件

通过添加Emacs风格的映射(如Bash shell), emacscommandline使命令行模式更像Unix命令行。 有些映射只是映射现有的vim命令,但其余的实现本地不可用的function。

conomode.vim在命令行上面实现了一种正常模式(“Cmdline-Normal模式”)。 目的与cmdline-window(q :)类似,但是可以在原地进行导航和编辑。 当然,cmdline窗口更强大。

Conomode并不能取代Vim本身的emacs风格的命令行编辑function,只是增加了一个键:CTRL-O(见下文)。

  • 用c_input(在命令行模式下按CTRL-O)
  • 模式指示符是冒号“:”,随游标一起移动,隐藏在它下面的字符
  • 使用I,i,a,A,或任何未映射的键(然后执行或插入本身)退出到Cmdline模式,或者等待60秒。
  • 退出到正常模式与Esc

(不可否认,我不明白这个插件的意思,因为不是按Ctrl + O来进入它的Cono模式,你可以用Ctrl + F快速地popup命令行窗口。)

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

而不是使用一个完整的插件,或作为它的补充,你可以定义你自己的映射 。 →看我的其他答案 。

复制普通模式命令的自定义映射

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

例如,以下一组映射将使命令行模式中的Alt + h只剩下一个字符, Alt + k重新调用前一个Ex命令等等,类似于正常模式下的hj k l

 " provide hjkl movements in Command-line mode via the <Alt> modifier key cnoremap <expr> <Ah> &cedit. 'h' .'<Cc>' cnoremap <expr> <Aj> &cedit. 'j' .'<Cc>' cnoremap <expr> <Ak> &cedit. 'k' .'<Cc>' cnoremap <expr> <Al> &cedit. 'l' .'<Cc>' 

由于默认情况下,Alt修饰键没有被映射(对某些重要的东西),所以可以以相同的方式将其他(或全部)function从正常模式拉到插入模式。 例如:用Alt + b移动到当前单词的开头:

 " Normal mode command(s) go… --v <-- here cnoremap <expr> <Ab> &cedit. 'b' .'<Cc>' cnoremap <expr> <Aw> &cedit. 'w' .'<Cc>' " <Alt>+<i> changes the first word (typically " the last run Ex :command or the last range, given the case) cnoremap <expr> <Ai> &cedit. '^cw' .'<Cc>' 

您必须将该代码复制到vimrc文件中,以便每次启动vim时加载它(可以通过键入:new $myvimrc打开该文件:new $myvimrc以普通模式启动)。

除了“重新发明轮子”,或者作为自己的映射的补充,您可以从其他作者的全function插件中汲取→请参阅我的其他答案 。