首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Powershell的Vim

使用Powershell的Vim
EN

Stack Overflow用户
提问于 2008-09-18 16:50:26
回答 13查看 23.5K关注 0票数 56

我在Windows上使用gvim。

在我的_vimrc中,我添加了:

代码语言:javascript
复制
set shell=powershell.exe
set shellcmdflag=-c
set shellpipe=>
set shellredir=>

function! Test()
  echo system("dir -name")
endfunction

command! -nargs=0 Test :call Test()

如果我执行这个函数(:Test),我看到的是无意义的字符(非数字/字母ASCII字符)。

如果我使用cmd作为外壳程序,它就可以工作(没有-name),所以问题似乎出在将powershell输出到vim中。

有趣的是,这很有效:

代码语言:javascript
复制
:!dir -name

如下所示:

代码语言:javascript
复制
:r !dir -name

更新:确认David提到的行为

如果在_vimrc中执行上面提到的set命令,:Test将输出无意义的输出。但是,如果您直接在vim中执行它们,而不是在_vimrc中执行,:Test就会按预期工作。

此外,我还尝试使用iconv,以防出现编码问题:

代码语言:javascript
复制
:echo iconv( system("dir -name"), "unicode", &enc )

但这并没有什么不同。我可能使用了错误的编码类型。

有人知道怎么做吗?

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2010-08-06 05:39:00

这是一个小技巧,但是下面的代码在Vim 7.2中是有效的。请注意,我在CMD会话中运行Powershell。

代码语言:javascript
复制
if has("win32")
    set shell=cmd.exe
    set shellcmdflag=/c\ powershell.exe\ -NoLogo\ -NoProfile\ -NonInteractive\ -ExecutionPolicy\ RemoteSigned
    set shellpipe=|
    set shellredir=>
endif

function! Test()
  echo system("dir -name")
endfunction

使用以下工具进行测试...

  • :!dir -name
  • :call Test()
票数 25
EN

Stack Overflow用户

发布于 2011-10-20 11:16:19

我在这里遇到了许多人描述的类似问题。

具体地说,调用

代码语言:javascript
复制
:set shell=powershell

在vim中手动操作将导致powershell正常工作,但只要我添加:

代码语言:javascript
复制
set shell=powershell

对于我的vimrc文件,我会收到错误消息"Unable to open temp file.“

问题是,在默认情况下,当shell被修改时,vim会自动将shellxquote设置为“这意味着shell命令将如下所示:

代码语言:javascript
复制
 powershell -c "cmd > tmpfile"

其中,为了让vim读取临时文件,此命令需要如下所示:

代码语言:javascript
复制
 powershell -c "cmd" > tmpfile

在我的vimrc文件中,将shellquote设置为“,并取消设置shellxquote (即,将其设置为空白)似乎可以解决我的所有问题:

代码语言:javascript
复制
set shell=powershell
set shellcmdflag=-c
set shellquote=\"
set shellxquote=

我还尝试了更进一步,并使用system()调用编写了一点vim脚本:system() with powershell in vim

票数 17
EN

Stack Overflow用户

发布于 2010-01-04 21:20:58

我怀疑问题在于Powershell对.NET使用了原生字符串编码,即UTF-16加上一个字节顺序标记。

当它在命令之间传输对象时,这不是问题。不过,对于外部程序来说,这完全是一种PITA。

你可以通过out-file来输出,它确实支持改变编码,但是仍然格式化输出到默认的终端(啊!),所以像"Get-Process“这样的东西会用省略号等截断。你可以指定Out-File使用的虚拟终端的宽度。

我不确定这些信息有多有用,但它确实更好地说明了这个问题。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/94382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档