Como lançar GUI Emacs da linha de comando no OSX?

91

Como eu inicio GUI Emacs da linha de comando no OSX?

Baixei e instalei o Emacs em http://emacsformacosx.com/ .

Aceitarei uma resposta que cumpra todos os seguintes critérios:

  1. A janela do emacs abre na frente da janela do meu terminal.
  2. Digitar "emacs" abre uma janela GUI do Emacs. Encontrar arquivos nessa janela irá, por padrão, procurar no diretório de onde iniciei o Emacs.
  3. Digitar "emacs foo.txt" quando foo.txt existe abre uma janela GUI do Emacs com foo.txt carregado.
  4. Digitar "emacs foo.txt" quando foo.txt não existe abre uma janela GUI do Emacs com um buffer de texto vazio chamado "foo.txt". Fazer ^ X ^ S naquele buffer salvará foo.txt no diretório de onde iniciei o Emacs.
Johan Walles
fonte
Quais desses critérios não são atendidos inserindo 'emacs' em um prompt de terminal? Seus requisitos descrevem o comportamento padrão no Linux. Faz um tempo que não uso um Mac, mas acho que o truque era apenas encontrar o programa certo para executar - emacs.app talvez?
Tyler de
8
Tyler, vindo de uma experiência Linux, estou com você o tempo todo; apenas digitar "emacs" no prompt deve ser tudo que eu preciso fazer. Fazer isso no OSX inicia o modo de texto Emacs na janela do terminal (portanto, falha no critério 1), e não é isso que eu quero.
Johan Walles,
1
Johan - você encontrou uma solução entretanto? Estou lutando com os mesmos problemas e penso em começar uma recompensa. Especialmente irritante é que chamar o emacs (e não o Emacs.app) da linha de comando abre uma janela em segundo plano ...
alexurba
1
@DougHarris Meus requisitos correspondem à realidade em qualquer distribuição Linux, é de onde eles vêm. Estou feliz por você ter encontrado um fluxo de trabalho que funciona para você. Felicidades!
Johan Walles,
2
Não sei se funciona no OSX, mas você pode tentar: emacsclient -c -a "" "$@"command
jfs

Respostas:

113

Chame o seguinte script de "emacs" e coloque-o em PATHalgum lugar:

#!/bin/sh
/Applications/Emacs.app/Contents/MacOS/Emacs "$@"

Isso cobre os números 2, 3 e 4.

Para o nº 1, coloque isso em algum lugar do seu arquivo .emacs:

(x-focus-frame nil)

O site emacsformacosx.com agora tem uma página How-To , que é de onde veio o trecho principal. Há mais informações sobre como executar emacscliente conectar o Emacs git mergetool.

David Caldwell
fonte
1
Obrigado David, você manda!
Johan Walles
1
Funciona bem. Bounty em breve.
Tamzin Blake
2
No Mavericks, se estou em uma pasta ~/fooe desejo abrir bar.txt, digito, gmacs bar.txtmas ele cria um novo arquivo em em ~/bar.txtvez de abrir ~foo/bar.txt. Estou fazendo algo errado?
Daniel Compton
2
Onde está o arquivo .emacs?
Bren
1
Você não pode adicionar (x-focus-frame nil) em qualquer lugar, tem que estar dentro da expressão (custom-set-variables), que o emacs criará para você assim que você configurar qualquer coisa por meio da customização. Basta personalizar algo na barra de menu, como ativar o "cursor piscante" (e desativar se você não gostar) e essa seção será criada em seu .emacs. Além disso, isso é testado? Não tenho certeza se o emacs no Cocoa vai respeitar essa configuração.
Chuck Adams
70

No seu shell, use o alias do comando 'emacs' para apontar para o aplicativo OSX emacs

No meu shell (executando o bash padrão), tenho o seguinte (no meu .bashrc)

alias emacs='open -a /Applications/Emacs.app $1'

Em seguida, digitar emacs na linha de comando inicia o aplicativo emacs.

Eu recomendaria, entretanto, que você abra uma cópia do emacs e apenas mantenha-o instalado e funcionando. Se for esse o caso, e você quiser carregar um arquivo em uma cópia existente do emacs, pode usar o emacsclient colocando o seguinte em seu .bashrc:

alias ec='/Applications/Emacs.app/Contents/MacOS/bin/emacsclient'

Em seguida, adicione o seguinte ao seu arquivo .emacs para iniciar o servidor emacs (que recebe as chamadas emacsclient)

;;========================================
;; start the emacsserver that listens to emacsclient
(server-start)

Então você pode digitar

ec .bashrc

para carregar uma cópia do .bashrc em uma sessão existente do emacs!

