我怎么知道我在vi命令:sh的shell中?


9

在vi中,我可以使用:sh命令获得一个shell终端。然后,我可以通过exitshell 返回vi 。

但是,如果我长时间使用Shell终端,却忘记了exit关闭任何东西还是将vi返回给我。

有什么方法可以检查我是否返回到vi?jobsfg不起作用。


3
由于Vim启动的单独shell的问题以及无法返回它的原因,我很多年前停止使用:sh命令。取而代之的是,我开始将Vim置于后台(c​​trl-z)以返回到正常的shell。使用bash作业控制功能,可以轻松地从普通shell返回Vim。
bsnyder

Answers:


8

在常规外壳中:

$ env | grep -i vim
EDITOR=vim

使用后 :shell

$ env | grep -i vim
EDITOR=vim
VIMRUNTIME=/usr/share/vim/vim80
VIM=/usr/share/vim
MYVIMRC=/home/martin/.vim/vimrc

所以它看起来像Vim的设置VIMRUNTIMEVIM以及MYVIMRC环境变量。其中,VIM对我来说似乎是最可靠的(您可能没有vimrc甚至vim运行时)。

您还可以设置自己的环境变量:

:let $HELLO = "test"
:shell
$ echo $HELLO
test

这对于传达有关您正在编辑的缓冲区的信息特别有用;例如:

:let $VIM_FILETYPE = &filetype
:let $VIM_FILENAME = expand('%:p')

将显示为:

VIM_FILETYPE=go
VIM_FILENAME=/home/martin/a.go

3

我在命令提示符下设置了一个红色的“ +”符号,该符号表示我是否在vim“:sh”中,而不是正常的shell会话。它的基石是“ $$”是当前进程的pid,因此:

MY_PPID=$(ps --no-header -o ppid -p $$)          # Gets the pid of the parent
                                                 # process.
MY_PCMDLINE=$(ps --no-header -o cmd -p $MY_PPID) # Gets its command line.
MY_CMDDASH=$(awk '{print $1}' <<<$MY_PCMDLINE)   # Gets the command name, possibly
                                                 # with a preceding hyphen.
MY_CMD=${MY_CMDDASH#-}                           # Get the bare command name.

一旦有了这个,就可以轻松地内联和构造类似于我在“ .bashrc”或类似文件中描述的内容。

注意:在别处描述的环境变量($ VIM)方法似乎比这更好,但是我将保留它,因为它可以识别您是否是任何东西的子进程(不仅仅是vim)。


1
Vim将三个变量放入它启动的shell环境中:sh:MYVIMRC,VIM和VIMRUNTIME。要知道您正在Vim的子外壳中运行,您要做的就是测试其中是否存在。
garyjohn

2

执行ps或更好ps -fH。例如:

$ ps -fH
UID        PID  PPID  C STIME TTY          TIME CMD
garyjohn 31140 31139  0 10:26 pts/11   00:00:00 bash
garyjohn 31267 31140  2 10:26 pts/11   00:00:00   vim hello.txt
garyjohn 31271 31267  0 10:26 pts/11   00:00:00     /bin/bash
garyjohn 31332 31271  0 10:26 pts/11   00:00:00       ps -fH

使用ps -fHover just 的好处ps是,它使您可以查看自己是否位于的子外壳中vim或是否置于vim背景中。在这种情况下,ps -fH将如下所示:

$ ps -fH
UID        PID  PPID  C STIME TTY          TIME CMD
garyjohn 31140 31139  0 10:26 pts/11   00:00:00 bash
garyjohn 31267 31140  0 10:26 pts/11   00:00:00   vim hello.txt
garyjohn 31924 31140  0 10:29 pts/11   00:00:00   ps -fH
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.