Tanto @Thomas Dickey quanto @Celada têm boas sugestões, e depois de brincar com isso por alguns dias eu tenho uma solução ok que pode ser de interesse.
Primeiro: Certamente você deve usar Mosh se estiver disponível no lado do servidor. Isso permitirá que você trabalhe com uma conexão defeituosa / lenta.
Em segundo lugar, use um editor que salvará seu trabalho em um desktop - o emacs tem isso, por exemplo. De acordo com a documentação e a variável desktop-auto-save-timeout
, irá salvar automaticamente a cada 30 segundos por padrão no Emacs 24.4 quando usar (desktop-save-mode 1)
em seu arquivo init. Note que o emacs pode bloquear um arquivo da área de trabalho para que o emacs reiniciado após o travamento não faça com sucesso (desktop-read)
. Algum código de aqui me ajudou (mas eu não sei como funciona). Adicione ao seu arquivo init:
;;; desktop-override-stale-locks.el begins here
(defun emacs-process-p (pid)
"If pid is the process ID of an emacs process, return t, else nil.
Also returns nil if pid is nil."
(when pid
(let ((attributes (process-attributes pid)) (cmd))
(dolist (attr attributes)
(if (string= "comm" (car attr))
(setq cmd (cdr attr))))
(if (and cmd (or (string= "emacs" cmd) (string= "emacs.exe" cmd))) t))))
(defadvice desktop-owner (after pry-from-cold-dead-hands activate)
"Don't allow dead emacsen to own the desktop file."
(when (not (emacs-process-p ad-return-value))
(setq ad-return-value nil)))
;;; desktop-override-stale-locks.el ends here
Eu uso o tmux com o tmuxinator do lado do cliente que abre algumas janelas / painéis que ssh para meu diretório de trabalho do lado do servidor . Não é perfeito, mas ainda é bastante eficiente configurar o ambiente de trabalho com instâncias de htop
e vários diretórios abertos usando meu shell faviourite. Algumas coisas úteis no meu arquivo de configuração do tmux:
# make sure your terminal emulator and tmux are on the same colour scheme, or your nice themes will get screwed up.
set -g default-terminal "xterm-256color"
#if you use vim in tmux you need this for quick ESC key sequences, else it gobbles up ESC key presses.
set -s escape-time 0
# Enable mouse mode (tmux 2.1 and above)
set -g mouse on
# don't rename windows automatically. useful for window "categories"
set-option -g allow-rename off
# switch panes using Alt-arrow without prefix
bind -n M-Left select-pane -L
bind -n M-Right select-pane -R
bind -n M-Up select-pane -U
bind -n M-Down select-pane -D
E um trecho do meu arquivo de configuração yml do tmuxinator
windows:
- ouput: # this is the name of a window
layout: tiled
panes: # these are some panes in said window
- cd /some/directory
- cd /another/directory
- cd ~/
- cd ~/
- remoutput:
layout: tiled
panes:
# cd to working dir and start up a zsh session
- ssh me@host -t 'cd ~/working/dir; zsh -i'
# repeat more panes and windows server-side
Ao desconectar as janelas do tmux com o ssh irá sair para um shell local onde o comando anterior era o comentário do tmux, então pelo menos é fácil subir + RET de volta para o servidor. Você desejará evitar as opções de "histórico incremental compartilhado" em seu ambiente para garantir que isso funcione.
Finalmente, se o seu sistema está determinado a matar sessões ociosas, peça ao seu cliente que envie um SSH por minuto para que eles não percebam que você está ocioso. Faça isso no .ssh / config com
Host *
ServerAliveInterval 60
Eu deliberadamente deixei o emacs fora da configuração do tmuxinator por dois motivos. 1 tmux pode ser lento com editores de texto, lutando para atualizar tanto texto e 2 eu queria rodar o emacs no modo de servidor e ele pode já estar rodando quando eu inicio no tmux. Eu geralmente rodaria janelas separadas, cliente e lado do servidor, dedicadas ao emacs (com a mesma configuração, é claro) em execução no modo de servidor. Além disso, eu defino EDITOR="emacsclient -t", para que as tarefas de edição rápida se conectem instantaneamente ao servidor emacs onde quer que elas sejam chamadas. Todas essas tarefas, é claro, tornam-se parte do desktop do emacs! (se alguém quiser elaborar sobre como fazer isso com o outro editor, estou interessado.)