Chris McMahan
fonte
4
Oi Cris! Sua primeira resposta falha nos critérios 2 e 4. Sua segunda resposta falha no critério 2. Estou procurando uma solução que atenda a todos os critérios numerados. Atenciosamente / Johan
Johan Walles
3
Parece que todos os seus problemas poderiam ser resolvidos se você simplesmente usasse o próprio emacs para carregar os arquivos, em vez de depender de uma linha de comando para iniciar uma nova instância a cada vez. Normalmente inicio o emacs no início do dia (se ainda não estiver em execução) e o uso para carregar arquivos, alterar diretórios, criar novos arquivos e tudo o mais que eu quiser, sem nunca tocar na janela do terminal.
Chris McMahan
Devo dizer que existem várias dessas questões neste site que tratam dessa questão, mas esta é a única que resolve totalmente o problema de também abrir um arquivo, de forma curta e eloquente.
tylerthemiler
3
@tylerthemiler, onde está a resposta que resolve totalmente o problema? Ambas as respostas nesta resposta falham no critério 2 e a primeira falha 4 também.
Johan Walles
5
Um pouco de tato ajuda muito na resposta a uma pergunta. O mesmo acontece com um pouco de Googling.
Duma
10

Isso melhora a resposta de David Caldwell ao iniciar o Emacs em segundo plano:

#!/bin/sh
$(/Applications/Emacs.app/Contents/MacOS/Emacs "$@") &

Conforme declarado na outra resposta, isso cobre os números 2, 3 e 4. Para # 1, colocar isso em algum lugar no seu arquivo .emacs: (x-focus-frame nil).

Observe que o seguinte não funciona para mim - não inicia o Emacs em um diretório especificado na linha de comando (por exemplo emacs .)

# NOT RECOMMENDED
#!/bin/sh
/Applications/Emacs.app/Contents/MacOS/Emacs "$@" &
David J.
fonte
1
Isso corrige um problema com OSX (talvez começando com 10.9 Mavericks). A partir de 10.9, o método "não recomendado" falha, onde até pelo menos 10.6, o não recomendado sincroniza o shell $ PWD e Emacs (pwd). A resposta de David pode estar em outro lugar, mas como você faz os mecanismos de pesquisa entenderem: "pwd não pwd"?
infogizmo
5

Suponho que você também:

  • Inicie o daemon emacs no login
  • Tenha (início do servidor) em seu .emacs
  • Não se importe de ter muitas cópias separadas do emacs rodando

Se sim, então acho que isso satisfaz os quatro critérios originais, mais um:

  1. A janela do emacs abre na frente da janela do meu terminal.

ele sempre abrirá em primeiro plano (com x-focus-frame).

  1. Digitar "emacs" abre uma janela GUI do Emacs. Encontrar arquivos nessa janela irá, por padrão, procurar no diretório de onde iniciei o Emacs.

Ele irá abrir uma janela existente do emacs no modo dired.

  1. Digitar "emacs foo.txt" quando foo.txt existe abre uma janela GUI do Emacs com foo.txt carregado.

Se o emacs já estiver em execução e tiver um servidor, ele será aberto na janela existente e entrará em primeiro plano.

  1. Digitar "emacs foo.txt" quando foo.txt não existe abre uma janela GUI do Emacs com um buffer de texto vazio chamado "foo.txt". Fazer ^ X ^ S naquele buffer salvará foo.txt no diretório de onde iniciei o Emacs.

Corrigir.

Um extra:

O controle retorna à sessão do terminal imediatamente após digitar o comando.

~ / bin / emacs

#!/bin/bash
EMACSPATH=/Applications/Emacs.app/Contents/MacOS

# Check if an emacs server is available 
# (by checking to see if it will evaluate a lisp statement)

if ! (${EMACSPATH}/bin/emacsclient --eval "t"  2> /dev/null > /dev/null )
then
    # There is no server available so,
    # Start Emacs.app detached from the terminal 
    # and change Emac's directory to PWD

    nohup ${EMACSPATH}/Emacs --chdir "${PWD}" "${@}" 2>&1 > /dev/null &
else
    # The emacs server is available so use emacsclient

    if [ -z "${@}" ]
    then
        # There are no arguments, so
        # tell emacs to open a new window

        ${EMACSPATH}/bin/emacsclient --eval "(list-directory \"${PWD}\")"
    else    
        # There are arguments, so
        # tell emacs to open them

        ${EMACSPATH}/bin/emacsclient --no-wait "${@}"
    fi

    # Bring emacs to the foreground

    ${EMACSPATH}/bin/emacsclient --eval "(x-focus-frame nil)"
fi
O dave
fonte
Impressionante! Parece que suas pernas args e não-args estão trocadas.
eriksensei
4

