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

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

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

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

  1. la fenêtre emacs s'ouvre devant la fenêtre de mon terminal.
  2. taper "emacs" lance une fenêtre GUI Emacs. Trouver des fichiers dans cette fenêtre sera par défaut regarder dans le répertoire d'où J'ai commencé Emacs.
  3. taper " emacs foo.txt " quand foo.txt exists lance une fenêtre Emacs GUI avec foo.txt chargé.
  4. taper " Emacs foo.txt " quand foo.txt does not exist lance une fenêtre GUI Emacs avec un tampon de texte vide nommé " foo.txt". Faire ^X^S dans ce tampon sauvera foo.txt dans le répertoire d'où J'ai commencé Emacs.
80
demandé sur Johan Walles 2012-04-16 13:02:43

11 réponses

Appelez le script suivant "emacs" et placez-le dans votre PATH quelque part:

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

Qui couvre #2, # 3, et #4.

Pour #1, mettez ceci quelque part dans votre .fichier emacs:

(x-focus-frame nil)

Le emacsformacosx.com le site a maintenant une page D'instructions , d'où vient l'extrait supérieur. Il y a plus d'informations sur l'exécution de emacsclient et l'accrochage D'Emacs jusqu'à git mergetool.

105
répondu David Caldwell 2013-05-29 09:28:05

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, en tapant emacs sur la ligne de commande, l'application emacs démarre.

Cependant, je vous recommande d'ouvrir une copie d'emacs et de la maintenir en service. 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 les éléments suivants dans votre .bashrc:

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

Ensuite, ajoutez 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!

69
répondu Chris McMahan 2014-10-25 14:21:08

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 #2, # 3 et # 4. Pour #1, mettre quelque part dans votre .fichier emacs: (x-focus-frame nil).

Notez que ce qui suit NePas Fonctionne 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 "$@" &
8
répondu David J. 2017-05-23 12:18:01

Je suppose que vous non plus:

  • Démarrez le démon emacs lors de la connexion
  • Ont (serveur de démarrage) dans votre .emacs
  • cela ne vous dérange pas d'avoir beaucoup de copies séparées d'emacs en cours d'exécution

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

  1. la fenêtre emacs s'ouvre devant la fenêtre de mon terminal.

Il s'ouvrira toujours au premier plan (avec X-focus-frame).

  1. taper " emacs" lance une fenêtre Emacs GUI. Trouver des fichiers dans cette fenêtre sera par défaut regarder dans le répertoire d'où J'ai commencé Emacs.

Il ouvrira une fenêtre Emacs existante en mode dired.

  1. taper " Emacs foo.txt " quand foo.txt exists lance une fenêtre Emacs GUI avec foo.txt chargé.

Si emacs est déjà en cours d'exécution et dispose d'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 Emacs GUI avec un tampon de texte vide nommé " foo.txt". Faire ^X^S dans ce tampon sauvera foo.txt dans le répertoire d'où J'ai commencé Emacs.

Correcte.

Un supplément:

Contrôle retourne à la session du 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
5
répondu The Dave 2017-02-25 13:13:03

Sur Mountain Lion, j'utilise le port de Yamamoto Mitsuharu https://github.com/railwaycat/emacs-mac-port avec l'alias suivant:

alias emacs=/Applications/Emacs.app/Contents/MacOS/Emacs

Et il répond à tous vos critères.

4
répondu mforbes 2013-05-05 03:41:39

Améliorer encore la réponse de David James les travaux suivants 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 "$@") &

Mise en garde: afin d'obtenir emacs pour ouvrir le répertoire en cours dans Dired par nom mode, vous besoin d'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) de 2014-11-13
4
répondu sbecker11 2015-03-27 00:38:24

Vient de construire emacs avec homebrew package manager selon ce guide: http://www.emacswiki.org/emacs/EmacsForMacOS avec brew install --cacao emacs Après que l'on devrait lancer le .version de l'application pour obtenir l'interface graphique, qui dans mon cas était /usr / local / Cellar / emacs / 24.3 / Emacs.app / Contents/MacOS / Emacs

3
répondu Yuriy Skvortsov 2014-02-17 13:58:50

Les autres réponses ici n'ont pas tout à fait 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, je devais faire

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

À la place.

1
répondu jackkamm 2015-05-22 16:13:33

Compilez Emacs selon les étapes suivantes:

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

Et votre fait! Il peut aider à télécharger et installer XQuartz, mais c'est juste mon avis.

0
répondu rake 2013-08-20 17:21:54

C'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
0
répondu Koren.H 2017-12-04 03:34:55

Solution Simple...

Beaucoup de solutions très complexes à ce problème sont affiché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
}

Utilisation

ec file [...]

Déballons ce qui se passe:

  1. transmettez tous les arguments ec à emacsclient et n'attendez pas (-n) emacs avant de continuer.
    1. Si Emacs est déjà en cours d'exécution, nous avons tous terminé et vous êtes édition.
  2. avalez le message d'erreur posté par emacsclient lorsqu'il n'y a pas d'Emacs en cours d'exécution. (2> /dev/null)
  3. gérer manuellement le code de sortie 1 ([[ $? == 1 ]])
    1. ouvrez Emacs.app et lui transmettre des arguments de fichier (les chemins seront correctement ouverts.)
    2. Vous avez terminé, et Emacs a ouvert vos fichiers.
0
répondu ocodo 2018-04-05 08:10:39