Como uso o emacsclient para conectar-me a uma instância remota do emacs?

44

Eu gostaria de poder executar o emacs em um computador:

server $ emacs --daemon

E conecte-se a ele de outro:

local $ emacsclient -c server

Isso é possível? Se sim, como?

liszt
fonte
1
Apenas uma dica: se você não precisar manter a sessão remota do Emacs em execução e apenas quiser editar arquivos no host remoto com o Emacs, poderá experimentar o TRAMP, que permite editar arquivos pela rede de forma transparente.
paprika
@paprika Acho que o OP quer usar uma configuração remota do emacs localmente. Portanto, o TRAMP pode não ser adequado. Essa é a razão pela qual prefixo minha resposta com o aviso.
Vamsi
3
Houve uma discussão sobre StackOverflow sobre o assunto: stackoverflow.com/questions/12546722/…
Crash Coredump

Respostas:

21

Você não pode usar o emacsclient para se conectar a uma instância do Emacs em execução em um computador remoto. Esse conceito cliente-servidor está relacionado a processos (locais), não a nós da rede. No entanto, você pode usar várias tecnologias de rede para efetuar login no computador remoto, conectar-se a um servidor emacs em execução no local e exibir a tela do emacsclient localmente. Dependendo do sistema operacional usado, a rede pode ser feita via SSH (terminal / X-Forwarding), VNC, RDP etc.

ATUALIZAÇÃO :
Como algumas pessoas apontaram, o emacsclient realmente tem uma opção para se conectar ao servidor via TCP. No entanto, o emacsclient nunca foi projetado para ser usado remotamente, a opção de soquete TCP é necessária para compatibilidade com sistemas não UNIX (ou seja, sistemas operacionais nos quais soquetes de domínio UNIX não estão disponíveis, como o Windows).

páprica
fonte
4
De acordo com este post, sua declaração não está exatamente correta. Você poderia ser mais específico?.
DJJ
5
@ paprika: Não, o mecanismo de autenticação usado para a conexão TCP foi projetado especificamente para o caso de acesso remoto. Eu insisti no uso do TCP no lado do Windows para que o código também seja útil no POSIX para conexões remotas, reduzindo assim o código específico do Windows e adicionando funcionalidade ao lado do POSIX.
Stefan
9

Provavelmente não é o que você pediu, mas supondo que você tenha uma configuração ssh com o encaminhamento X, você pode iniciar o emacsclient no servidor e encaminhá-lo para o DISPLAY remoto. (Aviso: código digitado diretamente no formulário da web)

 local> ssh server -f emacsclient -c --display=$DISPLAY
Vamsi
fonte
Não, isso é irrelevante para a questão.
heroxbd
4

Pode não ser o que você deseja, mas apenas para ver se pode ajudá-lo.

Normalmente, trabalho em uma máquina virtual inicializada com o Vagrant, tenho meu ~/.emacs.ddiretório sincronizado entre minha máquina (local) e a máquina virtual (remota), colocando o seguinte no Vagrantfilearquivo:

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

Além disso, minha configuração do Emacs inicia automaticamente um servidor na inicialização:

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

Portanto, quando inicio um servidor Emacs dentro da máquina virtual, posso conectar-me a ele com o seguinte:

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

nome da máquina virtual é o nome da máquina virtual que eu configurei no meu ~ / .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

Nota: Antes de iniciar o servidor Emacs dentro da máquina virtual, verifico se o ~/.emacs.d/server/serverarquivo não está presente (se for apenas removê-lo) porque, caso contrário, não funcionará.

Anler
fonte
Acabei de perceber que você está chamando o emacsclient no servidor remoto. Nesse caso, você não precisa passar o arquivo do servidor explicitamente, pois o emacsclient se conectará automaticamente ao primeiro servidor que encontrar.
Vamsi
Você não precisa especificar o arquivo de chave privada na linha de comando se o seu arquivo de identidade estiver definido corretamente .ssh/config. Você só precisa especificar o Host. Na dúvida, você pode usar a saída do comando: vagrant ssh-configpara definir seu ~/.ssh/configarquivo.
Alexandro de Oliveira
3

emacsclient e TRAMP

Abrir automaticamente arquivos remotos no emacs local

Eu tive sucesso com a primeira solução. O segundo parece ser mais simples, ainda estou para experimentar.

Crash Coredump
fonte
7
A resposta parece interessante, mas não basta postar links. Inclua alguns trechos e trechos para que a resposta fique por conta própria.
Malabarba 29/09