我经常使用 vim,并且经常发现使用!bash
. 但是,我需要输入exit
才能返回 vim,有时我不确定我是否在子 shell 中,或者这是否会关闭我的会话。
我真正想做的是输入类似这样的东西,!bash -prompt "subshell"
这样我就会得到这样的东西:
subshell$ <commands go here>
这可能吗?
我经常使用 vim,并且经常发现使用!bash
. 但是,我需要输入exit
才能返回 vim,有时我不确定我是否在子 shell 中,或者这是否会关闭我的会话。
我真正想做的是输入类似这样的东西,!bash -prompt "subshell"
这样我就会得到这样的东西:
subshell$ <commands go here>
这可能吗?
最直接的方法是PS1
在 vim 中设置环境变量:
:let $PS1="subshell$ "
并使用命令:shell
而不是:!bash
.
使用$
符号 withlet
修改环境变量。将此添加到您的.vimrc以保留设置。
或者,:shell
您可以使用shell 选项指定更具体的命令,包括参数,请参阅help shell
和help 'shell'
。
所以:
:set shell=bash\ --rcfile\ ~/.vimbashrc
在.vimbashrc添加,并使用而不是PS1="subshell "
调用子外壳。将此添加到您的.vimrc以保留设置。:shell
!bash
所以你有两个选择:
let $PS1="subshell "
到您的.vimrc:shell
中,并使用而不是启动子外壳:!bash
。PS1="subshell "
,并修改.vimrcshell
中的选项:。set shell=bash\ --rcfile\ ~/.vimbashrc
最后,如果您必须使用:!bash
来启动子 shell,还有其他几个选项。请注意,您还可以使用 传递更具体的命令行!
,例如:
:PS1="subshell$ " bash
应该管用。:!bash\ --rcfile\ ~/.vimbashrc
, 并PS1
在.vimbashrc中设置如上但是你每次都需要输入这些,或者为它定义一个映射。
使用 shell 变量$SHLVL
似乎是这里的另一种选择。添加$SHLVL
你的$PS1
:
export PS1="$PS1 $SHLVL"
所以你的提示看起来像这样:
[tim@RackAblade47 ~]$ 2
当你从 VIM 启动 shell 时,$SHLVL
会增加:
[tim@RackAblade47 ~]$ 4
是的 - 您可以在运行命令之前更改 shell 内的提示
PS1="子壳"
查看本指南以了解所有选项http://www.linuxselfhelp.com/howtos/Bash-Prompt/Bash-Prompt-HOWTO-2.html
如果您确实必须通过 bash 命令执行此操作,您可以使用“--rcfile”来指定为您运行 PS1 命令的 RC 文件(您通常将 PS1= 行放在您的 .bashrc 中以自定义登录时的提示)
要回答您最初的问题,您可以在 Vim 内部说:
:!VIMPROMPT="(vim) " bash
并从类似的东西更改您的提示(大概在您的.bashrc中)
PS1='\u@\h:\w\$ '
到
PS1='$VIMPROMPT\u@\h:\w\$ '
这将改变你的提示
me@host:~$
到
(vim) me@host:~$
如果在 Vim 中运行。
我个人使用
case $(ps $PPID) in *vim|*bash)
PS1="$(ps $PPID | awk '{print $NF}' | sed 1d) $PS1" ;;
esac
在我的.bashrc提供的提示脚本中,取自Triplee的评论。
我已经能够通过检查MYVIMRC
在vim中导出的变量来更改vim子shell进程的提示,然后会PS1
相应地更新。我用以下内容更新了我的.bashrc
文件。
PS1='\$ '
# when in vim subshell change PS1 for clarity
if [[ $MYVIMRC ]]; then PS1='>> '; fi;
将其放在您的.bashrc
任何现有PS1=
语句之后。
if ps | grep -q vim; then
export PS1="[VIM]$PS1"
fi
在 Ubuntu 上测试。
您可以使用 CTRL+Z 将其发送到后台,然后使用命令将其带回fg
。与jobs
您一起看到您已停止的所有工作。
这是您可以并行拥有多个 vim 实例并选择要带回的实例。如果没有运行,你只会得到一个no current job
错误,就是这样。
这并没有具体回答您的问题,而是解决了它下面的问题。