Date: Tue, 10 Dec 1996 21:55:51 GMT Server: NCSA/1.4.2 Content-type: text/html Last-modified: Thu, 05 Dec 1996 07:12:28 GMT Content-length: 88963 GNU Emacs for Windows NT and Windows 95

GNU Emacs on Windows NT and Windows 95

The latest release is 19.34.
See the section below on the changes between 19.32/33/34 and 19.31.

Emacs won't start anymore? See troubleshooting below.

Last modified: December 3, 1996

Table of Contents

  1. Which versions of NT and Win95 are supported?
  2. Changes between 19.32/33/34 and 19.31.
  3. How do I get an Emacs distribution?
  4. I don't want the precompiled version. How do I compile Emacs myself?
  5. How do I install Emacs?
  6. When I run Emacs, nothing happens. What's the deal?
  7. Why does Emacs ask me to connect to my dialup service when it starts up?
  8. When I run Emacs, a console window pops up. How do I make it go away?
  9. Where do I put my .emacs (or _emacs) file?
  10. How do I swap CapsLock and Control?
  11. How do I change the size, position, font, and color attributes of Emacs?
  12. How do I use Emacs with a two-button mouse?
  13. How do I highlight the region between the point and the mark?
  14. How do I change the sound of the Emacs beep?
  15. How do I display ISO 8859 characters?
  16. Subprocesses under Emacs
  17. How do I use a shell in Emacs?
  18. How do I use mail with Emacs?
  19. How do I use ange-ftp with Emacs?
  20. How do I use telnet with Emacs?
  21. How do I use crypt with Emacs?
  22. How do I use the browse-url package?
  23. How do I print from Emacs?
  24. How do I associate files with Emacs?
  25. How do I access UNIX files via NFS?
  26. Is there a package for editing Windows specific files (.bat, .ini, .inf, etc.)?
  27. Is there a mode for editing Visual Basic source?
  28. Is there a version of RCS for Win32?
  29. Is there a version of ispell for Win32?
  30. Does Emacs support popup menus?
  31. BUGS
  32. I get these strange error messages. What's wrong?
  33. Win95 Specific Problems
  34. Patches
  35. What other Unix tools have been ported to NT and/or Windows 95?
  36. What's the name of the NT Emacs mailing list?

Which versions of NT and Win95 are supported?

This port is known to run on all versions of NT up to 4.0 (including with the beta Win95 shell) on all NT hardware platforms, and on Windows 95 beta version 347 and later versions. This port is built using the Win32 API and supports most of the features of the Unix version. (Note that this port does not work with Win32s, and I do not know enough about Win32s to know whether it is either possible or even worth trying.)

MSDOS and Windows 3.11

Eli Zaretskii <eliz@is.elta.co.il> maintains the port of GNU Emacs for MSDOS and MS Windows. You can download precompiled versions with the latest DJGPP archives: Eli strongly recommends that you start with the emacs.README file -- it contains crucial info about what's in the other 10 zip files and how to install them and get started with Emacs on MSDOS/MS-Windows platforms.

More from Eli:

It might be of interest to Windows users that this version of Emacs supports long filenames (Windows 95 only) and the Windows clipboard (all versions of MS-Windows). It also supports multiple frames, but they all overlap, like when Emacs runs on a ``glass teletype'' terminal.

People who would like to run Emacs on plain DOS (as opposed to Windows) will need to download and install a DPMI host at this URL:

ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2misc/csdpmi3b.zip

MULE

Hisashi Miyashita <himi@bird.scphys.kyoto-u.ac.jp> maintains MULE, multilingual Emacs. You can get distributions of MULE at ftp://ftp.tokyonet.AD.JP/pub/pc/misc/mule2.3-win32.


Changes between 19.32/33/34 and 19.31.

As far as Emacs on NT/Win95 are concerned, 19.32, 19.33, and 19.34 (released within weeks of each other) are essentially the same.

How do I get an Emacs distribution?

Emacs is distributed in two different forms. You can get the full source distribution of Emacs, or you can get an installed distribution of Emacs with all executables precompiled.

Where can I get the source distribution?

The latest source distribution can be found in ftp.cs.washington.edu/pub/ntemacs/latest/src. It is distributed in two formats: one large gzipped tar file (emacs*.tar.gz), and a collection of smaller zip files that can be copied to 1.44 Mbyte floppies (em-src-_?.zip).

In the same directory you should also find patch files that enable you to upgrade source distributions to the latest version. These patch files are mirrors of the ones on the FSF server at ftp://ftp.gnu.ai.mit.edu/pub/gnu.

Where can I get precompiled versions?

Precompiled versions always exist for NT-i386 and Win95. When I receive contributed precompiled versions from other users on the other platforms, I place them in the appropriate directory. So if the link ends in an empty or nonexistant directory, then I haven't received any precompiled executables for that platform. In this case, if you have a Microsoft compiler, then you can download the source and compile it (and if you do, please consider contributing your executables; send me mail and we can make arrangements for making them available on my ftp server).

Links to precompiled versions:

I've had numerous reports from people outside North America stating that their ftp connection aborts for no apparent reason roughly a third of the way through a transfer of a full distribution. Marc Haber (s_haber@ira.uka.de) said that he suffered from the same problem, and later found that a timeout configured into his WWW proxy would cancel the transfer when the link to the US was very busy. Going around his proxy solved the problem. Other than that, I have not been able to figure out why this might be the case. If this happens to you, you might consider trying to download it in the 1.44 MB chunks, or try one of the mirror sites. Also, if you have access to a standalone ftp client (separate from your web browser), you should definitely try that as well.

Mirror sites with precompiled versions:

How do I unpack the distributions?

Decide on a directory in which to place Emacs. Move the distribution to that directory, and then unpack it. If you have the gzipped tar version, first use gunzip to uncompress the tar file, and then use tar with the "xvfm" flags to extract the files from the tar file:

	% gunzip -c -d emacs.tar.gz | tar xvfm -
