运行命令但留在 shell 中 vs 退出

rob*_*bus 6 vim shell terminal

我知道在 vim 中我可以输入

:terminal <command> %
Run Code Online (Sandbox Code Playgroud)

对当前编辑缓冲区中的文件运行命令。例如,为了简化我想要做的事情,让我们使用一个简单的 ls 命令:

:terminal ls %
Run Code Online (Sandbox Code Playgroud)

这将拆分窗口,运行命令并退出 shell,同时将输出留在屏幕上。那不是我想要的。我希望它运行命令,但将我留在 shell 中, 以便我可以运行更多可能与当前文件/操作相关的 bash 命令,然后在我完成后手动退出。

如果我只是输入

:terminal
Run Code Online (Sandbox Code Playgroud)

它把我带到了一个 bash shell,它允许我输入任意数量的命令,这很棒。但是我随后失去了使用 % 扩展工具的能力,以及从我正在编辑的文件中生成终端的便利性。IE。我失去了从原始文件/缓冲区产生的上下文的自动化,这意味着我必须手动输入当前文件名,包括可能的长路径和/或滚动以前的 bash 历史记录以重新运行原始命令。这是对击键的浪费。

基本上,我试图找到一种方法来创建一个 vim 映射,它允许我在 bash 命令中使用 % 文件名扩展,通过:term在命令运行后不结束作业(我更喜欢留在 shell 中的提示符处)继续会议!)

我实际上不在乎一个解决方案是否只是启动:termshell 并在 bash 提示符下用 % 文件名扩展回显我的命令而不输入它..这将允许我在我用手动马车执行命令后仍然留在 bash返回。

我不确定我想做的事情是否可行?请注意,我不希望暂停我当前的编辑会话和 fg,因为它会绑定当前的编辑会话。我不确定 tmux - vim 集成是否可以提供一种方法来做我想做的事,尽管我更喜欢直接找到解决方案,:term因为它是一个内置功能并且运行良好,除了我想要做的达到 :)

moo*_*pet 0

正如人们所评论的,实际上没有直接执行此操作的方法,但您可以使用帮助程序脚本来获得您想要的大部分内容。

使用 bash 作为 shell(为什么不),制作如下脚本:

#!/bin/bash

# could add echo $1 or ls $1 or whatever you want here.

V="$1" exec bash
Run Code Online (Sandbox Code Playgroud)

称其为 ,vim-bash使其可执行并将其放在路径上的某个位置。然后从 vim 中,:terminal vim-bash %会给你一个 shell,当前文件名可用为$V.

您可以通过创建一个 vim 命令来包装它来扩展这个想法:

command! Vterminal :execute 'terminal vim-bash %'
Run Code Online (Sandbox Code Playgroud)

然后你只需从 vim 运行即可:Vterminal。您将获得一个 shell,您可以在其中轻松访问文件名:

$ echo $V
my/really/long/pathname
Run Code Online (Sandbox Code Playgroud)

您可以看到,您可以将ls命令直接添加到脚本中,但如果您想要冒险,您可以调整 vim 命令以通过单行在该点执行。