Как я могу запустить! <cmd>из сценария vim, если путь в Windows содержит пробел? - PullRequest
5 голосов
/ 14 ноября 2011

Я пытаюсь использовать формат :!<cmd> в vim для выполнения внешней команды и помещения результатов в буфер.Если я наберу :!, возможно завершение пути, и я смогу завершить путь вплоть до команды, которую хочу выполнить.Это автоматически экранирует пробелы, например, так:

:!c:\Program\ Files\ (x86)\Microsoft\ Visual\ Studio\ 9.0\Common7\IDE\TF.exe

Когда я нажимаю Enter, я получаю:

'c:\Program\' is not recognized as an internal or external command

Что, как я подозреваю, означает, что vim не экранировал пробелы при передаче командыcmd.exe.Я пробовал все виды избегающих комбинаций, чтобы сделать эту работу, но безрезультатно.Единственный способ сделать это - выяснить, что такое имя файла DOS8.3, и использовать его вместо длинного пути.Однако мне не нравится такой подход, поскольку он сделает мой сценарий менее переносимым.Кто-нибудь знает, можно ли это сделать, или это ошибка в vim?

Ответы [ 4 ]

3 голосов
/ 14 ноября 2011

Заключите полный путь к исполняемому файлу в двойные кавычки. Не используйте пробелы в имени пути.

В вашем примере, некоторые из обратных косых черт были добавлены к пробелам, а другие являются частью пути. Вы не указали исходный путь, но я могу догадаться. Если я угадала, команда, которая будет работать:

:!"c:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\TF.exe"

Это одинаково хорошо работает в скрипте. Эквивалентная команда сценария:

silent execute '!"c:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\TF.exe"'

Я протестировал это в Vim 7.3.346 x86, установленном в Windows 7 Pro SP1 x64.

3 голосов
/ 14 ноября 2011

Если вы указали аргументы, а не только путь к exe, то вам, возможно, потребуется сделать несколько цитат, как показано ниже. Основная проблема не в самом exe-пути, а в аргументах. Я нашел эту веб-страницу полезной для подобных проблем самостоятельно: http://blogs.msdn.com/b/twistylittlepassagesallalike/archive/2011/04/23/everyone-quotes-arguments-the-wrong-way.aspx

Не уверен, что нет, и у вас нет времени на проверку, но если у вас есть аргумент в кавычках, то приведенный ниже пример может быть ближе к тому, что вам нужно:

silent! exe 'r!"C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\TF.exe" history /followbranches \^"#\^"' 

Кроме того, мне интересно, могут ли кавычки вокруг пути нуждаться в особой обработке, поскольку они составляют только часть полной команды. В любом случае кавычки \^" работают для основных кавычек в командной строке и ^" для кавычек, встроенных в другие кавычки. В прошлом я находил полезным поэкспериментировать с командой в командной строке Windows, не забывая проверять ее способом, которым ее готовит Vim, с вашей командой, к которой добавляется c:\windows\sys32\cmd.exe.

Подумав еще раз, я думаю, что когда я работал с подобной проблемой, я никогда не доходил до точки решения команды с обоими аргументами в кавычках и кавычками exe-path-with-space в одной команде. Я ожидаю, что есть способ сделать это, но вместо этого я просто создал мягкую ссылку на exe в пути без пробелов. E.g.:

 mklink c:\users\myname\myexe c:\program files(x86)\myapp\myexe.exe

После этого нет необходимости заключать в кавычки саму команду exe, и кавычка аргумента с \^" работала нормально. Мне, конечно, любопытно, как процитировать exe-with-spaces, который также цитирует аргументы.

РЕДАКТИРОВАТЬ: я думаю, что нашел способ обойти свою проблему с цитированием, не имею VS для тестирования с вашей точной командой, но вот что я думаю, может работать из командной строки:

cmd /k ""C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\TF.exe" history /followbranches ^"#^""

Если это работает для вас из командной строки, то, я думаю, единственная проблема заключается в том, чтобы Vim включил ключ / k. (Также может возникнуть проблема с тем, что командная строка Windows «выбросила» переключатель / followbranch из-за косой черты, но, возможно, нет.)

EDIT2: Я думаю, что хитрость для того, чтобы сделать это из Vim, состоит в том, чтобы просто включить 'cmd / k' как часть команды, которую вы выполняете. В итоге вы открываете несколько уровней снарядов, но я не думаю, что это проблема. Например, вот что запускается из Vim с (1) пробелами в пути exe, (2) аргументом в кавычках ((message .. )) и даже (3) кавычкой в ​​аргументе в кавычках (\^"hi\^"). Эта команда открывает экземпляр Emacs и выводит сообщение Emacs "hi":

!cmd /k ""c:\program files (x86)\emacs\emacs\bin\emacs.exe" --eval ^"(message \^"hi\^")^""

И еще одно редактирование: включение вашего собственного 'cmd / k' создает проблемы, я думаю, если вы пытаетесь не просто выполнить внешнюю команду, но прочитать ее результат обратно в буфер Vim. В этом случае вы можете перенаправить вывод в файл в домашнем каталоге пользователя и использовать :read для вставки в буфер. Если есть какой-то способ заставить собственный cmd Vim использовать k switch, тогда это будет ненужным, но если нет, то по крайней мере это обеспечит хороший обходной путь.

0 голосов
/ 28 мая 2015

Вам просто нужно позвонить, добавив в него двойную кавычку. Мне не хватает представления о скрипте Vim. но при запуске в командной строке, если вы укажете полный путь к exe, содержащий пробел, он выдаст ошибку, подобную

C:> c: \ Program Files \ Internet Explorer \ iexplore.exe

«c: \ Program» не распознается как внутренняя или внешняя команда, работающая программа или командный файл.

Но это сработает, если вас окружат двойным кубиком.

C:> "c: \ Program Files \ Internet Explorer \ iexplore.exe"

C:>

0 голосов
/ 14 ноября 2011
       %0 (batch name) %1 (1st parameter) %2 (2nd parameter)  

пример:

C: \ CSW> MyBatchFile.bat "C: \ Program Files" "C: \ CSW \ My File.txt"

Не уверен, работает ли это с vim, но работает ли он с bash в Windows.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...