system()在vim中使用powershell

act*_*ctf 6 vim powershell

我正在尝试在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

任何人都有任何想法,我在这里做错了什么?

act*_*ctf 4

我终于明白了这一点。

对我的函数的以下修改几乎完全符合我的要求:

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 完美配合。