Configuração básica do servidor Emacs no OSX

9

Eu comprei recentemente o meu primeiro Mac em uma década e estou no processo de configurá-lo. Eu sou um usuário do Emacs e decidi que quero apenas o Emacs regular, não o Aquamacs, para que eu possa usar minha configuração existente de outros sistemas operacionais. Tentei seguir muitas instruções que encontrei on-line (como este , este e este no site do qual baixei o Emacs ) e tentei combinar as peças de várias maneiras, mas nunca colocou as coisas em um estado que se aproximava do que estou acostumado / esperando:

  1. Um daemon do Emacs começa a ser executado na inicialização ou assim que eu precisar ; qualquer um está bom. Quaisquer novos quadros do Emacs são suportados pelo mesmo servidor.
  2. Quando abro um arquivo de texto no Finder, o arquivo é aberto no Emacs, em um quadro gráfico existente, se possível.
  3. Se eu executar o Emacs.app, o sistema reutiliza o daemon emacs que está sendo executado em segundo plano, em vez de iniciar uma nova instância e abrir uma nova janela nele. ( ponta do chapéu )
  4. Quando executo o Emacs a partir de um terminal, o terminal prossegue seus negócios sem esperar que eu termine com o Emacs (a menos que eu use '-nw')
  5. O AFAIK em nenhum momento durante as operações descritas acima deve o Emacs terminar em um estado ("modo de edição do servidor?") Em que ele está esperando que eu digite C-x #, embora eu não tenha um entendimento profundo desse problema.
  6. (Eu consideraria isso um bônus) Existe uma maneira de chamar o Emacs de um terminal para que o Emacs reutilize um quadro existente, se possível.

Como eu poderia configurar o Emacs para se comportar assim?

Estou particularmente perplexo ao fazer com que o Finder abra as coisas no Emacs da maneira que desejo (nº 2), pois os guias que encontrei geralmente criam vários aliases, Applescripts, scripts bash, etc. e não tenho certeza que eu quero dizer ao Finder para abrir arquivos de texto.

Obrigado!

A. O @lawlist pergunta: "Um novo quadro está sendo aberto por padrão quando você abre um novo arquivo no terminal, mesmo que exista um quadro existente?" A resposta é que, se eu iniciar um servidor na inicialização, conforme descrito aqui , abrir um quadro e, em seguida, abrir um arquivo digitando /Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n <whatever>, posso fazer com que o arquivo seja aberto em um quadro existente. Se não houver um quadro aberto no momento, tenho que usar "-nc" ou quando tento abrir um arquivo, nada acontece.

B. O @lawlist pergunta: "Você deseja que o daemon seja executado no login, ou seria suficiente carregar o Emacs manualmente após o login?" Executar manualmente seria bom.

kuzzooroo
fonte
Você pode numerá-los por favor, 1, 2, 3, 4, 5, 6 e talvez 7 e 8. Além disso, um novo quadro é aberto por padrão quando você abre um novo arquivo no terminal, mesmo que exista um quadro existente ? Conheço algumas das respostas, mas não todas, por isso os números das perguntas seriam úteis. Deseja que o daemon seja executado no logon ou seria suficiente carregar o Emacs manualmente após o logon?
lawlist
@Lauri Ranta tem uma boa resposta. M-x server-startiniciará manualmente o servidor para que ele emacsclientpossa se comunicar com ele. Coloquei (server-start)no meu init.elarquivo em vez de usar um daemon no login - no entanto, muitas pessoas preferem a opção de login do daemon. E, claro, o .emacsarquivo seria um local adequado para (server-start).
lawlist
Com relação à abertura de arquivos do Finder, suponho que você esteja muito além do estágio de precisar algo assim: dummies.com/how-to/content/… Então, supondo que isso esteja fora do caminho, provavelmente você estará para ficar bem ns-find-file- que é ativado automaticamente quando um arquivo é associado ao Emacs.app. Minha função de arquivo de interceptação nos links acima também modifica ns-find-filese isso é algo que lhe interessa. Claro, você precisa do Emacs construído --with-ns.
lawlist

