2

Я пытаюсь заставить 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 и заставить его работать).

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

1 ответ1

1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .