Приложение C  Emacs и MS-DOS – ЧАСТЬ 2

В MS-DOS нет понятия о начальном каталоге,  поэтому в MS-DOS Emacs делает вид, что каталог, в котором он установлен — это значение переменной среды HOME.  То есть, если исполняемый  файл Emacs, ‘emacs.exe’, находится в каталоге ‘c:/utils/emacs/bin’, то Emacs ведет себя так, как если бы HOME была установлена равной ‘c:/utils/emacs’.  В частности, именно здесь Emacs ищет файл инициализации,  ‘_emacs’. Помня это, вы можете использовать в именах файлов знак ‘~’ как псевдоним начального каталога, как вы делали бы это в Unix. Вы также можете установить переменную среды HOME до запуска Emacs;  ее значение перекроет описанное выше поведение по умолчанию.

Emacs обрабатывает в MS-DOS имя каталога ‘/dev’  особым образом, из-за некоторых средств в библиотеках эмулятора из DJGPP, которые создают видимость, что в этом каталоге перечислены имена устройств ввода/вывода.  Мы рекомендуем избегать использования на любом диске настоящего каталога с именем ‘/dev’.

C.4  Текстовые файлы и двоичные файлы

GNU Emacs использует для разделения строк знак перевода строки.  Это соглашение относится к Unix, на которой GNU Emacs был разработан, и в системах GNU, так как они принимают Unix за модель.

MS-DOS и MS-Windows обычно используют для разделения строк последовательность возврат каретки-прогон строки. (Прогон строки — это тот же знак, что и перевод строки.) Следовательно, для удобного редактирования в Emacs необходимо преобразование этих последовательностей конец-строки (EOL). И обычно Emacs делает это: во время считывания файла он превращает возврат каретки-перевод строки в перевод строки, а во время записи — перевод строки в возврат каретки-перевод строки. Это преобразование реализуется тем же механизмом, что управляет преобразованием кодов знаков из разных языков (см. Раздел 18.7 [Системы  кодирования], с. 165).

Одним из следствий этого особого преобразования формата большинства  файлов является то, что сообщаемая Emacs позиция знака (см.  Раздел 4.9 [Информация о позиции], с. 40) не соответствует  информации о размере файла, известной операционной системе.

Некоторые виды файлов не должны преобразовываться, так как их содержимое  не является на самом деле  текстом.   Следовательно,  Emacs различает в MS-DOS некоторые файлы как  двоичные и считывает и записывает их буквально.  (Это  различение — не часть MS-DOS; оно делается только в Emacs.)  Сюда включаются исполняемые файлы, сжатые архивы и так далее.  Emacs решает, двоичный это файл или нет, по его имени: шаблоны имен, указывающих на двоичные  файлы, определяются переменной file-namebuffer-file-type-alist.  Обратите внимание, если имя файла соответствует одному из шаблонов для двоичных файлов в file-name-buffer-file-type-alist,  Emacs использует систему кодирования no-conversion (см.  Раздел 18.7 [Системы кодирования],  с. 165), которая выключает все преобразования кодирования, а не только EOL.

Кроме того, если Emacs узнает из содержимого  файла, что в нем в качестве разделителя строк используется  перевод строки, а не возврат каретки-прогон строки, он не делает превращения при чтении или записи этого файла.  Таким образом, вы можете редактировать в MS-DOS файлы с систем Unix или GNU без специальных  усилий, и в них останутся знаки EOL в стиле Unix.

Вы можете обратиться к файлу и указать, нужно ли воспринимать его как текстовый или же как двоичный, с помощью команд find-file-text и find-file-binary.  Преобразование EOL — это часть более общего механизма  преобразования  системы кодирования, поэтому другой способ указать это же — воспользоваться командами для задания системы кодирования  (см.  Раздел 18.9 [Задание кодирования], с. 168). Например, C-x hRETc undecided-unix hRETC-x C-f foobar.txt обратится к файлу ‘foobar.txt’ без превращения EOL.

В строке режима показывается, использовалось ли для текущего буфера преобразование EOL. Обычно после буквы системы кодирования в начале строки режима появляется двоеточие. Если в этом буфере используется  преобразование последовательности  конец-строки MS-DOS, этот знак заменяется на обратную косую черту.

Если вы используете NFS или Samba для доступа к файловым системам, находящимся на компьютерах с Unix или GNU, Emacs не должен производить  преобразование EOL для любых файлов в этих файловых системах — даже если вы создаете новый файл. Чтобы затребовать это, обозначьте их как нетранслируемые файловые системы, вызвав функцию

add-untranslated-filesystem.  Она принимает один аргумент:  имя файловой системы,

включая букву диска, и, возможно, каталог. Например,

(add-untranslated-filesystem "Z:")

обозначает как нетранслируемую файловую систему диск Z, а

(add-untranslated-filesystem "Z:\\foo")

обозначает как нетранслируемую файловую систему каталог ‘\foo’ на диске Z.

Чаще  всего add-untranslated-filesystem пишется в файле ‘_emacs’  или же  в файле

‘site-start.el’, чтобы все пользователи вашей системы получили от нее пользу.

Чтобы   отменить  действие  add-untranslated-filesystem,   используйте   функцию remove-untranslated-filesystem.    Эта  функция принимает один аргумент,  который должен быть такой же строкой, что была ранее передана add-untranslated-filesystem.

C.5  Печать в MS-DOS

Команды печати, такие как lpr-buffer (см.  Раздел 30.4 [Распечатка], с. 331) и psprint-buffer (см.   Раздел 30.5 [Postscript], с. 332), могут  работать в MS-DOS и MSWindows, посылая вывод на порты принтера, если недоступна команда в стиле Unix lpr. Такое поведение контролируется теми же  переменными,  что управляют печатью через lpr в Unix (см. Раздел 30.4 [Распечатка], с. 331, см. Раздел 30.6 [Управление печатью в Postscript], с. 332), но MS-DOS и MS-Windows значения этих переменных по умолчанию отличаются от их значений по умолчанию в Unix.

Если вы хотите использовать ваш локальный принтер, печатающий обычным для DOS образом, то установите лисповскую переменную lpr-command в значение "" (это значение по умолчанию), а printer-name  — равной имени порта принтера — например, "PRN", обычного порта локального принтера (это  значение по умолчанию), или "LPT2",  или "COM1",  для последовательного  принтера.   Вы также  можете  установить printer-name равной имени файла, в этом случае “печатаемый” вывод на самом деле добавляется  в конец этого файла.  Если вы установите printer-name в значение "NUL", печатаемый вывод забывается (посылается в системное нулевое устройство) без предупреждений.

В MS-Windows, когда установлено  сетевое программное  обеспечение, вы можете также использовать принтер, предоставляемый другой машиной, установив printer-name равной UNC-имени разделяемого  ресурса для этого принтера — например, "//joes_pc/hp4si". (Здесь не имеет значения, пишете  ли вы простые или обратные косые черты.)   Чтобы выяснить имена разделяемых принтеров, запустите в командной подсказке DOS команду

‘net view’ для получения перечня серверов и ‘net view имясервера’, чтобы увидеть имена принтеров (и каталогов), предоставляемых этим сервером.

Если вы устанавливаете printer-name равной имени файла, лучше всего будет задать абсолютное имя. Emacs изменяет рабочий каталог в соответствии с каталогом по умолчанию текущего буфера, так что если имя файла в printer-name относительно, в результате у вас окажется несколько таких  файлов,  по одному в каталоге  каждого буфера,  откуда производилась печать.

Команды print-buffer и print-region вызывают программу pr или используют особые переключатели  программы lpr, чтобы создать на каждой напечатанной странице заголовок.   Обычно в MS-DOS и MS-Windows нет этих программ, поэтому по умолчанию переменная lpr-headers-switches устанавливается так, что запросы на печать заголовков страниц игнорируются.  Поэтому print-buffer и print-region дают тот же  вывод, что и lpr-buffer и lpr-region,  соответственно. Если у вас есть подходящая программа pr (например, из GNU Textutils),  установите lpr-headers-switches равной nil; тогда Emacs будет вызывать pr для создания заголовков страниц и печатать полученный вывод, как указано переменной printer-name.

