我经常使用vim,并且经常发现使用!bash
进入命令行非常有用。
然而,我需要输入exit
才能返回vim,有时候我不确定自己是否在子shell中或者是否会关闭我的会话。
我真正想做的是输入类似于!bash -prompt "subshell"
这样的东西,以便我得到像这样的结果:
subshell$ <commands go here>
这是可能的吗?
我经常使用vim,并且经常发现使用!bash
进入命令行非常有用。
然而,我需要输入exit
才能返回vim,有时候我不确定自己是否在子shell中或者是否会关闭我的会话。
我真正想做的是输入类似于!bash -prompt "subshell"
这样的东西,以便我得到像这样的结果:
subshell$ <commands go here>
最直接的方法是在vim中设置PS1
环境变量:
:let $PS1="subshell$ "
使用命令:shell
而不是:!bash
来启动您的子shell。
使用let
和$
符号可以修改环境变量。将此内容添加到您的.vimrc文件中以使设置持久化。
或者,使用:shell
命令,您可以使用shell选项指定更具体的命令和参数,参见help shell
和help 'shell'
。
因此:
:set shell=bash\ --rcfile\ ~/.vimbashrc
PS1="subshell "
,并使用:shell
而不是!bash
来调用子shell。将此添加到您的.vimrc以保留设置。let $PS1="subshell "
,并使用:shell
而不是:!bash
启动子shell。PS1="subshell "
添加到其中,并修改.vimrc中的shell
选项:set shell=bash\ --rcfile\ ~/.vimbashrc
。:!bash
启动子shell,则还有几个选项。请注意,您也可以使用!
传递更具体的命令行,例如:
:PS1="subshell$ " bash
应该可以工作。:!bash\ --rcfile\ ~/.vimbashrc
,并在上述.vimbashrc中设置PS1
使用shell变量$SHLVL
似乎是另一个选项。在$PS1
中添加$SHLVL
:
export PS1="$PS1 $SHLVL"
因此,您的提示看起来像这样:
[tim@RackAblade47 ~]$ 2
$SHLVL
将增加:[tim@RackAblade47 ~]$ 4
是的 - 在运行命令之前,您可以更改shell内部的提示符
PS1="subshell"
查看此指南以获取所有选项 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 中运行。
我已经能够通过检查vim中导出的MYVIMRC
变量并相应地更新PS1
来更改vim子shell进程的提示符。我使用以下内容更新了我的.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上测试通过。
vim
,而是检查它是否是当前 shell 的父级。 case $(ps $PPID) in *vim) PS1="[VIM] $PS1" ;; esac
- tripleee你可以使用CTRL+Z将其发送到后台,然后使用fg
命令将其带回前台。使用jobs
命令可以查看所有已停止的作业。
这样,您就可以并行运行多个vim实例,并选择要恢复哪个实例。如果没有正在运行的实例,则只会收到一个no current job
错误。
这并没有直接回答你的问题,但解决了问题的根本原因。
~/.vimbashrc
的顶部添加了. ~/.bashrc
,以便我仍然可以获得我的正常 bash 设置。 - voltrevolet
设置PS1
,然后使用:shell
启动应该可以解决你的问题,你试过了吗? - pb2qshell
的部分也是原始答案的一部分,并且似乎对 OP 有用。 - pb2q