Emacsclient: Um único processo emacs o tempo todo, desde o início e nunca feche e oculte melhor a GUI

9

Como o emacsclient pode lidar com o longo tempo de carregamento de pacotes de forma adequada, eu realmente quero manter pelo menos um processo emacs e, na maioria das vezes, apenas um processo emacs , aberto como um processo em segundo plano e ocultando melhor a GUI.

No momento, eu defini a seguinte função no .bashrc:

emc () 
{ 
    if [[ $# -eq 0 ]]; then
        emacs --eval "(suspend-frame)" &
        return
    fi
    args=($*);
    setsid emacsclient -c -e "(find-file \"${args[*]}\")"
}

E também tenha a seguinte linha em .bashrc:

emc

Então, toda vez que eu abrir um shell, acabarei tendo um novo processo emacs.

O problema é que terei muitos processos adicionais desnecessários do emacs depois de abrir muitas conchas. No entanto, só quero manter um único processo do emacs desde a inicialização, para ocultar melhor a GUI .

falso-colecionáveis
fonte
5
Não estou familiarizado com a prática, emacs --eval "(suspend-frame)"e não emacs --daemon( emacswiki.org/emacs/EmacsAsDaemon ). Existe uma razão para você optar por não chamar o emacs como um daemon? Você pode usar algo parecido pgrep -U `whoami` emacs || emacs --daemon &para garantir que esteja em execução.
Ebpa 16/01/19
Confira os scripts do MJ Wall para usar o cliente Emacs.
Tianxiang Xiong

Respostas:

13

Eu faço isso iniciando um daemon emacs quando faço login. O local onde você coloca esse comando depende do seu gerenciador de área de trabalho. Eu uso i3, que está configurado para executar um script no logon que inclui o seguinte:

emacs --daemon &

Com isso, o emacs está sempre em execução em segundo plano, e abro um novo cliente com emacsclient -c -n, vinculado a uma conveniente combinação de teclas no gerenciador de janelas. Se você estiver trabalhando em um terminal, você só precisa de um apelido simples como alias emc='emacsclient', possivelmente com -n, -cou -targumentos, dependendo de como você usá-lo.

Confira as opções para o emacsclient no manual: ( (emacs) emacsclient Options , acessível no Emacs por C-h r m emacsclient options <enter>). Você pode usar o -asinalizador para iniciar automaticamente um daemon emacs, se ele já não estiver em execução, -cou -tabrir um novo quadro ou cliente de terminal, em vez de reutilizar um existente (na mesma sessão):

'-um comando'
'--alternate-editor = COMMAND'
     Especifique um comando para executar se 'emacsclient' falhar ao entrar em contato com o Emacs.
     Isso é útil ao executar 'emacsclient' em um script.

     Como uma exceção especial, se COMMAND for a string vazia, então
     'emacsclient' inicia o Emacs no modo daemon (como 'emacs --daemon') e
     depois tenta se conectar novamente.

'-c'
'--criar quadro'
     Crie um novo “quadro cliente” gráfico, em vez de usar um existente
     Quadro Emacs. Veja abaixo o comportamento especial de 'Cx C-c' em um
     quadro de cliente. Se o Emacs não puder criar um novo quadro gráfico (por exemplo,
     se não conseguir se conectar ao servidor X), ele tenta criar um texto
     quadro do cliente de terminal, como se você tivesse fornecido a opção '-t'
     em vez de.

'-t'
'--tty'
'-nw'
     Crie um novo quadro de cliente no terminal de texto atual, em vez de
     usando um quadro Emacs existente. Isso se comporta exatamente como o '-c'
     , descrita acima, exceto que ele cria um terminal de texto
     frame (* note Terminais sem janela: :).
Tyler
fonte
4

Se você estiver usando um sistema operacional que usa o gerenciador de serviços systemd (que atualmente inclui a maioria das distribuições GNU / Linux), a melhor solução pode ser usar o systemd para iniciar o daemon Emacs na inicialização. Você pode fazer isso criando um arquivo $HOME/.config/systemd/user/emacs.servicecom o seguinte conteúdo:

[Unit]
Description=Emacs text editor
Documentation=info:emacs man:emacs(1) https://gnu.org/software/emacs/

[Service]
Type=simple
ExecStart=/usr/bin/emacs --fg-daemon
ExecStop=/usr/bin/emacsclient --eval "(kill-emacs)"
Environment=SSH_AUTH_SOCK=%t/keyring/ssh
Restart=on-failure

[Install]
WantedBy=default.target

Então você deve iniciar o serviço e configurá-lo para iniciar automaticamente para todas as futuras botas:

$ systemctl enable --user emacs
$ systemctl start --user emacs

Agora você pode usar emacsclientcomo de costume. Se você normalmente executá-lo com os -n, -cou -topções, você pode definir um alias em sua concha. Você também pode definir as variáveis ​​de ambiente EDITORe / ou VISUALpara executar emacsclientda maneira que desejar. Por exemplo, no Bash, você pode adicionar o seguinte ao seu .bashrcarquivo:

alias emc="emacsclient -c"
export VISUAL="emacsclient -c"
export EDITOR="emacsclient -t"

Se você precisar parar o daemon Emacs, faça o seguinte:

$ systemctl stop --user emacs

E se você deseja interromper permanentemente a execução na inicialização:

$ systemctl disable --user emacs
Psychonaut
fonte
11
talvez este link para o EmacsWiki deva ser reconhecido: EmacsAsDaemon
HongboZhu
0

O modo como faço é bastante semelhante a uma resposta anterior, por ter um alias definido no meu .bashrc para emacs --daemon

alias ds="emacs --daemon"

Além disso, tenho um atalho de teclado ctrl-alt-Edefinido como emacsclient -c. Quando quero começar a trabalhar no emacs, abro um terminal, digite dse chamo cada instância do emacsclient com meu atalho.

Espero que isso ajude alguém.

Nidish Narayanaa
fonte