Vim/Gvim 无法检测到我在 Windows10 中安装的 OpenSSH。如何让 vim 检测已安装的 ssh?我想使用 vim 通过 sftp 编辑文件,但目前无法做到这一点。我可以从命令提示符中使用 ssh,没有任何问题。
从命令提示符运行以下命令显示 ssh 已安装并位于路径中
C:\Windows\System32>where ssh
C:\Windows\System32\OpenSSH\ssh.exe
C:\Windows\System32>where sftp
C:\Windows\System32\OpenSSH\sftp.exe
echo %PATH%
C:\Windows\system32;C:\Windows;[snip];C:\Windows\System32\OpenSSH\;[snip]
但是如果我从 vim (或 gvim)提交以下内容
:!where ssh
我明白了
C:\Windows\system32\cmd.exe /c (where ssh)
INFO: Could not find files for the given pattern(s).
shell returned 1
Hit any key to close this window...
但是从 vim 运行以下命令显示 vim 可以正确看到 PATH
:!set
另外,使用 netrw 浏览 C:\Windows\System32\ 时显示 OpenSSH 没有列在那里的目录之一。
以管理员身份运行 gvim 没有任何区别。
答案1
Vim 通常以 32 位应用程序形式发布,这意味着它在WoW64 模拟器,其中C:\Windows\System32
被映射到C:\Windows\SysWOW64
,而原来的 System32 文件夹则变为C:\Windows\Sysnative
。由于微软目前仅将 OpenSSH 安装到 64 位 System32 文件夹中,它默认对 32 位应用程序不可见。
有几种不同的解决方法:
- 添加
C:\Windows\Sysnative\OpenSSH
到您的 PATH,以便在运行 32 位程序时可以访问它; - 安装 64 位版本的 Vim,完全绕过 WoW64 重定向机制;或者
- 创建目录符号链接,以便可以在 WoW64 下访问 OpenSSH 文件夹。
选项 1:安装 64 位 Vim
这vim.org 下载页面说:
如果你想要一个签名版本,你可以从 vim-win32-安装程序 它支持许多接口,例如Perl,Tcl,Lua,Python和Ruby。还有 64 位版本它只能在 64 位 MS-Windows 上运行,占用更多内存,但与 64 位插件兼容。您还可以从那里获得包含最新改进的夜间版本,但可能会出现问题。
您可以从以下位置获取 64 位 Vim 版本:https://github.com/vim/vim-win32-installer/releases
选项 2:将 C:\Windows\Sysnative\OpenSSH 添加到您的 PATH
看如何在 Windows 10 中将文件夹添加到“Path”环境变量(附截图)在 StackOverflow 上。
选项 3:在 SysWOW64 文件夹下创建目录符号链接
这需要管理员权限。这是最全面的解决方案,但如果微软决定修复此问题,可能会导致未来的软件更新出现问题漏洞在他们的 OpenSSH 包中。
- 打开管理命令提示符。PowerShell ( Win+X, A) 或命令都可以。
- 运行以下命令:
cmd /c mklink /D %SystemRoot%\SysWOW64\OpenSSH ..\System32\OpenSSH
删除符号链接
要删除刚刚创建的符号链接,可以运行以下命令:
cmd /c rmdir %SystemRoot%\SysWOW64\OpenSSH
这里最重要的是使用一个命令来删除仅有的符号链接本身。目录符号链接在 Windows 上并不常用,许多程序会尝试通过删除目标文件夹的全部内容来删除它。