我正在尝试在Vim中编写一个简单的函数来返回powershell命令的结果.不过,我在结果中不断受到喋喋不休.
我认为这可能是一个编码问题,但你会发现问题很奇怪,因为它"有点工作".但是我没有解决问题的方法.
使用vim中设置的以下非默认shell选项:
set shell=powershell
set shellcmdflag=-c
Run Code Online (Sandbox Code Playgroud)
鉴于以下功能:
function! Test()
let result = system("ls")
call setline(1, result)
endfunction
Run Code Online (Sandbox Code Playgroud)
当我运行时(来自C:\ Windows):
:call Test()
Run Code Online (Sandbox Code Playgroud)
以下内容写入我的缓冲区:
^@^@ Directory: C:\Windows^@^@^@ Mode LastWriteTime Length Name ^@-------
....continues
Run Code Online (Sandbox Code Playgroud)
但是当我运行以下命令时:
:r!ls
Run Code Online (Sandbox Code Playgroud)
我得到了我期望的结果(即ls的powershell结果)更有趣的是当我运行命令时:
:echo system("ls")
Run Code Online (Sandbox Code Playgroud)
结果看起来很正确
我尝试修改我原来的功能如下:
function! Test()
let result = system("ls")
echo result
call setline(1, result)
endfunction
Run Code Online (Sandbox Code Playgroud)
回声的价值正是我所期待的 - 但我仍然看到了胡言乱语
我也尝试过以下修改我的功能:
function! Test()
let result = system("ls")
let conv = iconv(result, "utf-8", &enc)
call setline(1, conv)
endfunction
Run Code Online (Sandbox Code Playgroud)
但结果完全相同(即它们包括^ @ ^ @符号和其他乱码)
我猜测正在发生的是使用>生成utf-16输出重定向的powershell cmds,而vim无法处理这个问题.我从powershell得到以下内容(本例中的文件是gnu32程序):
PS> ls > test
PS> file test
test; Little-endian UTF-16 Unicode text, with CRLF, CR line terminator
Run Code Online (Sandbox Code Playgroud)
我也试过玩$ OutputEncoding,没有任何成功,如下所述:http: //blogs.msdn.com/b/powershell/archive/2006/12/11/outputencoding-to-the-rescue.aspx
任何人都有任何想法,我在这里做错了什么?
我终于明白了这一点。
对我的函数的以下修改几乎完全符合我的要求:
function! Test()
let @r = system("ls")
put! r
endfunction
Run Code Online (Sandbox Code Playgroud)
我认为Artomegus是正确的,问题实际上是回车符,而不是编码问题。
附带说明一下,当我的 .vimrc 文件中只有以下内容时,我遇到了问题:
set shell=powershell
set shellcmdflag=-c
Run Code Online (Sandbox Code Playgroud)
仅使用这些设置,当我运行 :call Test() 时,我会收到有关 Vim 无法读取临时文件的错误。
解决此问题的方法是将以下内容添加到您的 .vimrc 文件中:
set shell=powershell
set shellcmdflag=-c
set shellquote=\"
set shellxquote=
Run Code Online (Sandbox Code Playgroud)
您必须将 shellquote 设置为 \",将 shellxquote 设置为空格(即空),因为默认情况下,在 Windows 上,shellxquote 设置为 \",这会覆盖 shellquote 的值。当使用在后台运行 vimrun.exe 程序的系统函数时,这是有问题的。
希望这对其他人有帮助。我已经被这个问题困扰了很长时间,但现在 powershell 与 Vim 完美配合。