5

我经常使用 vim,并且经常发现使用!bash. 但是,我需要输入exit才能返回 vim,有时我不确定我是否在子 shell 中,或者这是否会关闭我的会话。

我真正想做的是输入类似这样的东西,!bash -prompt "subshell"这样我就会得到这样的东西:

subshell$ <commands go here>

这可能吗?

4

8 回答 8

9

最直接的方法是PS1在 vim 中设置环境变量:

:let $PS1="subshell$ "

并使用命令:shell而不是:!bash.

使用$符号 withlet修改环境变量。将此添加到您的.vimrc以保留设置。

或者,:shell可以使用shell 选项指定更具体的命令,包括参数,请参阅help shellhelp 'shell'

所以:

:set shell=bash\ --rcfile\ ~/.vimbashrc

.vimbashrc添加,并使用而不是PS1="subshell "调用子外壳。将此添加到您的.vimrc以保留设置。:shell!bash

所以你有两个选择:

  • 添加let $PS1="subshell "到您的.vimrc:shell中,并使用而不是启动子外壳:!bash
  • 为您的 vim 子外壳制作一个自定义 rc 文件,添加您的特定文件PS1="subshell ",并修改.vimrcshell中的选项:。set shell=bash\ --rcfile\ ~/.vimbashrc

最后,如果您必须使用:!bash来启动子 shell,还有其他几个选项。请注意,您还可以使用 传递更具体的命令行!,例如:

  • :PS1="subshell$ " bash应该管用。
  • :!bash\ --rcfile\ ~/.vimbashrc, 并PS1.vimbashrc中设置如上

但是你每次都需要输入这些或者为它定义一个映射。

于 2012-09-05T01:38:42.180 回答
5

使用 shell 变量$SHLVL似乎是这里的另一种选择。添加$SHLVL你的$PS1

export PS1="$PS1 $SHLVL"

所以你的提示看起来像这样:

[tim@RackAblade47 ~]$ 2

当你从 VIM 启动 shell 时,$SHLVL会增加:

[tim@RackAblade47 ~]$ 4
于 2012-09-05T06:18:24.553 回答
1

是的 - 您可以在运行命令之前更改 shell 内的提示

PS1="子壳"

查看本指南以了解所有选项http://www.linuxselfhelp.com/howtos/Bash-Prompt/Bash-Prompt-HOWTO-2.html

如果您确实必须通过 bash 命令执行此操作,您可以使用“--rcfile”来指定为您运行 PS1 命令的 RC 文件(您通常将 PS1= 行放在您的 .bashrc 中以自定义登录时的提示)

于 2012-09-05T01:35:15.997 回答
1

要回答您最初的问题,您可以在 Vim 内部说:

:!VIMPROMPT="(vim) " bash

并从类似的东西更改您的提示(大概在您的.bashrc中)

PS1='\u@\h:\w\$ '

PS1='$VIMPROMPT\u@\h:\w\$ '

这将改变你的提示

me@host:~$ 

(vim) me@host:~$ 

如果在 Vim 中运行。

于 2012-09-05T02:39:26.510 回答
0

我个人使用

case $(ps $PPID) in *vim|*bash)
  PS1="$(ps $PPID | awk '{print $NF}' | sed 1d) $PS1" ;;
esac

在我的.bashrc提供的提示脚本中,取自Triplee评论

于 2013-04-04T10:47:04.390 回答
0

我已经能够通过检查MYVIMRC在vim中导出的变量来更改vim子shell进程的提示,然后会PS1相应地更新。我用以下内容更新了我的.bashrc文件。

PS1='\$ '
# when in vim subshell change PS1 for clarity
if [[ $MYVIMRC ]]; then PS1='>> '; fi;
于 2019-11-16T09:40:37.380 回答
-1

将其放在您的.bashrc任何现有PS1=语句之后。

if ps | grep -q vim; then
  export PS1="[VIM]$PS1"
fi

在 Ubuntu 上测试。

于 2012-09-05T01:56:03.583 回答
-2

您可以使用 CTRL+Z 将其发送到后台,然后使用命令将其带回fg。与jobs您一起看到您已停止的所有工作。

这是您可以并行拥有多个 vim 实例并选择要带回的实例。如果没有运行,你只会得到一个no current job错误,就是这样。

这并没有具体回答您的问题,而是解决了它下面的问题。

于 2013-02-04T13:04:13.100 回答