Woher weiß ich, dass ich mich in einer Shell von vi befehle: sh?

9

In vi kann ich ein Shell-Terminal mit :shBefehl erhalten. Und später kann ich per exitShell zu vi zurückkehren .

Aber wenn ich das Shell-Terminal für eine lange Zeit benutzt habe und vergessen habe, ob exitirgendetwas geschlossen oder mir das vi zurückgegeben wird.

Gibt es eine Möglichkeit zu überprüfen, ob ich zu vi zurückkehren werde? jobsoder fgfunktioniert nicht.

hailinzeng
quelle
3
Ich habe den Befehl: sh vor vielen Jahren aufgrund von Problemen mit der separaten Shell, die Vim startet, und der Unfähigkeit, dorthin zurückzukehren, nicht mehr verwendet. Stattdessen habe ich begonnen, Vim in den Hintergrund zu stellen (Strg-Z), um zur normalen Shell zurückzukehren. Mit der Bash-Jobsteuerungsfunktion können Sie ganz einfach von der normalen Shell zu Vim zurückkehren.
bsnyder

Antworten:

8

In einer regulären Hülle:

$ env | grep -i vim
EDITOR=vim

Nach dem Gebrauch :shell

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

So sieht es aus wie Vim setzt die VIMRUNTIME, VIMund MYVIMRCUmgebungsvariablen. Von diesen VIMscheint mir die zuverlässigste zu sein (Sie haben möglicherweise keine vimrc- oder sogar vim-Laufzeit).

Sie können auch Ihre eigenen Umgebungsvariablen festlegen:

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

Dies ist besonders nützlich, um Informationen über den Puffer zu übermitteln, den Sie bearbeiten. zum Beispiel:

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

Wird sich als etwas zeigen wie:

VIM_FILETYPE=go
VIM_FILENAME=/home/martin/a.go
Martin Tournoij
quelle
3

Ich habe meine Eingabeaufforderung so eingerichtet, dass ein rotes "+" - Symbol hinzugefügt wird, das angibt, ob ich mich in einem vim ": sh" befinde, im Gegensatz zu einer normalen Shell-Sitzung. Der Eckpfeiler davon ist, dass "$$" die PID des aktuellen Prozesses ist, also:

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.

Sobald Sie dies haben, können Sie einfach etwas inline und konstruieren, wie ich es beschrieben habe, um es in Ihrem ".bashrc" oder ähnlichem zu verwenden.

Hinweis : Die an anderer Stelle beschriebene Methode für Umgebungsvariablen ($ VIM) scheint besser zu sein, aber ich lasse dies, da sie funktioniert, um festzustellen, ob Sie ein untergeordneter Prozess von irgendetwas sind (nicht nur von vim).

Dan
quelle
1
Vim fügt drei Variablen in die Umgebung der Shell ein, mit der es gestartet wird :sh: MYVIMRC, VIM und VIMRUNTIME. Alles, was Sie tun müssen, um zu wissen, dass Sie in einer Sub-Shell von Vim ausgeführt werden, ist zu testen, ob diese vorhanden sind.
Garyjohn
2

Ausführen psoder besser ps -fH. Ex:

$ 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

Der Vorteil der Verwendung von ps -fHover just psbesteht darin, dass Sie sehen können, ob Sie sich in einer Sub-Shell von befinden vimoder ob Sie sie vimin den Hintergrund stellen. In diesem Fall ps -fHwürde das so aussehen:

$ 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
Garyjohn
quelle