Vim с Powershell - PullRequest
       47

Vim с Powershell

54 голосов
/ 18 сентября 2008

Я использую gvim в Windows.

В моем _vimrc я добавил:

set shell=powershell.exe
set shellcmdflag=-c
set shellpipe=>
set shellredir=>

function! Test()
  echo system("dir -name")
endfunction

command! -nargs=0 Test :call Test()

Если я выполняю эту функцию (: Тест), я вижу бессмысленные символы (не цифры / буквы ASCII).

Если я использую cmd в качестве оболочки, она работает (без -name), поэтому, похоже, проблема заключается в получении вывода из powershell в vim.

Интересно, это прекрасно работает:

:!dir -name

Как это сделать:

:r !dir -name

ОБНОВЛЕНИЕ: подтверждение поведения, упомянутого Дэвидом

Если вы выполняете команды набора, упомянутые выше в _vimrc,: Проверка выводов ерунда. Однако, если вы выполняете их непосредственно в vim, а не в _vimrc,: Test работает должным образом.

Также я попытался использовать iconv на случай, если возникла проблема с кодировкой:

:echo iconv( system("dir -name"), "unicode", &enc )

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

Кто-нибудь знает, как заставить это работать?

Ответы [ 11 ]

24 голосов
/ 06 августа 2010

Это что-то вроде хака, но в Vim 7.2 работает следующее. Обратите внимание, я запускаю Powershell в рамках сеанса CMD.

if has("win32")
    set shell=cmd.exe
    set shellcmdflag=/c\ powershell.exe\ -NoLogo\ -NoProfile\ -NonInteractive\ -ExecutionPolicy\ RemoteSigned
    set shellpipe=|
    set shellredir=>
endif

function! Test()
  echo system("dir -name")
endfunction

Протестировано со следующим ...

  • :!dir -name
  • :call Test()
15 голосов
/ 20 октября 2011

Я столкнулся с подобной проблемой, описанной здесь многими.

В частности, звонит

:set shell=powershell

вручную изнутри vim приведет к нормальной работе powershell, но как только я добавлю:

set shell=powershell

в мой файл vimrc я получаю сообщение об ошибке «Невозможно открыть временный файл ....»

Проблема в том, что по умолчанию при изменении оболочки vim автоматически устанавливает shellxquote в значение ", что означает, что команды оболочки будут выглядеть следующим образом:

 powershell -c "cmd > tmpfile"

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

 powershell -c "cmd" > tmpfile

Установка shellquote на "в моем файле vimrc и удаление shellxquote (то есть установка пустого места), похоже, решают все мои проблемы:

set shell=powershell
set shellcmdflag=-c
set shellquote=\"
set shellxquote=

Я также попытался продвинуться дальше и немного написать сценарий vim с помощью вызова system (): system () с powershell в vim

5 голосов
/ 04 января 2010

Я подозреваю, что проблема в том, что Powershell использует собственную кодировку String для .NET, которая является UTF-16 плюс знак порядка байтов.

Когда объекты передаются между командами, это не проблема. Это полная PITA для внешних программ.

Вы можете передать вывод через out-файл, который поддерживает изменение кодировки, но по-прежнему форматирует вывод для терминала, в котором он находится по умолчанию (arrgh!), Поэтому такие вещи, как «Get-Process», будут усекаться с эллипсами и т. д. Вы можете указать ширину виртуального терминала, который использует Out-File.

Не уверен, насколько полезна эта информация, но она освещает проблему немного больше.

3 голосов
/ 18 сентября 2008

Попробуйте заменить

"dir \*vim\*"

с

 " -command { dir \*vim\* }"

РЕДАКТИРОВАТЬ: Попробуйте использовать cmd.exe в качестве оболочки и поставить «powershell.exe» перед «-командой»

2 голосов
/ 17 ноября 2015

Ни один из ответов на этой странице не работал для меня, пока я не нашел эту подсказку из https://github.com/dougireton/mirror_pond/blob/master/vimrc - set shellxquote = [пробел] был пропущенным фрагментом.

if has("win32") || has("gui_win32") 
     if executable("PowerShell") 
        " Set PowerShell as the shell for running external ! commands 
        " http://stackoverflow.com/questions/7605917/system-with-powershell-in-vim      
        set shell=PowerShell 
        set shellcmdflag=-ExecutionPolicy\ RemoteSigned\ -Command 
        set shellquote=\" 
        " shellxquote must be a literal space character. 
        set shellxquote=  
   endif 
endif 
2 голосов
/ 29 марта 2010

Исходный пример кода отлично работает, когда я запускаю его в vimrc.

Так что теперь я пытаюсь выяснить, что в моем vimrc заставляет его работать. Возможно:

set encoding=utf8

Редактировать : Да, это похоже на это. Вы, вероятно, хотите, чтобы VIM по умолчанию в любом случае использовал Unicode ...

2 голосов
/ 19 сентября 2008

Интересный вопрос - вот что еще нужно добавить к путанице. Без внесения каких-либо изменений в мой файл .vimrc, если я затем выполню следующие команды в gvim:

:set shell=powershell.exe
:set shellcmdflag=-noprofile
:echo system("dir -name")

Он ведет себя как ожидалось!

Если я внесу те же изменения в свой файл .vimrc, хотя (параметры shell и shellcmdflag), запустив: echo system ("dir -name") вернет бессмысленные символы!

0 голосов
/ 01 февраля 2017

actf ответ работает для меня, но из-за Powershell, встроенного в DIFF (который отличается от Linux), вы должны добавить эту строку в свой профиль Powershell, чтобы diff снова работал в VIM:

Remove-Item Alias:diff -force
0 голосов
/ 16 декабря 2014

Попробуйте вместо set shellcmdflag=\ -c


Пояснение:

Vim использует tempname () для генерации пути к временному файлу, который читает system ().

Если & shell содержит 'sh' и & shellcmdflag начинается с '-' затем tempname () генерирует путь к временному файлу с косой чертой.

Таким образом, если set shell=powershell set shellcmdflag=-c тогда Vim попытается прочитать временный файл с косой чертой, не может быть найден.

Средство защиты должно быть установлено вместо set shellcmdflag=\ -c добавьте пробел в & shellcmdflag, чтобы первый символ больше не '-' и tempname () создает путь к временному файлу с обратным косые черты, которые могут быть найдены системой ().


Я заметил в списке рассылки vim_dev (https://groups.google.com/forum/#!topic/vim_dev/vTR05EZyfE0), что это заслуживает лучшей документации.

0 голосов
/ 04 ноября 2009

Я предлагаю хакерское решение. Это на самом деле не решает проблему, но как-то справляется с работой.

Этот плагин Vim автоматизирует создание временного файла сценария, вызов powershell через cmd.exe и вставку результата. Это не так хорошо, как правильная обработка PowerShell с помощью vim, но это работает.

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