web-dev-qa-db-fra.com

Comment lancer l'interface graphique Emacs depuis la ligne de commande sous OSX?

Comment lancer l'interface graphique Emacs à partir de la ligne de commande sous OSX?

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

J'accepte 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. 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 graphique Emacs avec foo.txt chargé.
  4. Taper "emacs foo.txt" lorsque foo.txt existe not n'existe pas, lance une fenêtre GUI Emacs avec un tampon de texte vide nommé "foo.txt". Faire ^ X ^ S dans ce tampon enregistrera foo.txt dans le répertoire à partir duquel j'ai démarré Emacs.
81
Johan Walles

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

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

Cela couvre les numéros 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 ici sur l'exécution de emacsclient et le raccordement d'Emacs jusqu'à git mergetool.

107
David Caldwell

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

Dans mon shell (exécutant le bash par défaut), j'ai les éléments suivants (dans mon .bashrc)

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

Ensuite, taper emacs sur la ligne de commande lance l’application emacs.

Cependant, je vous recommanderais d’ouvrir une copie d’Emacs et de la conserver. Si tel est le cas et que vous souhaitez charger un fichier dans une copie existante d’emacs, vous pouvez utiliser emacsclient en plaçant le texte suivant dans votre fichier .bashrc:

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

Ajoutez ensuite les éléments suivants à 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

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

69
Chris McMahan

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

Notez que not ne fonctionne pas pour moi - cela 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
David J.

Je suppose que vous non plus:

  • Démarrer le démon emacs à la connexion
  • Ont (serveur-start) dans votre .emacs
  • Ne vous dérange pas d'avoir beaucoup de copies séparées d'Emacs en cours d'exécution

Si tel est le cas, je pense que cela répond aux quatre critères initiaux, 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 GUI Emacs. 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 qu’il dispose d’un serveur, il s’ouvre dans la fenêtre existante et passe au premier plan.

  1. Taper "emacs foo.txt" lorsque 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 enregistrera foo.txt dans le répertoire à partir duquel 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
5
The Dave

Pour améliorer encore la réponse de David James, voici ce qui fonctionne pour moi:

Selon les instructions pour ouvrir un fichier depuis un terminal situé à 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 d'accès à ~/bin

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

Caveat: pour que emacs ouvre le répertoire actuel en mode Désactivé par son nom, 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 2014-11-13
4
sbecker11

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
mforbes

Vient de construire emacs avec le gestionnaire de paquets homebrew selon ce guide: http://www.emacswiki.org/emacs/EmacsForMacOS la version .app pour obtenir l'interface graphique, qui dans mon cas était /usr/local/Cellar/emacs/24.3/Emacs.app/Contents/MacOS/Emacs

3
Yuriy Skvortsov

Les autres réponses ici ne fonctionnaient pas vraiment 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 courant, je devais faire

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

au lieu.

1
jackkamm

Solution simple ...

Beaucoup de solutions très complexes à ce problème sont affichées ici. C'est juste parce que cela ne semble pas trivial.

Cependant, cette solution fonctionne vraiment bien pour moi.

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

Usage

ec file [...]

Déballons ce qui se passe:

  1. transmettez tous les arguments ec à emacsclient et n'attendez pas (-n) avant de continuer ..__
    1. Si Emacs est déjà en cours d'exécution, tout est terminé et vous éditez.
  2. avale le message d'erreur envoyé par emacsclient quand aucun serveur emacs n'est en cours d'exécution. (2> /dev/null)
  3. Gérez manuellement le code de sortie 1 ([[ $? == 1 ]])
    1. ouvrez Emacs.app et transmettez-lui les arguments de fichier (les chemins seront correctement ouverts.)
    2. Vous avez terminé et Emacs a ouvert vos fichiers.
1
ocodo

Compilez Emacs en suivant les étapes suivantes:

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

Et votre fait! Il peut être utile de télécharger et d'installer XQuartz, mais ce n'est que mon opinion.

0
rake

Ceci est mon script pour open 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
Koren.H