Wie öffne ich eine Datei in Cygwin Emacs von Windows?

2083
rs028

Ich versuche, Windows-Textdateien in Emacs zu öffnen, die ich unter Cygwin installiert habe. Ich habe folgende Anweisungen befolgt : und eine Fledermaus-Datei wie folgt erstellt:

@echo off chdir C:\LocalApp\cygwin\bin start mintty.exe /usr/bin/emacs-X11.exe %1 

Es startet Emacs, wenn ich in Windows Explorer auf den Dateinamen doppelklicke, aber ich habe zwei Probleme:

  1. Emacs läuft im Konsolenmodus und nicht im Fenstermodus (und ich habe XWin ausgeführt).

  2. Es wird ein leerer Puffer anstelle des Dateiinhalts angezeigt (ich vermute, dass dies ein Pfadproblem ist, aber ich konnte keine Möglichkeit finden, cygpath in das .bat-Skript einzufügen, damit es funktioniert).

Irgendeine Idee? Vielen Dank.

2
Warum nicht einfach NT Emacs installieren? [NT Emacs Link] (http://www.gnu.org/software/emacs/manual/efaq-w32.html) Techie Joe vor 10 Jahren 0
weil ich keine Administratorrechte habe und der Administrator mich nicht zulässt; aber ich konnte ihn überzeugen, mich von cygwin benutzen zu lassen. dumm ich weiß, aber so ist es. rs028 vor 10 Jahren 0
You really don't need admin rights to use NT Emacs. They're just files with no install program at all. The only thing you may need admin rights for is a quick registry hack but it's not mandidtory. The readme/setup text files have all the information. Techie Joe vor 10 Jahren 0
alles klar, dann kann ich das Problem umgehen. Ich wäre trotzdem neugierig, warum meine Lösung nicht funktioniert. Vielen Dank. rs028 vor 10 Jahren 0
Can you open the files within Emacs via the manual directory search? If not there's a problem with the program in general or a bug. I haven't used Emacs via Cygwin. All I've done outside of the general usage is rip the unix commands and DLLs out of the install folder and threw them all into the %systemroot%\system32 directory so I can have the commands available via the native Windows command prompt. You might want to ping a Cygwin board or the developers themselves to see how you can get what you want done accomplished. Techie Joe vor 10 Jahren 0
@TechieJoe "... rippen Sie die Unix-Befehle und DLLs aus dem Installationsordner und warfen sie alle in die% systemroot% \ system32 ..." Oh Gott! Windows hat eine Umgebungsvariable% PATH%, genau wie Unixes. Sie können den Wert in der Systemsteuerung "System" ändern - wenn Sie das Verzeichnis Cygwin bin (normalerweise "c: \ cygwin \ bin") hinzufügen Sie können Cygwin-Befehle in einer Windows-Shell verwenden, ohne auf Grausamkeiten zurückgreifen zu müssen. Aaron Miller vor 10 Jahren 0
Gräueltaten? Es heißt Engineering! Ich habe dies seit den frühesten Versionen von Cygwin getan und bekam den Vorschlag, dies von einem der alten Entwickler dieses Produkts zu tun. Techie Joe vor 10 Jahren 0
@ TechieJoe Es ist mir egal, ob CGF es selbst vorgeschlagen hat. Es war damals eine schlechte Idee, und dies ist jetzt eine schlechte Idee - der Cygwin-Updater kann diese Kopien nicht finden, was möglicherweise zu Problemen führt, wenn sich die Version von cygwin-1.dll ändert. Darüber hinaus ist es nicht generell eine großartige Idee, zufälliges Material in system32 abzulegen. Dies gilt insbesondere, wenn es um ein gesünderes Verfahren geht, um das gewünschte Ergebnis zu erzielen. Ich stehe fest hinter meiner Wahl des Substantivs. Aaron Miller vor 10 Jahren 0
Ich denke, wir können uns damit einverstanden erklären, an dieser Stelle nicht zustimmen. Techie Joe vor 10 Jahren 0

1 Antwort auf die Frage

1
Aaron Miller

1) Emacs startet höchstwahrscheinlich im Konsolenmodus, da keine DISPLAY-Variable festgelegt ist. Setzen Sie diese Umgebungsvariable mit einem Wert, der auf einen X-Server verweist, der Clients akzeptieren kann, und Sie sollten bessere Ergebnisse finden. Sie können Emacs auch eine Anzeige-ID über die Befehlszeilenoption --displayoder übergeben -d, die ich im folgenden Beispiel ausführen werde, da ich nicht wissen kann, wie Sie Env-Variablen in Windows-Batchdateien festlegen:

@echo off chdir c:\LocalApp\cygwin\bin start mintty.exe /usr/bin/emacs-X11.exe --display 127.0.0.1:0 %1 

Falls erforderlich, was wahrscheinlich nicht der --displayFall ist, ersetzen Sie den hier angegebenen Wert durch einen für Ihre X-Server-Konfiguration besser geeigneten Wert.

Es wird wahrscheinlich immer noch ein Konsolenfenster angezeigt, da Sie mit dem Windows-Startbefehl einen Mintty-Prozess erzeugen, den Sie dann zum Starten von Emacs auffordern. Stattdessen können Sie den Cygwin-Befehl run verwenden, der eine bestimmte Binärdatei ohne Konsolenfenster startet und den redundanten mintty-Prozess eliminiert:

