Я пытаюсь написать простую функцию в 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
Но результаты точно такие же (т.е. они включают символы ^ @ ^ @ и прочую тарабарщину)
Я предполагаю, что происходит то, что командлеты powershell, которые перенаправляются с использованием>, производят вывод 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
У кого-нибудь есть идеи, что я здесь делаю не так?