Uso spesso lo schermo GNU per mantenere attive le sessioni remote. Dal momento che vivo in Emacs, mi piacerebbe davvero poter riprendere una sessione di shell remota in esecuzione all'interno di Emacs.
Lo schermo GNU implementa ogni sorta di cose fantasiose come il multiplexing terminale e il disegno dei personaggi di cui non ho davvero bisogno. Sono davvero interessato solo ad avere sessioni di shell staccabili e ripristinabili, quindi qualcosa di semplice come dtach
potrebbe essere sufficiente.
Sto usando questa funzione per aprire una sessione SSH e riconnettermi a una dtach
sessione in esecuzione shell-mode
(presa da qui ):
(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))))
Nonostante le piccole stranezze, questo funziona quasi bene shell-mode
, ma in Eshell questo avvia solo un sottoprocesso, quindi il terminale diventa molto limitato (ad esempio nessun completamento automatico del percorso).
Come posso configurare Eshell per connettersi a una dtach
sessione in esecuzione al momento della connessione a un server remoto?
EDIT: Mentre ripensavo a questo problema, mi sono reso conto che non è del tutto chiaro quello che voglio davvero. Ecco un elenco:
- Voglio rimanere in eshell, non in alcuni sottoprocessi
- dopo il ricollegamento, desidero riprodurre l'output della sessione remota e rendere disponibile la cronologia dei comandi remoti
- Voglio essere in grado di interagire con un processo remoto in esecuzione (ad esempio una corsa in
yum install
attesa del mio input)
Sembra che dovrò scrivere un po 'di codice elisp per far funzionare tutto con dtach.
eshell
linee tra ciò che è locale e ciò che è remoto e ciò che è un comando esterno e una funzione elisp sono sfocate. Vorrei renderlo ancora più fuzzato in modo tale che i processi in esecuzione remoti possano interagire in modo trasparente come se fossero locali. Sarebbe quasi lo stesso di "riprendere" una sessione di corsa, credo.
screen
all'interno di shell-mode
non funzionerà bene, perché ha screen
bisogno di più di un terminale stupido.
eshell
È la shell - quindi concettualmente mi sembra che tu non possa fare quello che vuoi, a meno che tu non acceda ad un emacs in esecuzione con un buffer eshell nella sessione dtach. O mi sbaglio qui?