Wie kann ich Cygwin Bash Shell aus Emacs laufen?
-
04-07-2019 - |
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?
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.