Here's how I use graphical emacs as the working editor on a remote
machine.
The basic setup: I have email, news, etc., on desktop machine D.
I read it via ssh in a terminal window from laptop L. I want to edit
posts using emacs session, ideally a graphical one rather than in that
terminal.
There are some standard ways of doing this. Most obviously, you can
run emacs(client) over X forwarding (ssh -X, or -Y), and this seems to
be the usual approach. But I have some screens with quite different
resolutions from others, and I want to use the emacs(client) that's
tweaked for my local machine.
It's possible to tweak the emacs/emacsclient socket to allow remote
access, but this is fiddly at best and going by others' accounts
doesn't seem to be reliable.
I could use sshfs or TRAMP to tell the local machine to edit the
remote temporary file. But that wouldn't be readily automatable.
So instead when the mail- or news-reader runs an editor, it hits this
Perl program (using my standard principle of moving from shell to a
better language whenever things look like getting complicated).
The various possiblities are:
-
I have an X display, or not. (If I'm away from home I generally turn
off X forwarding because I'm on a mobile connection, or a bad hotel
connection.)
-
I am coming in via ssh, or not (in which case I'm sitting directly
at D).
my $display = $ENV{DISPLAY} || '';
(my $ssh = $ENV{SSH_CONNECTION} || '') =~ s/ .*//;
if ($display) { # we have X
if ($ssh) { # we're on remote X
-
I'm on L, but I'm allowing X-forwarding. ssh back to L, and tell it to
edit the temp file, on the local display, via TRAMP. When that window
is closed, the editing session ends.
system('ssh','-tA',$ssh, "export DISPLAY=:0.0; emacsclient -c /ssh:heliophagous:'".$ARGV[0]."'")
} else { # we're on local X
-
I'm on the local display. Just run local emacsclient.
system(qw(emacsclient -c),@ARGV);
}
} else { # we don't have X
-
I'm in some other situation, either being on a machine that doesn't
have X (like Termux on the phone) or having deliberately turned it off
(e.g. because ssh back to L won't be possible). Just run a simple
console emacsclient.
system(qw(emacsclient -nw),@ARGV);
}
Comments on this post are now closed. If you have particular grounds for adding a late comment, comment on a more recent post quoting the URL of this one.