Наконец, если у вас есть подобие lpr, вы можете установить переменную lpr-command в значение "lpr". Тогда Emacs будет использовать для печати lpr, как и в других системах. (Если имя этой программы отличается от ‘lpr’, установите lpr-command так, чтобы она указывала, где ее можно найти.) Когда lpr-command  не равна "", переменная lpr-switches несет свой обычный смысл. Если значением переменной printer-name является строка, то она используется как значение ключа ‘-P’ для lpr, как и в Unix.

Параллельный  набор переменных, ps-lpr-command,  ps-lpr-switches и ps-printername (см.  Раздел 30.6 [Управление печатью в Postscript], с. 332), определяет, как нужно печатать PostScript-файлы. Эти переменные используются  таким же способом, как соответствующие описанные  выше  переменные для печати не в PostScript.  Таким образом, значение ps-printer-name используется в качестве имени устройства (или файла), на которое посылается вывод PostScript, так же, как printer-name используется для печати не в PostScript. (Это два различных набора переменных в случае, если у вас два принтера, подсоединенных к разным портам, и только один из них — PostScript-принтер.)

Значение переменной ps-lpr-command равно по умолчанию "",  что направляет вывод PostScript на порт принтера, заданный в ps-printer-name.   Но ps-lpr-command  можно также  установить равной имени программы, воспринимающей  PostScript-файлы.  Это значит, что если у вас не PostScript-принтер, вы можете  задать в этой переменной имя программы-интерпретатора PostScript (такой как Ghostscript). Любые переключатели, которые необходимо передать интерпретатору, указываются в переменной ps-lpr-switches. (Если значением ps-printer-name является строка, она будет добавлена к списку переключателей в качестве значения ключа ‘-P’.  Скорее всего, это будет полезно, только если вы пользуетесь lpr,  поэтому, если вы печатаете через интерпретатор, вам следует cделать ps-printer-name не строкой, чтобы она проигнорировалась.)

Например, чтобы использовать Ghostscript для печати на принтере Epson, подсоединен-

ному к порту ‘LPT2’, поместите в ваш файл ‘_emacs’ такой код:

(setq ps-printer-name  t)  ; Ghostscript  не принимает -P (setq ps-lpr-command  "c:/gs/gs386")

(setq ps-lpr-switches ’("-q" "-dNOPAUSE" "-sDEVICE=epson"

"-r240x72"

"-sOutputFile=LPT2" "-Ic:/gs"))

(Это предполагает, что Ghostscript установлен в каталоге ‘"c:/gs"’.)

Для обратной совместимости,  если переменная  dos-printer  (dos-ps-printer) имеет значение,  то оно перекрывает  значение printer-name  (ps-printer-name);  это относится только к MS-DOS и MS-Windows.

C.6  Поддержка разных языков в MS-DOS

Emacs поддерживает в MS-DOS те  же  наборы знаков разных языков, что и в Unix, и на других платформах (см.  Глава 18 [MULE],  с. 161), включая системы кодирования для преобразования между различными наборами знаков. Однако, из-за несовместимости между MS-DOS/MS-Windows и Unix у этой поддержки есть несколько специфичных для DOS аспектов, о которых пользователи должны знать.  Эти аспекты описаны в данном разделе.

M-x dos-codepage-setup

Приводит экран Emacs и системы кодирования в соответствие с текущей кодо-

вой страницей DOS.

M-x codepage-setup

Создает систему кодирования для конкретной кодовой страницы DOS.

