我正在尝试在 Windows 上的 GVIM 中将 Powershell 设置为 shell。
当我这样做时:!ls,我会看到一个vimrun.exe窗口,其中包含我正在运行的命令,该命令似乎什么也没做。它会保持这样,直到我关闭它。
我的.vimrc配置:
set shell=powershell
set shellcmdflag=-command
set shellquote=\"
set shellxquote=
Run Code Online (Sandbox Code Playgroud)
没有什么会干扰它:当我这样做时,:verbose set shell? shellcmdflag? shellquote? shellxquote?我会得到上面设置的值。
当我删除vimrun.exefrom时%PATH%,我得到一个 Powershell 窗口,它是空的(其中没有输出),具有相同的行为。
命令本身很好 - 当我从 cmd 手动执行它时,它按预期工作。
当 Vim shell 设置为 cmd 时,一切都会按预期工作。
有些问题看似相关,但并不相同:
shell=cmd,这不是我的情况)我正在尝试在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 > …Run Code Online (Sandbox Code Playgroud)