Как использовать переменные среды Windows в скрипте Vim? - PullRequest
8 голосов
/ 19 февраля 2012

У меня есть скрипт Vim, который вызывает скрипт внешней оболочки и считывает вывод в текущий буфер.Он отлично работает в системах Unix.Я пытаюсь сделать скрипт независимым от ОС, поэтому хочу, чтобы он работал и для пользователей Windows.Вот соответствующая строка из скрипта:

:exe ":0r !$HOME/bin/shell_script"

Согласно документам Vim, $HOME должно хорошо переводиться и для пользователей Windows.При использовании gvim на Win XP в командном режиме выполнение

:echo $HOME

действительно приводит к появлению «C: \ Documents and Settings \ my_user».

Однако мой сценарий Vim (с учетом обратной косой черты) завершается неудачнона компьютере Windows с сообщением в окне DOS cmd.exe о том, что

$ HOME \ bin \ shell_script "не найдено.

Другими словами, Vim отображается нечтобы расширить значение $HOME перед передачей его в cmd.exe.

Я также не могу использовать %APPDATA%, потому что Vim интерпретирует % как текущий файл и предварительно / добавляет имя файла кAPPDATA. Странно, что Vim расширяет , расширяет %, но не расширяет $HOME.

Как мне правильно развернуть $HOME? Это потому, что я используюexe в скрипте vim?

Ответы [ 4 ]

6 голосов
/ 19 февраля 2012

Вам не нужно !, чтобы прочитать файл.

:exe ":0r $HOME/bin/shell_script"

Или прочитать команду type в Windows (например, cat в Linux):

:exe '0r !type "'. $HOME . '\bin\shell_script"'

Примечание:

  • type выполняется в оболочке Windows, поэтому вам необходимо \ (обратная косая черта) в пути
  • , если $HOME содержитspace s, вам нужно " (двойная кавычка), чтобы сохранить буквальное значение space s
4 голосов
/ 13 апреля 2012

Чтобы уточнить ответ, данный kev:

В Windows переменная $ HOME не раскрывается должным образом при выходе из консоли. Например, рассмотрим этот код:

:e $HOME/myscript

Это работает, потому что vim расширяет $ HOME как обычно. С другой стороны, это не сработает:

:%! $HOME/myscript

Почему? Потому что vim передает все после ! в базовую оболочку, которая в Windows cmd.exe, которая делает переменные окружения %LIKE_THIS%. Если вы попытаетесь использовать эту нотацию, vim перейдет и расширит % до имени текущего файла - перейдите к рисунку.

Как обойти это? Используйте ключевое слово exe:

:exe "%! ".$HOME."\myscript"

Давайте проанализируем:

  • :exe - это команда, которая берет строку и оценивает ее (думаю, eval на большинстве языков)
  • "!% " команда перехода в оболочку. Обратите внимание, что он указан так, чтобы exe мог его оценить. Также обратите внимание на то, что там есть дополнительное пространство, чтобы при добавлении home var он не исправлялся
  • .$HOME точка является символом объединения строк. $HOME находится вне кавычек, но сцеплен, чтобы vim мог правильно его расширить
  • ."/myscript" путь к сценарию и возможные аргументы (также в кавычках)

    Здесь важно хранить $HOME вне кавычек, в противном случае он может быть неправильно расширен в Windows.

1 голос
/ 15 января 2014

Возможно, вам нужно что-то вроде функции expand.Например:

:echo expand("$HOME/hello")
/home/amir/hello

Вы можете узнать больше информации о expand () с помощью :help expand.

1 голос
/ 19 февраля 2012

Здесь у вас есть некоторая информация о слэше и обратном слэше в vim:

http://vimdoc.sourceforge.net/htmldoc/os_dos.html

Если вы предпочитаете использовать прямую косую черту, установите опцию «раковины». Затем Vim при расширении заменяет обратную косую черту на прямую. имена файлов. Это особенно полезно при использовании Unix-подобной «оболочки».

...