Jak używać emacsclient do łączenia się ze zdalną instancją emacs?

44

Chciałbym móc uruchomić emacsa na jednym komputerze:

server $ emacs --daemon

A następnie połącz się z nim z innego:

local $ emacsclient -c server

czy to możliwe? Jeśli tak to jak?

Liszt
źródło
1
Tylko wskazówka: jeśli nie chcesz, aby zdalna sesja Emacsa działała, a chcesz po prostu edytować pliki na zdalnym hoście za pomocą Emacsa, możesz wypróbować TRAMP, który pozwala na edytowanie plików przez sieć w przejrzysty sposób.
papryka
@paprika Myślę, że OP chce używać zdalnej konfiguracji emacsa lokalnie. Dlatego TRAMP może nie być odpowiedni. Z tego powodu swoją odpowiedź poprzedziłem zastrzeżeniem.
Vamsi
3
Dyskusja na temat StackOverflow na ten temat: stackoverflow.com/questions/12546722/...
Crash Coredump

Odpowiedzi:

21

Nie można używać programu emacsclient do łączenia się z instancją Emacs działającą na komputerze zdalnym. Ta koncepcja klient-serwer jest związana z procesami (lokalnymi), a nie węzłami sieci. Możesz jednak użyć różnych technologii sieciowych, aby zalogować się na komputerze zdalnym, podłączyć się do działającego tam serwera emacs i wyświetlić lokalnie ekran emacsclient. W zależności od używanego systemu operacyjnego połączenie sieciowe może odbywać się za pośrednictwem SSH (terminal / X-Forwarding), VNC, RDP itp.

AKTUALIZACJA :
Jak niektórzy zauważyli, emacsclient faktycznie ma opcję połączenia z serwerem za pośrednictwem TCP. Jednak emacsclient nigdy nie miał być używany zdalnie, opcja gniazda TCP jest wymagana dla kompatybilności z systemami innymi niż UNIX (tj. Systemami operacyjnymi, w których gniazda domenowe UNIX są niedostępne, takie jak Windows).

papryka
źródło
4
Zgodnie z tym postem twoje oświadczenie nie jest do końca właściwe. Możesz być bardziej dokładny?.
DJJ
5
@paprika: Nie, mechanizm uwierzytelniania użyty do połączenia TCP został zaprojektowany specjalnie dla sprawy dostępu zdalnego. Naciskałem na użycie protokołu TCP po stronie systemu Windows, aby kod był także przydatny w POSIX do połączeń zdalnych, zmniejszając w ten sposób kod specyficzny dla systemu Windows i dodając funkcje po stronie POSIX.
Stefan
9

Prawdopodobnie nie to, o co prosiłeś, ale zakładając, że masz konfigurację ssh z X-forwardingiem, możesz uruchomić emacsclient na serwerze i przekazać go do zdalnego WYŚWIETLANIA. (Uwaga: kod wpisany bezpośrednio w formularzu internetowym)

 local> ssh server -f emacsclient -c --display=$DISPLAY
Vamsi
źródło
Nie, to nie ma znaczenia dla pytania.
heroxbd
4

To może nie być to, co chcesz, ale na wszelki wypadek, czy może ci to pomóc.

Zwykle pracuję na maszynie wirtualnej uruchomionej za pomocą Vagrant, mam ~/.emacs.dzsynchronizowany katalog między moją maszyną (lokalną) a maszyną wirtualną (zdalną), umieszczając w Vagrantfilepliku:

config.vm.synced_folder "~/.emacs.d", "/home/vagrant/.emacs.d"

Ponadto moja konfiguracja Emacsa automatycznie uruchamia serwer podczas uruchamiania:

(require 'server)
(setq server-use-tcp t
      server-socket-dir "~/.emacs.d/server")
(unless (server-running-p)
    (server-start))

Kiedy więc uruchamiam serwer Emacs na maszynie wirtualnej, mogę się z nim połączyć w następujący sposób:

ssh -Y -i ~/.vagrant.d/insecure_private_key "<virtual machine hostname>" 'emacsclient -c -f ~/.emacs.d/server/server'

nazwa hosta maszyny wirtualnej to nazwa hosta maszyny wirtualnej, którą skonfigurowałem w moim ~ / .ssh / config:

Host <virtual machine hostname>
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /home/anler/.vagrant.d/insecure_private_key
  IdentitiesOnly yes
  LogLevel FATAL
  ForwardAgent yes

Uwaga: Przed uruchomieniem serwera Emacs na maszynie wirtualnej sprawdzam, czy ~/.emacs.d/server/serverplik nie jest obecny (jeśli tak, po prostu go usuwam), ponieważ w przeciwnym razie nie zadziała.

Anler
źródło
Właśnie zdałem sobie sprawę, że wywołujesz emacsclient na zdalnym serwerze. W takim przypadku nie musisz jawnie przekazywać pliku serwera, ponieważ emacsclient automatycznie połączy się z pierwszym znalezionym serwerem.
Vamsi
Nie musisz określać pliku klucza prywatnego w wierszu polecenia, jeśli plik tożsamości jest poprawnie ustawiony w .ssh/configpliku. Musisz tylko określić Host. Wątpliwości możesz użyć danych wyjściowych polecenia: vagrant ssh-configdo ustawienia ~/.ssh/configpliku.
Alexandro de Oliveira
3

emacsclient i TRAMP

Automatycznie otwieraj zdalne pliki w lokalnych emacach

Miałem sukces z pierwszym rozwiązaniem. Drugi wydaje się prostszy, jeszcze go wypróbowałem.

Crored Coredump
źródło
7
Odpowiedź wygląda interesująco, ale proszę nie publikować linków. Dołącz niektóre fragmenty i fragmenty, aby odpowiedź stała na własnych nogach.
Malabarba