まず、私はネイティブの elisp ssh クライアントを認識していません (また、ネイティブの elisp ssh クライアントを作成する大きな動機があるとは思いません)。そのため、外部の ssh クライアント プロセスと対話する必要があることは確かです。
ssh をインタラクティブに使用したい場合、ssh プロセスには接続のローカル側に端末が必要です。
したがって、問題は次のようになります: Emacs は ssh プロセスを接続できる端末を実装していますか?
答えは: はい -- term.el は、シェルを必要とせずに ssh を直接実行できる堅牢な端末実装を提供します。
実行M-x term
RETすると、プログラムを求めるプロンプトが表示されます。(デフォルトはシェルですが、実行できるプロセスはこれだけではありません。)
理由は不明ですが、インタラクティブ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*")))
またはおそらくこれが望ましいです:
(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*")))
もちろん、改善の余地はありますが、現状のままでかなり有用だと思います。
の癖に精通していることを確認する必要がありますterm-mode
。見る:
- M-:
(info "(emacs) Terminal emulator")
RET
- M-:
(info "(emacs) Terminal Mode")
RET
- C-hf
term-mode
RET