38 votes

Comment puis-je exécuter Cygwin Bash Shell à partir d'Emacs ?

J'utilise GNU Emacs sous Windows et j'y entre :

M-x shell

lance le shell DOS de la ligne de commande de Windows. Cependant, j'aimerais pouvoir lancer le shell Cygwin Bash (ou tout autre shell non-Windows) à partir d'Emacs. Comment cela peut-il être fait facilement ?

42voto

cjm Points 44090

shell-file-name est la variable qui contrôle l'interpréteur de commandes qu'Emacs utilise lorsqu'il veut exécuter une commande de l'interpréteur de commandes.

explicit-shell-file-name est la variable qui contrôle quel shell M-x shell démarre.

La réponse de Ken change les deux, ce que vous pouvez ou non vouloir.

Vous pouvez également avoir une fonction qui démarre un autre shell en modifiant temporairement explicit-shell-file-name :

(defun cygwin-shell ()
  "Run cygwin bash in shell mode."
  (interactive)
  (let ((explicit-shell-file-name "C:/cygwin/bin/bash"))
    (call-interactively 'shell)))

Vous voudrez probablement aussi passer le --login à bash, car vous démarrez une nouvelle session Cygwin. Vous pouvez le faire en définissant explicit-bash-args . (Notez que M-x shell utilise explicit- PROGRAMME -args où PROGRAM est la partie nom de fichier du nom de chemin du shell. C'est pourquoi vous ne devez pas inclure l'élément .exe lors de la mise en place du shell.

7voto

Chris Jones Points 674

La meilleure solution que j'ai trouvée à ce sujet est la suivante :

;; When running in Windows, we want to use an alternate shell so we
;; can be more unixy.
(setq shell-file-name "C:/MinGW/msys/1.0/bin/bash")
(setq explicit-shell-file-name shell-file-name)
(setenv "PATH"
    (concat ".:/usr/local/bin:/mingw/bin:/bin:"
        (replace-regexp-in-string " " "\\\\ "
            (replace-regexp-in-string "\\\\" "/"
                (replace-regexp-in-string "\\([A-Za-z]\\):" "/\\1"
                    (getenv "PATH"))))))

Le problème avec le passage de "--login" en tant que cjm suggère est que votre shell démarrera toujours dans votre répertoire personnel. Mais si vous êtes en train d'éditer un fichier et que vous tapez "M-x shell", vous voulez que votre shell soit dans le répertoire de ce fichier. De plus, j'ai testé cette configuration avec "M-x grep" et "M-x compile". Je soupçonne que d'autres exemples ici ne fonctionneraient pas avec ces derniers à cause de problèmes de répertoire et de PATH.

Cet extrait d'elisp doit se trouver dans votre fichier ~/.emacs. Si vous voulez utiliser Cygwin au lieu de MinGW, changez la première chaîne en C:/cygwin/bin/bash. La deuxième chaîne est ajoutée à votre PATH Windows (après avoir converti ce PATH en une forme unixienne appropriée) ; dans Cygwin, vous voulez probablement "~/bin:/usr/local/bin:/usr/bin :" ou quelque chose de similaire.

6voto

Ken Gentle Points 10162

J'utilise XEmacs avec Cygwin, et je peux exécuter bash depuis XEmacs relativement facilement.

Voici la section pertinente de init.el

;; Let's use CYGWIN bash...
;;
(setq binary-process-input t) 
(setq w32-quote-process-args ?\") 
(setq shell-file-name "bash") ;; or sh if you rename your bash executable to sh. 
(setenv "SHELL" shell-file-name) 
(setq explicit-shell-file-name shell-file-name) 
(setq explicit-sh-args '("-login" "-i"))

5voto

Un dernier conseil important à ce sujet.

Si vous utilisez le mode shell d'Emacs et que vous voulez parfois utiliser à la fois bash et cmd, configurez-le pour qu'il utilise bash par défaut, car vous pouvez taper cmd à bash et le shell dos résultant fonctionne très bien.

Si vous configurez Emacs pour qu'il utilise cmd comme interpréteur de commandes (ce qui est le mode d'installation de NT emacs), l'interpréteur de commandes dos fonctionne bien, mais si vous tapez bash ou bash -i pour lancer un interpréteur de commandes bash, l'interpréteur de commandes résultant ne fonctionne pas correctement - voir la réponse 0.

Mais cela fonctionne bien si bash est le "premier" shell invoqué par emacs.

2voto

Ray Vega Points 30187

Vous pouvez exécuter bash directement à partir de l'interpréteur de commandes par défaut de Windows dans votre tampon *shell* d'Emacs :

Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\temp>bash
bash     

Cependant, aucune invite de commande n'est visible, ce qui peut être désorientant, car vos commandes et leurs résultats se confondent.

En outre, pour une raison inconnue, si vous entrez une commande et appuyez sur la touche retour, un caractère de retour de ligne ( \r ) est ajouté à la fin de votre instruction de commande, ce qui provoque une erreur bash :

ls
bash: line 1: $'ls\r': command not found

Une solution de contournement consiste à ajouter manuellement un caractère de commentaire (#) à la fin de chaque commande, ce qui a pour effet de commenter les éléments suivants \r texte :

ls #
myfile,txt
foo.bar
anotherfile.txt

Cette approche globale est loin d'être idéale, mais elle peut s'avérer utile si vous souhaitez passer de l'interpréteur de commandes natif de Windows à bash pour effectuer quelques opérations rapides, puis sortir pour continuer à travailler dans Windows.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X