bash - 有没有等同于 bash 的 '!$' 的 vim?

标签 bash vim sh

我经常发现自己在开发时做这样的事情:

: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

这个扩展,和many others like it,完全重新定义了我使用命令行的方式。 vim 中有等效项吗?我知道%别名当前文件。过去的命令参数呢?

最佳答案

据我所知,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

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

关于bash - 有没有等同于 bash 的 '!$' 的 vim?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18494837/

相关文章:

linux - Korn外壳用于循环

linux - 查找具有(或没有)特定所有者的文件

c++ - 使用 exec 在 C++ 中执行 shell 命令

node.js - 有没有办法退出 Node.js 并在文件上启动 VIM?

vim - 如何减少 Vim 的缓冲区列表以仅包含事件缓冲区

bash - 拆分并推送提交的文件到两个不同的分支

bash - 如何有效地将一个文件流式传输到多个管道

macos - 带有数字名称的 bash for 循环

vim - 在 coc.nvim 的 rust-analyzer 中更改类型提示的颜色

perl - 无法在 AWS lambda 上的 @INC 中找到 URI/Escape.pm