Подтвердить что ты не робот

Vim с 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 в качестве оболочки, он работает (без имени -name), поэтому проблема заключается в получении вывода из powershell в vim.

Интересно, что это отлично работает:

:!dir -name

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

:r !dir -name

UPDATE: подтверждение поведения, упомянутое David

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

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

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

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

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

4b9b3361

Ответ 1

Это немного взломанный, но в 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()

Ответ 2

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

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

:set shell=powershell

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

set shell=powershell

в мой файл vimrc я бы получил ошибку "Не удалось открыть файл temp..."

Проблема заключается в том, что по умолчанию, когда оболочка изменена, 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

Ответ 3

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

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

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

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

Ответ 4

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

"dir \*vim\*"

с

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

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

Ответ 5

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

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

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

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

Ответ 6

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

Итак, теперь я пытаюсь понять, что в моем vimrc делает его функцией. Возможно:

set encoding=utf8

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

Ответ 7

Ни один из ответов на этой странице не работал на меня, пока я не нашел этот намек от https://github.com/dougireton/mirror_pond/blob/master/vimrc - установить 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 

Ответ 8

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

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

Ответ 9

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


Пояснение:

Vim использует tempname() для создания пути к файлу temp, который читает 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), что это заслуживает лучшей документации.

Ответ 10

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

Remove-Item Alias:diff -force

Ответ 11

Я не использую VIM, но выход Powershell по умолчанию - Unicode. Блокнот может читать unicode, вы можете использовать его, чтобы узнать, получаете ли вы ожидаемый результат.