Bagaimana saya menggunakan emacsclient untuk terhubung ke instance emacs jarak jauh?

44

Saya ingin dapat menjalankan emacs di satu komputer:

server $ emacs --daemon

Dan kemudian terhubung dengannya dari yang lain:

local $ emacsclient -c server

Apakah ini mungkin? Jika ya, bagaimana caranya?

liszt
sumber
1
Sekedar petunjuk: jika Anda tidak perlu menjalankan sesi Emacs jarak jauh dan Anda hanya ingin mengedit file pada host jarak jauh dengan Emacs maka Anda mungkin ingin mencoba TRAMP, yang memungkinkan Anda mengedit file melalui jaringan secara transparan.
paprika
@ paprika Saya pikir OP ingin menggunakan konfigurasi emacs jarak jauh secara lokal. Karenanya TRAMP mungkin tidak cocok. Itulah alasan saya mengawali jawaban saya dengan penafian.
Vamsi
3
Telah ada diskusi tentang StackOverflow tentang masalah ini: stackoverflow.com/questions/12546722/…
Crash Coredump

Jawaban:

21

Anda tidak dapat menggunakan emacsclient untuk terhubung ke instance Emacs yang berjalan di komputer jarak jauh. Konsep client-server ini terkait dengan proses (lokal), bukan node jaringan. Namun, Anda dapat menggunakan berbagai teknologi jaringan untuk masuk ke komputer jarak jauh, melampirkan ke server emacs yang berjalan di sana dan menampilkan layar emacsclient secara lokal. Tergantung pada sistem operasi yang digunakan jaringan dapat dilakukan melalui SSH (terminal / X-Forwarding), VNC, RDP dll.

PEMBARUAN :
Seperti yang ditunjukkan beberapa orang, emacsclient sebenarnya memiliki opsi untuk terhubung ke server melalui TCP. Namun, emacsclient tidak pernah dimaksudkan untuk digunakan dari jarak jauh, opsi soket TCP diperlukan untuk kompatibilitas dengan sistem non-UNIX (yaitu sistem operasi di mana soket domain UNIX tidak tersedia, seperti Windows).

paprika
sumber
4
Menurut posting ini, pernyataan Anda tidak sepenuhnya benar. Bisakah kamu lebih spesifik?.
DJJ
5
@ paprika: Tidak, mekanisme otentikasi yang digunakan untuk koneksi TCP dirancang khusus untuk case akses jarak jauh. Saya mendorong untuk penggunaan TCP di sisi Windows sehingga kode ini juga berguna pada POSIX untuk koneksi jarak jauh, sehingga mengurangi kode khusus Windows dan menambahkan fungsionalitas ke sisi POSIX.
Stefan
9

Mungkin bukan yang Anda minta tetapi dengan asumsi Anda memiliki pengaturan ssh dengan penerusan X, Anda bisa mulai emacsclient di server dan meneruskannya ke DISPLAY jarak jauh. (Penafian: kode yang diketik langsung ke formulir web)

 local> ssh server -f emacsclient -c --display=$DISPLAY
Vamsi
sumber
Tidak, ini tidak relevan dengan pertanyaan.
heroxbd
4

Ini mungkin bukan yang Anda inginkan tetapi untuk berjaga-jaga jika itu dapat membantu Anda.

Saya biasanya bekerja di dalam mesin virtual yang di-bootstrap dengan Vagrant, ~/.emacs.ddirektori saya disinkronkan antara mesin saya (lokal) dan mesin virtual (jarak jauh) meletakkan yang berikut dalam Vagrantfilefile:

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

Konfigurasi Emacs saya secara otomatis memulai server saat startup:

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

Jadi ketika saya meluncurkan server Emacs di dalam mesin virtual, saya dapat menghubungkannya dengan yang berikut:

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

nama mesin virtual host adalah nama host dari mesin virtual yang saya konfigurasikan di ~ / .ssh / config saya:

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

Catatan: Sebelum meluncurkan server Emacs di dalam mesin virtual saya memeriksa bahwa ~/.emacs.d/server/serverfile tersebut tidak ada (jika saya hanya menghapusnya) karena jika tidak maka tidak akan berfungsi.

Anler
sumber
Baru sadar Anda menelepon emacsclient di server jauh. Dalam hal ini, Anda tidak perlu melewatkan file server secara eksplisit karena emacsclient akan secara otomatis terhubung ke server pertama yang ditemukannya.
Vamsi
Anda tidak perlu menentukan file kunci pribadi di baris perintah jika Anda memiliki file identitas Anda dengan benar diatur dalam .ssh/configfile Anda . Anda hanya perlu menentukan Host. Dalam keraguan Anda dapat menggunakan output dari perintah: vagrant ssh-configuntuk mengatur ~/.ssh/configfile Anda .
Alexandro de Oliveira
3

emacsclient dan TRAMP

Secara otomatis membuka file jarak jauh di emacs lokal

Saya telah sukses dengan solusi pertama. Yang kedua tampaknya lebih sederhana, saya belum mencobanya.

Kecelakaan Coredump
sumber
7
Jawabannya terlihat menarik, tapi tolong jangan hanya mengirim tautan. Sertakan beberapa kutipan dan cuplikan sehingga jawabannya berdiri sendiri.
Malabarba