Как перечислить все переменные среды в Vim?

, когда Vim запускается, он захватывает многие из переменные среды из операционной системы (например,PATH), а также устанавливает переменные окружения (например,MYVIMRC).

Как список или просмотреть все переменные среды, которые Vim понимает, и их соответствующие значения изнутри Vim?

4 ответов


в скрипте 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 типа ', перейти к началу команды с Ctrl+B переместите курсор на знак доллара, нажав (клавиша со стрелкой вправо) дважды удалите это $ и вставить . Такая же последовательность нажатий клавиш может быть воспроизведена неинтерактивное использование .

собираем все эти кусочки головоломки вместе, мы получаем следующую функцию.

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 особенность.


чтобы перечислить все переменные среды, используйте

:echo $<C-D>

затем, вы можете начать вводить имя переменной, автозаполнение с Tab, нажмите Enter чтобы показать свою ценность.

вы не сказали, Нужно ли вам это интерактивно или в скрипте. Для последнего, к сожалению, невозможно захватить выход через :redir.


глядя на другие ответы, вы можете сделать это без сценария.

вставить, а затем нажмите клавишу

<C-R>=

здесь Ctrl+R позволяет вставить любой из доступных регистров (см. :help i_Ctrl-R). Но особенно вы будете использовать выражение register = здесь, чтобы оценить строку (см. :help @=).

Итак, теперь вы можете вставить выражение, введенное ib.ответ. Введите это:

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

Теперь вы должны вернуться в нормальный режим, и выражение должно быть оценено в строку и помещено в буфер. Вы можете дополнительно очистить его с помощью команды замены:

:s/\s/\r$/g

Это должно поместить каждую переменную среды в другую строку.


основываясь на идее ib и комментариях от ZyX, вот функция, которую я использовал:

function! GetEnvVars()
    silent execute "normal! :return $\<C-a>')\<C-b>\<C-right>\<Right>\<Del>split('\<CR>"
endfunction