Wie starte ich GUI Emacs über die Befehlszeile in OSX?


91

Wie starte ich GUI Emacs über die Befehlszeile in OSX?

Ich habe Emacs von http://emacsformacosx.com/ heruntergeladen und installiert .

Ich akzeptiere eine Antwort, die alle folgenden Kriterien erfüllt:

  1. Das Emacs-Fenster öffnet sich vor meinem Terminalfenster.
  2. Durch Eingabe von "emacs" wird ein GUI-Emacs-Fenster geöffnet. Wenn Sie Dateien in diesem Fenster suchen, suchen Sie standardmäßig in dem Verzeichnis, in dem ich Emacs gestartet habe.
  3. Wenn Sie "emacs foo.txt" eingeben, wenn foo.txt vorhanden ist, wird ein GUI-Emacs-Fenster mit geladener foo.txt geöffnet.
  4. Wenn Sie "emacs foo.txt" eingeben, wenn foo.txt nicht vorhanden ist, wird ein GUI-Emacs-Fenster mit einem leeren Textpuffer namens "foo.txt" geöffnet. Wenn Sie ^ X ^ S in diesem Puffer ausführen, wird foo.txt in dem Verzeichnis gespeichert, in dem ich Emacs gestartet habe.

Welche dieser Kriterien werden durch die Eingabe von 'emacs' an einer Terminal-Eingabeaufforderung nicht erfüllt? Ihre Anforderungen beschreiben das Standardverhalten unter Linux. Ich habe seit einiger Zeit keinen Mac mehr benutzt, aber ich denke, der Trick bestand darin, das richtige Programm zum Ausführen zu finden - vielleicht emacs.app?
Tyler

8
Tyler, ich komme aus Linux und bin den ganzen Weg bei dir. Ich muss nur "emacs" an der Eingabeaufforderung eingeben. Wenn Sie dies unter OSX tun, wird jedoch der Textmodus Emacs im Terminalfenster gestartet (wodurch Kriterien 1 nicht erfüllt werden), und das ist nicht das, was ich will.
Johan Walles

1
Johan - hast du in der Zwischenzeit eine Lösung gefunden? Ich kämpfe mit den gleichen Problemen und denke darüber nach, ein Kopfgeld zu starten. Besonders ärgerlich ist, dass das Aufrufen von emacs (und nicht von Emacs.app) über die Befehlszeile ein Fenster im Hintergrund öffnet ...
alexurba

1
@DougHarris Meine Anforderungen entsprechen der Realität in jeder Linux-Distribution, daher kommen sie von dort. Ich bin froh, dass Sie einen Workflow gefunden haben, der für Sie funktioniert. Prost!
Johan Walles

2
Ich weiß nicht, ob es unter OSX funktioniert, aber Sie könnten versuchen: emacsclient -c -a "" "$@"Befehl
jfs

Antworten:


113

Nennen Sie das folgende Skript "emacs" und fügen Sie es PATHirgendwo ein:

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

Das umfasst # 2, # 3 und # 4.

Fügen Sie dies für # 1 irgendwo in Ihre .emacs-Datei ein:

(x-focus-frame nil)

Auf der Website emacsformacosx.com befindet sich jetzt eine Seite mit Anleitungen , von der das oberste Snippet stammt. Dort gibt es weitere Informationen zum Laufen emacsclientund Anschließen von Emacs git mergetool.


1
Danke David, du herrschst!
Johan Walles

1
Funktioniert super. Kopfgeld bevorstehend.
Tamzin Blake

2
Wenn ich mich auf Mavericks im Ordner befinde ~/foound öffnen möchte, tippe bar.txtich, gmacs bar.txtaber es wird eine neue Datei erstellt, ~/bar.txtanstatt sie zu öffnen ~foo/bar.txt. Mache ich etwas falsch?
Daniel Compton

2
Wo ist die .emacs-Datei?
Bren

1
Sie können (x-focus-frame nil) nicht überall hinzufügen, es muss sich innerhalb des Ausdrucks (custom-set-variables) befinden, den Emacs für Sie erstellt, sobald Sie durch Anpassung etwas festgelegt haben. Passen Sie einfach etwas in der Menüleiste an, z. B. "Blinkender Cursor" ein (und dann aus, wenn Sie es nicht mögen), und dieser Abschnitt wird in Ihren .emacs erstellt. Auch ist das überhaupt getestet? Ich bin mir nicht sicher, ob Emacs auf Cocoa diese Einstellung überhaupt respektieren werden.
Chuck Adams

