Question

J'utilise GNU Emacs sous Windows pour entrer:

M-x shell

lance le shell DOS en ligne de commande Windows. Cependant, je voudrais plutôt pouvoir exécuter le shell Cygwin Bash (ou tout autre shell non-Windows) à partir d’Emacs. Comment cela peut-il être facilement fait?

Était-ce utile?

La solution

nom-fichier-shell est la variable qui contrôle le shell utilisé par Emacs lorsqu'il veut exécuter une commande shell.

nom-fichier-shell-explicite est la variable qui contrôle quel shell M-x shell démarre.

Modification de la réponse de Ken deux, que vous souhaitiez ou non.

Vous pouvez également avoir une fonction qui démarre un shell différent en modifiant temporairement nom-fichier-coquille-explicite :

(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 également passer l'argument - login à bash, car vous démarrez une nouvelle session Cygwin. Vous pouvez le faire en définissant explicit-bash-args . (Notez que Mx shell utilise explicit - PROGRAM -args , où PROGRAM est le nom de fichier faisant partie du chemin du shell. C’est pourquoi vous ne devriez pas inclure le .exe lors de la configuration du shell.

Autres conseils

La meilleure solution que j'ai trouvée 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 de transmission de " - login " comme cjm suggère si votre shell démarre toujours dans votre répertoire personnel. Mais si vous modifiez un fichier et cliquez sur "M-x shell", vous voulez que votre shell se trouve dans le répertoire de ce fichier. De plus, j'ai testé cette configuration avec " M-x grep " et "M-x compile". Je doute que d'autres exemples ici ne fonctionnent pas avec ceux dus aux problèmes de répertoire et de chemin.

Cet extrait elisp appartient à votre fichier ~ / .emacs. Si vous souhaitez utiliser Cygwin au lieu de MinGW, remplacez la première chaîne par C: / cygwin / bin / bash. La deuxième chaîne est ajoutée à votre PATH Windows (après avoir converti ce PATH en un formulaire unixy approprié); dans Cygwin, vous voudrez probablement " ~ / bin: / usr / local / bin: / usr / bin: " ou quelque chose de similaire.

J'utilise XEmacs avec Cygwin et je peux utiliser 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"))

Encore un indice important à ce sujet.

Si vous utilisez le mode shell Emacs et que vous voulez parfois bash et cmd, configurez-le pour utiliser bash par défaut, car vous pouvez taper cmd à bash et le shell dos obtenu fonctionnera très bien.

Si vous configurez Emacs pour utiliser cmd en tant que shell (c'est ainsi que NT installe emacs), alors le shell DOS fonctionne correctement, mais si vous tapez bash ou bash -i pour exécuter un shell bash, le shell résultant ne fonctionne pas. marchez bien - voir réponse 0.

Mais cela fonctionne bien si bash est le "premier" shell emacs invoque.

Vous pouvez exécuter bash directement à partir du shell de ligne de commande Windows par défaut dans votre shell Emacs * shell *:

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 désorienter et entraîner la fusion de vos commandes.

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

ls
bash: line 1: 

Une solution de contournement consiste à ajouter manuellement un caractère de commentaire (#) à la fin de chaque commande qui commente effectivement le texte \ r:

ls #
myfile,txt
foo.bar
anotherfile.txt

Cette approche globale est loin d’être idéale, mais elle pourrait être utile si vous souhaitez accéder à bash depuis le shell natif de Windows pour effectuer des opérations rapides, puis quitter pour continuer à travailler sous Windows.

ls\r': command not found

Une solution de contournement consiste à ajouter manuellement un caractère de commentaire (#) à la fin de chaque commande qui commente effectivement le texte \ r:

<*>

Cette approche globale est loin d’être idéale, mais elle pourrait être utile si vous souhaitez accéder à bash depuis le shell natif de Windows pour effectuer des opérations rapides, puis quitter pour continuer à travailler sous Windows.

J'utilise EmacsW32. C-h un shell $ donne une liste des commandes de lancement du shell et les commandes cmd-shell et cygwin-shell semblent intéressantes. Les deux commandes ont besoin d'EmacsW32. Vous les trouverez également dans le menu: Outils > W & 32 coquilles .

Si vous exécutez cygwin-shell pour la première fois et si vous n'avez pas configuré cygwin path dans Emacs, vous accédez à la page Personnalisation où vous pouvez configurer le chemin cygwin en cliquant sur le bouton Rechercher.

Étant donné que ces approches ne fonctionnaient pas pour moi, je l'ai obtenu de la manière suivante:

(J'utilise NTEmacs qui ouvre un shell DOS par défaut, alors peut-être que votre emacs se comportera de la même manière)

Créez une variable d'environnement Windows nommée SHELL ('SHELL' et non pas '$ SHELL') et donnez-lui le chemin d'accès à bash.exe de votre installation cygwin (par exemple, c: \ programmes \ cygwin \ bin \ bash.exe)

Maintenant, lorsque vous faites un shell M-x, il ouvre un bash.

Cordialement,

Inno

En plus de la réponse de @Chris Jones sur le fait d'éviter l'argument --login à bash, j'ai défini les arguments de ligne de commande suivants:

 (setq explicit-bash-args '("--noediting" "-i"))

L'option --noediting empêche les interférences avec la bibliothèque GNU readline et l'option -i indique que le shell est interactif. J'utilise également le fichier .emacs_bash de mon répertoire personnel pour toute personnalisation de bash spécifique à emacs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top