在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插件中汲取→请参阅我的其他答案 。