最近我整天都在使用 vim 练习代码。很多时候,当我想从提示符下执行某些操作时,我会使用 :!bash 的键绑定并执行我需要执行的操作,然后键入 exit 返回我正在处理的 vim 脚本。
有时我会忘记自己是在 shell 中,需要四处寻找才能找到我的脚本。有没有办法设置它,以便我的提示符显示“vim $:”或类似内容?
我想我可以尝试创建一个.bashrc_for_vim
并运行source .bashrc_for_vim
或类似的东西,但这看起来很笨重。
这里有人找到一种优雅的方法来做到这一点吗?
答案1
Vim在 shell 中从或中设置VIMRUNTIME
(和) 环境变量,因此您可以在 中通过这种方式检测它:VIM
:sh
:!bash
.bashrc
if [ "$VIMRUNTIME" ]
then
PS1="vim: $PS1"
fi
上述命令将在您现有的提示符前加上“vim: ”。您可以根据vim $:
需要将其更改为其他内容,例如,只需 。将其放在文件末尾,这样您的正常提示符就已设置好,因此您可以使用它或替换它。
你不能做同样的事情,Ctrl-Z因为那真的做返回到您的原始 shell - 这不是一个新会话,而是您vim
最初启动的会话,因此它具有与您开始时相同的环境和设置。
答案2
我利用了$SHLVL
环境变量,如下man bash
所述
SHLVL Incremented by one each time an instance of bash is started.
在我的~/.bashrc
:
# set a variable to reflect SHLVL > 1
if [[ $SHLVL -gt 1 ]] ; then
export SUBSHELL="${SUBSHELL:+$SUBSHELL}+"
else
export SUBSHELL=""
fi
我稍后会使用它来设置PS1
每个级别添加一个“+”。
if [[ "$color_prompt" = yes ]]; then
# chroot? Depth green user@host nocolor : green $PWD ref (status) off $ or # space
PS1='${debian_chroot:+($debian_chroot)}${SUBSHELL}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[1;31m\]($?)\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}${SUBSHELL}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt
在使用中,它看起来像:
walt@bat:~(0)$ uptime
22:57:48 up 2 days, 9:51, 2 users, load average: 2.23, 0.75, 0.41
# start a subshell, see the first "+" appear
walt@bat:~(0)$ bash
# start a 2nd subshell, see the second "+" appear
+walt@bat:~(0)$ bash
# Start vim, then do :!bash
++walt@bat:~(0)$ vim foo
# here, underneath vim, look at the process tree leading to here
+++walt@bat:~(0)$ ps -fp$$
UID PID PPID C STIME TTY TIME CMD
walt 6803 6802 0 23:10 pts/21 00:00:00 bash
+++walt@bat:~(0)$ ps -fp$$,6802
UID PID PPID C STIME TTY TIME CMD
walt 6802 6732 0 23:10 pts/21 00:00:00 vim foo
walt 6803 6802 0 23:10 pts/21 00:00:00 bash
+++walt@bat:~(0)$ ps -fp$$,6802,6732
UID PID PPID C STIME TTY TIME CMD
walt 6732 6662 0 23:10 pts/21 00:00:00 bash
walt 6802 6732 0 23:10 pts/21 00:00:00 vim foo
walt 6803 6802 0 23:10 pts/21 00:00:00 bash
+++walt@bat:~(0)$ ps -fp$$,6802,6732,6662
UID PID PPID C STIME TTY TIME CMD
walt 6662 5932 0 23:10 pts/21 00:00:00 bash
walt 6732 6662 0 23:10 pts/21 00:00:00 bash
walt 6802 6732 0 23:10 pts/21 00:00:00 vim foo
walt 6803 6802 0 23:10 pts/21 00:00:00 bash
+++walt@bat:~(0)$ ps -fp$$,6802,6732,6662,5932
UID PID PPID C STIME TTY TIME CMD
walt 5932 5795 0 Jan29 pts/21 00:00:00 bash
walt 6662 5932 0 23:10 pts/21 00:00:00 bash
walt 6732 6662 0 23:10 pts/21 00:00:00 bash
walt 6802 6732 0 23:10 pts/21 00:00:00 vim foo
walt 6803 6802 0 23:10 pts/21 00:00:00 bash
+++walt@bat:~(0)$ ps -fp$$,6802,6732,6662,5932,5795
UID PID PPID C STIME TTY TIME CMD
walt 5795 5070 0 Jan29 ? 00:00:37 /usr/lib/gnome-terminal/gnome-terminal-server
walt 5932 5795 0 Jan29 pts/21 00:00:00 bash
walt 6662 5932 0 23:10 pts/21 00:00:00 bash
walt 6732 6662 0 23:10 pts/21 00:00:00 bash
walt 6802 6732 0 23:10 pts/21 00:00:00 vim foo
walt 6803 6802 0 23:10 pts/21 00:00:00 bash
# now unwind, returning to vim
+++walt@bat:~(0)$ exit
# back in vim, :q!
Press ENTER or type command to continue
# unwind
++walt@bat:~(0)$ exit
# unwind
+walt@bat:~(0)$ exit
# back at the top level
walt@bat:~(0)$ : and I'm out