19

Vim が起動すると、オペレーティング システムから多くの環境変数 ( などPATH) を取得し、独自の環境変数 ( など) も設定しますMYVIMRC

Vim が理解するすべての環境変数を、Vim 内部からのそれぞれの値とともにリストまたは表示するにはどうすればよいですか?

4

6 に答える 6

22

Vim スクリプトでは、現在定義されている環境変数のリストを直接取得する方法はありません。ただし、Vim のコマンドライン補完機能を利用して作成することは可能です。

次の未完了のコマンドの可能な完了を検討してください。

:echo $

Vim スクリプトの構文によれば、補完は環境変数の名前でなければならないことを理解するのは難しくありません。wildcharキー (Tabデフォルトでは ) または Ctrl+を押すと、Dそれらすべてが表示されます。

スクリプト内からこの補完のリストを取得するには、そのインタラクティブな性質を克服する必要があります。ここで提案する可能性のあるトリックは、機能の組み合わせに依存しています。それらの最初のものは Ctrl+Aコマンドです。コマンドライン モードでは、このショートカットにより、使用可能なすべての補完がカーソルの前に挿入されます。挿入された補完はアルファベット順にリストされ、スペースで区切られます。

Vim がこれらの補完をコマンド ラインに出力できるようにできれば、コマンドでコマンド出力をリダイレクトすることで、それらを簡単にキャプチャできます:redir。しかし、その副作用を達成するために必要なのは、Ctrl+で挿入されたテキストを引用することだけAです: 引用すると、コマンドの残りの部分が:echo文字列リテラルになります。

:echo 'NAME1 NAME2 NAME3'
NAME1 NAME2 NAME3

この方法でコマンド ラインを編集するには、ユーザーは :ec(のエイリアス:echo) を入力してから+を$押し 、 を入力 し、 Ctrl+を押して行頭にジャンプし、 を押してカーソルをドル記号の上に移動します。 A'CtrlB⇾</kbd> (the right arrow key) twice, delete that $, and, finally, insert ' instead. The same sequence of key presses can easily be reproduced non-interactively using the :normal command.

これらすべてのピースをまとめると、次の関数が得られます。

function! Env()
    redir => s
    sil! exe "norm!:ec$\<c-a>'\<c-b>\<right>\<right>\<del>'\<cr>"
    redir END
    return split(s)
endfunction

このアプローチを機能させるには、Vim をこの +cmdline_compl機能でコンパイルする必要があります。

于 2012-06-25T15:53:24.137 に答える
21

すべての環境変数を一覧表示するには、次を使用します

:echo $<C-D>

次に、関心のある変数の名前の入力を開始し、 でオートコンプリートしTab、最後に を押しEnterてその値を表示します。

これがインタラクティブに必要なのか、スクリプトで必要なのかはわかりませんでした。後者の場合、残念ながら を介して出力をキャプチャすることはできません:redir

于 2012-06-24T12:36:18.733 に答える
3

他の回答を見ると、スクリプトなしで実行できます。

挿入モードに入り、 を押します。

<C-R>=

Ctrl+Rを使用すると、使用可能な任意のレジスタを挿入できます (:help i_Ctrl-R を参照) 。しかし特に、=ここでは文字列を評価するために式 register を使用します (:help @= を参照)。

これで、ib. の回答で導入された式を挿入できるようになりました。これを入力してください:

$<C-A>"<HOME>"<CR><ESC>

これで、通常モードに戻り、式が文字列として評価され、バッファに配置されているはずです。代替コマンドでさらにクリーンアップできます。

:s/\s/\r$/g

これにより、すべての環境変数が別の行に配置されます。

于 2013-07-24T02:53:10.733 に答える
2

ib のアイデアと ZyX からのコメントに基づいて、最終的に使用した関数は次のとおりです。

function! GetEnvVars()
    silent execute "normal! :return $\<C-a>')\<C-b>\<C-right>\<Right>\<Del>split('\<CR>"
endfunction
于 2013-09-30T10:08:05.447 に答える