Solução simples ...

Muitas soluções muito complexas para este problema são postadas aqui. Isso é justo porque não parece trivial.

No entanto, essa solução funciona muito bem para mim.

ec() {
  emacsclient -n $@ 2> /dev/null
  if [[ $? == 1 ]]; then
    open -a Emacs.app  -- $@
  fi
}

Uso

ec file [...]

Vamos desvendar o que está acontecendo:

  1. passe todos os ecargumentos para o emacsclient e não ( -n) espere pelo emacs antes de continuar.
    1. Se o Emacs já estiver em execução, terminaremos e você estará editando.
  2. engula a mensagem de erro postada pelo emacsclient quando não há emacs em execução. ( 2> /dev/null)
  3. Manuseie manualmente o código de saída 1( [[ $? == 1 ]])
    1. abra o Emacs.app e passe os argumentos do arquivo para ele (os caminhos serão abertos corretamente).
    2. Tudo pronto e o Emacs abriu seus arquivos.
ocodo
fonte
3

Acabei de construir o emacs com o gerenciador de pacotes homebrew de acordo com este guia: http://www.emacswiki.org/emacs/EmacsForMacOS com brew install --cocoa emacs Depois disso, deve-se iniciar a versão .app para obter gui, que no meu caso era /usr/local/Cellar/emacs/24.3/Emacs.app/Contents/MacOS/Emacs

Yuriy Skvortsov
fonte
--cocoa foi preterido; usando --with-cocoa!
Erwin Rooijakkers de
3

Para melhorar ainda mais a resposta de David James, o seguinte funciona para mim:

De acordo com as instruções para abrir um arquivo de um terminal encontrado em http://www.emacswiki.org/emacs/EmacsForMacOS#toc20

open -a /Applications/Emacs.app <file-name>

combinando isso com a resposta de David Jame, criei o seguinte script emax bash e coloquei-o em meu caminho em ~ / bin

#!/bin/bash
(open -a /Applications/Emacs.app "$@") &

Advertência : para fazer com que o emacs abra o diretório atual no modo Dired by name , você precisa usar

emax .

Meio Ambiente:

  • OS X Yosemite Versão 10.10.2
  • GNU Emacs 24.4.2 (x86_64-apple-darwin14.0.0, NS apple-appkit-1343.14) de 2014-11-13
sbecker11
fonte
Isso só funciona para um arquivo existente, não criará um se não estiver lá
Stíofán.
Estou usando o macOS 10.15 (Catalina) e parece que funciona da primeira vez (quando o Emacs ainda não está aberto), mas não funciona da segunda vez (quando uma janela do Emacs já está aberta). Você sabe como consertar isso?
user102008
1

As outras respostas aqui não funcionaram muito bem para mim. Em particular, na minha máquina, o script bash

#!/bin/sh
/Applications/Emacs.app/Contents/MacOS/Emacs "$@" 

sempre abre o emacs no diretório inicial. Para abri-lo no diretório de trabalho atual, tive que fazer

#!/bin/sh
/Applications/Emacs.app/Contents/MacOS/Emacs "$PWD/$@"

em vez de.

jackkamm
fonte
1
Minha construção / instalação específica não tem esse problema, mas há um problema com sua solução. Se você tentar abrir mais de um arquivo, apenas o primeiro será expandido para o diretório PWD. O resto não terá um caminho $ PWD prefixado.
kmarsh
0

Compile o Emacs de acordo com as seguintes etapas:

./configure --with-x --prefix=/usr
make
sudo make install

E você está pronto! Pode ajudar baixar e instalar o XQuartz, mas é apenas minha opinião.

ancinho
fonte
0

Este é o meu script para abrir emacs / emacsclient no osx.

#!/bin/bash

# Ensure (server-start) is added in your emacs init script.

EMACS=/Applications/MacPorts/Emacs.app/Contents/MacOS/Emacs
EMACSCLIENT=/Applications/Macports/Emacs.app/\
Contents/MacOS/bin/emacsclient

# test if client already exsit.
$EMACSCLIENT -e "(frames-on-display-list)" &>/dev/null

# use emacsclient to connect existing server.
if [ $? -eq 0 ]; then
    $EMACSCLIENT -n "$@"
# open emacs.app instead.
else
    `$EMACS "$@"` &
fi
Koren.H
fonte
0

Em todos os itens acima, ao usar "abrir" - certifique-se de usar a opção "--args"

Não faça isso:

alias emacs='open -a /Applications/Emacs.app $1'

Em vez disso:

alias emacs='open -a /Applications/Emacs.app --args $1'

a --argsopção evita que "open" consuma várias opções destinadas ao Emacs.

user3696153
fonte