ВИМ с помощью 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 )


но это не имеет никакого значения. Я мог бы использовать неправильные типы кодировки хотя.



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

806   11  

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=utf8

Edit: Да, это, кажется, делает это. Вы, вероятно, хотите, чтобы 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

    Ничего не найдено.