使用命令行选项指定bash提示符是否可行?

5

我经常使用vim,并且经常发现使用!bash进入命令行非常有用。 然而,我需要输入exit才能返回vim,有时候我不确定自己是否在子shell中或者是否会关闭我的会话。

我真正想做的是输入类似于!bash -prompt "subshell"这样的东西,以便我得到像这样的结果:

subshell$ <commands go here>

这是可能的吗?
8个回答

9

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

:let $PS1="subshell$ "

使用命令:shell而不是:!bash来启动您的子shell。

使用let$符号可以修改环境变量。将此内容添加到您的.vimrc文件中以使设置持久化。

或者,使用:shell命令,您可以使用shell选项指定更具体的命令和参数,参见help shellhelp 'shell'

因此:

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

.vimbashrc中添加PS1="subshell ",并使用:shell而不是!bash来调用子shell。将此添加到您的.vimrc以保留设置。
因此,您有两个选择:
  • .vimrc中添加let $PS1="subshell ",并使用:shell而不是:!bash启动子shell。
  • 为您的vim子shell创建自定义rc文件,将特定的PS1="subshell "添加到其中,并修改.vimrc中的shell选项:set shell=bash\ --rcfile\ ~/.vimbashrc
最后,如果必须使用:!bash启动子shell,则还有几个选项。请注意,您也可以使用!传递更具体的命令行,例如:
  • :PS1="subshell$ " bash应该可以工作。
  • :!bash\ --rcfile\ ~/.vimbashrc,并在上述.vimbashrc中设置PS1
但是,您需要每次键入这些内容,或为其定义映射。

很棒,这个运行得非常好。我还在 ~/.vimbashrc 的顶部添加了 . ~/.bashrc ,以便我仍然可以获得我的正常 bash 设置。 - voltrevo
@RobertMaysJr,哪里出了问题?使用let设置PS1,然后使用:shell启动应该可以解决你的问题,你试过了吗? - pb2q
@RobertMaysJr 我并没有在“玩”什么,我只是在评论我的答案。我确实编辑了答案,这是公共编辑历史的一部分,任何人都可以查看。关于使用 shell 的部分也是原始答案的一部分,并且似乎对 OP 有用。 - pb2q
@RobertMaysJr 任何拥有足够声望的人都可以编辑答案,包括我的和你的。如果你发现我的回答有错误,我邀请你自行修正。 - pb2q
6
如果您阅读 StackOverflow 社区规则,就会明确地发现希望获得的投票答案尽可能有用。从其他人那里综合信息对实现这一目标至关重要。请记住,目标不仅是为自己赚取尽可能多的分数,而是创建一个充当共享社区资源的知识库。 - Charles Duffy
显示剩余4条评论

5

使用shell变量$SHLVL似乎是另一个选项。在$PS1中添加$SHLVL

export PS1="$PS1 $SHLVL"

因此,您的提示看起来像这样:

[tim@RackAblade47 ~]$ 2

当您从VIM启动shell时,$SHLVL将增加:
[tim@RackAblade47 ~]$ 4

1

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

PS1="subshell"

查看此指南以获取所有选项 http://www.linuxselfhelp.com/howtos/Bash-Prompt/Bash-Prompt-HOWTO-2.html

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


1

回答您的原始问题,您可以在Vim内说:

:!VIMPROMPT="(vim) " bash

并将您的提示符更改(在您的.bashrc中,应该是这样)从类似以下内容:

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

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

这会改变您的提示符

me@host:~$ 

(vim) me@host:~$ 

如果在 Vim 中运行。


0

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

PS1='\$ '
# when in vim subshell change PS1 for clarity
if [[ $MYVIMRC ]]; then PS1='>> '; fi;

0

我个人正在使用

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

在我的提示脚本中,它是由我的.bashrc引用的,取自triplee评论

-1
将以下代码放入您的.bashrc文件中,放在任何现有的PS1=语句之后。
if ps | grep -q vim; then
  export PS1="[VIM]$PS1"
fi

在Ubuntu上测试通过。


2
这并不是非常健壮,但我原本打算提出类似的建议。不只是搜索 vim,而是检查它是否是当前 shell 的父级。 case $(ps $PPID) in *vim) PS1="[VIM] $PS1" ;; esac - tripleee

-2

你可以使用CTRL+Z将其发送到后台,然后使用fg命令将其带回前台。使用jobs命令可以查看所有已停止的作业。

这样,您就可以并行运行多个vim实例,并选择要恢复哪个实例。如果没有正在运行的实例,则只会收到一个no current job错误。

这并没有直接回答你的问题,但解决了问题的根本原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接