有一个vim相当于bash的'!$'?

Chr*_*her 7 vim bash sh

我经常发现自己在开发过程中做了类似的事情:

:e <file>
:vsplit <the_same_file>  "reopen/re-edit with a vertical split
Run Code Online (Sandbox Code Playgroud)

正如一些响应者指出的那样,有一个更好的方法::vs<CR>.假设有一刻没有.

如果我在shell中打开文件,我会使用!$历史记录扩展来捕获上一个命令的最后一个参数,如下所示:

$ echo "Hello" "stackoverflow"
Hello stackoverflow
$ echo "I'm posting on !$"
I'm posting on stackoverflow
Run Code Online (Sandbox Code Playgroud)

这种扩展以及许多其他类似的扩展彻底重新定义了我使用命令行的方式.vim中有等价物吗?我知道%当前文件的别名.过去命令参数怎么样?

glt*_*lts 3

据我所知,Vim 没有历史扩展。

那么自然要做的就是在命令行上使用 Vim 为我们提供的工具。我们还有选择!

  • <Up>箭头过滤
  • 命令行编辑命令
    • CTRL-W向后删除一个单词
    • <Left><Right>四处移动,CTRL-BCTRL-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] : '!$'
Run Code Online (Sandbox Code Playgroud)

以下是您的示例在 Vim 中的工作方式:

:echo "Hello Stackoverflow"
Hello Stackoverflow
:echo "I'm posting on !$<Enter>
I'm posting on Stackoverflow
Run Code Online (Sandbox Code Playgroud)

当然,如果您确实决定走这条路,请使用函数来实现更复杂的表达式。