vim:终端运行命令但保留在shell vs exit中

问题描述 投票:2回答:1

我知道在vim我可以输入

:terminal <command> %

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

:terminal ls %

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

如果我只是输入

:terminal

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

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

我实际上并不关心一个解决方案只是启动:term shell并在bash提示符下使用%filename扩展回显我的命令而不输入它...这将允许我在我用手册执行命令后仍然保持bash回车。

我不确定我想做什么是可能的?请注意,我不打算暂停当前的编辑会话和fg,因为它占用了当前的编辑会话。我不确定tmux-vim集成是否可以提供一种方法来做我想要的,虽然我更愿意找到一个使用直接:term的解决方案,因为它是一个内置的功能,并且运行良好,除了我正在尝试实现:)

我希望这是有道理的。谢谢

shell vim terminal
1个回答
0
投票

正如人们所评论的,没有直接这样做的方法,但你可以使用帮助脚本来获得你想要的大部分内容。

使用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。您将获得一个shell,您可以轻松访问文件名:

$ echo $V
my/really/long/pathname

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


0
投票

此映射适用于扩展'%'并使新终端处于活动状态:

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

您可能需要映射到不同的键,否则这应该有效。

© www.soinside.com 2019 - 2024. All rights reserved.