Я часто використовую екран GNU, щоб підтримувати віддалені сесії. Оскільки я живу в Emacs, мені дуже хотілося б відновити запущений віддалений сеанс оболонки зсередини Emacs.
GNU Screen реалізує всілякі модні речі, такі як термінальне мультиплексування та малювання символів, які мені справді не потрібні. Мені дійсно цікаво лише проведення знімних і відновлюваних сесій оболонок, тому щось таке просте, як це dtach
може бути достатньо.
Я використовую цю функцію для відкриття сеансу SSH та підключення до запущеного dtach
сеансу в shell-mode
(взято звідси ):
(defun ssh-dtach (host)
"Open SSH connection to remote host and attach to dtach session."
(interactive)
(let ((explicit-shell-file-name "dtach")
(explicit-dtach-args '("-A" "/tmp/emacs.dtach" "-z"
"/bin/bash" "--noediting" "-login"))
(default-directory (format "/ssh:%s:" host)))
(shell (format "*ssh %s*" host))))
Незважаючи на незначні химерності, це працює майже чудово shell-mode
, але в Eshell це лише запускає підпроцес, тому термінал стає дуже обмеженим (наприклад, немає автозавершення шляху).
Як я можу налаштувати Eshell для підключення до запущеного dtach
сеансу після підключення до віддаленого сервера?
EDIT: Коли я знову замислювався над цією проблемою, я зрозумів, що не зовсім зрозуміло, чого я насправді хочу. Ось список:
- Я хочу залишитися в ешеллі, а не в якомусь підпроцесі
- після повторного входження я хочу, щоб результат віддаленого сеансу був відтворений і історія віддалених команд була доступною
- Я хочу мати можливість взаємодіяти з запущеним віддаленим процесом (наприклад, біг, який
yum install
чекає мого введення)
Здається, мені потрібно написати трохи коду elisp, щоб це все працювало з dtach.
eshell
лініях між локальним і тим, що віддаленим, і зовнішньою командою та функцією elisp розмиті. Я хотів би зробити його ще більш нечітким, щоб віддалені запущені процеси можна було взаємодіяти прозоро, як ніби вони були локальними. Я думаю, це було б майже так само, як "відновлення" запущеної сесії.
screen
всередині shell-mode
не працюватиме добре, тому що screen
потрібен більше ніж німий термінал.
eshell
IS оболонки - так що концептуально мені здається, ви не можете робити те, що хочете, якщо тільки ви не отримаєте доступ до запущених emacs з буфером eshell в сеансі dtach. Або я тут помиляюся?