Często używam GNU Screen do utrzymywania sesji zdalnych przy życiu. Ponieważ mieszkam w Emacsie, naprawdę chciałbym móc wznowić uruchomioną sesję powłoki zdalnej z poziomu Emacsa.
GNU Screen implementuje różne fantazyjne rzeczy, takie jak multipleksowanie terminali i rysowanie postaci, których tak naprawdę nie potrzebuję. Naprawdę interesuje mnie tylko możliwość odłączania i wznawiania sesji powłoki, więc coś tak prostego, jak dtach
mogłoby być wystarczające.
Korzystam z tej funkcji, aby otworzyć sesję SSH i ponownie połączyć się z uruchomioną dtach
sesją w shell-mode
(wzięte stąd ):
(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))))
Pomimo drobnych dziwactw, działa to prawie w porządku shell-mode
, ale w Eshell po prostu uruchamia podproces, więc terminal staje się bardzo ograniczony (np. Brak autouzupełniania ścieżki).
Jak skonfigurować Eshell do łączenia się z uruchomioną dtach
sesją po połączeniu ze zdalnym serwerem?
EDYCJA: Kiedy ponownie pomyślałem o tym problemie, zdałem sobie sprawę, że nie jest całkowicie jasne, czego tak naprawdę chcę. Oto lista:
- Chcę pozostać w eshell, a nie w jakimś podprocesie
- po ponownym podłączeniu chcę odtworzyć dane wyjściowe sesji zdalnej i udostępnić historię poleceń zdalnych
- Chcę mieć możliwość interakcji z uruchomionym procesem zdalnym (np. Uruchomieniem
yum install
czekającym na moje dane wejściowe)
Wygląda na to, że muszę napisać trochę kodu elisp, aby wszystko działało z dtach.
eshell
liniach między tym, co lokalne, a tym, co zdalne, a tym, co jest poleceniem zewnętrznym i funkcją elisp, zaciera się. Chciałbym, aby było jeszcze bardziej niewyraźne, aby zdalnie działające procesy mogły być obsługiwane w sposób transparentny, jakby były lokalne. Myślę, że to prawie tak samo, jak „wznawianie” trwającej sesji.
screen
wewnątrz shell-mode
nie działa dobrze, ponieważ screen
wymaga więcej niż głupiego terminala.
eshell
JEST powłoką - więc koncepcyjnie wydaje mi się, że nie możesz robić tego, co chcesz, chyba że uzyskasz dostęp do działającego emacsa za pomocą bufora eshell w sesji dtach. A może się mylę?