Comment lancer GUI Emacs à partir de la ligne de commande sous OSX?

91

Comment lancer GUI Emacs à partir de la ligne de commande dans OSX?

J'ai téléchargé et installé à partir Emacs http://emacsformacosx.com/ .

J'accepterai une réponse remplissant tous les critères suivants:

  1. La fenêtre emacs s'ouvre devant ma fenêtre de terminal.
  2. Taper "emacs" lance une fenêtre Emacs GUI. La recherche de fichiers dans cette fenêtre se fera par défaut dans le répertoire à partir duquel j'ai démarré Emacs.
  3. Taper "emacs foo.txt" quand foo.txt existe lance une fenêtre GUI Emacs avec foo.txt chargé.
  4. Taper "emacs foo.txt" quand foo.txt n'existe pas lance une fenêtre GUI Emacs avec un tampon de texte vide nommé "foo.txt". Faire ^ X ^ S dans ce tampon sauvegardera foo.txt dans le répertoire d'où j'ai démarré Emacs.
Johan Walles
la source
Lesquels de ces critères ne sont pas satisfaits en entrant «emacs» à l'invite du terminal? Vos exigences décrivent le comportement par défaut sous Linux. Je n'ai pas utilisé de Mac depuis un moment, mais je pense que l'astuce consistait simplement à trouver le bon programme à exécuter - emacs.app peut-être?
Tyler
8
Tyler, venant d'un milieu Linux, je suis avec vous jusqu'au bout; taper simplement "emacs" à l'invite devrait être tout ce que j'ai à faire. Faire cela sur OSX lance cependant le mode texte Emacs dans la fenêtre du terminal (échouant donc au critère 1), et ce n'est pas ce que je veux.
Johan Walles
1
Johan - avez-vous trouvé une solution entre-temps? Je suis aux prises avec les mêmes problèmes et je pense à commencer une prime. Le fait d'appeler emacs (et non Emacs.app) depuis la ligne de commande ouvre une fenêtre en arrière-plan ...
alexurba
1
@DougHarris Mes exigences correspondent à la réalité sur n'importe quelle distribution Linux, c'est de là qu'elles viennent. Je suis heureux que vous ayez trouvé un flux de travail qui fonctionne pour vous. À votre santé!
Johan Walles
2
Je ne sais pas si cela fonctionne sur OSX mais vous pouvez essayer: emacsclient -c -a "" "$@"command
jfs

Réponses:

113

Appelez le script suivant "emacs" et placez-le PATHquelque part:

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

Cela couvre les n ° 2, 3 et 4.

Pour le n ° 1, mettez ceci quelque part dans votre fichier .emacs:

(x-focus-frame nil)

Le site emacsformacosx.com a maintenant une page How-To , d'où provient l'extrait de code supérieur. Il y a plus d'informations là-bas sur l'exécution emacsclientet le raccordement d'Emacs git mergetool.

David Caldwell
la source
1
Merci David, vous réglez!
Johan Walles
1
Fonctionne très bien. Bounty à venir.
Tamzin Blake
2
Sur Mavericks, si je suis dans un dossier ~/fooet que bar.txtje veux ouvrir, je tape gmacs bar.txtmais cela crée un nouveau fichier au ~/bar.txtlieu de s'ouvrir ~foo/bar.txt. Est-ce que je fais quelque chose de mal?
Daniel Compton
2
Où est le fichier .emacs?
Bren le
1
Vous ne pouvez pas ajouter (x-focus-frame nil) n'importe où, il doit être dans l'expression (custom-set-variables), qu'emacs créera pour vous une fois que vous aurez défini quoi que ce soit via la personnalisation. Personnalisez simplement quelque chose dans la barre de menu, comme activer le "curseur clignotant" (puis le désactiver si vous ne l'aimez pas) et cette section sera créée dans votre .emacs. En outre, est-ce même testé? Je ne suis pas sûr qu'emacs sur Cocoa respectera même ce paramètre.
Chuck Adams
70

Dans votre shell, alias la commande 'emacs' pour pointer vers l'application OSX emacs

