Emacs и MS-DOS

Этот раздел кратко описывает особенности использования Emacs под "операционной системой" MS-DOS (известной также как "MS-DOG"). Если вы соберете Emacs для MS-DOS, этот двоичный файл можно будет также запустить на Windows 3.X, Windows NT, Windows 9X или OS/2 как приложение DOS; сведения из данной главы относятся ко всем этим системам, если вы используете Emacs, который был скомпилирован для MS-DOS.

Заметьте, что возможно собрать Emacs специально для Windows NT или Windows 9X. Если вы сделаете так, большая часть главы будет неприменима к вашему случаю; тогда вы получите поведение, которое более близко к тому, что описано в остальной части руководства, и которое включает поддержку для длинных имён файлов, множественных фреймов, полосок прокрутки, меню для мыши и подпроцессов. Однако, раздел о текстовых и двоичных файлах всё ещё будет иметь силу. Также в конце этой главы есть два раздела, которые относятся исключительно к Windows NT и 9X.

Клавиатура и мышь в MS-DOS

Раскладки клавиатуры PC используют в качестве клавиши META левую клавишу ALT. Вы можете выбрать между двумя способами эмулирования клавиш SUPER и HYPER: использовать либо правый CTRL, либо правый ALT, установив переменные dos-hyper-key и dos-super-key, соответственно, в значение 1 или 2. Если ни dos-super-key, ни dos-hyper-key не равна 1, то по умолчанию правый ALT также отображается в клавишу META. Однако, если установлена KEYB.COM, программа для поддержки в MS-DOS многоязыковой клавиатуры, Emacs не будет отображать правый ALT в META, так как он используется для получения таких знаков, как ~ и @ в раскладках, отличных от раскладки US; в таком случае вы можете использовать в качестве клавиши META только левый ALT.

Переменная dos-keypad-mode -- это флаг, который управляет кодами, возвращаемыми клавишами дополнительной цифровой клавиатуры. Вы также можете определить клавишу ENTER с дополнительной клавиатуры как C-j, поместив в ваш файл `_emacs' следующую строку:

;; Делает так, чтобы Enter с дополнительной
;; клавиатуры действовал как C-j.
(define-key function-key-map [kp-enter] [?\C-j])

Клавиша, известная в Emacs как DEL (потому что таково её назначение на большинстве рабочих станций), на PC известна как BS (забой). Поэтому специфичная для PC инициализация терминала изменяет отображение клавиши BS таким образом, чтобы она действовала как DEL; клавиша DEL отображается в C-d по тем же причинам.

Emacs, собранный для MS-DOS, распознает в качестве ключа выхода комбинацию C-BREAK, точно так же, как C-g. Это делается, потому что Emacs не может зарегистрировать нажатие C-g, если только он не готов к принятию ввода. Как следствие, вы не можете использовать C-g для остановки запущенной команды (смотрите раздел Выход и аварийное завершение). Напротив, C-BREAK можно уловить, как только вы её набрали (как C-g на других системах), поэтому её можно применять для остановки работающей команды и для аварийного выхода (смотрите раздел Аварийный выход).

Emacs поддерживает в MS-DOS мышь (только на терминале по умолчанию). Команды мыши работают как описано, включая те, что используют меню и полоску меню (смотрите раздел Полоска меню). Полоски прокрутки не работают в MS-DOS Emacs. Мыши на PC обычно имеют только две кнопки; они действуют как Mouse-1 и Mouse-2, но если вы нажмете их вместе, то они подействуют как Mouse-3.

Собранный для MS-DOS и запущенный под Windows Emacs поддерживает операции с буфером обмена. Команды, которые помещают текст в список уничтожений или восстанавливают текст из него, сначала проверяют буфер обмена, так же, как в X Windows (смотрите раздел Команды мыши для редактирования). В MS-DOS Emacs под Windows поддерживаются только первичное выделение и буфер вырезок; вторичное выделение всегда выглядит как пустое.

Доступ к буферу обмена реализован в Windows так, что длина текста, который вы можете в него поместить, ограничена количеством доступной Emacs свободной памяти DOS. Обычно в буфере может уместиться до 620KB текста, но этот предел зависит от конфигурации системы и будет меньше, если вы запустите Emacs как подпроцесс другой программы. Если уничтоженный текст не умещается, Emacs печатает сообщение об этом и не помещает этот текст в буфер обмена.

Также, в буфер обмена Windows нельзя поместить знаки с нулевым кодом. Если уничтожаемый текст содержит нули, Emacs не будет записывать его в буфер обмена и напечатает об этом предупреждение в эхо-области.

Переменная dos-display-scancodes, если она не равна nil, велит Emacs показывать ASCII-значение скан-кодов клавиатуры при каждом нажатии клавиши; эта возможность служит дополнением к команде view-lossage, она полезна для отладки.

Изображение в MS-DOS

В MS-DOS нельзя использовать вариации шрифтов, такие как курсив или жирный шрифт, но множественные начертания поддерживаются; каждое из них может определять цвета шрифта и фона. Следовательно, вы можете пользоваться всей функциональностью пакетов Emacs, которые используют шрифты (таких как font-lock, режим Enriched Text и других), определяя подходящие начертания как использующие различные цвета. Чтобы посмотреть, какие цвета и начертания доступны, и как они выглядят, запустите команду list-colors-display (смотрите раздел Установка параметров фрейма) и команду list-faces-display (смотрите раздел Использование разных начертаний).

Смотрите раздел Поддержка разных языков в MS-DOS, где описано, как Emacs отображает глифы и знаки, которые не поддерживаются встроенными шрифтами.

Множественные фреймы (смотрите раздел Фреймы и X Windows) поддерживаются в MS-DOS, но они перекрываются, так что в одно время вы можете видеть только один из них. Этот единственный фрейм занимает весь экран. Когда вы запускаете Emacs в сеансе DOS из-под MS-Windows, вы можете сделать так, чтобы видимый фрейм занимал не весь экран, но Emacs все равно не может показать более одного фрейма одновременно.

Команда mode4350 переключает между отображением 43 или 50 строк, в зависимости от вашей аппаратуры; команда mode25 переключает к размеру экрана по умолчанию, 80x25.

По умолчанию Emacs знает только как установить размер окна для 80-ти столбцов на 25, 28, 35, 40, 43 или 50 строк. Однако, если у вашего видеоадаптера есть особые видеорежимы, которые переключаю изображение в другие размеры, вы можете сделать так, чтобы Emacs поддерживал и их тоже. Когда вы просите Emacs изменить размер фрейма на n столбцов и m строк, он проверяет, есть ли переменная с именем screen-dimensions-nxm, и если она есть, использует её значение (которое должно быть целым числом) как видеорежим, в который нужно переключиться. (Emacs переключается в этот видеорежим, вызывая функцию BIOS Set Video Mode со значением screen-dimensions-nxm в регистре AL.) Например, представим, что ваш адаптер переходит к размерам 66x80, когда его перевели в видеорежим 85. Тогда вы можете сделать так, чтобы Emacs поддерживал этот размер экрана, поместив в ваш файл `_emacs' следующее:

(setq screen-dimensions-66x80 85)

Поскольку Emacs способен в MS-DOS установить размер фрейма только к конкретным поддерживаемым размерам, он не может следовать любому возможному запросу на его изменение. Когда запрошен неподдерживаемый размер, Emacs выбирает следующий, больший, чем указанный. Например, если вы потребуете фрейм 36x80, вместо этого вы получите 40x80.

Переменные screen-dimensions-nxm используются, только если они точно совпадают с указанным размером; при поиске следующего большего размера они игнорируются. В примере выше, даже если ваш VGA-адаптер поддерживает размер 38x80, и вы определили переменную screen-dimensions-38x80 с соответствующим значением, вы тем не менее получите экран 40x80, когда потребуете сделать размер фрейма равным 36x80. Если вы хотите получить в этом случае размеры 38x80, вы можете сделать это, установив переменную с именем screen-dimensions-36x80 и тем же значением видеорежима, что и screen-dimensions-38x80.

Изменение размеров фрейма в MS-DOS приводит также к новым размерам и все остальные фреймы.

Имена файлов в MS-DOS

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

Имена файлов в MS-DOS регистронезависимы и ограничены восемью знаками плюс необязательная точка и ещё три знака. Emacs достаточно осведомлен об этих ограничениях, чтобы справляться с именами файлов, предназначенных для других операционных систем. К примеру, начальные точки `.' в имени файла недопустимы в MS-DOS, поэтому Emacs автоматически переводит их в подчерки `_'; так что ваш файл инициализации по умолчанию (смотрите раздел Файл инициализации, `~/.emacs') называется в MS-DOS `_emacs'. Излишние знаки перед или после точки обычно игнорируются самой MS-DOS; поэтому, если вы обращаетесь к файлу `LongFileName.EvenLongerExtension', вы без предупреждений получите `longfile.eve', но в строке режима Emacs все так же будет показывать это длинное имя файла. Упомянутые выше ограничения на имена файлов в MS-DOS делают конструирование имён резервных файлов почти невозможным (смотрите раздел Одиночные или нумерованные резервные файлы) без потери некоторых знаков из первоначального имени файла. Например, именем резервного файла для `docs.txt' будет `docs.tx~', даже если использован единственный резервный файл.