70

Aliasen Sie in Ihrer Shell den Befehl 'emacs', um auf die OSX-Emacs-Anwendung zu verweisen

In meiner Shell (mit der Standard-Bash) habe ich Folgendes (in meiner .bashrc)

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

Wenn Sie dann emacs in die Befehlszeile eingeben, wird die emacs-Anwendung gestartet.

Ich würde jedoch empfehlen, dass Sie eine Kopie von Emacs öffnen und sie einfach am Laufen halten. Wenn dies der Fall ist und Sie eine Datei in eine vorhandene Kopie von Emacs laden möchten, können Sie den Emacsclient verwenden, indem Sie Folgendes in Ihre .bashrc-Datei einfügen:

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

Fügen Sie dann Folgendes zu Ihrer .emacs-Datei hinzu, um den Emacs-Server zu starten (der die Emacsclient-Aufrufe empfängt).

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

Dann können Sie tippen

ec .bashrc

um eine Kopie von .bashrc in eine vorhandene Emacs-Sitzung zu laden!


4
Hallo Chris! Ihre erste Antwort besteht die Kriterien 2 und 4 nicht. Ihre zweite Antwort besteht die Kriterien 2 nicht. Ich suche nach einer Lösung, die alle nummerierten Kriterien erfüllt. Grüße / Johan
Johan Walles

3
Es scheint, dass alle Ihre Probleme gelöst werden könnten, wenn Sie lediglich emacs selbst zum Laden der Dateien verwenden würden, anstatt sich jedes Mal auf eine Befehlszeile zu verlassen, um eine neue Instanz zu starten. Normalerweise starte ich Emacs zu Beginn meines Tages (wenn es noch nicht ausgeführt wird) und verwende es zum Laden von Dateien, Ändern von Verzeichnissen, Erstellen neuer Dateien und was auch immer ich möchte, ohne jemals das Terminalfenster zu berühren.
Chris McMahan

Ich muss sagen, es gibt einige dieser Fragen auf dieser Site, die sich mit dieser Frage befassen, aber dies ist die einzige, die das Problem des Öffnens einer Datei auf kurze, beredte Weise vollständig löst.
Tylerthemiler

3
@tylerthemiler, wo ist die Antwort, die das Problem vollständig löst? Beide Antworten in dieser Antwort schlagen Kriterium 2 und die erste 4 ebenfalls fehl.
Johan Walles

5
Ein wenig Fingerspitzengefühl trägt wesentlich dazu bei, eine Frage zu beantworten. Ein bisschen googeln auch.
Duma

10

Dies verbessert die Antwort von David Caldwell, indem Emacs im Hintergrund gestartet wird:

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

Wie in der anderen Antwort angegeben, umfasst dies # 2, # 3 und # 4. Fügen Sie dies für # 1 irgendwo in Ihre .emacs-Datei ein : (x-focus-frame nil).

Beachten Sie, dass die folgenden Fälle nicht für mich arbeiten - es ist nicht Emacs startet in einem Verzeichnis auf der Kommandozeile angegeben (zB emacs .)

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

1
Dies behebt ein Problem mit OSX (möglicherweise ab 10.9 Mavericks). Ab 10.9 schlägt die "nicht empfohlene" Methode fehl, wobei bis mindestens 10.6 die nicht empfohlene Methode die Shell $ PWD und Emacs (pwd) synchronisiert hat. Davids Antwort könnte anderswo sein, aber wie bringen Sie Suchmaschinen dazu, zu verstehen: "pwd not pwd"?
Infogizmo

5

Ich nehme an, Sie auch:

  • Starten Sie den Emacs-Daemon beim Anmelden
  • Haben (Server-Start) in Ihren .emacs
  • Es macht nichts aus, wenn viele separate Kopien von Emacs ausgeführt werden

Wenn ja, dann erfüllt dies meiner Meinung nach die ursprünglichen vier Kriterien plus eines:

  1. Das Emacs-Fenster öffnet sich vor meinem Terminalfenster.

Es öffnet sich immer zum Vordergrund (mit X-Focus-Frame).

  1. Durch Eingabe von "emacs" wird ein GUI-Emacs-Fenster geöffnet. Wenn Sie Dateien in diesem Fenster suchen, suchen Sie standardmäßig in dem Verzeichnis, in dem ich Emacs gestartet habe.

Es wird ein vorhandenes Emacs-Fenster im Dired-Modus geöffnet.

  1. Wenn Sie "emacs foo.txt" eingeben, wenn foo.txt vorhanden ist, wird ein GUI-Emacs-Fenster mit geladener foo.txt geöffnet.

