phi*_*ils 10
首先,我不知道本机elisp ssh客户端(并且不会想象编写一个客户端有很多动机),因此您肯定需要与外部ssh客户端进程进行交互.
由于您希望以交互方式使用ssh ,因此ssh进程需要连接本地端的终端.
因此问题变成:Emacs是否实现了可以附加ssh进程的终端?
答案是:是的 - term.el提供了一个强大的终端实现,通过它可以直接运行ssh,而不需要shell.
如果您运行M-x term
RET,将提示您输入程序.(它默认为shell,但这肯定不是您可以运行的唯一类型的进程.)
由于未知原因,交互式term
(和ansi-term
)函数不支持将参数传递给指定的程序,如果您希望运行类似的程序,则会使它们变得不那么有用ssh user@host
.您可以改为指定处理参数的脚本,但我们也可以在elisp中管理它:
该term
函数实际上是一个简单的包装器,它调用make-term
启动程序然后设置适当的模式.由于make-term
不接受程序的参数,它是相当直接的复制和修改的定义term
,以满足自己的目的.
这是一个非常简单的实现:
(defun my-ssh (user host port)
"Connect to a remote host by SSH."
(interactive "sUser: \nsHost: \nsPort (default 22): ")
(let* ((port (if (equal port "") "22" port))
(switches (list host "-l" user "-p" port)))
(set-buffer (apply 'make-term "ssh" "ssh" nil switches))
(term-mode)
(term-char-mode)
(switch-to-buffer "*ssh*")))
Run Code Online (Sandbox Code Playgroud)
或者这可能是最好的:
(defun my-ssh (args)
"Connect to a remote host by SSH."
(interactive "sssh ")
(let ((switches (split-string-and-unquote args)))
(set-buffer (apply 'make-term "ssh" "ssh" nil switches))
(term-mode)
(term-char-mode)
(switch-to-buffer "*ssh*")))
Run Code Online (Sandbox Code Playgroud)
显然还有改进的余地,但我认为这是非常有用的.
你应该确保你熟悉它的怪癖term-mode
.看到:
(info "(emacs) Terminal emulator")
RET(info "(emacs) Terminal Mode")
RETterm-mode
RET 归档时间: |
|
查看次数: |
6623 次 |
最近记录: |