Come avviare la GUI Emacs dalla riga di comando in OSX?


91

Come avvio la GUI Emacs dalla riga di comando in OSX?

Ho scaricato e installato Emacs da http://emacsformacosx.com/ .

Accetto una risposta che soddisfi tutti i seguenti criteri:

  1. La finestra di emacs si apre davanti alla finestra del mio terminale.
  2. Digitando "emacs" si avvia una finestra Emacs della GUI. La ricerca di file in quella finestra farà per impostazione predefinita la ricerca nella directory da cui ho avviato Emacs.
  3. Digitando "emacs foo.txt" quando foo.txt esiste, si avvia una finestra Emacs della GUI con foo.txt caricato.
  4. Digitando "emacs foo.txt" quando foo.txt non esiste lancia una finestra Emacs della GUI con un buffer di testo vuoto chiamato "foo.txt". Facendo ^ X ^ S in quel buffer salverai foo.txt nella directory da cui ho avviato Emacs.

Quali di questi criteri non vengono soddisfatti inserendo "emacs" al prompt del terminale? I tuoi requisiti descrivono il comportamento predefinito su Linux. Non uso un Mac da un po ', ma penso che il trucco sia stato trovare il programma giusto da eseguire - forse emacs.app?
Tyler

8
Tyler, provenendo da un ambiente Linux, sono con te per tutto il tempo; basta digitare "emacs" al prompt dovrebbe essere tutto ciò che devo fare. Farlo su OSX avvia comunque la modalità testo Emacs nella finestra del terminale (quindi fallendo il criterio 1), e non è quello che voglio.
Johan Walles

1
Johan, nel frattempo hai trovato una soluzione? Sto lottando con gli stessi problemi e penso di iniziare una taglia. Particolarmente fastidioso è che chiamando emacs (e non Emacs.app) dalla riga di comando si apre una finestra in background ...
alexurba

1
@DougHarris I miei requisiti corrispondono alla realtà su qualsiasi distribuzione Linux, ecco da dove vengono. Sono felice che tu abbia trovato un flusso di lavoro che funziona per te. Saluti!
Johan Walles

2
Non so se funziona su OSX ma potresti provare: emacsclient -c -a "" "$@"command
jfs

Risposte:


113

Chiama il seguente script "emacs" e mettilo da PATHqualche parte:

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

Questo copre # 2, # 3 e # 4.

Per # 1, mettilo da qualche parte nel tuo file .emacs:

(x-focus-frame nil)

Il sito emacsformacosx.com ora ha una pagina How-To , da cui proviene lo snippet principale. Ci sono ulteriori informazioni su come eseguire emacscliente collegare Emacs git mergetool.


1
Grazie David, regni tu!
Johan Walles

1
Funziona alla grande. Bounty in arrivo.
Tamzin Blake

2
Su Mavericks se sono nella cartella ~/fooe voglio aprire, bar.txtdigito gmacs bar.txtma crea un nuovo file ~/bar.txtinvece di aprirlo ~foo/bar.txt. Sto facendo qualcosa di sbagliato?
Daniel Compton,

2
Dov'è il file .emacs?
Bren

1
Non puoi aggiungere (x-focus-frame nil) ovunque, deve essere all'interno dell'espressione (custom-set-variables), che emacs creerà per te una volta che hai impostato qualcosa tramite la personalizzazione. Personalizza semplicemente qualcosa dalla barra dei menu, come impostare "cursore lampeggiante" su (poi disattivarlo se non ti piace) e quella sezione verrà creata nel tuo .emacs. Inoltre, è anche testato? Non sono sicuro che emacs su Cocoa rispetterà questa impostazione.
Chuck Adams

70

Nella tua shell, alias il comando 'emacs' per puntare all'applicazione OSX emacs

Nella mia shell (che esegue la bash predefinita), ho quanto segue (nel mio .bashrc)

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

Quindi, digitando emacs sulla riga di comando si avvia l'applicazione emacs.

Tuttavia, ti consiglio di aprire una copia di emacs e di mantenerlo attivo e funzionante. In questo caso, e vuoi caricare un file in una copia esistente di emacs, puoi usare emacsclient inserendo quanto segue nel tuo .bashrc:

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

Quindi aggiungi quanto segue al tuo file .emacs per avviare il server emacs (che riceve le chiamate emacsclient)

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

Quindi puoi digitare

ec .bashrc

caricare una copia di .bashrc in una sessione emacs esistente!


4
Ciao chris! La tua prima risposta non soddisfa i criteri 2 e 4. La tua seconda risposta non supera il criterio 2. Sto cercando una soluzione che soddisfi tutti i criteri numerati. Saluti / Johan
Johan Walles

3
Sembra che tutti i tuoi problemi potrebbero essere risolti se hai semplicemente usato emacs stesso per caricare i file, piuttosto che fare affidamento su una riga di comando per avviare ogni volta una nuova istanza. Di solito avvio emacs all'inizio della mia giornata (se non è ancora in esecuzione) e lo uso per caricare file, cambiare directory, creare nuovi file e qualsiasi altra cosa voglio senza mai toccare la finestra del terminale.
Chris McMahan

Devo dire che ci sono molte di queste domande su questo sito che trattano questa domanda, ma questa è l'unica che risolve completamente il problema dell'apertura anche di un file, in modo breve ed eloquente.
tylerthemiler

