Frage

Ich bin mit GNU Emacs auf Windows so eingeben:

M-x shell

startet die Windows-Befehlszeilen DOS-Shell. Ich möchte jedoch anstelle der Lage sein, die Cygwin Bash Shell (oder andere Nicht-Windows-Shell) aus Emacs laufen. Wie kann dies leicht getan werden?

War es hilfreich?

Lösung

shell-file-name ist die Variable, die steuert, welche Shell Emacs verwendet, wenn er möchte, einen Shell-Befehl auszuführen.

explicit-shell-file-name ist die Variable, die steuert, welche Shell M-x shell anläuft.

Kens Antwort Änderungen beide von denen, die Sie können oder nicht wollen.

Sie können auch eine Funktion, die durch eine vorübergehende Veränderung explicit-shell-file-name eine andere Shell beginnt:

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

Sie werden wahrscheinlich wollen auch das --login Argument bash passieren, weil Sie eine neue Cygwin Session fangen. Sie können das tun, indem explicit-bash-args Einstellung. (Beachten Sie, dass M-x shell verwendet explicit-PROGRAM-args, wo PROGRAM ist der Dateiname Teil der Pfadname der Shell. Aus diesem Grund sollten Sie nicht die .exe enthalten, wenn die Schale setzen.

Andere Tipps

Die beste Lösung, die ich dazu gefunden habe, ist die folgende:

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

Das Problem mit passing "--login" als cjm schlägt Shell ist immer in Ihrem Home-Verzeichnis starten. Aber wenn Sie eine Datei bearbeiten und Sie treffen „M-x-Shell“, möchten Sie Ihre Shell in der Datei des Verzeichnisses. Darüber hinaus habe ich dieses Setup mit „M-x grep“ und „M-x Kompilierung“ getestet. Ich bin misstrauisch, dass andere Beispiele hier nicht mit denen arbeiten aufgrund Verzeichnis und PATH Probleme.

Dieser elisp Schnipsel gehört in Ihrer ~ / .emacs-Datei. Wenn Sie Cygwin anstelle von MinGW verwenden möchten, ändern Sie die erste Zeichenfolge in C: / Cygwin / bin / bash. Die zweite Zeichenfolge ist auf Ihren Windows-PATH vorangestellt (nach diesem Weg zu einer entsprechend Unixy Form umgewandelt); in Cygwin möchten Sie wahrscheinlich "~ / bin: / usr / local / bin: / usr / bin:". oder etwas ähnliches

Ich benutze XEmacs mit Cygwin und relativ leicht bash von XEmacs laufen kann.

Hier ist der relevante Abschnitt von 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"))

Ein weiterer wichtiger Hinweis zu diesem Thema.

Wenn Sie Emacs Shell-Modus verwenden und sowohl bash wollen und cmd manchmal, es einrichten bash standardmäßig zu verwenden, da Sie bei bash cmd eingeben können und die resultierende DOS-Shell funktioniert gut.

Wenn Sie Setup-Emacs cmd als Shell verwenden (das ist die Art und Weise NT Emacs installiert), dann DOS-Shell funktioniert gut, aber wenn Sie bash oder bash -i geben Sie eine Bash-Shell auszuführen, wird die resultierende Schale nicht Recht auf Arbeit - vgl. Antwort 0

Aber es funktioniert gut, wenn bash die "ersten" Shell Emacs ist aufrufen.

Sie können bash laufen direkt aus dem Standard-Windows-Befehlszeilenshell innerhalb Ihrer Emacs * Shell * buffer:

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

C:\temp>bash
bash     

jedoch keine Eingabeaufforderung ist sichtbar, die in Ihre Befehle und deren Ausgabeergebnisse alle zusammen Mischen resultierende verwirrende sein kann.

Darüber hinaus aus einem unbekannten Grund, wenn Sie einen Befehl tun eingeben und drücken die Eingabetaste, eine Rückleitung Zeichen (\ r) mit dem Ende der Befehlsanweisung angehängt ein Bash-Fehler verursacht:

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

ist eine Problemumgehung manuell ein Kommentarzeichen (#) am Ende jeden Befehl hinzufügen, die effektiv den \ r Text sagt aus:

ls #
myfile,txt
foo.bar
anotherfile.txt

Dieses Gesamtkonzept bei weitem nicht ideal ist, aber kann nützlich sein, wenn Sie bash von Windows-nativen Shell fallen wollen einige schnelle Operationen zu tun und dann in Windows weiter zu arbeiten verlassen aus.

Ich verwende EmacsW32. C-h a shell$ gibt eine Liste von Shell-Start-Befehle und die Befehle cmd-Shell und Cygwin-Shell interessant aussehen. Beide Befehle müssen EmacsW32. Sie werden auch in der Speisekarte zu finden. Tools> W & 32 Shells

Wenn Sie Cygwin-Shell zum ersten Mal ausführen, und wenn Sie nicht Setup Cygwin Pfad in Emacs haben, es führt Sie auf die Anpassungsseite, wo Sie können Setup die Cygwin-Pfad durch Suchen-Taste drücken.

Da diese Ansätze nicht für mich arbeiten, ich habe es folgendermaßen:

(Ich verwende NTEmacs die eine DOS-Shell standardmäßig geöffnet wird, so vielleicht Ihre Emacs verhält sich gleich)

Erstellen Sie eine Windows-Umgebungsvariable namens SHELL ( 'SHELL' nicht '$ SHELL') und geben ihm den Weg zu bash.exe Ihrer Cygwin-Installation (zum Beispiel C: \ Programme \ cygwin \ bin \ bash.exe)

Nun, wenn M-x tun Shell es öffnet sich ein heftiger Schlag.

Grüße,

Inno

Neben @ Chris Jones' Antwort über das --login Argument bash zu vermeiden, habe ich die folgenden Befehlszeilenargumente:

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

Die --noediting Option verhindert Interferenzen mit dem GNU Readline-Bibliothek und die Option -i gibt an, dass die Shell interaktiv ist. Ich benutze auch die .emacs_bash Datei in meinem Home-Verzeichnis für alle Emacs spezifische bash Anpassung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top