如何使用Powershell作为我的tramp-encoding-shell?

Joh*_*ohn 9 windows emacs powershell plink tramp

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

然后我收到此错误消息

Microsoft Windows [版本6.1.7601]版权所有(c)2009 Microsoft Corporation.版权所有.

管理员已禁用命令提示符.

按任意键继续 ...

我正在尝试连接plink(在我的路径中),也是在通过*Messages*缓冲区后我找到了这个.

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

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

我修改了我的.emacs文件

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

我得到了不同的结果,但结果似乎是乱糟糟的(第三行看起来可能是一个提示,\而且>字符在正确的位置......).

emacs错误

我设法挖掘了一个很好的描述是什么tramp-encoding-shell,还有一个相关的SO问题,这里是github上的tramp-encoding-shell 源/文档.

更新

这是我的屏幕在尝试以PowerShell设置为tramp-encoding-shell的plink连接失败后的样子.

全屏截图

JPB*_*anc 2

所以我不知道 TRAMP,但你得到的解释是 Windows PowerShell 向你发送回 unicode (UTF16),每个字符都是 16 位,在本例中是字母和零,加上行尾是回车符 /换行(0xa、Oxd)。

\n\n

现在,根据TRAMP 文档@Michael Albinus 的建议,“emacs 无法找到 PowerShell 的本地 shell 提示”错误似乎很有希望。

\n\n

6.4.2 在远程主机上运行shell

\n\n

在与远程主机相关的缓冲区中调用 Mx shell 会运行本地 shell,如 中所定义shell-file-name。这也可能是要在远程主机上应用的 shell 的有效文件名,但至少当本地和远程主机属于不同的系统类型时(例如 \xe2\x80\x98windows-nt\xe2\x80),它会失败\x99 和 \xe2\x80\x98gnu/linux\xe2\x80\x99。

\n\n

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

\n\n

6.4.6 在 Windows 主机上运行远程进程\n在 winexe 的帮助下,可以在远程 Windows 主机上运行进程。TRAMP 已为进程文件和启动文件进程实现了此功能。

\n\n

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

\n\n

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

\n\n
(setq explicit-shell-file-name "cmd"\n      explicit-cmd-args \'("/q"))\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果将 powershell 作为远程 shell 运行,则设置为

\n\n
(setq explicit-shell-file-name "powershell"\n      explicit-powershell-args \'("-file" "-"))\n
Run Code Online (Sandbox Code Playgroud)\n