Como uso o emacsclient como EDITOR ou VISUAL?

10

Cenário: Estou no zsh e quero editar um comando shell longo em uma instância já aberta do Emacs. Eu configurei $VISUALpara emacsclient -n -c. Quando corro C-x C-edo zsh, um novo quadro do Emacs é aberto, preenchido com o conteúdo da linha zsh. Depois de editar e salvar o buffer, pressionei C-x ke o buffer fecha. A linha zsh permanece inalterada . Por que o zsh não reconhece as mudanças feitas no Emacs?

Emacs 24.5.1, zsh 5.0.8, Mac OS X 10.10.4

cg433n
fonte

Respostas:

11

Defina VISUALcomo emacsclient -c(ou alguma outra variação sem -n).

A opção -nfaz emacsclientcom que retorne assim que entrar em contato com a instância do Emacs em execução para solicitar a edição do arquivo. O programa que chama o editor (aqui, zsh, mas isso se aplica igualmente a qualquer outro programa que chama $VISUAL) sabe que você terminou de editar porque o programa que ele chamou saiu, o que, com -n, acontece essencialmente imediatamente.

Você precisa organizar o programa invocado VISUALpara sair quando terminar de editar, ou seja, quando você fechar o buffer no Emacs. Isso é exatamente o que emacsclientsem -nfaz: ele contata a instância Emacs correndo para dizer-lhe para abrir o arquivo, em seguida, fica em torno de até Emacs responde a dizer emacsclient que a sessão de edição é concluída. A maneira normal de terminar uma sessão de edição é pressionar C-x #( server-edit). Isso notifica o emacsclient e fecha o buffer, bem como o quadro quando ele foi aberto emacsclient -c. Fechar o buffer também notifica o processo emacsclient de que a sessão está concluída, mas você recebe um aviso ("O buffer ... ainda tem clientes, mata-o?"), Que pode ser desativado substituindo a função server-kill-buffer-query-function(o RMS acha que é perigoso). Em um quadro aberto poremacsclient -c, pressionar C-x C-c( save-buffers-kill-terminal) salva o arquivo, fecha e fecha o quadro.

Gilles 'SO- parar de ser mau'
fonte
-ntambém impedirá o emacsclient de trabalhar como editor para o git.
Cg433n
Uma tangente (e eu vou colocá-lo em outra pergunta, se você quiser), mas que uso tem a -nbandeira?
Squidly
3
@MrBones Diga que estou em um gerenciador de arquivos ou na linha de comando e desejo editar um arquivo. Não "edite um arquivo e faça algo com ele", apenas comece a editá-lo. Se eu executasse uma instância separada do Emacs por arquivo, executaria emacs myfile &(ou o equivalente do Windows), colocando o processo do Emacs entre os bastidores. Com o emacsclient, eu poderia executar emacsclient myfile &, mas isso deixa um emacsclientprocesso cujo único trabalho é esperar e sair. Em vez disso, eu corro emacsclient -n myfile, então o processo emacsclient desaparece por si só. Isso é tão comum que eu tenho um apelido de shell para ele:alias e='emacsclient -n'
Gilles 'SO- stop be evil'
@ Gilles, percebi que só corria emacsclientno terminal, e é por isso que não conseguia entender -n. Obrigado
Squidly
2
@ MrBones, eu diria que executar o emacsclient em um terminal é o motivo exato para usar -n: após abrir o envio do arquivo para o quadro Emacs aberto, o emacsclient termina e pode-se continuar trabalhando no terminal. Isso é excepcionalmente útil.
Daniel