如何将Powershell用作我的tramp编码shell?

9

首先我启动了eshell,然后输入命令cd /plink:<user>@<host>:/home/

然后我收到以下错误信息:

Microsoft Windows [Version 6.1.7601]版权所有(c)2009 Microsoft Corporation。保留所有权利。

您的管理员已禁用命令提示符。

按任意键继续. . .

我尝试使用plink建立连接(它在我的路径中),还通过*Messages*缓冲区找到了以下内容:

无法找到(C:\Windows\system32\cmd.exe)的本地shell提示符

我90%确定这是因为我的机器上已禁用cmd,因为当我在另一台我知道已启用cmd的计算机上尝试相同的设置时,一切正常。

我已修改我的.emacs文件以包括:

(require 'tramp)
(set 'tramp-encoding-shell "C:/Windows/System32/WindowsPowershell/v1.0/powershell.exe")
(set 'tramp-encoding-command-switch "-Command")

我得到了不同的结果,但结果似乎是混乱无序的(第三行看起来像是提示符,\>字符处于正确的位置...)。
我找到了一个相当好的描述 tramp-encoding-shell 是什么 的文章,还有一个相关的 SO 问题,这里是在 github 上的 tramp-encoding-shell 源代码/文档更新 在将 powershell 设置为 tramp-encoding-shell 后尝试打开 plink 连接失败后,我的屏幕显示如下:

2
Windows PowerShell 会返回 Unicode(UTF16)编码,每个字符占用 16 位。此外,换行符是回车/换行符(0xa, Oxd),这可能解释了你所得到的结果。 - JPBlanc
@JPBlanc,这就是问题的一部分。我在我的PowerShell配置文件中添加了$OutputEncoding = New-Object -typename System.Text.UTF8Encoding,这样就消除了乱码问题,但是现在出现了“找不到本地shell提示符(...powershell)”的错误。我认为新的错误可能与你提到的EOL有关。 - John
@JPBlanc,经过进一步检查,看起来tramp知道如何处理Windows风格的换行符 - John
你能解释一下你在哪里遇到了“找不到本地shell提示符(... powershell)”错误吗?可以附上一张截图吗? - JPBlanc
@JPBlanc,我添加了一个屏幕截图,展示了我所看到的内容。右侧的窗口是由emacs自动拉起的。 - John
1个回答

2

我不了解TRAMP,但根据所得解释,Windows PowerShell会向您发送Unicode(UTF16),每个字符在这种情况下都是16位字母和零的组合,加上行尾符回车/换行符(0xa,Oxd)。

现在针对“emacs could not find local shell prompt for PowerShell”错误,根据TRAMP文档@Michael Albinus的建议似乎很有前途。

6.4.2 在远程主机上运行shell

在与远程主机相关的缓冲区中调用M-x shell会运行由shell-file-name定义的本地shell。这也可能是一个适用于远程主机的有效文件名,但至少当您的本地和远程主机属于不同的系统类型时,例如“windows-nt”和“gnu / linux”时,它将失败。

您必须设置变量explicit-shell-file-name为远程主机上的shell文件名,以便在远程主机上启动该shell。

6.4.6 在Windows主机上运行远程进程 通过winexe的帮助,可以在远程Windows主机上运行进程。 TRAMP已经为process-file和start-file-process实现了这一点。

变量tramp-smb-winexe-program必须包含本地winexe命令的文件名。在远程主机上,必须安装Powershell V2.0;它用于运行远程进程。

为了通过M-x shell在Windows主机上打开远程shell,您必须设置变量explicit-shell-file-name和explicit-*-args。例如,如果您想运行cmd,则必须设置:

(setq explicit-shell-file-name "cmd"
      explicit-cmd-args '("/q"))

如果作为远程 shell 运行 PowerShell,则设置如下:

(setq explicit-shell-file-name "powershell"
      explicit-powershell-args '("-file" "-"))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接