Wenn emacs bereits ausgeführt wird und einen Server hat, wird es im vorhandenen Fenster geöffnet und in den Vordergrund gerückt.

  1. Wenn Sie "emacs foo.txt" eingeben, wenn foo.txt nicht vorhanden ist, wird ein GUI-Emacs-Fenster mit einem leeren Textpuffer namens "foo.txt" geöffnet. Wenn Sie ^ X ^ S in diesem Puffer ausführen, wird foo.txt in dem Verzeichnis gespeichert, in dem ich Emacs gestartet habe.

Richtig.

Ein Extra:

Die Steuerung kehrt unmittelbar nach Eingabe des Befehls zur Terminalsitzung zurück.

~ / 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

Genial! Es sieht so aus, als ob Ihre Args- und No-Args-Beine vertauscht sind.
Eriksensei


4

Einfache Lösung ...

Viele sehr komplexe Lösungen für dieses Problem finden Sie hier. Das ist fair, weil es nicht trivial erscheint.

Diese Lösung funktioniert jedoch sehr gut für mich.

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

Verwendung

ec file [...]

Packen wir aus, was passiert:

  1. ecÜbergeben Sie alle Argumente an emacsclient und -nwarten Sie nicht ( ) auf emacs, bevor Sie fortfahren.
    1. Wenn Emacs bereits ausgeführt wird, sind wir alle fertig und Sie bearbeiten.
  2. Schlucken Sie die von emacsclient gepostete Fehlermeldung, wenn keine Emacs ausgeführt werden. ( 2> /dev/null)
  3. Behandeln Sie den Exit-Code manuell 1( [[ $? == 1 ]])
    1. Öffnen Sie Emacs.app und übergeben Sie Dateiargumente (Pfade werden korrekt geöffnet.)
    2. Sie sind fertig und Emacs hat Ihre Dateien geöffnet.


3

Die Reaktion von David James weiter zu verbessern, funktioniert für mich wie folgt:

Anweisungen zum Öffnen einer Datei über ein Terminal finden Sie unter http://www.emacswiki.org/emacs/EmacsForMacOS#toc20

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

In Kombination mit der Antwort von David Jame habe ich das folgende Emax- Bash-Skript erstellt und es in meinen Pfad unter ~ / bin gestellt

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

Vorsichtsmaßnahme : Damit Emacs das aktuelle Verzeichnis im Modus " Dired by Name" öffnen können, müssen Sie Folgendes verwenden

emax .

Umgebung:

  • OS X Yosemite Version 10.10.2
  • GNU Emacs 24.4.2 (x86_64-apple-darwin14.0.0, NS apple-appkit-1343.14) vom 13.11.2014

Dies funktioniert nur für eine vorhandene Datei, es wird keine erstellt, wenn sie nicht vorhanden ist
Stíofán.

Ich verwende macOS 10.15 (Catalina) und es scheint, dass dies beim ersten Mal funktioniert (wenn Emacs noch nicht geöffnet ist), aber beim zweiten Mal nicht (wenn ein Emacs-Fenster bereits geöffnet ist). Wissen Sie, wie Sie das beheben können?
user102008

1

Die anderen Antworten hier haben bei mir nicht ganz funktioniert. Insbesondere auf meinem Computer das Bash-Skript

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

öffnet immer Emacs im Home-Verzeichnis. Um es im aktuellen Arbeitsverzeichnis zu öffnen, musste ich es tun

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

stattdessen.


1
Mein spezieller Build / Install hat dieses Problem nicht, aber es gibt ein Problem mit Ihrer Lösung. Wenn Sie versuchen, mehr als eine Datei zu öffnen, wird nur die erste Datei in das PWD-Verzeichnis erweitert. Dem Rest wird kein $ PWD-Pfad vorangestellt.
kmarsh

0

Kompilieren Sie Emacs gemäß den folgenden Schritten:

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

Und fertig! Es kann hilfreich sein, XQuartz herunterzuladen und zu installieren, aber das ist nur meine Meinung.


0

Dies ist mein Skript für open emacs / emacsclient auf 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

Stellen Sie in allen oben genannten Fällen bei Verwendung von "Öffnen" sicher, dass Sie die Option "--args" verwenden

Mach das nicht:

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

Stattdessen dies:

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

Die --argsOption verhindert, dass "Öffnen" verschiedene für Emacs bestimmte Optionen verwendet.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.