Как открыть файл в Cygwin Emacs из Windows?

2088
rs028

Я пытаюсь заставить Windows открывать текстовые файлы в Emacs, который я установил под Cygwin. Я следовал этим инструкциям : и создал файл bat следующим образом:

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

Он запускает Emacs, когда я дважды щелкаю по имени файла в проводнике Windows, но у меня есть две проблемы:

  1. Emacs работает в консольном режиме, а не в оконном режиме (и у меня работает XWin).

  2. Он показывает пустой буфер вместо содержимого файла (я подозреваю, что это проблема пути, но я не смог найти способ вставить cygpath в скрипт .bat и заставить его работать).

Любая идея? Благодарю.

2
Почему бы просто не установить NT Emacs? [NT Emacs Link] (http://www.gnu.org/software/emacs/manual/efaq-w32.html) Techie Joe 10 лет назад 0
потому что у меня нет прав администратора, а администратор не позволит мне; но мне удалось убедить его позволить мне использовать Cygwin. глупо, я знаю, но это так. rs028 10 лет назад 0
Вам действительно не нужны права администратора для использования NT Emacs. Это просто файлы без какой-либо программы установки. Единственное, для чего вам могут понадобиться права администратора - это быстрый взлом реестра, но это не обязательно. Текстовые файлы readme / setup содержат всю информацию. Techie Joe 10 лет назад 0
хорошо, тогда я могу обойти проблему. Тем не менее мне было бы интересно узнать, почему мое решение не работает. Благодарю. rs028 10 лет назад 0
Можете ли вы открыть файлы в Emacs с помощью ручного поиска в каталоге? Если нет, то есть проблема с программой в целом или ошибка. Я не использовал Emacs через Cygwin. Все, что я сделал за пределами общего использования, это вырвал команды unix и библиотеки DLL из папки установки и бросил их все в каталог% systemroot% \ system32, чтобы я мог получить команды, доступные через командную строку Windows. Возможно, вы захотите проверить связь с доской Cygwin или самими разработчиками, чтобы узнать, как можно добиться того, чего вы хотите добиться. Techie Joe 10 лет назад 0
@TechieJoe "... вырвать команды unix и библиотеки DLL из папки установки и выбросить их все в% systemroot% \ system32 ..." О Боже! В Windows есть переменная окружения% PATH%, как в Unix, и вы можете изменить ее значение из панели управления «Система» - если вы добавите в нее каталог bin Cygwin (обычно `c: \ cygwin \ bin`), вы Вы сможете использовать команды Cygwin в оболочке Windows, не прибегая к зверствам. Aaron Miller 10 лет назад 0
Зверства? Это называется инжиниринг! Занимался этим с самых ранних версий Cygwin и получил предложение сделать это от одного из старых разработчиков этого продукта. Techie Joe 10 лет назад 0
@TechieJoe Мне все равно, если сам CGF предложил это; тогда это была плохая идея, и сейчас это плохая идея - программа обновления Cygwin не сможет найти эти копии, что, как я вижу, может вызвать проблемы при изменении версии cygwin-1.dll; более того, использование случайных вещей в system32 не является хорошей идеей по общему принципу, особенно когда есть гораздо более разумный способ получить желаемый результат. Я твердо поддерживаю мой выбор существительного. Aaron Miller 10 лет назад 0
Я думаю, что мы можем согласиться не согласиться на этом этапе. Techie Joe 10 лет назад 0

1 ответ на вопрос

1
Aaron Miller

1) Emacs, скорее всего, запускается в консольном режиме, потому что переменная DISPLAY не установлена; установите эту переменную среды со значением, указывающим на X-сервер, способный принимать клиентов, и вы должны найти лучшие результаты. Вы также можете передать идентификатор дисплея через параметр командной строки --displayили -dв Emacs, что я и сделаю в следующем примере, потому что я не знаю, как установить переменные env в пакетных файлах Windows:

@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, которая запускает данный двоичный файл без окна консоли и устраняет избыточный процесс mintty:

@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, который передает аргумент имени файла в скрипт, который переводит его и запускает 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) почти наверняка сработает, а все остальное должно быть в порядке по модулю лишнего консольного окна, о котором вы можете заботиться или не заботиться. Дайте мне знать, как это происходит, и я посмотрю, какую дополнительную помощь я могу предложить.

Прежде всего, извинения всем за поздний ответ и спасибо за все обсуждения. rs028 10 лет назад 0
Я пробовал вышеуказанное решение: часть # 1 работает так, как вы сказали. часть № 2 вроде работает, но не совсем. Сценарий launch-emacs.sh, похоже, не нуждается в инструкции `cd / cygdrive / c / LocalApp / cygwin / bin` (он путается с путем к файлу). если эта строка удалена, launch-emacs.sh может открыть файл в emacs, если я запускаю его вручную из mintty, но не, если он вызывается из файла bat. Кажется, информация о файле по какой-то причине неправильно передается из одного сценария в другой. они кажутся мне правильными. веселит. rs028 10 лет назад 0
@rsom Если вы используете эти сценарии с файлами, пути которых содержат пробелы, вам, вероятно, потребуется добавить кавычки вокруг позиционного параметра как в пакетном файле, так и в сценарии оболочки, например, `"% 1 "` в первом и ` "$ 1" в последнем. Извините, я должен был подумать об этом в первую очередь. Aaron Miller 10 лет назад 0
Нет, я думаю, что это что-то еще. файл 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" \ `` Я понимаю, что первый скрипт открывает оболочку (sh), и если бы я мог вывести к нему из второго скрипта, может быть, я мог бы понять, правильно ли переданы имя файла и путь. но окна исчезают слишком быстро! rs028 10 лет назад 0
@rsom Вы можете добавить строку в скрипт оболочки перед запуском Emacs, например, `echo \` cygpath -au "$ 1" \ `>> / tmp / launch-emacs.log`, чтобы увидеть, какой путь фактически передается в Emacs бинарный. Эта же техника обобщает получение практически всей необходимой информации из сценария оболочки, и вы можете `tail -F / tmp / launch-emacs.log` в другом окне оболочки, чтобы увидеть, что выходит из сценария при каждом запуске. Aaron Miller 10 лет назад 0
отличный совет! почему я всегда забываю, что могу перенаправить вывод, которого я не знаю. как выясняется, если я выполняю `echo" $ 1 "`, это показывает, что имя файла передается в сценарий оболочки без слешей, как в: `C: LocalDatacodetools_RprocessData.R`, если я использую одинарные кавычки около% 1 в файле bat вместо двойных кавычек получается правильно (хотя по какой-то причине cygpath все равно не работает) rs028 10 лет назад 0