¿Cómo puedo ejecutar Cygwin Bash Shell desde dentro de Emacs?

Estoy ejecutando GNU Emacs en Windows para ingresar:

Mx shell 

lanza el shell DOS de línea de comandos de Windows. Sin embargo, me gustaría poder ejecutar Cygwin Bash Shell (o cualquier otro shell que no sea de Windows) desde Emacs. ¿Cómo se puede hacer esto fácilmente?

shell-file-name es la variable que controla qué shell usa Emacs cuando quiere ejecutar un comando de shell.

explicit-shell-file-name es la variable que controla qué Mx shell inicia el shell Mx shell .

La respuesta de Ken cambia ambos, que puede o no querer.

También puede tener una función que inicie un shell diferente cambiando temporalmente el 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))) 

Probablemente también quiera pasar el argumento --login a bash, porque está iniciando una nueva sesión de Cygwin. Puedes hacer eso estableciendo explicit-bash-args . (Tenga en cuenta que Mx shell usa explicit- PROGRAM -args , donde PROGRAM es la parte del nombre de archivo del nombre de la ruta del shell. Es por eso que no debe incluir el .exe al configurar el shell.

La mejor solución que he encontrado para esto es la siguiente:

 ;; 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")))))) 

El problema con pasar “–login” como cjm sugiere es que su caparazón siempre comenzará en su directorio de inicio. Pero si está editando un archivo y pulsa “Mx shell”, quiere que su shell esté en el directorio de ese archivo. Además, he probado esta configuración con “Mx grep” y “Mx compile”. Sospecho que otros ejemplos aquí no funcionarían con los debidos a problemas de directorio y RUTA.

Este fragmento elisp pertenece a su archivo ~ / .emacs. Si desea utilizar Cygwin en lugar de MinGW, cambie la primera cadena a C: / cygwin / bin / bash. La segunda cadena se antepone a su RUTA de Windows (después de convertir esa RUTA a una forma apropiadamente no mixta); en Cygwin probablemente desee “~ / bin: / usr / local / bin: / usr / bin:” o algo similar.

Uso XEmacs con Cygwin, y puedo ejecutar bash desde XEmacs con relativa facilidad.

Aquí está la sección relevante 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")) 

Una más sugerencia importante sobre este tema.

Si usa el modo de shell de Emacs y quiere tanto bash como cmd a veces, configúrelo para usar bash de forma predeterminada, ya que puede escribir cmd en bash y el shell dos resultante funciona bien.

Si configura Emacs para usar cmd como shell (que es la forma en que instala NT emacs), entonces dos shell funciona bien, pero si escribe bash o bash -i para ejecutar un shell bash, el shell resultante no funciona bien – ver respuesta 0.

Pero funciona bien si bash es el “primer” shell que invoca emacs.

Puede ejecutar bash directamente desde el shell de línea de comandos predeterminado de Windows dentro de su buffer Emacs * shell *:

 Microsoft Windows XP [Version 5.1.2600] (C) Copyright 1985-2001 Microsoft Corp. C:\temp>bash bash 

Sin embargo, no se ve ningún símbolo del sistema que pueda desorientar, lo que hace que sus comandos y sus resultados de salida se mezclen.

Además, por algún motivo desconocido, si ingresa un comando y presiona return, se agrega un carácter de línea de retorno (\ r) al final de su instrucción de comando, lo que causa un error bash:

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

Una solución alternativa es agregar manualmente un carácter de comentario (#) al final de cada comando que efectivamente comenta el texto:

 ls # myfile,txt foo.bar anotherfile.txt 

Este enfoque general está lejos de ser ideal, pero podría ser útil si desea ingresar en bash desde el shell nativo de Windows para realizar algunas operaciones rápidas y luego salir para continuar trabajando en Windows.

Estoy usando EmacsW32. Ch a shell$ da una lista de comandos de lanzamiento de shell y los comandos cmd-shell y cygwin-shell parecen interesantes. Ambos comandos necesitan EmacsW32. También se encuentran en el menú: Herramientas> W & 32 Shells .

Si ejecuta cygwin-shell por primera vez, y si no ha configurado cygwin path en Emacs, lo llevará a la página de personalización donde puede configurar la ruta cygwin presionando el botón Buscar.

Como estos enfoques no me funcionaron, lo obtuve de la siguiente manera:

(Estoy usando NTEmacs, que abre dos shell por defecto, por lo que tal vez tu emacs se comporte igual)

Cree una variable de entorno de Windows llamada SHELL (‘SHELL’ no ‘$ SHELL’) y asígnele la ruta a bash.exe de su instalación de cygwin (por ejemplo c: \ programs \ cygwin \ bin \ bash.exe)

Ahora cuando se hace shell Mx se abre un bash.

Saludos,

Inno

Además de la respuesta de @Chris Jones sobre evitar el argumento –login para bash, establecí los siguientes argumentos de línea de comando:

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

La opción –noediting evita la interferencia con la biblioteca GNU readline y la opción -i especifica que el shell es interactivo. También uso el archivo .emacs_bash en mi directorio personal para cualquier personalización de bash específica de emacs.