如何从Windows打开Cygwin Emacs中的文件?


2

我正在尝试在Emacs中创建Windows打开的文本文件,我在Cygwin下安装了它。我已按照这些说明操作:并创建了一个这样的bat文件:

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

当我在Windows资源管理器中双击文件名时它会启动Emacs,但我有两个问题:

  1. Emacs在控制台模式下运行,而不是在窗口模式下(我运行XWin)。

  2. 它显示一个空缓冲区而不是文件内容(我怀疑这是一个路径问题,但我找不到在.bat脚本中插入cygpath并使其工作的方法)。

任何想法?谢谢。


为什么不安装NT Emacs? NT Emacs Link
Techie Joe 2013年

因为我没有管理员权限,管理员不会让我; 但我设法说服他让我使用cygwin。傻我知道,但就是这样。
rs028 2013年

您真的不需要管理员权限来使用NT Emacs。它们只是没有安装程序的文件。您可能需要管理员权限的唯一事情是快速注册表黑客,但它不是强制性的。自述文件/设置文本文件包含所有信息。
Techie Joe 2013年

好吧,那我就可以解决这个问题了。我仍然很想知道为什么我的解决方案不起作用。谢谢。
rs028 2013年

你能通过手动目录搜索打开Emacs中的文件吗?如果不是这个程序一般有问题或有bug。我没有通过Cygwin使用Emacs。我在一般用法之外所做的就是将unix命令和DLL从安装文件夹中删除并将它们全部放入%systemroot%\ system32目录中,这样我就可以通过本机Windows命令提示符获得命令了。您可能想要ping一个Cygwin板或开发人员自己,看看如何获​​得您想要完成的任务。
Techie Joe 2013年

Answers:


1

1)Emacs最有可能在控制台模式下启动,因为没有设置DISPLAY变量; 设置该环境变量,其值指向能够接受客户端的X服务器,您应该找到更好的结果。您还可以通过--display-d命令行选项将显示标识符传递给Emacs,我将在以下示例中执行此操作,因为我不知道如何在Windows批处理文件中设置env vars:

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

如果需要,可能不是,请将--display此处给出的值替换为更适合您的X服务器配置的值。

这可能仍会显示一个控制台窗口,因为您正在使用Windows启动命令生成一个简短的进程,然后您要求启动Emacs。你可以做的是使用Cygwin run命令,该命令在没有控制台窗口的情况下启动给定的二进制文件,并消除多余的mutyty进程:

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

2)最后,您需要找到一种方法,以一种可以理解的形式将文件路径传递给Emacs。不幸的是,我非常确定在Windows批处理语言中不可能进行命令插值,所以你不能做相当于例如Bash的操作$(cygpath -au %1)。也许你最好的选择可能是让Windows批处理文件运行Cygwin Bash,将filename参数传递给翻译它的脚本并启动Emacs。例如,您的批处理文件可能是

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

然后,在launch-emacs.sh中,您可能会遇到以下情况:

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

它将路径转换为通过cygpath,然后将其移交给Emacs,以及如上所述的显示标识符。

我唯一的Windows盒子在家里,所以我没有机会测试这些确切的脚本,但我在那台机器上用Emacs做了一些非常相似的事情; 假设您的X服务器配置正确,1)中的内容几乎肯定会起作用,其余的应该是OK模块化一个多余的控制台窗口,您可能会或可能不关心它。让我知道它是怎么回事,我会看到我能提供什么进一步的帮助。


首先,对于迟到的回复向所有人道歉并感谢所有讨论。
rs028 2013年

我已经尝试了上述解决方案:第1部分就像你说的那样工作。第2部分作品但不完全。launch-emacs.sh脚本似乎不需要cd /cygdrive/c/LocalApp/cygwin/bin指令(它与文件路径混淆)。如果该行被取出,launch-emacs.sh可以在emacs中打开一个文件,如果我从mintty手动运行它,但如果从bat文件调用它则不行。似乎有关该文件的信息由于某种原因未能从一个脚本正确传递到下一个脚本。他们似乎对我而言。干杯。
rs028 2013年

@rsom如果您将这些脚本与路径包含空格的文件一起使用,则可能需要在批处理文件和shell脚本中的位置参数周围添加引号,例如"%1"在前者和"$1"后者中。对不起,我应该首先想到这一点。
Aaron Miller

不,我认为这是别的。bat文件是:@echo off chdir C:\LocalApp\RS445\cygwin\bin run sh /cygdrive/c/LocalApp/RS445/cygwin/launch-emacs.sh "%1"而launch-emacs.sh文件基本上只是:/usr/bin/emacs-X11 --display 127.0.0.1:0 `cygpath -au "$1"`我理解第一个脚本打开一个shell(sh),如果我可以从第二个脚本输出它,也许我可以理解文件名和路径传递正确。但是窗户消失得太快了!
rs028 2013年

@rsom你可以在启动Emacs之前向shell脚本添加一行,例如echo `cygpath -au "$1"` >> /tmp/launch-emacs.log查看实际传递给Emacs二进制文件的路径。相同的技术通常可以从shell脚本中获取您需要的任何信息,并且您可以tail -F /tmp/launch-emacs.log在另一个shell窗口中查看每次运行时脚本中的内容。
Aaron Miller
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.