运行命令但留在 shell vs exit

Posted

技术标签:

【中文标题】运行命令但留在 shell vs exit【英文标题】:Run a command but stay in the shell vs exit 【发布时间】:2019-02-01 22:06:24 【问题描述】:

我知道在 vim 中我可以输入

:terminal <command> %

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

:terminal ls %

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

如果我只是输入

:terminal

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

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

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

我不确定我想做的事情是否可行?请注意,我不打算暂停当前的编辑会话并返回 fg,因为它会占用当前的编辑会话。我不确定 tmux - vim 集成是否可以提供一种方法来做我想做的事,尽管我更喜欢直接使用:term 找到解决方案,因为它是一个内置功能,除了我的功能外,它运行良好我正在努力实现:)

【问题讨论】:

I don't think this is possible with :term, although might be possible manually starting the terminal with term_start() and a handler for a proper option (see help for job-options).不过,我必须说,整个情况并不是特别简单。您希望在不打开终端的情况下从不断打开的终端(历史记录、滚动查看以前的命令)中获取功能。我不明白每次运行命令后保持一个新的打开会更实用。 感谢您的回复。基本上我希望终端在 vim 拆分中,以便我可以保留上下文。可以说,我不想使用 % 在我当前编辑的文件上运行 ls,而是想实际运行 %,因为它是一个 python 脚本文件。在从 vim :term 第一次运行脚本(没有 args 的香草运行)后,有时我喜欢重新运行脚本,但然后从命令行输入 不同 args。有时这些 args 是文件,我可以使用 bash 选项卡完成将它们添加到脚本命令行,或者我可以运行 find 或其他 bash 命令来查找要指定为 args 的文件。 cont'd.. 如果该术语在运行我的 % 脚本文件后退出,那么我将无法使用不同的参数等从命令行继续使用它。保留文件很好编辑上下文打开 b/c 最终我将回到文件并编辑/更改它。当然,我可以直接打开:term,我有一个完整的外壳,可以得到我想要的 90%。但是如果 vim 不在我编辑的文件的目录中,我必须找到我当前正在编辑的文件。没有上下文。如果可以将 % 传递给 shell 并且 shell 不会退出它,那就更容易了。有意义吗? 【参考方案1】:

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

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

#!/bin/bash

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

V="$1" exec bash

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

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

command! Vterminal :execute 'terminal vim-bash %'

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

$ echo $V
my/really/long/pathname

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

【讨论】:

【参考方案2】:

您可以通过映射来做到这一点。 此映射适用于扩展“%”并使新终端保持活动状态:

:nmap <F12> :let $MYFILE=expand('%')<CR>:terminal<CR>echo $MYFILE<CR>

您可能需要映射到不同的键,否则这应该可以工作。

【讨论】:

【参考方案3】:

您可以使用命令'put'将变量放在光标之后。例如:

let filename=expand(%)
term
put='ls '.filename

【讨论】:

这不起作用 -- vim 报告“无法进行更改,'modifiable' 已关闭”。【参考方案4】:

试试这个:

:terminal ls % && bash

【讨论】:

以上是关于运行命令但留在 shell vs exit的主要内容,如果未能解决你的问题,请参考以下文章

Shell中退出状态码exit

在UBUNTU下,编写一个叫quit的命令,当在终端运行quit,则相当于运行exit,关闭当前终端。

shell 中 exit0 exit1 的区别

获取linux帮助命令

Linux下使Shell 命令脱离终端在后台运行

用putty或secureCRT通过SSH到linux后,直接关闭putty(securCRT)与通过输出exit命令退出,两者有何不同?