3
@tylerthemiler, dov'è la risposta che risolve completamente il problema? Entrambe le risposte in questa risposta non soddisfano il criterio 2 e anche la prima non supera il 4.
Johan Walles

5
Un po 'di tatto fa molto per ottenere una risposta a una domanda. Così fa un po 'di ricerca su Google.
duma

10

Questo migliora la risposta di David Caldwell avviando Emacs in background:

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

Come affermato nell'altra risposta, questo copre # 2, # 3 e # 4. Per 1 #, mettere questo da qualche parte nel vostro file .emacs: (x-focus-frame nil).

Nota che quanto segue non funziona per me - non avvia Emacs in una directory specificata sulla riga di comando (ad esempio emacs .)

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

1
Questo risolve un problema con OSX (forse a partire da 10.9 Mavericks). A partire dalla 10.9, il metodo "sconsigliato" fallisce, mentre fino ad almeno 10.6, lo sconsigliato sincronizzava la shell $ PWD ed Emacs (pwd). La risposta di David potrebbe essere altrove, ma come fai a far capire ai motori di ricerca: "pwd non pwd"?
infogizmo

5

Presumo che tu:

  • Avvia il demone emacs all'accesso
  • Avere (server-start) nel tuo .emacs
  • Non importa avere molte copie separate di emacs in esecuzione

Se è così, penso che questo soddisfi i quattro criteri originali, più uno in più:

  1. La finestra di emacs si apre davanti alla finestra del mio terminale.

si aprirà sempre in primo piano (con x-focus-frame).

  1. Digitando "emacs" si avvia una finestra Emacs della GUI. La ricerca di file in quella finestra farà per impostazione predefinita la ricerca nella directory da cui ho avviato Emacs.

Aprirà una finestra di emacs esistente in modalità dired.

  1. Digitando "emacs foo.txt" quando foo.txt esiste, si avvia una finestra Emacs della GUI con foo.txt caricato.

Se emacs è già in esecuzione e ha un server, allora si aprirà nella finestra esistente e verrà in primo piano.

  1. Digitando "emacs foo.txt" quando foo.txt non esiste lancia una finestra Emacs della GUI con un buffer di testo vuoto chiamato "foo.txt". Facendo ^ X ^ S in quel buffer salverai foo.txt nella directory da cui ho avviato Emacs.

Corretta.

Un extra:

Il controllo ritorna alla sessione del terminale immediatamente dopo aver digitato il 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

Eccezionale! Tuttavia, sembra che le tue gambe senza argomenti siano cambiate.
eriksensei


4

Soluzione semplice ...

Molte soluzioni molto complesse a questo problema sono pubblicate qui. È giusto perché sembra non banale.

Tuttavia, questa soluzione funziona davvero bene per me.

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

Utilizzo

ec file [...]

Spacchiamo cosa sta succedendo:

  1. passa tutti gli ecargomenti a emacsclient e non (-n ) aspetta emacs prima di continuare.
    1. Se Emacs è già in esecuzione, abbiamo finito e stai modificando.
  2. inghiottire il messaggio di errore inviato da emacsclient quando non c'è emacs in esecuzione. (2> /dev/null )
  3. Gestisci manualmente il codice di uscita 1([[ $? == 1 ]] )
    1. apri Emacs.app e passagli gli argomenti del file (i percorsi verranno aperti correttamente).
    2. Hai finito ed Emacs ha aperto i tuoi file.


3

Migliorando ulteriormente la risposta di David James, i seguenti lavori per me:

Per istruzioni per aprire un file da un terminale disponibile su http://www.emacswiki.org/emacs/EmacsForMacOS#toc20

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

combinando questo con la risposta di David Jame ho creato il seguente script bash emax e l'ho inserito nel mio percorso in ~ / bin

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

Avvertenza : per fare in modo che emacs apra la directory corrente in modalità Dired by name , è necessario utilizzare

emax .

Ambiente:

  • OS X Yosemite versione 10.10.2
  • GNU Emacs 24.4.2 (x86_64-apple-darwin14.0.0, NS apple-appkit-1343.14) del 13/11/2014

Funziona solo per un file esistente, non ne creerà uno se non è presente
Stíofán.

Sto usando macOS 10.15 (Catalina), e sembra che funzioni la prima volta (quando Emacs non è già aperto), ma non funziona la seconda volta (quando una finestra di Emacs è già aperta). Sai come aggiustarlo?
user102008

1

Le altre risposte qui non hanno funzionato per me. In particolare, sulla mia macchina, lo script bash

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

apre sempre emacs nella directory home. Per farlo aprire nella directory di lavoro corrente, ho dovuto fare

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

anziché.


1
La mia build / installazione particolare non presenta questo problema, ma c'è un problema con la tua soluzione. Se provi ad aprire più di un file, solo il primo si espanderà nella directory PWD. Il resto non avrà un percorso $ PWD come prefisso.
kmarsh

0

Compilare Emacs secondo i seguenti passaggi:

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

E hai finito! Può essere utile scaricare e installare XQuartz, ma questa è solo la mia opinione.


0

Questo è il mio script per aprire emacs / emacsclient su 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

0

In tutto quanto sopra, quando usi "open", assicurati di usare l'opzione "--args"

Non farlo:

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

Invece questo:

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

l' --argsopzione impedisce ad "open" di consumare varie opzioni previste per Emacs.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.