据我所知,Vim 没有历史扩展。
那么很自然的事情就是使用 Vim 在命令行上为我们提供的工具。我们有选择!
<Up>
箭头过滤
- 命令行编辑命令
CTRL-W
向后删除一个单词
<Left>
并<Right>
四处移动,CTRL-B
并CTRL-E
移动到行的开始/结束
- 使用命令行窗口
q:
(或CTRL-F
已经在命令行上)获得最终的历史编辑能力
- 以 Vim 精神为手头的特定问题找到惯用的替代解决方案
然而,如果你真的想要 Bash 风格的历史扩展,你可以<expr>
很容易地用命令行缩写来破解一些东西(至少对于更简单的情况)。
我最常使用的历史扩展项目(坦率地说不是经常):
!!
, 最近的命令行
!-2
, 第二个最近的命令行
!*
, 除前一个命令行的第一个参数外的所有参数
!$
, 上一个命令行的最后一个参数
以下是如何将它们实现为表达式缩写:
cnoreabbr <expr> !! getcmdtype() == ':' ? @: : '!*'
cnoreabbr <expr> !-2 getcmdtype() == ':' ? histget(':', -2) : '!-2'
cnoreabbr <expr> !* getcmdtype() == ':' ? join(split(@:,'\s\+')[1:], ' ') : '!*'
cnoreabbr <expr> !$ getcmdtype() == ':' ? split(@:,'\s\+')[-1] : '!$'
以下是您的示例在 Vim 中的工作方式:
:echo "Hello Stackoverflow"
Hello Stackoverflow
:echo "I'm posting on !$<Enter>
I'm posting on Stackoverflow
当然,如果您真的决定走这条路,请使用函数来处理更复杂的表达式。