The "-d" flag forces gunzip to decompress (its behavior depends upon the name of the executable, and sometimes it doesn't recognize that it is really gunzip), and the "-c" flag tells it to pipe its output to stdout. Similarly, the "-" flag to tar tells it to read the tar file from stdin. Unpacking the distribution this way leaves the distribution in compressed form so it takes up less space.

If for some reason you also want to have the tar file gunzipped, then invoke gunzip without the -c option:

	% gunzip -d emacs.tar.gz
If you have the zip version, use unzip with the "-x" flag on all of the .zip files (note that you cannot use pkunzip on these files, as pkunzip will not preserve the long filenames):

	% unzip -x emacs-_1.zip
	% (repeat for the remaining .zip files)
You can find precompiled versions of all of the compression and archive utilities in
ftp.cs.washington.edu/pub/ntemacs/utilities.

WARNING: Some utilities that handle tar files can incorrectly untar the distributions when using the default settings. If you encounter problems with Emacs, see the section below on troubleshooting these problems.

Now what?

You should find a file named README as a part of the distribution. Be sure to read this file for information on installing Emacs, as well as reading the section below on installing Emacs.


I don't want the precompiled version. How do I compile Emacs myself?

To compile Emacs, you will need a Microsoft C compiler package. For NT, this can be any of the SDK compilers from NT 3.1 and up, Microsoft Visual C++ for NT (versions 1.0 and up), or Microsoft Visual C++ (versions 2.0 and up). For Windows 95, this can be Microsoft Visual C++ versions 2.0 and up.

Download and place the source distribution in a directory (say, c:\emacs). Unpack the distribution, and go to the nt subdirectory of the emacs directory that gets created in the unpacking process. Read the README and INSTALL files included with the distribution for the full details of this process.

Below are known problems with various combinations of Emacs versions and compiler versions. The problems are being addressed in later versions, and are included here so that you know to expect them and how to work around them:

Emacs 19.29.1 and MSVC 2.2

win32.mak: For some reason, the MSVC 2.2 installation process does not install win32.mak, which is included by the file ntwin32.mak. You'll have to copy over the win32.mak file into the MSVC include directory before the Emacs makefiles will work.

PROCESSOR_* macros: Although the PROCESSOR_* macros are defined in the manual, MSVC 2.2 no longer defines the full set of PROCESSOR_* macros in winnt.h. You'll have to comment the macros out in nt\nt.c to get nt.c to compile.


How do I install Emacs?

Precompiled distribution

Preferred method:

Let's assume that the directory in which you have unpacked Emacs is c:\emacs (note that it can be anything you want it to be; I just want to be able to refer to something concrete at this point). First, you will want to run the program bin\addpm.exe with the Emacs directory as an argument. In this example you would invoke it as:

	c:\emacs\bin\addpm.exe c:\emacs
Invoking addpm.exe will do two things. First, it will create a set of registry keys that tell Emacs where to find its support files (lisp, info, etc.). Second, it will create a folder containing an icon linked to runemacs.exe (a wrapper program for invoking Emacs).

Now, to run Emacs, simply click on the icon in the newly created folder or invoke runemacs.exe from a command prompt.

Alternate method:

Another alternative for running Emacs is to use the emacs.bat batch file in the bin directory (this is now the old method of invoking Emacs). Edit the emacs.bat file to change the emacs_dir environment variable to point to the Emacs installation directory and invoke the emacs.bat file to run Emacs. (If you use bash as your shell, you can use an equivalent bash script to emacs.bat.)

Note that, on Win95, you are likely to get "Out of environment space" messages when invoking the emacs.bat batch file. The problem is that the console process in which the script is executed runs out of memory in which to set the Emacs environment variables. To get around this problem, create a shortcut icon to the emacs.bat script. Then right click on the icon and select Properties. In the dialog box that pops up, select the Memory tab and then change the Environment memory allocation from "Auto" to "1024". Close the dialog box and then double click on the icon to start Emacs.

Source distribution
You have two options for installing Emacs with the source distribution. You can install it over the source directory, or you can install it in a completely separate directory. Emacs works the same with either installation option. One advantage of installing it over the source directory is that it takes up far less disk space (primarly because the lisp files don't have to be copied). One advantage of installing Emacs in a separate directory is that Emacs can now be managed as a single unit that can be moved and copied independently of the source code.

The INSTALL_DIR macro in the nt\makefile.def makefile determines where Emacs will get installed from the source distribution. If you want to install Emacs in the same directory as the source tree (say, c:\src\emacs), then simply set INSTALL_DIR appropriately:

	INSTALL_DIR = c:\src\emacs
If you want to install Emacs in a different directory (say, c:\emacs), then set INSTALL_DIR to this directory:
	INSTALL_DIR = c:\emacs
As compared with the installation process for the precompiled version, the installation process will automatically create a bin\emacs.bat file in the installation tree with the emacs_dir variable set appropriately.


When I run Emacs, nothing happens. What's the deal?

Emacs could have failed to run for a number of reasons. The most common symptom is that, when Emacs is started, the cursor changes for a second but nothing happens. If this happens to you, it is quite likely that the distribution was unpacked incorrectly. If you are using 19.31 on a machine that uses dialup networking, then it is also possible that Emacs is trying to resolve your machine's domain name as winsock.dll is being loaded. See the next section for more info on working around this problem; check for the following to see if there was a problem during unpacking:

  1. Be sure to disable the CR/LF translation or the executables will be unusable. Older versions of WinZipNT would enable this translation by default. If you are using WinZipNT, disable it.

  2. Check that filenames were not truncated to 8.3. For example, there should be a file lisp\term\win32-win.el; if this has been truncated to win32-wi.el, your distribution has been corrupted while unpacking and Emacs will not start.

  3. I've been told that some utilities (WinZip again?) don't create the lock subdirectory. The lock subdirectory needs to be created.

  4. I've also had reports that the gnu-win32 tar corrupts the executables. Use the version of tar on my ftp site instead.

If you are in doubt about whether the utilities you used unpacked the distribution incorrectly, use the gunzip, tar, and unzip executables provided in the utilities directory. These are the ones I use to create and test the distributions. My advice would be to use these utilities from the start.

If you feel certain that you have unpacked the distribution correctly, then you should check to make sure that the emacs_dir variable in the emacs.bat file is set correctly. If it is and you are still having trouble, make sure that it is an absolute path that includes the drive letter (or is in UNC format).

If it is still not working, send me mail or send mail to the list.

Emacs used to work fine. But now it won't start, and I didn't change anything in Emacs.

The typical behavior people are encountering with this problem is that they invoke Emacs but either nothing happens or it produces an access violation -- and yet they have changed nothing in their Emacs installation, and Emacs used to work fine before this point. Most likely, the problem is due to an interaction between Emacs and some new piece of software you have just installed (the most popular culprit seems to be HeapAgent). Due to the nature in which Emacs is designed and built, Emacs is fundamentally non-relocatable: it uses an initialized heap segment that needs to be mapped in at a particular virtual address at startup time before Emacs will work correctly. It appears that programs like HeapAgent install DLLs that intrude upon Emacs' virtual address space, preventing Emacs to load its initialized heap.

If you have HeapAgent, then you can work around the problem in two ways. You can download the source and recompile, as described below. Or, you can use editbin to change the base address at which the haloader.dll dll will be loaded (this is the dll that gets loaded into every application's address space on startup):

editbin /rebase:base=0x20000000 haloader.dll
Otherwise, the only other workaround is to recompile Emacs on your machine so that Emacs creates and initializes its heap at a virtual address that does not conflict with software such as HeapAgent. To do this, you will need to download the
source, #define the macro NTHEAP_PROBE_BASE inside the procedure src\ntheap.c:allocate_heap(), and rebuild.


Why does Emacs ask me to connect to my dialup service when it starts up?

For some users, when Emacs starts up it pops up the dialog for connecting to their dialup service, or sometimes appears to hang for a few minutes and suddenly appear.

The reason for this is that Emacs now has networking support built in. When Emacs starts, the winsock DLL automatically gets loaded and tries to resolve the fully qualified domain name for your machine under the name "localhost". If the system doesn't have this name mapped, it will try to query a nameserver on the internet, which is typically some host within your ISP and subsequently prompts to connect to your dialup service so that it can ask a name server for the domain name of your machine. As you know, this is very unfortunate, and was not anticipated when the networking support was added.

This problem will be fixed when 19.32 comes out, but you can work around the problem by giving the dialup support another method for figuring out the domain name of your machine. To do this, you need to edit the hosts file for your system (located in %windir%\hosts on Win95 and %windir%\system32\drivers\etc\hosts on NT) so that localhost becomes an alias for your machine name. If your system doesn't have a hosts file yet, you can easily create one by copying the sample hosts file in the same directory, hosts.sam.

For example, if my machine were named banana-fish.cs.washington.edu, then I would edit the hosts file from:

127.0.0.1       localhost
to

127.0.0.1       banana-fish.cs.washington.edu localhost
The hostname should be the value of invoking (system-name) in the Emacs *scratch* buffer, i.e., the fully qualified domain name for your system. Note that you may also have to tell the system to look in the hosts file as well as using DNS.

If this doesn't work for you, there are some other options (I have not tried these):


When I run Emacs, a console window pops up. How do I make it go away?

This is annoying, I know, and you shouldn't have to be dealing with this. But please bear with me for now. If it isn't there already, prepend "start" to the last line of the .bat file (the line that invokes the emacs.exe executable). Then create a shortcut icon to the emacs.bat file, and edit the Properties of the shortcut (right click on the icon). On the Program tab, select Run: to be Minimized and make sure the Close on exit checkbox is checked. Double click on the icon, and Emacs should start up cleanly.


How do I change the size, position, font, and color attributes of Emacs?

Emacs can run in two different interface modes: the Windows interface, which allows the flexible use and mixture of fonts and colors; and the console interface, which constrains Emacs to the limitations of console windows. The following two sections describe how to specify and change the size, position, font, and color attributes of Emacs in both interface modes.

Windows Interface

With the Windows interface, you can change the size, position, font, and color attributes of Emacs using three different mechanisms: using the mouse with the user interface, by specifying them as command line arguments, or by invoking Emacs Lisp functions. You will probably find it convenient to specify command line arguments in the Properties of the shortcut to the Emacs batch file, and to invoke the lisp functions in your startup file. For information on how to propagate attributes to new frames, see the section below on frames.

  • SIZE

    User Interface
    To resize an Emacs window, drag on a border with the mouse.

    Command Line
    To have Emacs start up with a particular size, invoke it with the X Windows -geometry command line argument. For example, to start Emacs with a window 40 lines by 80 columns in size, use the following:

    emacs -g 80x40
    Note that the geometry command can be combined with the position command, as described below.

    Emacs Lisp
    To change the size of an Emacs frame using elisp, you can use the two functions set-frame-width and set-frame-height. For example, to resize Emacs to display 40 lines by 80 columns, you could use:

    (set-frame-height (selected-frame) 40)
    (set-frame-width (selected-frame) 80)

  • POSITION

    User Interface
    To reposition a running Emacs, click on its title bar and drag the window.

    Command Line
    To start Emacs at a particular position, invoke it with the X Windows -geometry command line argument. For example, to start Emacs at pixel offset (10, 30) from the top left corner:

    emacs -g +10+30
    To combine the size with position, first specify the size and then the position. The two examples above can be combined as follows:

    emacs -g 80x40+10+30
    Note that you can also specify position offsets from any of the corners of the screen. See the
    GEOMETRY SPECIFICATIONS section of the X man page for complete details on the geometry command.

    Emacs Lisp
    To reposition an Emacs frame using elisp, you can use the set-frame-position function. For example, to move the current frame to the offset (10, 30), you could use:

    (set-frame-position (selected-frame) 10 30)

  • FONTS

    Fonts in Emacs are named using the standard X Windows format for fonts. These font names are the names that can be used as arguments on the command line or in lisp functions. To see the font name corresponding to a font chosen using the font selection dialog, execute the following elisp code in the *scratch* buffer:

    (insert (prin1-to-string (win32-select-font)))
    To see the complete list of fonts that Emacs has access to, execute the following elisp code in the *scratch* buffer:

    (insert (prin1-to-string (x-list-fonts "*")))
    For complete details on X Windows font names, see the
    FONT NAMES section of the X man page.

    The font support currently is a little rough around the edges. In particular, italic fonts give Emacs some problems; see below for more info about using italic fonts. Generally it performs as expected, but occasionally you might get unexpected results (e.g., Emacs didn't quite use the font you told it to use). Work is underway to fix these problems, but for now I suggest experimenting if you encounter problems.

    Also, X Windows has the luxury of a set of font aliases (such as fixed) that are convenient names for referring to specific fonts. Work is underway to provide an equivalent alias mechanism under Win32 so that naming fonts does not have to be as cumbersome as it currently is.

    User Interface
    To change the default font that Emacs uses, shift click the left mouse button (i.e., [shift-mouse-1]) and a font selection dialog will pop up. Select the font that you would like to use, and click on the OK button to close the dialog and use the selected font. (Note that the dialog only displays fixed-pitch and screen fonts since Emacs cannot handle variable-pitched fonts.)

    Command Line
    To start Emacs with a particular font, use the the -font X Windows command line option. For example, to start Emacs with the Courier font of size 10 and font style Regular, invoke Emacs using:
    emacs -font "-*-Courier-normal-r-*-*-13-97-*-*-c-*-*-ansi-"
    Emacs Lisp
    To change the default font of Emacs using elisp, use the set-default-font function:

    (set-default-font 
     "-*-Courier-normal-r-*-*-13-97-*-*-c-*-*-ansi-")
    
    To set the font of a particular face, use the set-face-font function.

    Registry
    To change the default font of Emacs frames using registry entries, create a value in the key HKEY_CURRENT_USER\Software\GNU\Emacs:

    Value Name: Emacs.Font
    Value Type: REG_SZ
    String: -*-Courier-normal-r-*-*-13-97-*-*-c-*-*-ansi-
    Since the font strings are rather cumbersome, I would suggest cutting the font string into the kill-ring (which will place it in the clipboard, too) and pasting it (Ctrl-V) into the regedit dialog. (Note that you shouldn't place quotes around the font string in the registry.)

    If you have Emacs frames with specific names, you can also specify a font for that frame. For the Value Name of the entry, use the name of the frame instead of Emacs (e.g., RMAIL.Font for your RMAIL frame).

  • COLORS

    As with other windowing attributes, Emacs uses the X Windows color names for specifying colors on the command line and in elisp. One set of these names is a set of abstract color names, e.g., red, green, and blue. These names are the ones you will typically use as arguments on the command line or in elisp functions. Emacs also supports the use of numeric color names; see the COLOR NAMES section of the X man page for complete details on how to specify numeric color names and their color spaces.

    To see the abstract color names that Emacs understands and the colors that they map to, use the menu command Edit->Text Properties->Display Colors, or invoke the list-colors-display function in the *scratch* buffer:

    (list-colors-display)
    If you would like to change the mapping of color names to RGB values, or to add new color names to Emacs, then you will want to modify the alist win32-color-map. To make changes, you can simply cons new mappings onto the head of the alist:

    (setq win32-color-map (cons '("snow" . 16448255) win32-color-map))
    The number in the element is the logical OR of three values for the red, green, and blue components: (B << 16 | G << 8 | R). In the example above, red is 255, green is 250, and blue is 250. At some point there will be support for reading in files with color mappings to make this process a little easier.

    User Interface
    To change the foreground or background color in Emacs through the windowing interface, you can use the menu commands Foreground Color->Other and Background Color->Other in the Edit->Text Properties menu.

    Command Line
    To change the foreground or background color in Emacs on the command line, you can use the -fg and -bg command line arguments. For example, to start Emacs with yellow text on a black background, invoke Emacs using:

    emacs -fg yellow -bg black
    Emacs Lisp
    You can use elisp functions to change the colors of any of the Emacs faces. For example, to change the foreground or background color of Emacs, you can use the set-foreground-color and set-background-color functions. To change the color of an arbitrary face, use the set-face-foreground and set-face-background functions. To change the color of the cursor, use the set-cursor-color function.

    The following elisp changes the background color to black:

    (set-background-color "black")
    The following elisp changes the mode line foreground to firebrick:

    (set-face-foreground 'modeline "firebrick")
    The following elisp changes the cursor color to purple:

    (set-cursor-color "purple")

  • FRAMES

    Emacs uses two alists to determine the default appearances of frames, default-frame-alist and initial-frame-alist. The default-frame-alist variable sets the basic defaults of all frames. Since it is a common Emacs usage to have the initial frame have slightly different properties than other frames (e.g., its position), you can use the initial-frame-alist variable to override properties in default-frame-alist specially for the initial frame. You should definitely read the help text for these variables (C-h v) for more details on the differences between the two variables and how they interact with each other.

    Below is an example of using default-frame-alist and initial-frame-alist to configure the appearances of the initial frame and all other frames (you would place this code in your startup file). With default-frame-alist, we set the top left corner of new frames to be at pixel offset +200+400, the width and height to be 80x40, the cursor to be white, the foreground to be yellow, the background to be black, and the font to be Courier 10. With initial-frame-alist, we override the top left corner of the initial frame to be at pixel offset +10+30, and inherit the remaining properties for the initial frame from default-frame-alist.

    (setq default-frame-alist
          '((top . 200) (left . 400)
    	(width . 80) (height . 40)
    	(cursor-color . "white")
    	(foreground-color . "yellow")
    	(background-color . "black")
    	(font . "-*-Courier-normal-r-*-*-13-97-*-*-c-*-*-ansi-")))
    
    (setq initial-frame-alist '((top . 10) (left . 30)))
    

  • ITALICS

    Emacs currently requires that italic versions of fonts have the same width as the normal version of the font. However, most of the default fonts have italic and italic bold versions whose character widths are larger than the normal version (the only default font that appears to have viable italic and bold versions is Courier New). Because of this, Emacs by default disables the use of italic faces.

    You can still enable the use of italic faces with Emacs by setting the variable win32-enable-italics to t in your startup file:

    (setq win32-enable-italics t)  ; This must be done before font settings!
    (set-face-font 'italic "-*-Courier New-normal-i-*-*-11-82-c-*-*-ansi-")
    (set-face-font 'bold-italic "-*-Courier New-bold-i-*-*-11-82-c-*-*-ansi-")
    
    Although this works best with Courier New, there is still one minor glitch: the italics versions are one pixel higher than the other versions, so the line spacing is increased by a pixel when italics are enabled.

    Console Interface

    Emacs can also run inside a console window. Simply invoke Emacs with the -nw command line option to do so. Although you cannot change the size, font, or color of the window from within Emacs, you can use the window's menu to do so. (If no icon has been created to invoke the Emacs batch file, then you'll have to create one to change these attributes.)

  • SIZE

    Under NT, go to the upper left hand corner and open the "-" menu of the console window. Select "Screen Size and Position...", and use the dialog to set the window to the size you want. Be sure to check the "Save Window Size and Position" checkbox so that future invocations will retain the new window size. After closing the dialog box, resize the window itself by dragging on the edges.

    Under Win95, click on the properties icon in the icon toolbar at the top of the window. Go to the "Screen" tab and select the desired window size in the "Usage" panel. Click on "OK".

  • POSITION

    To reposition Emacs, click on the title bar of the console window and drag it.

  • FONT

    Under NT, open the "-" menu. Select "Fonts...", and use the dialog to set the window font to the one you want. Be sure to check the "Save Configuration" checkbox so that your font change will be used in future invocations. Click on "OK", and the window will get resized.

    . Under Win95, simply use the popup font menu in the upper left-hand corner of the window. Or click on the font icon in the icon toolbar. Or click on the properties icon in the icon toolbar and go to the "Font" tab and choose the font that you want to use.

  • COLOR

    Under the NT interface, open the "-" menu. Select "Screen Colors...", and use the dialog to choose the colors you want to use for the window. Be sure to check the "Save Configuration" checkbox so that the colors are used in future invocations. Click on "OK". Unfortunately, the colors are not immediately used, but the changes have been made. To use the new colors, simply close the window and use the icon to start Emacs again. Emacs will then come up using the colors you chose before.

    I'm not exactly sure how to change the colors on a per-console-window basis under Win95.


    Where do I put my .emacs (or _emacs) file?

    Your startup file can be named either _emacs or .emacs, and should be placed in your "home" directory. If you have both files in your home directory, Emacs will load the .emacs file and ignore _emacs. Also, if you have a version of Emacs older than 19.31, Emacs will only recognized _emacs as the startup file.

    Your home directory is where the HOME configuration variable tells Emacs it is. As with the other Emacs configuration variables, HOME can be set in a number of ways:

    If Emacs cannot find HOME set in any of the above locations, it will assume your HOME directory is "C:\".

    The directory specified by HOME is also the directory substituted for tildes (~) in file names (so, by definition, your startup file will be in the directory "~\").


    How do I swap CapsLock and Control?

    CapsLock and Control cannot be swapped from within Emacs, and Windows does not have a convenient mechanism like xmodmap to change virtual key bindings. Instead, new keyboard layouts or device drivers need to be installed to swap the two keys.

    WARNING: If you use a new keyboard layout to switch CapsLock and Control, beware of the option to use hotkey sequences to switch keyboard layouts. This option is in Control Panel->Keyboard under the Language (Win95) or Input Locales (NT) tabs; the sequences themselves are "Left Alt+Control" and "Ctrl+Shift". If you enable one of these options, then you will likely at some point switch keyboard layouts while trying to use an Emacs key combination.

    NT 4.0: For NT 4.0, check out swapcapslock.zip.

    NT 3.5, 3.51: James Kittock has provided a program for NT that installs a new keyboard layout with the two keys swapped. Once installed, you can then select it using the "International" control panel applet.

    Win95: Microsoft has placed a keyboard remapping program for Win95 on their ftp site. For more info, take a look at their Kernel Toys page.

    Mark Russinovich has also written a freeware VxD that swaps CapsLock and Control under Windows 95. (I've been told that you might have to hit the real Control key once after installing the VxD to jumpstart the mapping.)


    Subprocesses under Emacs

    Emacs on NT and Win95 can utilize subprocesses just like Unix Emacs. However, the behavior of subprocesses with Emacs may be unintuitive in some situations. This section discusses these situations, and how you might work around them.

    Programs reading input hang

    Programs that explicitly use a handle to the console ("CON" or "CON:") instead of stdin and stdout cannot be used as subprocesses to Emacs, and they will also not work in shell-mode (the default ftp clients on Win95 and NT are examples of such programs). There is no convenient way for either Emacs or any shell used in shell-mode to redirect the input and output of such processes from the console to input and output pipes. The only workaround is to use a different implementation of the program that does not use the console directly (see the discussion on ange-ftp for a replacement for the default ftp clients).

    Buffering in shells

    You may notice that some programs, when run in a shell in shell-mode, have their output buffered (e.g., people have found this happening to them with sql-mode). When the program has a lot of output, it overflows the buffering and gets printed to the shell buffer; however, if the program only outputs a small amount of text, it will remain buffered and won't appear in the shell buffer.

    Although it may at first seem like the shell is buffering the output from the program, it is actually the program that is buffering output. The C runtime typically decides how to buffer output based upon whether stdout is bound to a handle to a console window or not. If bound to a console window, output is buffered line by line; if bound to a block device, such as a file, output is buffered block by block.

    In a shell buffer, stdout is a pipe handle and so is buffered in blocks. If you would like the buffering behavior of your program to behave differently, the program itself is going to have to be changed; you can use setbuf and setvbuf to manipulate the buffering semantics.

    DOS subprocesses

    You can run DOS subprocesses under Emacs, but with the limitation that you run only one at a time. The implication of this is that, if you use command.com under Win95 as your shell, then you can only run one shell process at a time (command.com is still a DOS process even under Win95). You can use other shells, such as bash, tcsh, or 4NT, instead of command.com; see the section below on other tools for pointers to other sites.

    Andrew Innes is working on removing this limitation. If all goes well, it should be available in 19.35.


    How do I use a shell in Emacs?

    You can use an interactive subshell in Emacs by typing "M-x shell". Emacs uses the SHELL configuration variable to determine which program to use as the shell. If you installed Emacs using the addpm.exe program, then addpm.exe will associate the value %COMSPEC% with SHELL in the registry. Emacs will then use the value of the COMSPEC environment variable when it starts up, unless the SHELL environment variable is explicitly defined (as when using the emacs.bat batch file).

    If you would like to specify a different shell for Emacs to use, then you should do one of two things. You should either explicitly set the environment variable SHELL to be the shell you want to use, or, if you want to have the COMSPEC environment variable determine the shell, then you need to install Emacs using the addpm.exe program and ensure that the SHELL environment variable is not defined when you start up Emacs.

    How do I prevent shell commands from being echoed?

    Some shells echo the commands that you send to them, and the echoed commands appear in the output buffer. In particular, the default shells, command.com on Win95 and cmd.exe on NT, have this behavior.

    To prevent echoed commands from being printed, you can place the following in your startup file:

    (setq comint-process-echoes t)
    
    If shell-mode still is not stripping echoed commands, then you'll have to explicitly tell the shell to not echo commands. You can do this by setting the explicit-SHELL-args variable appropriately, where SHELL is the value of your shell environment variable (do a "M-: (getenv "SHELL")" to see what it is currently set to). Assuming that you are on NT and that your SHELL environment variable is set to cmd.exe, then placing the following in your startup file will tell cmd.exe to not echo commands:

    (setq explicit-cmd.exe-args '("/q"))
    
    The comint package will use the value of this variable as an argument to cmd.exe every time it starts up a new shell (as in shell-mode); the /q is the argument to cmd.exe that stops the echoing (in a shell, invoking "cmd /?" will show you all of the command line arguments to cmd.exe).

    Note that this variable is case sensitive; if the value of your SHELL environment variable is CMD.EXE instead, then this variable needs to be named explicit-CMD.EXE-args instead.

    Why is a "Specified COMMAND search directory bad" message printed?

    The function shell in shell.el automatically invokes the shell program with the argument "-i", and parses this as the directory in which the shell program resides (which, of course, is invalid). To prevent this message from being printed, you can create a variable named according to the form specified in the help message of shell (to look at the help message, type "C-h f shell"). For the default shells, then, you could place the following in your startup file to prevent this message (these will eventually get into winnt.el so you don't have to do this):
    (setq explicit-command.com-args nil)
    (setq explicit-COMMAND.COM-args nil)
    (setq explicit-cmd.exe-args nil)
    (setq explicit-CMD.EXE-args nil)
    
    Multiple lines for each shell are given since variable names are case sensitive and shell names can be any case (so this only handles the most common situations). If you have an entirely different shell that also complains about being given the "-i" switch, you can initialize a similarly named variable to prevent the "-i" switch from being sent to the shell.

    Note that, if you would like to always pass arguments to an interactive shell when it starts up, you would change the nil value in the appropriate assignment above to the list of arguments you would like to use with your shell. For example, if you would like to invoke command.com and tell it which directory its executable resides, you could place something like the following in your startup file:

    ;; Determine the directory containing the shell program, explicitly making
    ;; certain that the directory separator is a backslash when doing so.
    (let ((directory-sep-char ?\\))
      (setq shell-directory (file-name-directory (getenv "SHELL"))))
    
    (setq explicit-command.com-args (list shell-directory))
    (setq explicit-COMMAND.COM-args (list shell-directory))
    

    When I run programs within a shell I get "Incorrect DOS version" messages. Why?

    This might happen if, for example, you invoke nmake in a shell and it tries to create subshells. The problem is related to the one above where, again, when the shell is initially created, the first argument to the shell is not the directory in which the shell program resides. When this happens, command.com fabricates a value for its COMSPEC environment variable that is incorrect. Then, when other programs go to use COMSPEC to find the shell, they are given the wrong value.

    The fix for this is to either prevent any arguments from being sent to the shell when it starts up (in which case command.com will use a default, and correct, value for COMSPEC), or to have the first argument be the directory in which the shell executable resides. Examples of how to do both of these are in shown in the previous subsection.


    How do I use mail with Emacs?

    You do not need to do much to use mail with Emacs under Win32, but you do need to be able to communicate with local mail daemons and mail servers (they do most of the work) to both receive and send mail from your system. These daemons and servers are typically running on the machines in your local network that are already handling mail for you and/or other users on other systems.

    I've only tested the outgoing and incoming RMAIL setups. If you find that the suggested code for any of the other incoming mail configurations is inaccurate, please let me know.

    Outgoing

    For outgoing mail, you need an elisp file, smtpmail.el, that enables Emacs to talk SMTP with mail daemons (smtpmail.el was written by Tomoji Kagatani <kagatani@rbc.ncl.omron.co.jp> and has been submitted to be included in future distributions). You also need to add the following to your startup file (be sure to customize for you and your system):

    (setq user-full-name "Your full name")
    (setq user-mail-address "Your email address")
    
    (setq smtpmail-default-smtp-server "Domain name of machine with SMTP server")
    (setq smtpmail-local-domain nil)
    (setq send-mail-function 'smtpmail-send-it)
    
    (load-library "smtpmail")
    

    Incoming: RMAIL and POP3

    For incoming mail using the RMAIL package and a POP3 mail server, you need only place the following in your startup file (again, be sure to customize):

    (setenv "MAILHOST" "Domain name of machine with POP3 server")
    (setq rmail-primary-inbox-list '("po:Your login") rmail-pop-password-required t)
    
    Note that you will need to customize the Domain name of machine with POP3 server and Your login fields to be the name of your POP server and your login name.

    Incoming: VM and POP3

    For incoming mail using the VM package and a POP3 mail server, you first need the vm package (check any elisp archive) and then you need to place the following in your .vm configuration file:

    (setq vm-spool-files 
          (list 
           (list "~/INBOX"
                 "POP3 server:110:pass:POP user name:*"
                 "~/INBOX.CRASH")))
    
    Note that you will need to customize the POP3 server and POP user name fields to be your login name and the name of your POP server. You will also probably want to customize the name of your inbox and crash files (~/INBOX and ~/INBOX.CRASH in the example above.)

    Incoming: GNUS

    You should be able to use Gnus 5.2 and above as a mail reader. The following was sent as an example by Marc Fleischeuers <Marc.Fleischeuers@kub.nl>:
    ;; For sending mail
    (setq message-send-mail-function 'smtpmail-send-it)
    
    ;; For reading mail (other backends can be substituted for nnml)
    (setq gnus-secondary-select-methods '((nnml "")))
    (setq nnmail-spool-file "po:POP user name")
    (setq nnmail-pop-password-required t)
    
    Be sure to customize the POP user name field appropriately.

    tm

    I don't know of any complete ports of tm to the Win32 environment, but Fabrice POPINEAU <popineau@esemetz.ese-metz.fr> has made some modifications to the OS2 version of tm. See his description of what he has done for more info. The support programs mentioned can be found in mm.zip (note that they have only been tested on NT 4.0, though).


    How do I use ange-ftp with Emacs?

    You will need some additional files before ange-ftp will work with Emacs. Partly this is due to the unfortunate fact that the ftp program shipped with Win95 and NT does not accept a password from a pipe or a redirected file, and partly this is due to some incompatibilities in the ange-ftp.el lisp file when used on Windows.

    Chris Szurgot <szurgot@itribe.net> has been working on both of these problems. He has a version of ftp that solves the password problem, and a version of ange-ftp that deals with the incompatibilities. You can find both on his ftp server:

    Place the ftp.exe executable in a directory where you keep your local executables, and the ange-ftp.el file in whatever directory you keep custom and personalized elisp files (you will probably also want to byte-compile ange-ftp.el, too). Then be sure that the exec-path variable is set so that, when Emacs runs the ftp.exe program, it runs the one you downloaded (and not the default one). Likewise, be sure to set load-path so that, when ange-ftp is invoked, the ange-ftp.el file you downloaded gets loaded instead of the default one. As an example, assuming that you placed ftp.exe in, say, %HOME%\bin and ange-ftp.el in %HOME%\elisp, you could set exec-path and load-path as follows in your startup file:

    (setq exec-path (cons (expand-file-name "~/bin") exec-path))
    (setq load-path (cons (expand-file-name "~/elisp") load-path))
    
    As another alternative, you can tell ange-ftp exactly which ftp program to use by customizing ange-ftp-ftp-program-name, e.g.:

    (setq ange-ftp-ftp-program-name "c:/bin/ftp.exe")
    
    With this method you don't have to worry about the wrong ftp program being picked up through exec-path.

    You will also want to customize the temporary directory that ange-ftp uses to cache files:

    (setq ange-ftp-tmp-name-template 
          (concat (expand-file-name (getenv "TEMP")) "/ange-ftp"))
    (setq ange-ftp-gateway-tmp-name-template 
          (concat (expand-file-name (getenv "TEMP")) "/ange-ftp"))
    
    Note that this particular ftp client was ported pretty much only for use with Emacs; if you're looking for a snazzier ftp client for more general use, you might want to look at the ncftp client on Chris's ftp server.


    How do I use telnet with Emacs?

    As far as I know, there is no telnet client that you can successfully use as a subprocess to Emacs, and so telnet mode does not work. Most telnet clients for Windows are GUI apps that use their own windows; Emacs requires a console app that works with pipes.

    To get telnet working with Emacs, I see two possibilities. One is to implement a version of telnet.el that talks the telnet protocol directly (c.f. the gnus implementation), skipping the telnet program altogether. The other possibility is to implement a console version of telnet. Chris Szurgot <szurgot@itribe.net> has a console app telnet on his ftp server (see ftp://ftp.itribe.net/pub/virtunix/telc10a.zip), but it unfortunately uses direct console input and output. This version can be hacked to use stdin and stdout, and then could be used as an Emacs subprocess.


    How do I use crypt with Emacs?

    The crypt++ package doesn't yet work out of the box with Emacs on Win32. David S. Rosinger <dsrosing@fed3005.reston.ingr.com> modified crypt++.el so that it would work, commenting:

    This package will allow you to transparently visit `.Z', `.gz', `.tar', `.tar.gz' and DOS files. (However, on occasion, certain `.tar.gz' files lock up emacs...don't know why, but killing `gzip' frees up emacs again.)
    Download this version of
    crypt++.el and place it somewhere in your load path. You'll also need the compression/uncompression utilities (look in ftp.cs.washington.edu/pub/ntemacs/utilities) in your exec path.


    How do I use the browse-url package?

    Caleb Deupree has put together a package for intergrating browse-url.el with Emacs on Win32. First pick up the latest browse-url.el from http://wombat.doc.ic.ac.uk/emacs/browse-url.el (note that this is a much more recent version than is shipped with Emacs), and set it up as per the instructions in that file. Then download and install the shelex.exe program, making sure that it is in your exec-path. (The code for shelex.exe is in shelex.c.)

    Then add the following commands to your startup file:

    (defvar shell-execute-helper "shelex.exe")
    (defun shell-execute-url (url &optional new-window)
    "Invoke the shell-execute-helper program to call ShellExecute and launch
    or re-direct a web browser on the specified url."
       (interactive "sURL: ")
       (call-process shell-execute-helper nil nil nil url))
    
    (setq browse-url-browser-function 'shell-execute-url)
    (setq gnus-button-url 'shell-execute-url)		; GNUS
    (setq vm-url-browser 'shell-execute-url)		; VM
    
    This works with the default browser on your system, whether it's IE or something else. However, you must have IE3 installed on your system for it to work with other browsers as the dll that makes this all work, WININET.DLL, only gets installed when IE3 is installed.


    How do I use Emacs with a two-button mouse?

    Emacs assumes that you have a three-button mouse by default. However, if you have a two-button mouse, you can press both buttons at once to emulate the missing middle button expected by Emacs. If you have a three-button mouse, but the middle mouse button does not work for you, skip to the end of this section.

    Three variables control mouse button emulation under Emacs: win32-num-mouse-buttons, win32-mouse-button-tolerance, and win32-swap-mouse-buttons. If you use help on win32-num-mouse-buttons (i.e., with "C-h v"), it will tell you how many buttons Emacs thinks your mouse has; if win32-num-mouse-buttons is less than 3, then Emacs will emulate the middle mouse button.

    Emacs emulates the middle mouse button by treating simultaneous button presses of the left and right buttons as a middle button press. Since presses both buttons cannot really be simultaneous, Emacs compares button presses within a specified window of time to determine whether it should emulate the middle button. This window of time is controlled using win32-mouse-button-tolerance. Help on this variable will show you the value Emacs uses by default, and you can change this value to suit your needs.

    Depending upon the type of two-button mouse, you may find it useful to swap the mapping of middle and right mouse buttons. By default, the middle button is mapped to mouse-2 and the right button is mapped to mouse-3. If you set win32-swap-mouse-buttons to a non-nil value, then you can swap these two mappings.

    Some people find that they have a three button mouse, but the middle mouse button does not work for them. First check to see if win32-num-mouse-buttons is set correctly. If so, then check to see whether your mouse has been installed with the proper driver (open Control Panel->Mouse to examine the driver being used). If nothing seems to be amiss, then at the very least you can have Emacs emulate the middle button by setting win32-num-mouse-buttons to 2.


    How do I highlight the region between the point and the mark?

    To highlight the region between the point and the mark, use the function transient-mark-mode:
    (transient-mark-mode t)
    

    How do I change the sound of the Emacs beep?

    You can use the function set-message-beep to change the sound that Emacs uses for its beep. Emacs allows you to specify one of the Windows system sounds for the beep. For example, to use the ok system sound, place the following in your startup file:

    (set-message-beep 'ok)
    
    Look up help for the function for a complete description of how to use the function and which sounds it recognizes.


    How do I display ISO 8859 characters?

    To display ISO 8859 characters, place the following in your startup file:

    (standard-display-european t)
    To input 8-bit characters, you may also need to adjust the input mode (from Johan Myreen (jem@vistacom.fi)):

    (set-input-mode (car (current-input-mode))
                    (nth 1 (current-input-mode))
                    0)
    

    How do I print from Emacs?

    Pascal Obry has a nice example of how to set up some variables to get printing to work on NT.

    Jeff Paquette <paquette@ici.net> has a version of pr for use with Emacs, and instructions on how to set it up.

    Vassil Peytchev <vassil@msn.fullfeed.com> has an example of how to use ghostscript to print to non-postscript printers.


    Is there a package for editing Windows specific files (.bat, .ini, .inf, etc.)?

    Peter Breton <pbreton@i-kinetics.com> has written a package called generic-mode for editing Windows specific files (such as .bat, .ini, .inf, .reg, .rc, and .rul files). Download generic-mode.el and generic-extras.el, place them somewhere in your load-path, byte-compile them, and then follow the instructions at the top of file to use them.


    How do I associate files with Emacs?

    You can use a package like gnuserv to associate files with Emacs so that opening a file outside of Emacs (e.g., by double-clicking on its icon) will create a new frame in a running Emacs displaying that file. Peter Breton <pbreton@dirac.i-kinetics.com> ported a version of gnuserv to NT that used named pipes. Since Win95 doesn't support named pipes, Nico Francois <Nico.Francois@scala.nl> modified it again to use mailslots so that it would work on both platforms.

    Nico's distribution is in:

    Note that you can set up file associations in Win95/NT 4.0 using Explorer by selecting the "View->Options..." menu operation, and then clicking on the "File Types" tab in the dialog that pops up. Clicking on a file type will allow you to edit it and associate the file with gnuclient.exe.

    Comments from Nico:

    I've made some small modifications and now there's a gnuclientw.exe included which is compiled as a Windows program (it will also force the -q flag on so it doesn't hang around for nothing).

    Ideal to be used for file associations. Also rather cool to put a shortcut to gnuclientw.exe on your desktop and have the ability to drag-n-drop files into Emacs.


    How do I access UNIX files via NFS?

    If you mount UNIX file systems onto your machine (e.g., with samba), and you would like to prevent your files from being translated to the DOS CR/LF format, you can use using-unix-filesystems by placing the following:

    (using-unix-filesystems t)
    in your startup file. Note, though, that this has Emacs treat all files as if they were on a UNIX filesystem, which can be very limiting.

    A future replacement for using-unix-filesystems are the functions at the end of untranslate.el. These functions enable you to turn on and off translation on an individual filesystem basis. If you want to use these functions, download and place untranslate.el in your load-path and have it loaded from your startup file. Then you can place calls to add-untranslated-filesystem to selectively access filesystems in binary mode.


    Is there a mode for editing Visual Basic source?

    Fred White <fwhite@world.std.com> has written a package for editing Visual Basic source. Download basic-mode.el, place it in your load-path, and follow the directions at the top of the file to use it. Fred's comments:

    Here is a simple mode for editing programs written in The World's Most Sucessful Programming Language. It features indentation, font locking, keyword capitalization, and some other convenience functions.

    Is there a version of RCS for Win32?

    You can find a collection of the RCS x86 executables in rcs57nt.zip. I was told Mark Alexander <marka@daddy.pepper.com> did the port.

    (Executables provided by Peter Breton <pbreton@dirac.i-kinetics.com>. I don't have any source.)

    Note that to use RCS you will also need a copy of gnu diff.


    Is there a version of ispell for Win32?

    Henry Thorpe has <thorpe@iew.sed.monmouth.army.mil> has ported a somewhat hacked up version of ispell to Win32. You can get it from his ftp server at ftp://www.sesd.ilex.com/pub/thorpe/NT-ispell.cygnus.hacked.zip.

    Brian Tibbetts <tibbetts@cat.rpi.edu> has also done some work on making ispell more Win32 friendly. Check out his page at http://cat.rpi.edu/~tibbetts/ispell_toc.html (his latest update on 10/16/96).


    Does Emacs support popup menus?

    The standard distribution does not yet support popup menus like the Unix version does. Mark Jungerman <mjungerm@us.oracle.com> and <hsexton@us.oracle.com> (my apologies; I seem to have lost your name!) have implemented popup menu support, although its programming semantics are slightly different than the standard Emacs popup menu semantics (Jake Colman <jcolman@jnc.com> is trying to remedy this situation). If you would like to use what they have implemented, you can download their patches (which were made to the 19.34.1 source).


    BUGS

    Below is a list of the most obvious bugs that users typically encounter. I am aware that these bugs exist, so there is no need to send a bug report to either me or to the mailing list. If I know of a workaround, I'll mention it along with the description of the bug.

    In time I will grow this list to be a more comprehensive list of bugs.

    19.34