現在の(Bash)シェルが(Vi / Vim)サブシェルであることを検出する方法は?


3

Vi / Vimの内部から、次のように入力できます。

:shell

シェルにドロップします。

Viで生成されたサブシェルにいることを検出する方法はありますか?

環境変数SHLVLは2ですが、これは、Vi / Vimで生成されたサブシェルにいることを明確に教えてくれません。

OS Xには、以下の変数も設定されています:MYVIMRCVIMRUNTIMEVIM

これらはどのくらい普遍的ですか?Vi / Vimサブシェルを使用している場合にのみ、これらが任意のシステムに設定されていることを期待できますか?

そうでない場合、Vi / Vimサブシェルにいることを伝える、移植性があり、堅牢で、うまくいけば効率的な方法はありますか?

ありがとう。

回答:


2

これらの変数は、Vim 7.2を使用するUbuntu 9.10およびVistaを使用するVim 7.2を使用するCygwin 1.7で見られます。

これがドキュメントです。

ファイルMYVIMRCがない場合は存在しないことに注意してください.vimrc


Debian Lenny、vim 7.1でも同じです。私が手SHLVLに2 画面だけでなく(SHLVLよう際に、それらの画面ウィンドウの1つでのvim-生み出しサブシェルで3)SHLVL自体はおそらく良いテストではありません。おそらくSHLVL> 1およびVIM、VIMRUNTIME、MYVIMRCの
クワックキホーテ

1
あなたは時々それらの一つはの外に設定されていることを発見した場合はVIM(彼らはのための設定変数なのでVIM)、あなたは使用することができlet $UNDER_VIM='Yes, probably.'、あなたの.vimrcに、チェックtest -n "${UNDER_VIM:-}"あなたのシェルで。お使いのシェルがある場合やPPID、使用してPSをそれのためのコマンドを検索し、それがどのように見えるかどうかを確認するためのvim(vimの、VI、rvim、evim、ビュー、rview、などすることができます)。
クリスジョンセン

@クリス:それを除いてrvimrviewあなたをさせません:shell
デニスウィリアムソン

情報をありがとう。クリス・ジョンセン-あなたの「$ UNDER_VIM = 'はい、たぶん」と思うアイデアは完璧に機能します。...ありがとう!
ジート

@Chris:ところで、なぜテストでデフォルトのnullを使用しているのですか?あなたとの違いはありませんtest -n "${UNDER_VIM}
デニスウィリアムソン

1

OSXについてはあまりよく知りませんが、/ procファイルシステムがある場合は、おそらく次のように親プロセスの名前を確認できます。

parent=$(</proc/$PPID/exename)
if expr match $parent $(which vim) > /dev/null
then
    ...
fi

/ procファイルシステムはありません、怖いです。概念は次のように実装できますが、 if [ $(ps -o command -p $(ps -o ppid -o command -p $$ | tail -1 | awk '{print $1}') | tail -1) == vi then ... fi かなり厄介です!
ジート

これで十分ではないでしょうか?:ps -oコマンド-p $ PPID
njd

njd:確かにそうです。$PPIDエクスポートされたことに気づきませんでした。ありがとう!
ジート
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.