Configurando o emacsclient no MS windows

11

Estou tentando configurar o daemon do servidor emacs e usar o emacsclient no MS Windows para que os arquivos possam ser abertos rapidamente sem o atraso e a sobrecarga associados ao início de instâncias adicionais do emacs para cada arquivo aberto. Estou seguindo as instruções específicas fornecidas no emacswiki para MS Windows, que envolvem:

  1. Executando o emacs como um daemon, runemacs.exe --daemon
  2. Seguido invocando emacsclientw.execom as opções apropriadas.

O início do daemon foi bem-sucedido (vejo o emacs.exe na lista de processos), mas a chamada do emacsclient produz erros. O wiki diz para criar um atalho emacsclientw.exee alterar o destino para

X:\path\to\emacs\bin\emacsclientw.exe -na "X:\path\to\emacs\bin\emacsclientw.exe" -c -n

Isso está correto? Parece que o cliente é chamado duas vezes. O uso do destino conforme mostrado não executa o programa e produz o erro "nome do arquivo ou argumento necessário". Usando apenas a primeira parte do alvo mostrada acima

X:\path\to\emacs\bin\emacsclientw.exe -na

produz um erro genérico. Usando apenas a segunda parte

X:\path\to\emacs\bin\emacsclientw.exe -c -n

produz o erro "Nenhum soquete ou editor alternativo". (As opções oficiais do emacsclient estão descritas aqui. )

Alguma sugestão? O Emacs funciona bem no modo padrão, ou seja, não no modo daemon. Versão 25.1. Eu preferiria executar o daemon em vez de iniciar o servidor no meu arquivo de inicialização.

Snelephant
fonte

Respostas:

5

Não tenho tanta certeza sobre os conselhos na página do emacswiki. O que você quer fazer é o seguinte:

  • Inicie um cliente emacs conectado ao servidor emacs em execução.
  • Se o servidor emacs não estiver em execução, inicie-o e conecte o cliente emacs.
  • Não espere o cliente terminar (se você estiver iniciando em uma linha de comando).

O comando que eu uso é

C:\emacs\bin\emacsclientw.exe -n -c -a ""

O -n significa que não espere o cliente terminar quando você estiver iniciando na linha de comando. O -a permite especificar um editor alternativo se o servidor emacs não estiver em execução , mas se você fornecer uma string vazia, ele tentará iniciar o servidor emacs e conectar-se a ele. Por fim, se você estiver colocando isso em um atalho do Windows, também deseja adicionar um -c que abrirá um novo quadro ( consulte as opções do emacsclient ).

Aqui está o meu atalho, ele funciona para mim (no Windows 7, emacs 25.3). Não sei por que a página do emacswiki colocou outra invocação do emacsclientw como editor alternativo que não faz sentido.

Devo acrescentar que quando tento omitir a opção -c ao executar como atalho , ocorre um erro.

atalho do emacsclientw

Angelo
fonte
A configuração do atalho emacsclientw.exe da maneira mostrada produz: Error: Cannot connect even after starting the Emacs daemonConfirmado esse atalho inicia o processo daemon, mas os arquivos ainda abrem em sua própria instância do emacs. Testado com e sem privilégios de administrador. Emacs 25.1, Windows 7.
Snelephant
@ Channelephant, hmm, não sei o que pode estar errado. Eu até fiz o downgrade para o emacs 25.1 e meu atalho ainda funcionava. Como você está abrindo arquivos através de um menu de contexto ou com o comando no atalho seguido pelo nome do arquivo?
Angelo
O erro ocorre quando clico no atalho para o emacsclientw.exe em si sem nenhum arquivo especificado e quando clico em um atalho para um arquivo de texto com o emacsclientw.exe e o nome do arquivo especificado no campo Destino. Na verdade, não sei ao certo o método pretendido para abrir arquivos no cliente no Windows? Gostaria apenas de clicar no arquivo no Windows Explorer. Clicar em um arquivo no OSX parece abrir o arquivo em uma instância existente, mas clicar em um arquivo no Windows cria uma instância separada. Nota: Eu configurei o Windows para abrir arquivos de texto usando o runemacs.exe fornecido com o emacs.
Snelephant
Se você configurou o Windows para abrir arquivos de texto com o runemacs.exe, eles serão abertos em processos separados do Emacs. Você deseja alterar essa associação para usar o emacsclientw.
glucas
@glucas Alterou as associações de arquivos de texto para o atalho para emacsclientw.exe, conforme Angelo descreveu. Clicar em um arquivo de texto produz o mesmo Error: Cannot connect even after starting the Emacs daemon.
Snelephant
1

O comando que eu uso é:

emacsclientw.exe --create-frame --no-wait --alternate-editor runemacs.exe --server-file %APPDATA%\.emacs.d\server\server

(Se a pasta bin Emacs não estiver na sua PATH, use os caminhos completos para emacsclientw.exee runemacs.exe.)

ou com os nomes curtos das opções e o truque de string vazio,

emacsclientw.exe -c -n -a "" -f %APPDATA%\.emacs.d\server\server

Observe que o truque da string vazia -ainiciará o daemon se ele não estiver em execução, mas isso não deve funcionar até o Emacs 26 (ainda estou com 25). Antes de 26, você precisa especificar o editor alternativo explicitamente. Eu usei runemacs.exe, mas meu Emacs está configurado para iniciar o servidor e deixá-lo em execução.

Como o Windows não possui os soquetes de domínio local do Unix que emacsclientnormalmente seriam usados ​​para se conectar ao servidor, ele deve voltar a usar um soquete TCP de rede. Por razões óbvias de segurança, você não deseja que ninguém na sua rede acesse todo o sistema de arquivos através do servidor Emacs. Portanto, é emacsclientnecessário conhecer a porta (efêmera) correta e o token de segurança gravados no arquivo do servidor antes que o servidor permita a conexão.

Se o servidor já estiver em execução, você não precisará do -a(mas não dói). Você pode definir a ALTERNATE_EDITORvariável de ambiente em vez de usar -a.

Se você definir a EMACS_SERVER_FILEvariável de ambiente, não precisará especificá-la novamente com -f.

gilch
fonte