Во-первых, я не знаю собственного клиента elisp ssh (и не думаю, что есть много мотивации для написания одного), поэтому вам обязательно нужно будет взаимодействовать с внешним процессом ssh-клиента.
Как вы хотите использовать ssh интерактивно, для процесса ssh требуется терминал на локальной стороне соединения.
Вопрос поэтому: Будет ли Emacs реализовывать терминал, к которому может быть присоединен процесс ssh?
Ответ: yes - term.el обеспечивает надежную реализацию терминала, через которую ssh можно запускать напрямую, без требования к оболочке.
Если запустить M-хterm
RET вам будет предложено ввести программу. (По умолчанию используется оболочка, но это, конечно, не единственный тип процесса, который вы можете запустить.)
По неизвестным причинам интерактивные функции term
(и ansi-term
) не поддерживают передачу аргументов указанной программе, которая отображает они менее полезны, если вы хотите запустить что-то вроде ssh [email protected]
. Вместо этого вы можете указать скрипт, который обрабатывал аргументы, но мы можем управлять этим также в 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
- М-:
(info "(emacs) Terminal Mode")
RET
- С-че
term-mode
RET
Оба «M-x shell» и Tramp * do * относятся к вашему вопросу, как указано. Поэтому, пожалуйста, объясните конкретно, что это такое, чего они не делают. Я понимаю, что вы хотите сделать больше, чем позволяет Tramp, но что вы хотите сделать, чтобы «M-x shell» не позволял вам делать? – Stefan
Я хочу ввести 'M-x ssh' или что-то подобное для создания ssh-соединения, например, я могу набрать' M-x sql-postgresql', чтобы создать соединение непосредственно с базой данных. 'M-x shell' просто открывает оболочку, из которой I * может * ssh или что-то еще. Я спрашивал, есть ли способ ssh * напрямую * из Emacs. – SabreWolfy
Что вы на самом деле хотите сделать с помощью ssh, который не редактирует удаленные файлы или не открывает удаленный терминал? – Tyler