Emacs and MS-DOS
================

This section briefly describes the peculiarities of using Emacs on MS-DOS. Information about peculiarities common to MS-DOS and Microsoft's current operating systems Windows is in Microsoft Windows.

If you build Emacs for MS-DOS, the binary will also run on Windows 3.X, Windows NT, Windows 9X/ME, or Windows 2000/XP as a DOS application; all of this chapter applies for all of those systems, if you use an Emacs that was built for MS-DOS.

See Text and Binary, for information about Emacs's special handling of text files under MS-DOS (and Windows).

Keyboard Usage on MS-DOS
------------------------

The key that is called DEL in Emacs (because that's how it is designated on most workstations) is known as BS (backspace) on a PC.  That is why the PC-specific terminal initialization remaps the BS key to act as DEL; the Delete key is remapped to act as C-d for the same reasons.

Emacs built for MS-DOS recognizes C-Break as a quit character, just like C-g.  This is because Emacs cannot detect that you have typed C-g until it is ready for more input.  As a consequence, you cannot use C-g to stop a running command (see Quitting). By contrast, C-Break is detected as soon as you type it (as C-g is on other systems), so it can be used to stop a running command and for emergency escape (see Emergency Escape).

The PC keyboard maps use the left Alt key as the META key. You have two choices for emulating the SUPER and HYPER keys: choose either the right Ctrl key or the right Alt key by setting the variables dos-hyper-key and dos-super-key to 1 or 2 respectively.  If neither dos-super-key nor dos-hyper-key is 1, then by default the right Alt key is also mapped to the META key.  However, if the MS-DOS international keyboard support program KEYB.COM is installed, Emacs will not map the right Alt to META, since it is used for accessing characters like ~ and @ on non-US keyboard layouts; in this case, you may only use the left Alt as META key.

The variable dos-keypad-mode is a flag variable that controls what key codes are returned by keys in the numeric keypad.  You can also define the keypad ENTER key to act like C-j, by putting the following line into your _emacs file:

     ;; Make the ENTER key from the numeric keypad act as C-j.
     (define-key function-key-map [kp-enter] [?\C-j])

Mouse Usage on MS-DOS
---------------------

Emacs on MS-DOS supports a mouse (on the default terminal only). The mouse commands work as documented, including those that use menus and the menu bar (see Menu Bar). Scroll bars don't work in MS-DOS Emacs.  PC mice usually have only two buttons; these act as mouse-1 and mouse-2, but if you press both of them together, that has the effect of mouse-3.  If the mouse does have 3 buttons, Emacs detects that at startup, and all the 3 buttons function normally, as on X.

Help strings for menu-bar and pop-up menus are displayed in the echo area when the mouse pointer moves across the menu items.  Highlighting of mouse-sensitive text (see Mouse References) is also supported.

Some versions of mouse drivers don't report the number of mouse buttons correctly.  For example, mice with a wheel report that they have 3 buttons, but only 2 of them are passed to Emacs; the clicks on the wheel, which serves as the middle button, are not passed.  In these cases, you can use the M-x msdos-set-mouse-buttons command to tell Emacs how many mouse buttons to expect.  You could make such a setting permanent by adding this fragment to your _emacs init file:

     ;; Treat the mouse like a 2-button mouse.
     (msdos-set-mouse-buttons 2)

Emacs built for MS-DOS supports clipboard operations when it runs on Windows.  Commands that put text on the kill ring, or yank text from the ring, check the Windows clipboard first, just as Emacs does on the X Window System (see Mouse Commands). Only the primary selection and the cut buffer are supported by MS-DOS Emacs on Windows; the secondary selection always appears as empty.

Due to the way clipboard access is implemented by Windows, the length of text you can put into the clipboard is limited by the amount of free DOS memory that is available to Emacs.  Usually, up to 620KB of text can be put into the clipboard, but this limit depends on the system configuration and is lower if you run Emacs as a subprocess of another program.  If the killed text does not fit, Emacs outputs a message saying so, and does not put the text into the clipboard.

Null characters also cannot be put into the Windows clipboard.  If the killed text includes null characters, Emacs does not put such text into the clipboard, and displays in the echo area a message to that effect.

The variable dos-display-scancodes, when non-nil, directs Emacs to display the ASCII value and the keyboard scan code of each keystroke; this feature serves as a complement to the view-lossage command, for debugging.

Display on MS-DOS
-----------------

Display on MS-DOS cannot use font variants, like bold or italic, but it does support multiple faces, each of which can specify a foreground and a background color.  Therefore, you can get the full functionality of Emacs packages that use fonts (such as font-lock, Enriched Text mode, and others) by defining the relevant faces to use different colors.  Use the list-colors-display command (see Colors) and the list-faces-display command (see Faces) to see what colors and faces are available and what they look like.

See MS-DOS and MULE, later in this chapter, for information on how Emacs displays glyphs and characters that aren't supported by the native font built into the DOS display.

When Emacs starts, it changes the cursor shape to a solid box.  This is for compatibility with other systems, where the box cursor is the default in Emacs.  This default shape can be changed to a bar by specifying the cursor-type parameter in the variable default-frame-alist (see Creating Frames). The MS-DOS terminal doesn't support a vertical-bar cursor, so the bar cursor is horizontal, and the WIDTH parameter, if specified by the frame parameters, actually determines its height. For this reason, the bar and hbar cursor types produce the same effect on MS-DOS.  As an extension, the bar cursor specification can include the starting scan line of the cursor as well as its width, like this:

      '(cursor-type bar WIDTH . START)

In addition, if the WIDTH parameter is negative, the cursor bar begins at the top of the character cell.

The MS-DOS terminal can only display a single frame at a time.  The Emacs frame facilities work on MS-DOS much as they do on text terminals (see Frames). When you run Emacs from a DOS window on MS-Windows, you can make the visible frame smaller than the full screen, but Emacs still cannot display more than a single frame at a time.

The dos-mode4350 command switches the display to 43 or 50 lines, depending on your hardware; the dos-mode25 command switches to the default 80x25 screen size.

By default, Emacs only knows how to set screen sizes of 80 columns by 25, 28, 35, 40, 43 or 50 rows.  However, if your video adapter has special video modes that will switch the display to other sizes, you can have Emacs support those too.  When you ask Emacs to switch the frame to N rows by M columns dimensions, it checks if there is a variable called screen-dimensions-NxM, and if so, uses its value (which must be an integer) as the video mode to switch to.  (Emacs switches to that video mode by calling the BIOS Set Video Mode function with the value of screen-dimensions-NxM in the AL register.) For example, suppose your adapter will switch to 66x80 dimensions when put into video mode 85.  Then you can make Emacs support this screen size by putting the following into your _emacs file:

     (setq screen-dimensions-66x80 85)

Since Emacs on MS-DOS can only set the frame size to specific supported dimensions, it cannot honor every possible frame resizing request.  When an unsupported size is requested, Emacs chooses the next larger supported size beyond the specified size.  For example, if you ask for 36x80 frame, you will get 40x80 instead.

The variables screen-dimensions-NxM are used only when they exactly match the specified size; the search for the next larger supported size ignores them.  In the above example, even if your VGA supports 38x80 dimensions and you define a variable screen-dimensions-38x80 with a suitable value, you will still get 40x80 screen when you ask for a 36x80 frame.  If you want to get the 38x80 size in this case, you can do it by setting the variable named screen-dimensions-36x80 with the same video mode value as screen-dimensions-38x80.

Changing frame dimensions on MS-DOS has the effect of changing all the other frames to the new dimensions.

File Names on MS-DOS
--------------------

On MS-DOS, file names are case-insensitive and limited to eight characters, plus optionally a period and three more characters.  Emacs knows enough about these limitations to handle file names that were meant for other operating systems.  For instance, leading dots .  in file names are invalid in MS-DOS, so Emacs transparently converts them to underscores _; thus your default init file (see Init File) is called _emacs on MS-DOS.  Excess characters before or after the period are generally ignored by MS-DOS itself; thus, if you visit the file LongFileName.EvenLongerExtension, you will silently get longfile.eve, but Emacs will still display the long file name on the mode line.  Other than that, it's up to you to specify file names which are valid under MS-DOS; the transparent conversion as described above only works on file names built into Emacs.

The above restrictions on the file names on MS-DOS make it almost impossible to construct the name of a backup file (see Backup Names) without losing some of the original file name characters.  For example, the name of a backup file for docs.txt is docs.tx~ even if single backup is used.

If you run Emacs as a DOS application under Windows 9X, Windows ME, or Windows 2000/XP, you can turn on support for long file names.  If you do that, Emacs doesn't truncate file names or convert them to lower case; instead, it uses the file names that you specify, verbatim.  To enable long file name support, set the environment variable LFN to y before starting Emacs.  Unfortunately, Windows NT doesn't allow DOS programs to access long file names, so Emacs built for MS-DOS will only see their short 8+3 aliases.

MS-DOS has no notion of home directory, so Emacs on MS-DOS pretends that the directory where it is installed is the value of the HOME environment variable.  That is, if your Emacs binary, emacs.exe, is in the directory c:/utils/emacs/bin, then Emacs acts as if HOME were set to c:/utils/emacs.  In particular, that is where Emacs looks for the init file _emacs. With this in mind, you can use ~ in file names as an alias for the home directory, as you would on GNU or Unix.  You can also set HOME variable in the environment before starting Emacs; its value will then override the above default behavior.

Emacs on MS-DOS handles the name /dev specially, because of a feature in the emulator libraries of DJGPP that pretends I/O devices have names in that directory.  We recommend that you avoid using an actual directory named /dev on any disk.

Printing and MS-DOS
-------------------

Printing commands, such as lpr-buffer (see Printing) and ps-print-buffer (see PostScript) can work on MS-DOS by sending the output to one of the printer ports, if a Posix-style lpr program is unavailable.  The same Emacs variables control printing on all systems, but in some cases they have different default values on MS-DOS.

See Windows Printing, for details about setting up printing to a networked printer.

Some printers expect DOS codepage encoding of non-ASCII text, even though they are connected to a Windows machine that uses a different encoding for the same locale.  For example, in the Latin-1 locale, DOS uses codepage 850 whereas Windows uses codepage 1252.  See MS-DOS and MULE.  When you print to such printers from Windows, you can use the C-x RET c (universal-coding-system-argument) command before M-x lpr-buffer; Emacs will then convert the text to the DOS codepage that you specify.  For example, C-x RET c cp850-dos RET M-x lpr-region RET will print the region while converting it to the codepage 850 encoding.

For backwards compatibility, the value of dos-printer (dos-ps-printer), if it has a value, overrides the value of printer-name (ps-printer-name), on MS-DOS.

International Support on MS-DOS
-------------------------------

Emacs on MS-DOS supports the same international character sets as it does on GNU, Unix and other platforms (see International), including coding systems for converting between the different character sets.  However, due to incompatibilities between MS-DOS/MS-Windows and other systems, there are several DOS-specific aspects of this support that you should be aware of.  This section describes these aspects.

The description below is largely specific to the MS-DOS port of Emacs, especially where it talks about practical implications for Emacs users.

M-x dos-codepage-setup
     Set up Emacs display and coding systems as appropriate for the current DOS codepage.

MS-DOS is designed to support one character set of 256 characters at any given time, but gives you a variety of character sets to choose from.  The alternative character sets are known as DOS codepages. Each codepage includes all 128 ASCII characters, but the other 128 characters (codes 128 through 255) vary from one codepage to another. Each DOS codepage is identified by a 3-digit number, such as 850, 862, etc.

In contrast to X, which lets you use several fonts at the same time, MS-DOS normally doesn't allow use of several codepages in a single session.  MS-DOS was designed to load a single codepage at system startup, and require you to reboot in order to change it (Normally, one particular codepage is burnt into the display memory, while other codepages can be installed by modifying system configuration files, such as CONFIG.SYS, and rebooting. While there is third-party software that allows changing the codepage without rebooting, we describe here how a stock MS-DOS system behaves.).  Much the same limitation applies when you run DOS executables on other systems such as MS-Windows.

For multibyte operation on MS-DOS, Emacs needs to know which characters the chosen DOS codepage can display.  So it queries the system shortly after startup to get the chosen codepage number, and stores the number in the variable dos-codepage.  Some systems return the default value 437 for the current codepage, even though the actual codepage is different.  (This typically happens when you use the codepage built into the display hardware.)  You can specify a different codepage for Emacs to use by setting the variable dos-codepage in your init file.

Multibyte Emacs supports only certain DOS codepages: those which can display Far-Eastern scripts, like the Japanese codepage 932, and those that encode a single ISO 8859 character set.

The Far-Eastern codepages can directly display one of the MULE character sets for these countries, so Emacs simply sets up to use the appropriate terminal coding system that is supported by the codepage. The special features described in the rest of this section mostly pertain to codepages that encode ISO 8859 character sets.

For the codepages that correspond to one of the ISO character sets, Emacs knows the character set based on the codepage number.  Emacs automatically creates a coding system to support reading and writing files that use the current codepage, and uses this coding system by default.  The name of this coding system is cpNNN, where NNN is the codepage number. (The standard Emacs coding systems for ISO 8859 are not quite right for the purpose, because typically the DOS codepage does not match the standard ISO character codes.  For example, the letter ç (c with cedilla) has code 231 in the standard Latin-1 character set, but the corresponding DOS codepage 850 uses code 135 for this glyph.)

All the cpNNN coding systems use the letter D (for ``DOS'') as their mode-line mnemonic.  Since both the terminal coding system and the default coding system for file I/O are set to the proper cpNNN coding system at startup, it is normal for the mode line on MS-DOS to begin with -DD\-. See Mode Line. Far-Eastern DOS terminals do not use the cpNNN coding systems, and thus their initial mode line looks like the Emacs default.

Since the codepage number also indicates which script you are using, Emacs automatically runs set-language-environment to select the language environment for that script (see Language Environments).

If a buffer contains a character belonging to some other ISO 8859 character set, not the one that the chosen DOS codepage supports, Emacs displays it using a sequence of ASCII characters.  For example, if the current codepage doesn't have a glyph for the letter ò (small o with a grave accent), it is displayed as {`o}, where the braces serve as a visual indication that this is a single character. (This may look awkward for some non-Latin characters, such as those from Greek or Hebrew alphabets, but it is still readable by a person who knows the language.)  Even though the character may occupy several columns on the screen, it is really still just a single character, and all Emacs commands treat it as one.

MS-Windows provides its own codepages, which are different from the DOS codepages for the same locale.  For example, DOS codepage 850 supports the same character set as Windows codepage 1252; DOS codepage 855 supports the same character set as Windows codepage 1251, etc. The MS-Windows version of Emacs uses the current codepage for display when invoked with the -nw option.

Subprocesses on MS-DOS
----------------------

Because MS-DOS is a single-process ``operating system'', asynchronous subprocesses are not available.  In particular, Shell mode and its variants do not work.  Most Emacs features that use asynchronous subprocesses also don't work on MS-DOS, including Shell mode and GUD.  When in doubt, try and see; commands that don't work output an error message saying that asynchronous processes aren't supported.

Compilation under Emacs with M-x compile, searching files with M-x grep and displaying differences between files with M-x diff do work, by running the inferior processes synchronously.  This means you cannot do any more editing until the inferior process finishes.

Spell checking also works, by means of special support for synchronous invocation of the ispell program.  This is slower than the asynchronous invocation on other platforms

Instead of the Shell mode, which doesn't work on MS-DOS, you can use the M-x eshell command.  This invokes the Eshell package that implements a Posix-like shell entirely in Emacs Lisp.

By contrast, Emacs compiled as a native Windows application does support asynchronous subprocesses. See Windows Processes.

Printing commands, such as lpr-buffer (see Printing) and ps-print-buffer (see PostScript), work in MS-DOS by sending the output to one of the printer ports. See MS-DOS Printing.

When you run a subprocess synchronously on MS-DOS, make sure the program terminates and does not try to read keyboard input.  If the program does not terminate on its own, you will be unable to terminate it, because MS-DOS provides no general way to terminate a process. Pressing C-c or C-Break might sometimes help in these cases.

Accessing files on other machines is not supported on MS-DOS.  Other network-oriented commands such as sending mail, Web browsing, remote login, etc., don't work either, unless network access is built into MS-DOS with some network redirector.

Dired on MS-DOS uses the ls-lisp package (see ls in Lisp). Therefore, Dired on MS-DOS supports only some of the possible options you can mention in the dired-listing-switches variable.  The options that work are -A, -a, -c, -i, -r, -S, -s, -t, and -u.