Я использую 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
Обновлено:, подтверждающее поведение, упомянутое Дэйвид
Если вы выполните указанные выше команды set в _vimrc,: Test выведет ерунду. Однако, если вы выполняете их непосредственно в vim, а не в _vimrc,: Test работает должным образом.
Кроме того, я пробовал использовать iconv на случай, если возникла проблема с кодировкой:
:echo iconv( system("dir -name"), "unicode", &enc )
Но это не имело значения. Однако я мог использовать неправильные типы кодировки.
Кто-нибудь знает, как заставить эту работу?
Может быть проблема с кодировкой? Powershell использует Unicode, если считает, что целью является файл. Попробуйте -кодировать ASCII в качестве переключателя на PowerShell.
Есть идеи, как я могу передать этот переключатель через Vim?
-encoding, похоже, не является допустимым переключателем для PowerShell
Извините, Кевин, переключатель кодировки используется вместе с файлом out, который, я думаю, здесь не применим. Я бы хотел помочь, но, к сожалению, то, что вы пытаетесь сделать, у меня работает;)
Возможно, мне просто придется установить PowerShell, чтобы попытаться понять это.





Попробуйте заменить
"dir \*vim\*"
с
" -command { dir \*vim\* }"
Обновлено: Попробуйте использовать cmd.exe в качестве оболочки и поместите "powershell.exe" перед "-command"
Я не использую VIM, но вывод Powershell по умолчанию - Unicode. Блокнот не может читать Unicode, вы можете использовать его, чтобы увидеть, получаете ли вы ожидаемый результат.
Это снимок в темноте, который на самом деле не решает проблему. Vim отлично работает с Unicode.
Интересный вопрос - здесь есть еще кое-что, чтобы добавить путаницы. Без внесения каких-либо изменений в мой файл .vimrc, если я затем выполню следующие команды в gvim:
:set shell=powershell.exe
:set shellcmdflag=-noprofile
:echo system("dir -name")
Он ведет себя как положено!
Если я внесу те же изменения в свой файл .vimrc (параметры оболочки и shellcmdflag), то при запуске: echo system ("dir -name") вернутся бессмысленные символы!
Предлагаю хакерское решение. На самом деле это не решает проблему, но каким-то образом выполняет свою работу.
Этот Плагин Vim автоматизирует создание временного файла сценария, вызов PowerShell через cmd.exe и вставку результата. Это не так хорошо, как правильная обработка Powershell с помощью vim, но это работает.
Я подозреваю, что проблема в том, что Powershell использует собственную кодировку String для .NET, которая представляет собой UTF-16 плюс отметку порядка байтов.
Когда он передает объекты между командами, это не проблема. Однако это полная PITA для внешних программ.
Вы можете направить вывод через выходной файл, который поддерживает изменение кодировки, но по-прежнему форматирует вывод для терминала, в котором он находится по умолчанию (arrgh!), Поэтому такие вещи, как «Get-Process», будут обрезаться с помощью многоточия и т. д. Вы можете указать ширину виртуального терминала, который использует Out-File.
Не уверен, насколько полезна эта информация, но она немного больше освещает проблему.
Исходный код примера отлично работает для меня, когда я вставляю его в vimrc.
Итак, теперь я пытаюсь понять, что в моем vimrc заставляет его работать. Возможно:
set encoding=utf8
Редактировать: Ага, похоже, это так. В наши дни вы, вероятно, захотите, чтобы VIM по умолчанию использовал Unicode ...
Это немного похоже на взлом, но в 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
Попробуйте вместо этого
set shellcmdflag=\ -c
Объяснение:
Vim использует tempname () для создания пути к временному файлу, который читает system ().
Если & shell содержит 'sh', а & shell cmdflag начинается с '-' затем 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), что это заслуживает лучшей документации.
Ни один из ответов на этой странице не работал у меня, пока я не нашел эту подсказку от 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
Что здесь означает «работа»? Можете ли вы выбрать строки и !sort-object их (заменив строки отсортированными строками)?
Ответ actf работает для меня, но из-за того, что Powershell встроен в DIFF (который отличается от Linux), вы должны добавить эту строку в свой профиль Powershell, чтобы diff снова работал в VIM:
Remove-Item Alias:diff -force
Объединив ответы в этой и связанной ветке, добавьте следующее в свой $profile, предполагая, что вы установили diffutils из шоколадного:
Remove-Item Alias:diff -force
И добавьте к ~/.vimrc следующее:
if (has('win32') || has('gui_win32')) && executable('pwsh')
set shell=pwsh
set shellcmdflag=\ -ExecutionPolicy\ RemoteSigned\ -NoProfile\ -Nologo\ -NonInteractive\ -Command
endif
убедитесь, что shellcmdflag точно такой, как показано
Вся благодарность за эти решения их соответствующим авторам, это просто сводный пост.
Я использую GVim v8.2 (Windows).
У меня работает полный путь к исполняемому файлу:
set shell=C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Я просто подумал, что это будет так круто. Представьте себе мощность / гибкость!