По своему дизайну MS-DOS поддерживает один набор из 256 знаков в каждый момент времени, но дает вам выбрать из множества наборов знаков. Эти альтернативные наборы знаков известны как кодовые страницы DOS. Каждая кодовая страница включает все 128 знаков ASCII, но остальные 128 (с кодами от 128 до 255) изменяются от одной кодовой страницы к другой. Каждой кодовой странице DOS присвоен трехзначный номер, как 850,

862, etc.

В  противоположность X  Windows,  которая  позволяет вам использовать несколько шрифтов одновременно, в MS-DOS нельзя использовать  несколько кодовых страниц в течение одного сеанса. Вместо этого, MS-DOS загружает одну кодовую страницу во время запуска, и чтобы изменить кодовую страницу, вы должны перезагрузить MS-DOS1 . Практически те же ограничения применяются к исполняемым файлам DOS в других системах, таких как MS-Windows.

Если вы вызываете Emacs в MS-DOS с ключом ‘-unibyte’ (см.  Раздел A.2 [Ключи запуска], с. 386), Emacs не делает никаких преобразований знаков, не входящих в ASCII. Напротив, он считывает и записывает такие знаки буквально и буквально посылает их восьмибитные коды на дисплей. Таким образом, однобайтный Emacs поддерживает в MSDOS текущую кодовую страницу, какой бы она не была, но не может представить никакие другие знаки.

Для многобайтной работы на MS-DOS, Emacs должен знать, какие знаки может отображать выбранная кодовая страница DOS. Поэтому он вскоре после старта посылает системе запрос о номере выбранной  кодовой страницы и сохраняет этот номер в переменной dos-codepage. Некоторые системы возвращают  437, значение по умолчанию, даже если в действительности кодовая страница другая. (Обычно это происходит, если вы используете кодовую страницу, встроенную в дисплей.) Вы можете велеть Emacs использовать другую кодовую страницу, устанавливая в вашем файле инициализации переменную dos-codepage.

Многобайтный Emacs поддерживает только некоторые кодовые страницы DOS, те, что показывают восточные виды письма, как японская кодовая страница 932, и те,  которые кодируют один из наборов знаков ISO 8859.

Дальневосточные кодовые страницы могут непосредственно отображать один из наборов знаков MULE  для этих стран, поэтому Emacs просто подготавливает к применению подходящую систему кодирования терминала, которая поддерживается этой кодовой страницей.  Описываемые в остальной части главы особые средства  относятся в основном к кодовым страницам, кодирующим наборы знаков ISO 8859.

Для кодовых страниц, соответствующих одному из наборов знаков ISO 8859, Emacs узнает имя этого набора, основываясь на номере кодовой страницы. Emacs автоматически создает систему кодирования для поддержки чтения и записи файлов в текущей кодовой странице и использует эту систему кодирования по умолчанию. Имя этой системы кодирования — cpnnn, где nnn — это номер кодовой страницы.2

Все системы кодирования cpnnn используют в качестве мнемоники для строки режима букву ‘D’  (от “DOS”).  Поскольку во время запуска и система кодирования терминала, и система кодирования для ввода/вывода  файлов устанавливаются  в подходящее значение cpnnn, строка режима в MS-DOS обычно начинается ‘-DD\-’.    См.  Раздел 1.3 [Строка режима], с. 25.

Так как кодовая страница также указывает и на то, какой вид письма вы используете, Emacs автоматически запускает set-language-environment, чтобы выбрать языковую среду для этой письменности (см. Раздел 18.3 [Языковые  среды], с. 162).

1  Обычно одна кодовая страница прошита  в памяти дисплея, тогда  как  другие можно устанавливать,

изменяя системные файлы конфигурации, а именно, ‘CONFIG.SYS’, и перезагружаясь.

2  Стандартные системы кодирования Emacs для ISO 8859 не подходят для этой цели, так  как  обычно кодовые страницы DOS не соответствуют  стандартным  кодам ISO. Например, буква ‘?c’  (‘c’  с  седилем) имеет в стандартном наборе символов Latin-1 код 231, но соответствующая кодовая страница 850 использует для этой буквы код 135.