Если вы запускаете Emacs как приложение DOS под Windows 9X, вы можете включить поддержку длинных имён файлов. Если вы сделаете так, Emacs не станет усекать имена файлов или приводить их к нижнему регистру; напротив, он будет использовать имена файлов так, как вы их задали, без изменений. Чтобы задействовать поддержку длинных имён файлов, установите переменную среды `LFN' равной `y' перед запуском Emacs. К сожалению, Windows NT не позволяет программам DOS получать доступ к длинным именам файлов, так что собранный для MS-DOS Emacs будет видеть только их короткие псевдонимы в форме 8+3.

В 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'.

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

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

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

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

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

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

Вы можете обратиться к файлу и указать, нужно ли воспринимать его как текстовый или же как двоичный, с помощью команд find-file-text и find-file-binary. Преобразование EOL -- это часть более общего механизма преобразования системы кодирования, поэтому другой способ указать это же -- воспользоваться командами для задания системы кодирования (смотрите раздел Задание системы кодирования). Например, C-x RET c undecided-unix RET C-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.

Печать в MS-DOS

Команды печати, такие как lpr-buffer (смотрите раздел Вывод твердой копии) и ps-print-buffer (смотрите раздел Печать через Postscript), могут работать в MS-DOS и MS-Windows, посылая вывод на порты принтера, если недоступна команда в стиле Unix lpr. Такое поведение контролируется теми же переменными, что управляют печатью через lpr в Unix (смотрите раздел Вывод твердой копии, смотрите раздел Переменные, управляющие печатью в Postscript), но 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-printer-name (смотрите раздел Переменные, управляющие печатью в Postscript), определяет, как нужно печатать 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.

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

Emacs поддерживает в MS-DOS те же наборы знаков разных языков, что и в Unix, и на других платформах (смотрите раздел Поддержка разных языков), включая системы кодирования для преобразования между различными наборами знаков. Однако, из-за несовместимости между 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-DOS(16). Практически те же ограничения применяются к исполняемым файлам DOS в других системах, таких как MS-Windows.

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

Для многобайтной работы на 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 -- это номер кодовой страницы.(17) (`c' с седилем) имеет в стандартном наборе символов Latin-1 код 231, но соответствующая кодовая страница 850 использует для этой буквы код 135.}

Все системы кодирования cpnnn используют в качестве мнемоники для строки режима букву `D' (от "DOS"). Поскольку во время запуска и система кодирования терминала, и система кодирования для ввода/вывода файлов устанавливаются в подходящее значение cpnnn, строка режима в MS-DOS обычно начинается `-DD\-'. Смотрите раздел Строка режима.

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

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

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

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

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

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

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

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

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

Напротив, Emacs, скомпилированный как "родное" приложение Windows поддерживает асинхронные подпроцессы. Смотрите раздел Подпроцессы в Windows 95 и NT.

Команды печати, такие как lpr-buffer (смотрите раздел Вывод твердой копии) и ps-print-buffer (смотрите раздел Печать через Postscript), работают в MS-DOS, посылая вывод на один из портов принтера. Смотрите раздел Печать в MS-DOS.

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

Доступ к файлам на других машинах не поддерживается в 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.

Подпроцессы в 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-DEL и выберите затем Shutdown. Обычно это работает, хотя и может занять несколько минут.

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

Emacs, собранный как "родное" приложение Windows, обычно выключает такое свойство Windows, что прижатие клавиши ALT вызывает меню. Так делается, потому что ALT работает в Emacs в качестве META. Часто при использовании Emacs пользователи временно нажимают клавишу META, а потом меняют решение; если это будет вызывать меню Windows, то смысл последующих команд изменится. Многие находят это неприятным.

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

Назад |  Вперед |  Содержание



Распространение материалов сайта означает, что распространитель принял условия лицензионного соглашения.
Идея и реализация: © Владимир Довыденков и Анатолий Камынин,  2004-2024