@echo off chdir c:\LocalApp\cygwin\bin run /usr/bin/emacs-X11.exe --display 127.0.0.1:0 %1 

2) Schließlich müssen Sie einen Weg finden, um den Dateipfad in einer für Emacs verständlichen Form zu übergeben. Leider bin ich mir ziemlich sicher, dass die Befehlsinterpolation in Windows-Batch-Sprache nicht möglich ist. Sie können also nicht das Äquivalent von zB Bash ausführen $(cygpath -au %1). Möglicherweise ist die beste Option, Cygwin Bash mit der Windows-Batchdatei auszuführen, wobei das Argument Dateiname an ein Skript übergeben wird, das es übersetzt und Emacs startet. Beispielsweise könnte Ihre Batchdatei sein

@echo off chdir C:\LocalApp\cygwin\bin run sh /path/to/launch-emacs.sh %1 

In launch-emacs.sh haben Sie vielleicht etwas wie:

#!/bin/sh cd /cygdrive/c/LocalApp/cygwin/bin /usr/bin/emacs-X11 --display 127.0.0.1:0 `cygpath -au $1` 

die den Pfad via übersetzt cygpath, gibt ihn dann zusammen mit einer Anzeige-ID an Emacs weiter, wie oben beschrieben.

Meine einzige Windows-Box ist zu Hause. Ich hatte also keine Gelegenheit, diese genauen Skripts zu testen, aber ich mache ziemlich ähnliche Dinge mit Emacs auf diesem Computer. Vorausgesetzt, Ihr X-Server ist richtig konfiguriert, wird das Zeug in 1) mit Sicherheit funktionieren, und der Rest sollte OK sein. Modulo ein überflüssiges Konsolenfenster, um das Sie sich vielleicht nicht kümmern. Lassen Sie mich wissen, wie es läuft, und ich werde sehen, welche weitere Hilfe ich anbieten kann.

zunächst entschuldige mich bei allen für die späte antwort und danke für die ganze diskussion. rs028 vor 10 Jahren 0
Ich habe die obige Lösung ausprobiert: Teil # 1 funktioniert wie Sie sagten. Teil # 2 arbeitet zwar nicht ganz. Das Skript launch-emacs.sh scheint die Anweisung `cd / cygdrive / c / LocalApp / cygwin / bin` nicht zu benötigen (der Dateipfad wird dadurch beeinträchtigt). Wenn diese Zeile entfernt wird, kann launch-emacs.sh eine Datei in emacs öffnen, wenn ich sie manuell von mintty aus ausführe, nicht aber, wenn sie von der bat-Datei aufgerufen wird. Es scheint, dass Informationen über die Datei aus irgendeinem Grund nicht korrekt von einem Skript an das nächste übergeben werden. sie scheinen mir recht zu sein. Prost. rs028 vor 10 Jahren 0
@rsom Wenn Sie diese Skripts mit Dateien verwenden, deren Pfade Leerzeichen enthalten, müssen Sie wahrscheinlich sowohl in der Batchdatei als auch im Shellskript den Positional-Parameter in Anführungszeichen setzen, z. B. "% 1" `und "$ 1" `im letzteren. Entschuldigung, daran hätte ich eigentlich denken sollen. Aaron Miller vor 10 Jahren 0
Nein, ich denke es ist etwas anderes. Die bat-Datei lautet: `@echo off chdir C: \ LocalApp \ RS445 \ cygwin \ bin und führt sh /cygdrive/c/LocalApp/RS445/cygwin/launch-emacs.sh"% 1 "` und das launch-emacs.sh aus Datei ist im Grunde nur: `/ usr / bin / emacs-X11 --display 127.0.0.1:0 \` cygpath -au "$ 1" \ `` Ich verstehe, dass das erste Skript eine Shell (sh) öffnet und ob ich es ausgeben könnte dazu könnte ich vielleicht aus dem zweiten Skript verstehen, ob Dateiname und Pfad korrekt weitergegeben werden. aber die fenster verschwinden zu schnell! rs028 vor 10 Jahren 0
@rsom Sie können dem Shell-Skript vor dem Start von Emacs eine Zeile hinzufügen, z. B. `echo \` cygpath -au "$ 1" \ ">> / tmp / launch-emacs.log", um zu sehen, welcher Pfad tatsächlich an den übergeben wird Emacs binär. Dieselbe Technik verallgemeinert, um so ziemlich alle Informationen zu erhalten, die Sie aus dem Shell-Skript benötigen, und Sie können "-F / tmp / launch-emacs.log" in einem anderen Shell-Fenster anzeigen, um zu sehen, was bei jedem Lauf aus dem Skript kommt. Aaron Miller vor 10 Jahren 0
toller tipp! Warum ich immer vergesse, dass ich die Ausgabe umleiten kann, weiß ich nicht. Wie sich herausstellt, wenn "echo" $ 1 "` ausgeführt wird, wird der Dateiname ohne Schrägstriche an das Shellskript übergeben, z Anstelle von doppelten Anführungszeichen wird es korrekt (obwohl Cygpath aus irgendeinem Grund immer noch fehlschlägt) rs028 vor 10 Jahren 0