Если буфер  содержит знак, принадлежащий  какому-то другому набору ISO 8859, не тому, что поддерживается выбранной кодовой страницей DOS, Emacs показывает его с помощью последовательности знаков ASCII. Например, если в текущей кодовой странице нет глифа для буквы ‘`o’ (маленькой ‘o’ с акцентом грав), она отображается как ‘{‘o}’, где фигурные скобки служат визуальным указанием на то, что это один знак.  (Это может выглядеть странно с некоторыми знаками не из латиницы, а, например, из греческого или иврита; но это все же можно читать, если вы знаете язык.) Хотя знак может занимает на экране несколько столбцов, он на самом деле является  одиночным знаком, и все команды Emacs понимают его как одиночный.

Не всем знакам из кодовых страниц DOS есть соответствия в ISO 8859 — некоторые используются для других целей, например  для псевдографики.  В Emacs нет внутреннего представления для этих знаков, поэтому когда вы считываете  файл, содержащий такие знаки, они превращаются  в определенные  знаковые коды, задаваемые переменной  dosunsupported-character-glyph.

Кроме  ISO 8859, Emacs поддерживает много других наборов знаков, но он не может отображать их в MS-DOS. Поэтому, если в буфере появляется один из таких многобайтных знаков, Emacs для MS-DOS показывает их, как указано в переменной dos-unsupportedcharacter-glyph; по умолчанию этим глифом является пустой треугольник.  Чтобы увидеть действительный код такого знака и набор, к которому он принадлежит, используйте команду C-u C-x =. См. Раздел 4.9 [Информация о позиции], с. 40.

По умолчанию Emacs определяет систему кодирования для поддержки текущей кодовой страницы. Чтобы определить систему кодирования для какой-то другой кодовой страницы (например, чтобы обратиться к файлу, написанному  на машине с DOS в другой стране), используйте команду M-x codepage-setup.  Она запрашивает с возможностью завершения трехзначный номер кодовой страницы, а затем создает для нее систему кодирования. Тогда для чтения и записи файла  вы можете  применять эту новую систему кодирования, но тогда вы должны явно задавать  ее командам работы с файлами (см. Раздел 18.9 [Задание кодирования], с. 168).

Эти  системы кодирования также  полезны для обращения  к  файлам, использующим кодовые страницы DOS, когда Emacs запущен на других операционных системах.

C.7  Подпроцессы в MS-DOS

Поскольку MS-DOS — это однозадачная “операционная система”, асинхронные подпроцессы недоступны.   В частности, не  работают режим Shell и его варианты.  Также  не работают большинство средств Emacs, использующих  асинхронные подпроцессы, включая проверку правописания и GUD. Когда вы сомневаетесь, попробуйте и увидите; неработающие команды печатают сообщение об ошибке, говорящее, что асинхронные подпроцессы не поддерживаются.

Компиляция под Emacs с использованием M-x compile,  поиск файлов с помощью M-x grep и показ различий между файлами с помощью M-x diff в действительности работают, запуская подчиненные процессы синхронно. Это означает, что вы не можете редактировать, пока подчиненный  процесс не завершится.

Напротив, Emacs, скомпилированный как “родное” приложение Windows, поддерживает

асинхронные подпроцессы. См. Раздел C.8 [Процессы под Windows], с. 411.

Команды печати, такие как lpr-buffer (см.  Раздел 30.4 [Распечатка], с. 331) и psprint-buffer (см. Раздел 30.5 [Postscript], с. 332), работают в MS-DOS, посылая вывод на один из портов принтера. См. Раздел C.5 [Печать в MS-DOS], с. 407.

Когда вы запустили синхронный процесс в MS-DOS, убедитесь, что он завершился и не пытается читать ввод с клавиатуры. Если программа не завершится  сама, вы не сможете прервать ее  вручную, потому что  MS-DOS не предоставляет  общего способа  прервать процесс. Иногда в таких случаях может помочь нажатие C-c или C-hBREAKi.

Доступ к  файлам на других  машинах не поддерживается  в MS-DOS. Другие ориентированные на работу с сетью команды, такие как  отправка почты, хождение по Web, удаленный вход в систему и другие, также не работают, если в MS-DOS не встроен доступ к сети через сетевой редиректор.

Dired в MS-DOS использует пакет ls-lisp,  где  на других  платформах применяется системная команда ls.  Поэтому Dired поддерживает в MS-DOS лишь некоторые из возможных ключей, которые вы можете перечислить в переменной dired-listing-switches. Работают ключи ‘-A’, ‘-a’,  ‘-c’,  ‘-i’, ‘-r’, ‘-S’, ‘-s’,  ‘-t’ и ‘-u’.

C.8  Подпроцессы в Windows  95 и NT

Emacs, скомпилированный как “родное” приложение Windows (в противоположность версии для DOS) включает полную поддержку асинхронных подпроцессов.  В версии для Windows синхронные и асинхронные подпроцессы работают нормально как в Windows 95, так и в Windows NT, до тех пор, пока вы запускаете только 32-битные приложения Windows. Однако, если вы запускаете в подпроцессе приложение DOS, вы можете столкнуться с некоторыми проблемами или вообще не суметь запустить это приложение; а если вы одновременно запустили два приложения DOS в двух подпроцессах, вам, возможно, придется перезагрузить систему.

Поскольку  стандартный интерпретатор команд (и  большинство утилит  командной строки) в Windows 95 являются приложениями DOS, эти проблемы  весьма важны.  Но мы ничего не можем с этим поделать, их может исправить только Microsoft.

Если вы запустили только один подпроцесс с приложением DOS, он должен работать, как ожидается,  если только он “ведет себя хорошо” и не пытается получить прямой доступ к дисплею и не делает необычных действий.  Если у вас есть программа отслеживания загрузки CPU, то она покажет, что машина загружена на 100%, даже  если приложение DOS ничего не делает, но это просто пережиток того способа, которым эти программы измеряют загрузку CPU.

Вы должны завершить приложение DOS до того, как запустите любое другое в отдельном подпроцессе. Emacs не может прервать или завершить подпроцесс DOS. Единственный способ остановить такой подпроцесс — дать его программе команду выхода.

Если вы попытаетесь  одновременно запустить два приложения DOS в разных подпроцессах, второй будет приостановлен до завершения первого, даже если оба они асинхронные.

Если вы можете перейти в первый подпроцесс и велеть ему выйти, второй процесс должен нормально продолжить работу. Однако, если второй подпроцесс синхронный,  зависнет сам Emacs до тех пор, пока не завершится первый подпроцесс. Если это не может случаться без пользовательского  ввода, вам не останется ничего, кроме как перезагрузиться, если вы работаете на Windows 95. Если у вас Windows NT, вы можете использовать монитор процессов, чтобы уничтожить  нужный экземпляр ntvdm (это уничтожит  оба подпроцесса DOS).

Если вам приходится в такой ситуации перезагружать Windows 95, не  используйте команду Shutdown в меню Start;  это только подвесит систему.  Вместо этого, нажмите CTL-ALT-hDELи выберите затем Shutdown. Обычно это работает, хотя и может занять несколько минут.

C.9  Использование системного меню  в Windows

Emacs, собранный как “родное” приложение Windows, обычно выключает такое свойство Windows, что прижатие клавиши hALTi  вызывает меню.  Так  делается, потому что hALTi  работает в Emacs в качестве hMETAi.  Часто при использовании Emacs пользователи

временно нажимают клавишу hMETAi, а потом меняют решение; если это будет вызывать меню Windows, то смысл последующих команд изменится. Многие находят это неприятным.

Вы можете снова задействовать  обработку прижатия клавиши hALTi, принятую в Windows по умолчанию, установив w32-pass-alt-to-system в отличное от nil значение.

Источник: Ричард Столмен, Руководство по GNU Emacs

Похожие посты:

Вы можете оставить комментарий, или ссылку на Ваш сайт.

Оставить комментарий