система () с PowerShell в VIM - PullRequest
       5

система () с PowerShell в VIM

5 голосов
/ 30 сентября 2011

Я пытаюсь написать в Vim простую функцию, которая возвращает результаты команды powershell.Я продолжаю получать бред в результатах все же.

Я думаю, что это может быть проблема с кодировкой, но, как вы увидите, проблема странная, поскольку она "работает".Однако у меня нет решения этой проблемы.

Со следующими параметрами оболочки по умолчанию, не установленными в vim:

set shell=powershell
set shellcmdflag=-c

Учитывая следующую функцию:

function! Test()
   let result = system("ls")
   call setline(1, result)
endfunction

Когда я запускаю (из C: \ Windows):

:call Test()

В мой буфер записывается следующее:

^@^@    Directory: C:\Windows^@^@^@    Mode            LastWriteTime   Length Name ^@-------
 ....continues

Однако, когда я запускаю следующую команду:

:r!ls

Я получаю именно то, что ожидал (т. Е. Результаты PowerShell от ls) Еще интереснее, когда я запускаю команду:

:echo system("ls")

Результаты выглядят правильно

Я попытался изменить свою исходную функцию следующим образом:

function! Test()
   let result = system("ls")
   echo result
   call setline(1, result)
endfunction

, и значение, отраженное эхом, точно соответствует ожиданиям - но я все еще вижу бред

У меня естьтакже попробовал следующую модификацию моей функции:

function! Test()
   let result = system("ls")
   let conv = iconv(result, "utf-8", &enc)
   call setline(1, conv)
endfunction

Но результаты точно такие же (т. е. они включают символы ^ @ ^ @ и другие тарабарщины)

Я думаю, чтопроисходит то, что PowerShild команд, которые перенаправляются с помощью> производить вывод utf-16, и vimне может справиться с этим.Я получаю следующее от powershell (в данном случае это программа gnu32):

PS> ls > test
PS> file test
test; Little-endian UTF-16 Unicode text, with CRLF, CR line terminator

Я также попытался поиграть с $ OutputEncoding, но безуспешно, как описано здесь: http://blogs.msdn.com/b/powershell/archive/2006/12/11/outputencoding-to-the-rescue.aspx

У кого-нибудь есть идеи, что я здесь не так делаю?

Ответы [ 2 ]

2 голосов
/ 20 октября 2011

Я наконец-то понял это.

Следующая модификация моей функции делает в точности то, что я хочу:

function! Test()
  let @r = system("ls")
  put! r
endfunction

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

В качестве примечания я столкнулся с проблемами, когда в моем файле .vimrc было only следующее:

set shell=powershell
set shellcmdflag=-c

Только с этими настройками при запуске:Вызовите Test (). Я получаю сообщение об ошибке, из-за которой Vim не может прочитать временный файл.

Исправление этой проблемы - добавить следующее в ваш файл .vimrc:

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

Вы должны установить значение shellquote равным \ ", а значение shellxquote - пустым пространством (т. Е. Пустым), потому что по умолчанию для shellxquote в windows установлено значение \", которое переопределяет значение shellquote.Это проблематично при использовании системной функции, которая запускает программу vimrun.exe за кулисами.

Надеюсь, это поможет кому-то еще.Я застрял в этом надолго, но теперь PowerShell отлично работает для меня с Vim.

1 голос
/ 16 декабря 2014

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

Пояснение:

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

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

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

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

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