Exibir buffers gerenciados por outra instância do emacs

7

É possível executar gnusou outras coisas que tendem a bloquear frequentemente em uma instância separada do emacs e "encaminhar os buffers" para a instância principal do emacs. Acho que, de maneira geral, estou me perguntando que tipo de comunicação entre instâncias do emacs é possível.

Gregory Nisbet
fonte
Não é uma resposta para sua pergunta, mas apenas alguns pensamentos - muitas pessoas parecem executar várias instâncias do Emacs por falta de um método melhor para manter os buffers organizados. Os problemas de comunicação entre várias instâncias podem ser evitados por não tê-los - ou seja, melhor organização com apenas uma instância - por exemplo, organização por quadros usando frame-bufs github.com/alpaker/Frame-Bufs ou uma variedade de outras bibliotecas organizacionais (por exemplo, projetos etc.). Em poucas palavras, existem muitas maneiras de organizar efetivamente um enorme volume de buffers ativos em uma instância do Emacs.
lawlist
Estou começando a usar el-screenpara organização de buffer, mas uma abordagem orientada a projeto pode fazer mais sentido. Estou imaginando mais um mestre emacs e alguns trabalhadores sem cabeça que impedem coisas como essa gnus. A solução mais simples possível: o emacses se comunica por soquetes ou o mestre emacs gera um trabalhador efêmero e toda a comunicação é feita por stdin e stdout, mas então eu precisaria me esforçar bastante para serializar e desserializar objetos específicos do emacs (que é o trabalho duro que estou tentando evitar).
Gregory Nisbet
Ah entendo. . . sim, normalmente tomo uma xícara de café ou checo as perguntas mais recentes sobre stackexchange enquanto recebo / envio de e-mails pela primeira vez após o lançamento do Emacs - ou seja, sinto sua dor. As verificações / envios subsequentes de email são muito mais rápidos com o Wanderlust, mas a verificação / envio inicial com milhares de emails armazenados pode demorar alguns minutos.
lawlist
@lawlist, tentei executar o mutt dentro do ansiterm, porque somente o ansiterm seria bloqueado, mas a taxa de atualização era terrível (e eu não conseguia descobrir como desativar a cor de fundo no mutt). Também tentei usar o desejo de viajar, mas não consegui descobrir como configurá-lo para o gmail (tenho uma pasta da área de trabalho vazia sem nada).
Gregory Nisbet
Eu uso o mu4e, que usa um processo assíncrono para baixar e-mails. (Enviando ainda é um problema, mas geralmente menos, uma vez que é apenas uma mensagem.)
mbork

Respostas:

4

Certifique-se de que cada instância do Emacs execute um daemon com um nome exclusivo. Defina a variável server-startpara escolher o nome do servidor, por exemplo

emacs --daemon &          # Normal instance with the default server name ("server")
emacs --daemon=gnus &     # Instance for GNUS only

De um exemplo, você pode executar um código em outra instância com a função server-eval-at. O valor da expressão é retornado para a instância local. Ele precisa ser um valor que possa ser lido novamente: números inteiros, seqüências de caracteres, listas e outras estruturas de dados "transparentes" são aceitáveis, mas você pode transferir buffers, quadros etc. dessa maneira.

Você pode usar esse recurso para dizer a outra instância para abrir um quadro, para listar os nomes de buffer em outra instância, etc. Observe que se a outra instância estiver ocupada, seu código será bloqueado até responder ao daemon.

(server-eval-at "gnus" `(frame-parameter
                          (make-frame-on-display ,(frame-parameter (selected-frame) 'display))
                          window-id))

Não há muito código por aí que use esse recurso: a maioria dos usuários do Emacs executa uma única instância. Então, o que você quiser fazer, provavelmente terá que fazer algum trabalho de codificação.

Gilles 'SO- parar de ser mau'
fonte
Você pode simplesmente dizer em emacs --daemon=gnusvez deemacs --daemon --eval '(setq server-name "gnus")'
phils 4/15
0

Emacsclient

Use em vez de Emacs, o Emacsclient. Primeiro você precisa fazer um (server-start)no seu Emacs (pt) e depois executar o cliente em seu próprio quadro com emacsclient -c test.mac.

Você também pode distinguir arquivos de servidor diferentes com as opções -f ServerFile(no Windows) ou nomes de servidor -s ServerName. Veja http://www.gnu.org/software/emacs/manual/html_node/emacs/emacsclient-Options.html . Para isso, é necessário definir nomes de servidores diferentes para os diferentes Emacsen:, (setq server-name "Server1")etc.

Dieter.Wilhelm
fonte
O emacsclient pode se conectar a vários daemons?
Gregory Nisbet 4/15
Receio não entender completamente seus casos de uso. Você poderia nos dar exemplos, por favor.
precisa saber é o seguinte
11
programas de leitura de correio, como gnus ou wanderlust, bloqueiam a interface do usuário durante a atualização. Eu realmente não preciso que esses programas interajam com o resto do emacs na maioria das vezes, mas gostaria que os buffers fossem gerenciados em um único contexto, para que eu não precisasse alternar entre o emacs de email e tudo mais mais emacs. Eu sei que certos pacotes como o helm usam uma instância separada do emacs para evitar o bloqueio, e fiquei pensando se há uma maneira de exibir os buffers de outra instância do emacs em vez de reescrever parte de um cliente existente do emacs para ser menos síncrona.
Gregory Nisbet 4/15
@GregoryNisbet: Eu vejo, eu atualizei a minha resposta para incluir a sua resposta sobre vários daemons ou instâncias de servidor Emacs, espero que isso ajuda ...
Dieter.Wilhelm
2
Não seria o mesmo que executar instâncias diferentes do emacs, uma vez que uma instância do emacsclient seria capaz de acessar os buffers de apenas um servidor do emacs?
Iqbal Ansari