Dans mon shell (exécutant le bash par défaut), j'ai ce qui suit (dans mon .bashrc)

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

Ensuite, la saisie d'emacs sur la ligne de commande démarre l'application emacs.

Je vous recommanderais cependant d'ouvrir une copie d'emacs et de la maintenir opérationnelle. Si c'est le cas, et que vous souhaitez charger un fichier dans une copie existante d'emacs, vous pouvez utiliser emacsclient en plaçant ce qui suit dans votre .bashrc:

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

Ajoutez ensuite ce qui suit à votre fichier .emacs pour démarrer le serveur emacs (qui reçoit les appels emacsclient)

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

Ensuite, vous pouvez taper

ec .bashrc

pour charger une copie de .bashrc dans une session emacs existante!

Chris McMahan
la source
4
Salut chris! Votre première réponse échoue aux critères 2 et 4. Votre deuxième réponse échoue au critère 2. Je recherche une solution qui remplit tous les critères numérotés. Regards / Johan
Johan Walles
3
Il semble que tous vos problèmes pourraient être résolus si vous utilisiez simplement emacs lui-même pour charger les fichiers, plutôt que de compter sur une ligne de commande pour lancer une nouvelle instance à chaque fois. Je lance généralement emacs au début de ma journée (s'il n'est pas encore en cours d'exécution), et je l'utilise pour charger des fichiers, changer de répertoire, créer de nouveaux fichiers et tout ce que je veux sans jamais toucher la fenêtre du terminal.
Chris McMahan
Je dois dire qu'il y a plusieurs de ces questions sur ce site qui traitent de cette question, mais c'est la seule qui résout complètement le problème de l'ouverture également d'un dossier, de manière brève et éloquente.
tylerthemiler
3
@tylerthemiler, où est la réponse qui résout complètement le problème? Les deux réponses de cette réponse échouent au critère 2 et la première échoue également au 4.
Johan Walles
5
Un peu de tact permet d'obtenir une réponse à une question. Un peu de googler aussi.
Douma
10

Cela améliore la réponse de David Caldwell en démarrant Emacs en arrière-plan:

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

Comme indiqué dans l'autre réponse, cela couvre les n ° 2, 3 et 4. Pour # 1, mettre quelque part dans votre fichier .emacs: (x-focus-frame nil).

Notez que ce qui suit ne fonctionne pas pour moi - il ne démarre pas Emacs dans un répertoire spécifié sur la ligne de commande (par exemple emacs .)

# NOT RECOMMENDED
#!/bin/sh
/Applications/Emacs.app/Contents/MacOS/Emacs "$@" &
David J.
la source
1
Cela résout un problème avec OSX (peut-être à partir de 10.9 Mavericks). À partir de la version 10.9, la méthode "non recommandée" échoue, alors qu'au moins jusqu'à 10.6, la méthode non recommandée a synchronisé le shell $ PWD et Emacs (pwd). La réponse de David est peut-être ailleurs, mais comment faire comprendre aux moteurs de recherche: "pwd pas pwd"?
infogizmo
5

Je suppose que vous non plus:

  • Démarrez le démon emacs lors de la connexion
  • Avoir (server-start) dans votre .emacs
  • Cela ne vous dérange pas d'avoir de nombreuses copies séparées d'emacs

Si tel est le cas, je pense que cela satisfait aux quatre critères d'origine, plus un de plus:

  1. La fenêtre emacs s'ouvre devant ma fenêtre de terminal.

il s'ouvrira toujours au premier plan (avec x-focus-frame).

  1. Taper "emacs" lance une fenêtre Emacs GUI. La recherche de fichiers dans cette fenêtre se fera par défaut dans le répertoire à partir duquel j'ai démarré Emacs.

Cela ouvrira une fenêtre emacs existante en mode dired.

  1. Taper "emacs foo.txt" quand foo.txt existe lance une fenêtre GUI Emacs avec foo.txt chargé.

Si emacs est déjà en cours d'exécution et a un serveur, il s'ouvrira dans la fenêtre existante et viendra au premier plan.

  1. Taper "emacs foo.txt" quand foo.txt n'existe pas lance une fenêtre GUI Emacs avec un tampon de texte vide nommé "foo.txt". Faire ^ X ^ S dans ce tampon sauvegardera foo.txt dans le répertoire d'où j'ai démarré Emacs.

Correct.

Un extra:

Le contrôle revient à la session de terminal immédiatement après avoir tapé la commande.

~ / 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
Le Dave
la source
Impressionnant! Il semble que vos arguments et non-arguments soient inversés.
eriksensei
4

Solution simple ...

De nombreuses solutions très complexes à ce problème sont publiées ici. C'est juste parce que cela semble non trivial.

Cependant, cette solution fonctionne très bien pour moi.

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

Usage

ec file [...]

Découvrons ce qui se passe:

  1. passez tous les ecarguments à emacsclient et n'attendez pas ( -n) pour emacs avant de continuer.
    1. Si Emacs est déjà en cours d'exécution, nous avons terminé et vous éditez.
  2. avalez le message d'erreur posté par emacsclient quand aucun emacs n'est en cours d'exécution. ( 2> /dev/null)
  3. Gérer manuellement le code de sortie 1( [[ $? == 1 ]])
    1. ouvrez Emacs.app et passez-lui les arguments de fichier (les chemins seront correctement ouverts.)
    2. Vous avez terminé et Emacs a ouvert vos fichiers.
ocodo
la source
3

Je viens de créer des emacs avec le gestionnaire de paquets homebrew selon ce guide: http://www.emacswiki.org/emacs/EmacsForMacOS avec brew install --cocoa emacs Après cela, il faut lancer la version .app pour obtenir gui, ce qui dans mon cas était /usr/local/Cellar/emacs/24.3/Emacs.app/Contents/MacOS/Emacs

Yuriy Skvortsov
la source
--cocoa était obsolète; en utilisant à la place --with-cacao!
Erwin Rooijakkers
3

En améliorant davantage la réponse de David James, les travaux suivants fonctionnent pour moi:

Par instructions pour ouvrir un fichier à partir d'un terminal trouvé à http://www.emacswiki.org/emacs/EmacsForMacOS#toc20

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

en combinant cela avec la réponse de David Jame, j'ai créé le script emax bash suivant et l' ai placé dans mon chemin à ~ / bin

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

Attention : pour que emacs ouvre le répertoire courant en mode Dired by name , vous devez utiliser

emax .

Environnement:

  • OS X Yosemite version 10.10.2
  • GNU Emacs 24.4.2 (x86_64-apple-darwin14.0.0, NS apple-appkit-1343.14) du 13/11/2014
sbecker11
la source
Cela ne fonctionne que pour un fichier existant, il n'en créera pas si ce n'est pas là
Stíofán.
J'utilise macOS 10.15 (Catalina), et il semble que cela fonctionne la première fois (quand Emacs n'est pas déjà ouvert), mais ne fonctionne pas la deuxième fois (lorsqu'une fenêtre Emacs est déjà ouverte). Savez-vous comment résoudre ce problème?
user102008
1

Les autres réponses ici n'ont pas vraiment fonctionné pour moi. En particulier, sur ma machine, le script bash

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

ouvre toujours emacs dans le répertoire personnel. Pour l'ouvrir dans le répertoire de travail actuel, j'ai dû faire

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

au lieu.

jackkamm
la source
1
Ma version / installation particulière n'a pas ce problème, mais il y a un problème avec votre solution. Si vous essayez d'ouvrir plus d'un fichier, seul le premier se développera dans le répertoire PWD. Le reste n'aura pas de chemin d'accès $ PWD préfixé.
kmarsh
0

Compilez Emacs selon les étapes suivantes:

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

Et vous avez terminé! Il peut être utile de télécharger et d'installer XQuartz, mais ce n'est que mon avis.

râteau
la source
0

Ceci est mon script pour ouvrir emacs / emacsclient sur 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
la source
0

Dans tout ce qui précède lorsque vous utilisez "open" - assurez-vous d'utiliser l'option "--args"

Ne faites pas cela:

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

Au lieu de cela:

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

l' --argsoption empêche «open» de consommer diverses options destinées à Emacs.

user3696153
la source