ВИМ с помощью PowerShell
Я использую 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()
если я выполняю эту функцию (: Test), я вижу бессмысленные символы (не числовые/буквенные символы ASCII).
если я использую cmd в качестве оболочки, он работает (без имени), поэтому проблема, похоже, заключается в получении вывода из powershell в vim.
интересно, что это отлично работает:
:!dir -name
как это:
:r !dir -name
обновление: подтверждение поведения, упомянутого Дэвидом
если вы выполняете команды набора, упомянутые выше в _vimrc,: Test выводит ерунду. Однако, если вы выполняете их непосредственно в vim, а не в _vimrc, :Test работает так, как ожидалось.
кроме того, я пробовал использовать iconv в случае, если это была проблема с кодировкой:
:echo iconv( system("dir -name"), "unicode", &enc )
но это не имеет никакого значения. Я мог бы использовать неправильные типы кодировки хотя.
кто-нибудь знает, как сделать эту работу?
11 ответов:
это немного хак, но следующие работы в 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()
я столкнулся с подобной проблемой, описанной многими здесь.
в частности, называя
: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
Я подозреваю, что проблема в том, что Powershell использует собственную кодировку строк для .NET, которая является UTF-16 плюс Знак порядка байтов.
когда это конвейерные объекты между командами это не проблема. Это полная Пита для внешних программ, хотя.
вы можете передать вывод через out-file, который поддерживает изменение кодировки, но по-прежнему форматирует вывод для терминала, в котором он находится по умолчанию (arrgh!), поэтому такие вещи, как "Get-Process", будут усекаться эллипсы и т. д. Вы можете указать ширину виртуального терминала, который использует Out-File.
Не уверен, насколько полезна эта информация, но она освещает проблему немного больше.
попробуйте заменить
"dir \*vim\*"С
" -command { dir \*vim\* }"EDIT: попробуйте использовать cmd.exe в качестве оболочки и поставить " powershell.exe-файла" До "-команда"
интересный вопрос-здесь есть что-то еще, чтобы добавить к путанице. Без внесения каких-либо изменений .vimrc файл, если я затем запустить следующие команды в gvim:
:set shell=powershell.exe :set shellcmdflag=-noprofile :echo system("dir -name")он ведет себя так, как ожидалось!
Если я внесу те же изменения в мой .однако файл vimrc (параметры shell и shellcmdflag), запущенный :echo system("dir-name") возвращает бессмысленные символы!
исходный пример кода отлично работает для меня, когда я плюхаю его в vimrc.
Так что теперь я пытаюсь выяснить, что в моем vimrc делает его функции. Возможно:
set encoding=utf8Edit: Да, это, кажется, делает это. Вы, вероятно, хотите, чтобы VIM по умолчанию для unicode в любом случае, в эти дни...
ни один из ответов на этой странице не работал для меня, пока я не нашел этот намек от 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
Я предлагаю хакерское решение. На самом деле это не решает проблему, но она как-то справляется с работой.
этой плагин для Vim автоматизируйте создание временного файла сценария, вызов powershell через cmd.exe и вставить результат. Это не так хорошо, как правильная обработка powershell vim, но она работает.
вместо того, чтобы попробовать
set shellcmdflag=\ -c
объяснение:
Vim использует tempname() для создания пути к временному файлу, который читает system ().
Если & shell содержит 'sh' и &shellcmdflag начинается с' -' затем tempname () создает путь к временному файлу с косыми чертами.
таким образом, если
set shell=powershell set shellcmdflag=-cзатем Vim попытается прочитать временный файл с прямыми косыми чертами, которые не может быть найден.вместо этого нужно установить средство
set shellcmdflag=\ -cто есть, добавьте пробел к &shellcmdflag так, что первый символ больше не ' - ' и tempname () создает путь к временному файлу с обратным косые черты, которые можно найти с помощью system ().
Я заметил в списке рассылки vim_dev (https://groups.google.com/forum/#! topic/vim_dev / vTR05EZyfE0 ) что это заслуживает лучшей документации.
actf ответ работает для меня, но из-за Powershell, встроенного в DIFF (который отличается от Linux), вы должны добавить эту строку в свой профиль Powershell, чтобы diff снова работал в VIM:
Remove-Item Alias:diff -force
Я не использую VIM, но выход Powershell по умолчанию-Unicode. Блокнот может читать unicode, вы можете использовать его, чтобы увидеть, если вы получаете результат, который вы ожидаете.
Comments