2008-10-24 15 views

Respuesta

42

shell-file-name es la variable que controla el cual utiliza la cáscara Emacs cuando se quiere ejecutar un comando shell.

explicit-shell-file-name es la variable que controla qué shell M-x shell se inicia.

Ken's answer cambia los dos, que puede o no puede querer.

Usted también puede tener una función que inicia un shell diferente cambiando temporalmente 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))) 

Es probable que también desee pasar el argumento --login para golpear, porque vas a empezar una nueva sesión de Cygwin. Puede hacerlo estableciendo explicit-bash-args. (Tenga en cuenta que M-x shell utiliza explicit- PROGRAMA -args, donde el curso es la parte de nombre de archivo de nombre de ruta de la cáscara. Por esta razón, no se debe incluir el .exe la hora de establecer la cáscara.

+2

Su e-lisp es mejor que el mío - Aprendí lo suficiente como para hacerlo funcionar de la manera que quería hace _years_ y desde entonces he olvidado lo que significa la mayor parte. Creo que mi código se copió originalmente de una pregunta frecuente en algún lugar ... –

+0

+1, se inclina ante el maestro Yoda que usa el paréntesis. Tu e-lisp sopla la mía fuera del agua. –

+5

para ser específico, debe agregar (setq explicit-bash-args '("--login" "-i")) en algún lugar, de lo contrario, estaba recibiendo el mensaje "bash: ls: comando no encontrado" –

6

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

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

Puede ejecutar fiesta directamente desde las ventanas de línea de comandos por defecto shell dentro de su Emacs * shell * buffer:

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

C:\temp>bash 
bash  

sin embargo, ningún símbolo del sistema es visible que puede ser desorientador resultante en sus comandos y sus resultados de salida todo mezclando juntos

Además, para algunos unkno. razón wn, si lo hace entre un comando y la tecla de retorno, un personaje línea de retorno (\ r) se añade al final de su declaración de comandos causando un error de fiesta:

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

Una solución es agregar manualmente un comentario carácter (#) al final de cada comando, que comenta con eficacia el texto \ r:

ls # 
myfile,txt 
foo.bar 
anotherfile.txt 

Este enfoque global está lejos de ser ideal, pero podría ser útil si se quiere caer en fiesta de shell nativa de Windows para realice algunas operaciones rápidas y luego salga para continuar trabajando en Windows.

5

Una sugerencia más importante sobre este tema.

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

Si configura Emacs para usar cmd como el 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 t trabajo correcto - vea la respuesta 0.

Pero funciona bien si bash es el "primer" shell invocado por emacs.

1

Dado que estos enfoques no funcionan para mí lo tengo de la siguiente manera:

(estoy usando NTEmacs que abre una ventana DOS de forma predeterminada, por lo que tal vez sus emacs se comporta de la misma)

crear una variable de entorno de windows denominado SHELL ('SHELL' no '$ SHELL') y darle la ruta de acceso a bash.exe de la instalación de cygwin (por ejemplo c: \ programas \ cygwin \ bin \ bash.exe)

Ahora cuando se hace shell Mx se abre un bash.

Saludos,

Inno

+0

Tuve el mismo problema y esto funcionó para mí también. Notaré que tuve que cerrar y volver a abrir Emacs para que esto surta efecto. –

2

estoy usando EmacsW32. C-h 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 Conchas.

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.

7

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 el paso "--login" como CJM suggests es su cáscara se iniciará siempre en su directorio personal. Pero si está editando un archivo y pulsa "M-x shell", quiere que su shell esté en el directorio de ese archivo. Además, he probado esta configuración con "M-x grep" y "M-x 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.

0

Además de respuesta @ Chris Jones acerca de cómo evitar el argumento --login para golpear, que defina las siguientes argumentos de línea de comandos:

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

La opción --noediting evita la interferencia con la biblioteca readline de GNU 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.

Cuestiones relacionadas