7

在开发过程中,我经常发现自己在做这样的事情:

:e <file>
:vsplit <the_same_file>  "reopen/re-edit with a vertical split

正如一些响应者指出的那样,有一种更好的方法可以做到这一点::vs<CR>. 假设一会儿没有。

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

$ echo "Hello" "stackoverflow"
Hello stackoverflow
$ echo "I'm posting on !$"
I'm posting on stackoverflow

这个扩展,以及许多其他类似的扩展,彻底重新定义了我使用命令行的方式。vim中是否有等价物?我知道%别名当前文件。过去的命令参数呢?

4

3 回答 3

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] : '!$'

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

:echo "Hello Stackoverflow"
Hello Stackoverflow
:echo "I'm posting on !$<Enter>
I'm posting on Stackoverflow

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

于 2013-08-28T21:15:26.537 回答
1

不带参数使用:vsp会拆分当前窗口。

不完全符合您的要求,但我经常使用%当前文件名:

:e some_file
:vsp %

:help cmdline-special

于 2013-08-28T20:11:27.103 回答
0

杰出的 VIM 提示指出了历史重复起作用的一个特定领域,即换人:

" Summary of editing repeats [N]
.      last edit (magic dot)
:&     last substitute
:%&    last substitute every line
:%&gic last substitute every line confirm
g%     normal mode repeat last substitute
g&     last substitute on all lines
@@     last recording
@:     last command-mode command
:!!    last :! command
:~     last substitute
:help repeating
于 2013-09-24T21:31:07.207 回答