powershell - system() 在 vi​​m 中使用 powershell

标签 powershell vim

我正在尝试在 Vim 中编写一个简单的函数来返回 powershell 命令的结果。不过,我一直在结果中胡言乱语。

我认为这可能是一个编码问题,但正如您将看到的,这个问题很奇怪,因为它“有点工作”。虽然我没有任何解决问题的方法。

在 vim 中设置以下非默认 shell 选项:

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

我得到了我所期望的(即 ls 的 powershell 结果)
更有趣的是当我运行命令时:
: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 cmds 产生 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

任何人都知道我在这里做错了什么?

最佳答案

我终于想通了这一点。

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

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

我认为 Artomegus 是正确的,问题确实是回车,而不是编码问题。

作为旁注,当我的 .vimrc 文件中只有以下内容时,我遇到了问题:
set shell=powershell
set shellcmdflag=-c

当我运行 :call Test() 时仅使用这些设置,我会收到有关 Vim 无法读取临时文件的错误。

解决此问题的方法是将以下内容添加到您的 .vimrc 文件中:
set shell=powershell
set shellcmdflag=-c
set shellquote=\"
set shellxquote= 

您必须将 shellquote 设置为\"并将 shellxquote 设置为一个空格(即空),因为默认情况下,在 Windows 上,shellxquote 设置为\",这会覆盖 shellquote 的值。这在使用系统函数时会出现问题,该函数在幕后运行 vimrun.exe 程序。

希望这对其他人有帮助。我已经坚持了很长时间,但现在 powershell 与 Vim 完美配合。

关于powershell - system() 在 vi​​m 中使用 powershell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7605917/

相关文章:

sql - 找不到与参数名称 'ConnectionString' 匹配的参数

google-chrome - 通过Powershell启动过程在新标签页而不是新窗口中打开Chrome

vim - .vimrc textwidth 不适用

windows - lein repl 使我的 Clojure 源文件在 Windows 上的 Vim 中只读

powershell - Azure DSC - 执行 PS 脚本

arrays - 适用于PowerShell的更好的 “Split-ArrayInChunks”

powershell - 确定PSCustomObject的数组是否包含具有属性值的实例

vim - 如何让 Vim 在通过命令行/shell 打开文件时忽略文件扩展名?

在 Vim 中使用快速修复列表进行搜索和替换

vim - 在vim中从grep中选择结果文件