Respostas:

10

Para fazer o Emacs.app abrir arquivos em um quadro existente em vez de um novo quadro, adicione (setq ns-pop-up-frames nil)a um arquivo de configuração como ~/.emacs.

Você pode abrir um arquivo de um terminal com open -a emacs fileou emacsclient -n file. Se o Emacs.app não estiver aberto, mas houver um Emacs --daemonprocesso, por algum motivo emacsclient -n filenão funcionará, mas emacsclient -nc filefuncionará.

Certifique-se de usar o emacsclientbinário incluído na versão do Emacs que você usa, como /Applications/Emacs.app/Contents/MacOS/bin/emacsclientou /usr/local/bin/emacsclientse instalou o Emacs com o Homebrew.

Para iniciar um servidor Emacs no login, por exemplo, salve este plist como ~/Library/LaunchAgents/my.emacsdaemon.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>my.emacsdaemon</string>
  <key>ProgramArguments</key>
  <array>
    <string>/Applications/Emacs.app/Contents/MacOS/Emacs</string>
    <string>--daemon</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>KeepAlive</key>
  <true/> <!-- run the program again if it terminates -->
</dict>
</plist>

O plist é carregado automaticamente na próxima vez que você fizer login, mas você pode carregá-lo imediatamente executando launchctl load ~/Library/LaunchAgents/my.emacsdaemon.plist.

Edit: Eu ainda não sei por que as pessoas estão associando tipos de arquivos a um aplicativo AppleScript em vez de apenas ao Emacs.app. O script na resposta do kuzzooroo também pode ser escrito como um shell script:

macos=/Applications/Emacs.app/Contents/MacOS
if pgrep -qf 'Emacs.*--daemon'; then
  [[ $($macos/bin/emacsclient -e '(<= 2 (length (visible-frame-list)))') = t ]] && args=-nc || args=-n
else
  $macos/Emacs --daemon
  args=-nc
fi
$macos/bin/emacsclient $args "$@"
open -a /Applications/Emacs.app

Você pode usar o Platypus para salvar o script como um aplicativo:

Comecei a usar o Emacs, mas tenho uma configuração completamente diferente. Criei meu próprio aplicativo Emacs fazendo uma cópia do iTerm.app, alterando o CFBundleIdentifier no Info.plist para que o aplicativo use um arquivo de preferências diferente e definindo o comando padrão como /usr/local/bin/emacs. Eu adicionei (server-start)a ~/.emacse eu abrir o aplicativo Emacs costume no início da sessão. Usei o Platypus para criar um aplicativo que é executado emacsclient -n "$@";open -b my.emacse o tornei o aplicativo padrão para arquivos de texto.

Lri
fonte
2

A solução da Lauri, combinada com sugestões dos comentários, abordou amplamente meus problemas. Eu colei abaixo alguns Applescript que eu juntei de coisas que encontrei online. O script ajuda a suavizar algumas rugas restantes, por exemplo, seu comportamento é um pouco melhor se não houver um quadro atual do Emacs.

EDIT: o objetivo do script é ser associado aos arquivos .txt no Finder.

-- http://superuser.com/questions/457484/how-to-open-emacs-from-macs-finder
-- https://gist.github.com/ambethia/304964#comment-799519
on run {input}
    set filepath to quoted form of POSIX path of input
    tell application "Terminal"
        try
            -- we look for <= 2 because Emacs --daemon seems to always have an entry in visibile-frame-list even if there isn't
            set frameVisible to do shell script "/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -e '(<= 2 (length (visible-frame-list)))'"
            if frameVisible is "t" then
                do shell script "/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n " & filepath
            else
                -- there is a not a visible frame, launch one
                do shell script "/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -c -n " & filepath
            end if
        on error
            -- daemon is not running, start the daemon and open a frame     
            do shell script "/Applications/Emacs.app/Contents/MacOS/Emacs --daemon"
            do shell script "/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -c -n"
        end try
    end tell

    -- bring the visible frame to the front
    tell application "Emacs" to activate

    return input
end run
kuzzooroo
fonte