This is the GNU Emacs FAQ for MS Windows, last updated on 12 March 2011.
This FAQ is maintained by the developers and users of Emacs on MS Windows. If you find any errors, or have any suggestions, please send them to help-emacs-windows@gnu.org. Currently the FAQ maintainer is Ramprasad B.
This FAQ is available in two versions:
The latest version of GNU Emacs as of 12 March 2011 is version 23.3.
This FAQ covers questions that are specific to running GNU Emacs on Windows. In this version of the FAQ, information that was out of date, covered in the manuals or not specific to Windows has been removed. See Further information.
It is not our goal to “help Windows users” by making text editing on Windows more convenient. We aim to replace proprietary software, not to enhance it. So why support GNU Emacs on Windows?
We hope that the experience of using GNU Emacs on Windows will give programmers a taste of freedom, and that this will later inspire them to move to a free operating system such as GNU/Linux. That is the main valid reason to support free applications on nonfree operating systems.
Emacs 23.3 is known to run on all versions of Windows from Windows 95 and Windows NT 4.0 through to Vista. The Windows port is built using the Win32 API and supports most features of the X version, including variable width fonts, images and tooltips.
Eli Zaretskii maintains the port of GNU Emacs for DOS and 16 bit Windows. When run on Windows 95, 98 and ME, it will support long file names, and uses the Windows clipboard on all versions of Windows. The latest pre-compiled version at ftp.delorie.com seems to be 20.5, but more recent versions can be built from source using DJGPP.
Hisashi Miyashita created Meadow the early days of Emacs 20, when the Windows port was far behind in supporting the new multilingual functionality. Meadow continues to be developed along with Emacs due to some extra functionality that it offers, particularly for Japanese users. Information in English is available from the Meadow Wiki.
Lennart Borgman maintains some patches which he calls EmacsW32. His patches aim to provide closer integration with Windows, and make things easier for Windows refugees to begin the transition to Emacs. Lennart is active in Emacs development, so some of his patches are likely to be included in future versions of Emacs. In addition to the patches themselves, Lennart also offers installers for development versions of Emacs from CVS, both with and without his patches.
XEmacs has also been ported to Windows. See the XEmacs FAQ.
There are a number of others who distribute Windows binaries of Emacs, either bundled with some extra lisp libraries for a particular purpose, or development code from CVS packaged as an installer. Because these come and go (mostly during long development cycles without an official release), they are not listed here.
Pre-compiled versions are distributed from ftp.gnu.org and its mirrors1. Emacs binaries are distributed as zip files, digitally signed by the developer who built them. Generally most users will want the file emacs-23.3-bin-i386.zip, which contains everything you need to get started. The file emacs-23.3-barebin-i386.zip is provided for users who already have the source, but had second thoughts about compiling it themselves.
The latest source is always available from ftp.gnu.org and its mirrors. It is distributed as a gzipped tar file, digitally signed by the maintainer who made the release. For minor releases, xdeltas for patching the previous release are also available.
Yes you can. See the instructions on Savannah, the GNU development site, for details.
To compile Emacs on Windows, you will need the MingW or Cygwin port of GCC with MingW make, or a Microsoft C compiler with nmake and the single threaded C runtime library. Recent versions of Microsoft Visual Studio no longer come with the single threaded C runtime library, which is required for certain POSIX compatibility, so MingW is usually the best choice. Image support requires external libraries, the headers and import libraries for which will need to be installed where your compiler can find them. You will also need ports of GNU rm and cp, as the Windows native equivalents are not consistent between versions. GNU texinfo will be required to build the manuals. See Other useful ports.
After unpacking the source, or checking out of CVS, be sure to read the instructions in nt/README and nt/INSTALL.
By default, Emacs is compiled with debugging on, and optimizations enabled. The optimizations may interfere with some types of debugging; the debugger may not show clearly where it is, or may not be able to inspect certain variables. If this is the case, reconfigure with --no-opt.
The file etc/DEBUG contains general debugging hints, as well as specific notes about debugging Emacs with both gdb and Microsoft debuggers.
GDB is the GNU debugger, which can be used to debug Emacs when it has been compiled with GCC. The best results will be obtained if you start gdb from the src directory as ‘gdb oo/i386/emacs.exe’. This will load the init file .gdbinit in that directory, to define some extra commands for working with lisp while debugging, and set up breakpoints to catch abnormal aborts.
MS DevStudio can be used to debug Emacs when it has been compiled with
a Microsoft compiler. To view lisp variables, you can call the
function debug_print
from the Quickwatch window. Some
old tips are probably still valid.
The binary distributions are distributed as zip files, which are handled natively by Windows XP and later. For earlier versions, there are many tools that can handle the zip format, from InfoZip's command line unzip tool, to 7zip's multi-format graphical archive explorer. Although popular, WinZip has caused problems with line-ends in the past, and is not Free software, so we do not recommend it.
Source distributions are distributed as gzipped tar files. 7zip and similar multi-format graphical tools can handle these, or you can get Windows ports of the command line gzip and tar tools from multiple sources. See Other useful ports.
The command to unpack a source distribution from the command line is:
tar xzf emacs-23.3.tar.gz
If this does not work with the versions of tar and gzip that you have, you may need to try a two step process:
gzip -dc emacs-23.3.tar.gz | tar xvf -
You may see many messages from tar complaining about being unable to change the modification time on directories, and from gzip complaining about a broken pipe. These messages are usually harmless, caused by incomplete ports that are not fully aware of the limitations of Windows.
You can run Emacs without any extra steps, but if you want icons in your Start Menu, or for Emacs to detect the image libraries that are already installed on your system as part of GTK, then you should run the program emacs-23.3\bin\addpm.exe.
Emacs has built in support for XBM and PBM/PGM/PPM images. This is sufficient to see the monochrome splash screen and tool-bar icons. Since 22.2, the official precompiled binaries for Windows have bundled libXpm, which is required to display the color versions of those images.
Emacs is compiled to recognize JPEG, PNG, GIF and TIFF images also, but displaying these image types require external DLLs which are not bundled with Emacs. See Other useful ports.
When Emacs starts up, it attempts to load and execute the contents of a file commonly called .emacs (though it may have other names, see Where do I put my init file?) which contains any customizations you have made. You can manually add lisp code to your .emacs, or you can use the Customization interface accessible from the Options menu. If the file does not exist, Emacs will start with the default settings.
On Windows, the .emacs file may be called _emacs for backward compatibility with DOS and FAT filesystems where filenames could not start with a dot. Some users prefer to continue using such a name, because Explorer cannot create a file with a name starting with a dot, even though the filesystem and most other programs can handle it. In Emacs 22 and later, the init file may also be called .emacs.d/init.el. Many of the other files that are created by lisp packages are now stored in the .emacs.d directory too, so this keeps all your Emacs related files in one place.
All the files mentioned above should go in your HOME directory. The HOME directory is determined by following the steps below:
HKCU\SOFTWARE\GNU\Emacs\HOME
is set, use the
directory it indicates.
HKLM\SOFTWARE\GNU\Emacs\HOME
is set, use the
directory it indicates. Not recommended, as it results in users sharing
the same HOME directory.
Within Emacs, <~> at the beginning of a file name is expanded to your HOME directory, so you can always find your .emacs file with C-x C-f ~/.emacs.
If you've set HOME to a directory using one of the above methods, and Emacs still doesn't load your init file, the first thing you should do is check to see what Emacs thinks HOME is set to. You can do this by evaluating the following expression in the *scratch* buffer using C-x C-e:
(insert (getenv "HOME"))
Look carefully at what is printed and make sure the value is valid. For example, if the value has trailing whitespace, Emacs won't be able to find the directory. Also, be sure that the value isn't a relative drive letter (e.g., d: without a backslash); if it is, then HOME is going to be whatever the current directory on that drive is, which is likely not what you want to happen.
The recommended way to associate files is to associate them with emacsclientw.exe. In order for this to work when Emacs is not yet started, you will also need to set the environment variable ALTERNATE_EDITOR to runemacs.exe. To open files in a running instance of Emacs, you will need to add the following to your init file:
(server-start)
You can use Emacs as the editor for composing mail for
<mailto:
> links, reading usenet for <news:
>
links, and viewing source. The following registry entries control
this:
Thanks to Jason Rumney and Sigbjorn Finne for these tips.
The location of the Desktop varies between different versions of Windows, and in a corporate environment can be moved around by the network administrator. On NT derivatives, you can use the value of the USERPROFILE environment variable to find where the desktop might be:
C-x C-f $USERPROFILE/Desktop
If this doesn't work, then you probably have to forgo the keyboard just this once, and either drag a file onto the Emacs frame from the desktop, or use the file dialog (displayed when you use the toolbar or menu by default). Once you have a file from the Desktop inside Emacs, C-x C-f will quickly reveal where your desktop is kept.
Customize the variables focus-follows-mouse
and
mouse-autoselect-window
. The former can be used to mislead
Emacs into giving focus to other frames when the mouse is over them,
even though Windows has a click to focus policy by default (there is
software available to change that though). The latter can be used to
make Emacs use a focus-follow-mouse policy within its own frames.
This cannot be done within Emacs, but you can modify the scan code mappings in the registry or define a new keyboard layout to swap the keys on a system wide basis.
Microsoft has a tool called keyremap that is part of their Kernel Toys add ons for Windows 95. The tool has also been confirmed to work on Windows 98.
Many beginning users find Emacs difficult to use because its user interface is different in many ways. Emacs predates most UI standards, and experienced Emacs users are used to the way things are, so changing the defaults is difficult. Most of the “standard” behavior can be approximated in Emacs after some configuring though.
Emacs has a concept of a mark and point that is similar to selections in other programs. But the mark in Emacs is used for more than just defining the selected region, it lives on while you continue to edit and move around the buffer so it can also be a kind of bookmark. The history of marks is saved so you can pop previous marks back to the top of the stack to go back to somewhere you were some time ago. Because of this dual purpose, the region between mark and point is not highlighted by default unless you select a region by clicking and dragging the mouse.
The minor mode transient-mark-mode
changes the behavior of
the mark in two ways. First, it distinguishes between an active mark
that has just been defined or reactivated, and an inactive mark. When
the mark is active, some commands that normally act on lines, words,
buffers etc. will instead act on the region. An inactive mark needs
to be reactivated to operate on it, unless mark-even-if-inactive
is set. Secondly, transient-mark-mode
also highlights the
region when it is active, providing the same visual clue that you get
in other programs.
In addition to seeing the highlighting, new Emacs users often expect
editing commands to replace the region when it is active. This behavior
can be obtained with delete-selection-mode
, but see the following
question also.
The keybindings of Emacs predate modern GUIs, and the keys that were
chosen by later GUIs for cut and copy were given important functions
as extended keymaps in Emacs. CUA mode attempts to let both bindings
co-exist by defining C-x and C-c as kill-region
and
copy-region-as-kill
when the region is active, and letting
them have their normal Emacs bindings when the region is not active.
Many people find this to be an acceptable compromise. CUA mode also
defines a number of other keys (C-v, Shift selection), and can be turned
on from the Options menu.
The function w32-send-sys-command
can be used to simulate
choosing commands from the system menu (in the top left corner of the
Window) and a few other system wide functions. It takes an integer
argument, the value of which should be a valid WM_SYSCOMMAND
message as documented in Microsoft's API documentation.
Emacs does not come with an uninstall program. No files are installed
outside of the Emacs base directory, so deleting that directory is
sufficient to clean away the files. If you ran addpm,
you'll need to delete the Start Menu group too. The registry entries
inserted by addpm will not cause any problems if you leave
them there, but for the sake of completeness, you can use regedit
to remove the keys under HKEY_LOCAL_MACHINE
orx
HKEY_CURRENT_USER
: SOFTWARE\GNU\Emacs
, and the key
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\emacs.exe
if it exists.
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.
Check for the following to see if there was a problem during unpacking:
If it is still not working, send mail to the list, describing what you've done, and what you are seeing. (The more information you send the more likely it is that you'll receive a helpful response..
There have been reports in the past that some virus scanners claim that the Emacs distribution has a virus. This is extremely unlikely if you have downloaded Emacs from the GNU FTP site or one of its mirrors and the GPG signature for it is valid and listed in the GNU keyring, unless perhaps it is a new release made in the last few days, in which case you should exercise more caution and report the problem. Past problems seem to have been caused by virus checkers running into a buffer size limit when unpacking large tar.gz files for scanning, and reporting the failure as an “unknown virus”.
Anti-virus and firewall software can block Emacs from starting subprocesses and opening network connections. Most such products have an Advanced mode where they will prompt you rather than silently blocking. In some cases the “scan all files” or “auto protect” option of anti-virus programs has caused failures running shell related commands within Emacs. See Why is nothing happening when I enter shell commands?.
The variable w32-use-full-screen-buffer
controls whether Emacs uses
the window size or buffer size to determine the number of lines on screen.
Normally the window size is correct, but when running Emacs over some
telnet servers, the buffer size needs to be used. Emacs tries to guess
the correct value at startup, but if it guesses wrong, you can customize
that variable yourself.
Emacs assigns bindings assuming a three button mouse. On Windows, if
a two button mouse is detected, a hack is enabled which lets you
simulate the third button by pressing both mouse buttons
simultaneously. w32-mouse-button-tolerance
defines the timeout
for what is considered “simultaneous”. You can check how many
buttons Emacs thinks your mouse has with C-h v
w32-num-mouse-buttons
.
If you find yourself needing the mouse-3 bindings more often than mouse-2, you can swap the buttons with the following code in your init file:
(setq w32-swap-mouse-buttons t)
If you attempt to cut and paste text with NUL characters embedded in it, then the text will be truncated at the first NUL character. This is a limitation of the Windows clipboard, and does not affect killing and yanking from the kill-ring within Emacs.
You can try set-selection-coding-system
, but generally such
corruption is a thing of the past, as Emacs uses Unicode for the clipboard
by default now.
You can use the function set-message-beep
to change the sound
that Emacs uses for its beep. This affects both console and GUI frames.
The doc string contains a list of the system sounds you can use.
Fonts in Emacs 22 and earlier are named using the X Logical Font Description (XLFD) format. Emacs on Windows ignores many of the fields, and populates them with * when listing fonts. Former maintainer Andrew Innes wrote this explanation of what each field in the font string means and how Emacs treated them back in 19.34. Since then, multilingual support and a redisplay overhaul to support variable width fonts have changed things slightly; more character sets are recognized (and the old pseudo character sets are deprecated), and the resolution fields are used to calculate the difference between point and pixel sizes, but normally you should leave these at the system default. The foundry field is also populated with an indication of whether the font is outline (.TTF, .ATM) or raster (.FON) based when fonts are listed, which may let you differentiate between two fonts with the same name and different technologies.
From Emacs 23, the preferred font name format will be moving to the simpler and more flexible fontconfig format. XLFD names will continue to be supported for backward compatibility.
XLFD: -*-Courier New-normal-r-*-*-13-*-*-*-c-*-iso8859-1 Fontconfig: Courier New-13
To find the XFLD name for a font, you can execute the following in the *scratch* buffer by pressing C-j at the end of the line:
(w32-select-font nil t)
To see a complete list of fonts, execute the following in the *scratch* buffer by pressing C-x C-e at the end of the line:
(insert (prin1-to-string (x-list-fonts "*")))
The command line options and frame-parameters for changing the default font in Emacs are documented in the manual. Fonts can also be used when defining faces, though family and size are generally specified individually there. In addition, Emacs on Windows reads the registry to find X Resources. This is also documented in the manual.
Emacs will only use the italic (and bold) versions of a font automatically if it has the same width as the normal version. Many fonts have italic and bold versions that are slightly wider. It will also only use real bold and italic fonts by default, where other applications may use synthesized variations that are derived from the normal font. To enable more italic and bold fonts to be displayed, you can enable synthesized fonts and manually set the font for italic, bold and bold-italic as follows:
(setq w32-enable-synthesized-fonts t) (set-face-font 'italic "-*-Courier New-normal-i-*-*-11-*-*-*-c-*-iso8859-1") (set-face-font 'bold-italic "-*-Courier New-bold-i-*-*-11-*-*-*-c-*-iso8859-1")
To display all the languages that Emacs is capable of displaying, you will require the BDF fonts from the GNU intlfonts package. See How do I use bdf fonts with Emacs?.
For many languages, native truetype fonts are sufficient, and in Emacs 23 the need for BDF fonts will disappear for almost all languages. At the time of writing, some Arabic characters in the HELLO file still do not display with native fonts, because they are pre-composed characters from MULE character sets rather than standard Unicode Arabic, but all other characters are able to be displayed with appropriate truetype or opentype fonts.
Recent versions of Emacs display a large range of characters out of
the box, but if you are having problems with a particular character
set which you know you have fonts for, you can try defining a
new fontset with create-fontset-from-ascii-font
or
create-fontset-from-fontset-spec
.
(create-fontset-from-fontset-spec "-*-Courier New-normal-r-*-*-12-*-*-*-c-*-fontset-most, latin-iso8859-2:-*-Courier New-normal-r-*-*-12-*-*-*-c-*-iso8859-2, latin-iso8859-3:-*-Courier New-normal-r-*-*-12-*-*-*-c-*-iso8859-3, latin-iso8859-4:-*-Courier New-normal-r-*-*-12-*-*-*-c-*-iso8859-4, cyrillic-iso8859-5:-*-Courier New-normal-r-*-*-12-*-*-*-c-*-iso8859-5, greek-iso8859-7:-*-Courier New-normal-r-*-*-12-*-*-*-c-*-iso8859-7, latin-iso8859-9:-*-Courier New-normal-r-*-*-12-*-*-*-c-*-iso8859-9, japanese-jisx0208:-*-MS Gothic-normal-r-*-*-12-*-*-*-c-*-jisx0208-sjis, katakana-jisx0201:-*-MS Gothic-normal-r-*-*-12-*-*-*-c-*-jisx0208-sjis, latin-jisx0201:-*-MS Gothic-normal-r-*-*-12-*-*-*-c-*-jisx0208-sjis, japanese-jisx0208-1978:-*-MS Gothic-normal-r-*-*-12-*-*-*-c-*-jisx0208-sjis, korean-ksc5601:-*-Gulim-normal-r-*-*-12-*-*-*-c-*-ksc5601-*, chinese-gb2312:-*-MS Song-normal-r-*-*-12-*-*-*-c-*-gb2312-*, chinese-big5-1:-*-MingLiU-normal-r-*-*-12-*-*-*-c-*-big5-*, chinese-big5-2:-*-MingLiU-normal-r-*-*-12-*-*-*-c-*-big5-*" t)
In addition to the wide range of fonts that come with the language support packages of various components of Windows itself, GNU/Linux distributions these days come with a number of Free truetype fonts that cover a wide range of languages. The GNU intlfonts source distribution contains BDF fonts covering all of the languages that can be displayed by Emacs 22, and can be downloaded from ftp.gnu.org.
You probably only need to do this on the non-Unicode versions of Windows (95, 98 and ME), and even then, various Windows and Internet Explorer updates have made third party software unnecessary in most cases. If you are having trouble displaying text, try defining a fontset with the font for the languages that the third party software handles set to what that software expects (which may not be an appropriate font for that language, but the third party software is intercepting it and using a different font behind the scenes). See How do I get Emacs to display non-latin characters?.
In addition to defining a fontset with the expected font, you may also need to disable unicode output with:
(setq w32-enable-unicode-output nil)
Normally Emacs should initialize locale-coding-system
appropriately
based on your locale, which will let Emacs use font names in your local
language successfully.
To use bdf fonts with Emacs, you need to tell Emacs where the fonts are located, create fontsets for them, and then use them. We'll use the 16 dot international fonts from ftp.gnu.org/gnu/intlfonts as an example put together by Jason Rumney
Download 16dots.tar.gz and unpack it; I'll assume that they are in
c:\intlfonts. Then set w32-bdf-filename-alist
to the list of
fonts returned by using w32-find-bdf-fonts
to enumerate all of
the font files. It is a good idea to set the variable
bdf-directory-list
at the same time so ps-print
knows where
to find the fonts:
(setq bdf-directory-list '("c:/intlfonts/Asian" "c:/intlfonts/Chinese" "c:/intlfonts/Chinese-X" "c:/intlfonts/Ethiopic" "c:/intlfonts/European" "c:/intlfonts/Japanese" "c:/intlfonts/Japanese-X" "c:/intlfonts/Korean-X" "c:/intlfonts/Misc/")) (setq w32-bdf-filename-alist (w32-find-bdf-fonts bdf-directory-list))
Then create fontsets for the BDF fonts:
(create-fontset-from-fontset-spec "-*-fixed-medium-r-normal-*-16-*-*-*-c-*-fontset-bdf, japanese-jisx0208:-*-*-medium-r-normal-*-16-*-*-*-c-*-jisx0208.1983-*, katakana-jisx0201:-*-*-medium-r-normal-*-16-*-*-*-c-*-jisx0201*-*, latin-jisx0201:-*-*-medium-r-normal-*-16-*-*-*-c-*-jisx0201*-*, japanese-jisx0208-1978:-*-*-medium-r-normal-*-16-*-*-*-c-*-jisx0208.1978-*, thai-tis620:-misc-fixed-medium-r-normal--16-160-72-72-m-80-tis620.2529-1, lao:-misc-fixed-medium-r-normal--16-160-72-72-m-80-MuleLao-1, tibetan-1-column:-TibMdXA-fixed-medium-r-normal--16-160-72-72-m-80-MuleTibetan-1, ethiopic:-Admas-Ethiomx16f-Medium-R-Normal--16-150-100-100-M-160-Ethiopic-Unicode, tibetan:-TibMdXA-fixed-medium-r-normal--16-160-72-72-m-160-MuleTibetan-0")
Many of the international bdf fonts from gnu.org are type 0, and therefore need to be added to font-encoding-alist:
;; Need to add some fonts to font-encoding-alist since the bdf fonts ;; are type 0 not the default type 1. (setq font-encoding-alist (append '(("MuleTibetan-0" (tibetan . 0)) ("GB2312" (chinese-gb2312 . 0)) ("JISX0208" (japanese-jisx0208 . 0)) ("JISX0212" (japanese-jisx0212 . 0)) ("VISCII" (vietnamese-viscii-lower . 0)) ("KSC5601" (korean-ksc5601 . 0)) ("MuleArabic-0" (arabic-digit . 0)) ("MuleArabic-1" (arabic-1-column . 0)) ("MuleArabic-2" (arabic-2-column . 0))) font-encoding-alist))
You can now use the Emacs font menu (see How can I have Emacs use a font menu like on X?) to select the bdf: 16-dot medium fontset, or you can select it by setting the default font:
(set-frame-font "fontset-bdf")
Try loading the file etc/HELLO, and you should be able to see the various international fonts displayed (except for Hindi, which is not included in the 16-dot font distribution).
Place the following in your init file:
(setq w32-use-w32-font-dialog nil)
If you have set w32-use-w32-font-dialog to nil, you can add fonts to the font menu by changing `w32-fixed-font-alist'. For example:
(setq w32-fixed-font-alist (append w32-fixed-font-alist '(("Monotype.com" ("8" "-*-Monotype.com-normal-r-*-*-11-*-*-*-c-iso8859-1") ("9" "-*-Monotype.com-normal-r-*-*-12-*-*-*-c-iso8859-1") ("10" "-*-Monotype.com-normal-r-*-*-13-*-*-*-c-iso8859-1") ("11" "-*-Monotype.com-normal-r-*-*-15-*-*-*-c-iso8859-1")))))
There are a number of methods by which you can control automatic CR/LF translation in Emacs, a situation that reflects the fact that the default support was not very robust in the past. For a discussion of this issue, take a look at this collection of email messages on the topic.
For existing files, Emacs scans the file to determine the line ending convention as part of the same scan it does to determine the file encoding. Embedded Ctrl-M (ASCII 13) characters and inconsistent line ends can confuse the automatic scanning, and Emacs will present the file in Unix (LF) mode with the Ctrl-M characters displayed as ‘^M’. It does this to be safe, as no data loss will occur if the file is really binary and the Ctrl-M characters are significant.
The variable file-name-buffer-file-type-alist
holds a list of
filename patterns and their associated type; binary or text. Files marked
as binary will not have line-end detection performed on them, and instead
will always be displayed as is. With auto-detection in recent versions of
Emacs, this is seldom useful for existing files, but can still be used
to influence the choice of line ends for newly created files.
The variable untranslated-filesystem-list
defines whole
directory trees that should not have CR/LF autodetection performed on
them. The list can be manipulated with the functions
add-untranslated-filesystem
and
remove-untranslated-filesystem
. With auto-detection in
recent versions of Emacs, this is seldom useful for existing files,
but can still be used to influence the choice of line ends for newly
created files.
A lot of effort has gone into making it easier to print from Emacs on Windows and DOS, but this has still been insufficient to keep up with changes in printing technology from text and postscript based printers connected via ports that can be accessed directly, to graphical printers that are only accessible via USB. The changes do however make old information on the subject redundant, so you need to make sure any instructions you are following are up to date. For that reason, the old information from this FAQ has been removed, and you are advised to check the Emacs Wiki for more up to date information.
The quoting rules for native Windows shells and Cygwin shells have some subtle differences. When Emacs spawns subprocesses, it tries to determine whether the process is a Cygwin program and changes its quoting mechanism appropriately. See this previous discussion for details.
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 client on Windows is an example of such a program - this
ftp program is mostly fine for use with ange-ftp
or
tramp
, but not for M-x ftp (see How do I use FTP within Emacs). 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. Microsoft's new
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. The same can happen
in other subprocesses that themselves run other programs as
subprocesses, for example when using cvs from Emacs, which
is itself configured to use ssh, password prompts fail to
appear when expected, and cvs appears to hang.
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.
Some programs handle this by having an explicit flag to control their buffering behaviour, typically -i for interactive. Other programs manage to detect that they are running under Emacs, by using ‘getenv("emacs")’ internally.
A handy solution for Perl scripts to the above problem is to use:
# Turn all buffering off. select((select(STDOUT), $| = 1)[0]); select((select(STDERR), $| = 1)[0]); select((select(STDIN), $| = 1)[0]);
If you are finding the 16 bit DOS subprocesses cause your A: drive to be accessed, hanging Emacs until the read times out if there is no floppy in the drive, check to see if your virus software is causing the problem.
Emacs cannot guarantee that a subprocess gets killed on Windows 95 and its descendants, and it is a difficult limitation to work around. To avoid problems on these systems, you should let subprocesses run to completion including explicitly exiting shells before killing the associated buffer.
If you find that while shutting down, Windows complains that there is a running cmdproxy.exe even though you carefully exited all shells and none were showing in Task Manager before the shutdown, this could be due to buggy interaction with your virus scanner.
When an EOF is sent to a subprocess running in an interactive shell
with process-send-eof
, the shell terminates unexpectedly as
if its input was closed. This affects the use of C-c C-d in
shell buffers. See
this discussion for more details.
You can start an interactive shell in Emacs by typing M-x shell.
Emacs uses the SHELL environment variable to determine which
program to use as the shell. To instruct Emacs to use a non-default
shell, you can either set this environment variable, or customize
explicit-shell-file-name
. You can also customize
shell-file-name
to change the shell that will be used by
subprocesses that are started with shell-command
and
related non-interactive shell commands.
Cygwin bash is a popular shell for use with Emacs. To use bash as the default shell in Emacs, you can place the following in your init file:
(defun my-shell-setup () "For Cygwin bash under Emacs 20" (setq comint-scroll-show-maximum-output 'this) (make-variable-buffer-local 'comint-completion-addsuffix)) (setq comint-completion-addsuffix t) ;; (setq comint-process-echoes t) ;; reported that this is no longer needed (setq comint-eol-on-send t) (setq w32-quote-process-args ?\") (setq shell-mode-hook 'my-shell-setup)
If you find that you are having trouble with Emacs tracking drive changes with bash, see Mike Fabian's note.
WARNING: Some versions of bash set and use the environment variable PID. For some as yet unknown reason, if PID is set and Emacs passes it on to bash subshells, bash dies (Emacs can inherit the PID variable if it's started from a bash shell). If you clear the PID variable in your init file, you should be able to continue to use bash as your subshell:
(setenv "PID" nil)
The package cygwin-mount.el teaches Emacs about Cygwin mount points.
Dired uses an internal lisp implementation of ls by default on Windows. For consistent display of symbolic links and other information with other programs (eg Cygwin) and performance reasons, you may want to use a Windows port of ls instead.
(setq ls-lisp-use-insert-directory-program t) ;; use external ls (setq insert-directory-program "c:/cygwin/bin/ls") ;; ls program name
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 and cmd.exe, have this behavior.
To prevent echoed commands from being printed, you can place the following in your init file:
(defun my-comint-init () (setq comint-process-echoes t)) (add-hook 'comint-mode-hook 'my-comint-init)
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 init 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; the /q is the argument to cmd.exe that stops the echoing (invoking ‘cmd /?’ in a shell 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.
The character appended to directory names when completing in a shell
buffer is controlled by the variable comint-completion-addsuffix
.
See its documentation (with C-h v) for details.
This might happen if, for example, you invoke nmake in a shell and it tries to create sub-shells. The problem happens because 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.
Some anti-virus software has been reported to cause problems with shells in the past. Try turning off options such as “Scan all files”. See What known problems are there with anti-virus software?.
Emacs comes with several options for reading and writing mail. These are documented in the manual, and the choice of which method to use depends on personal taste. There are some issues specific to Windows however, related to the fact that Windows machines do not have the mail infrastructure that is commonly installed on other platforms, so mail will not work without some configuration.
For outgoing mail, you will need to use smtpmail.el which allows Emacs to talk directly to SMTP mail servers. This is included with Emacs, and can be set up as follows:
(setq user-full-name "Your full name") (setq user-mail-address "Your@email.address") (setq smtpmail-default-smtp-server "domain.name.of.your.smtp.server") (setq send-mail-command 'smtpmail-send-it) ; For mail-mode (Rmail) (setq message-send-mail-function 'smtpmail-send-it) ; For message-mode (Gnus)
Note that if you want to change the name of the SMTP server after
smtpmail is loaded, then you'll need to change
smtpmail-smtp-server
.
If you are experiencing problems with sending large messages, check
the value of the variable smtpmail-debug-info
. If it is non-nil, you
should set it to nil
:
For incoming mail using the Rmail package and a POP3 server, you will need the following configuration:
(setenv "MAILHOST" "domain.name.of.your.pop3.server") (setq rmail-primary-inbox-list '("po:your logon id")) (setq rmail-pop-password-required t)
Although Gnus started life as a Usenet news reader, it also makes a good mail reader, particularly if you subscribe to a lot of mailing lists, or you want to use IMAP rather than POP3, which is not supported by Rmail. Because of the varied ways of setting up Gnus, it is best that you read the Gnus manual, and seek help on news:gnu.emacs.gnus if needed.
Other options for reading mail in Emacs include VM, MH-E and Wanderlust. All of these require lisp or executable code that does not come with Emacs, so you should seek help where you obtained the packages from if you want to use them.
In your HOME directory create a file called .mailcap, with contents like the following:
application/zip "C:/Program Files/7-Zip/7zFM.exe" video/* "C:/Program Files/VideoLAN/VLC/vlc.exe"
Warning: Associating MIME types with start or other generic Windows commands to open arbitrary files might seem like a good idea, but it leaves your system as open to attack as Outlook Express was at its worst. Especially dangerous is associating application/* or */* in this way.
Windows built in FTP client can be used with ange-ftp. Ange-ftp is the Emacs package that provides FTP connectivity to tramp, a multi-protocol remote file access package for Emacs that is enabled by default.
The Windows FTP client does have problems with some firewalls, due to
lack of passive mode support, so you may want to try an alternative
ftp client instead. Make sure that the client you are trying is in
your PATH before the default Windows client, or rename the
default Windows client to avoid it getting in the way. Alternatively
you can customize ange-ftp-ftp-program-name
to the full path to
the version you are trying. See Other useful ports.
Tramp can use a number of protocols to connect to remote machines to
read files and even run commands on those files remotely. A popular
one is ssh. As well as Cygwin versions of openssh, you can use
PuTTY's command line plink program as the ssh client. The relevant
methods to use in tramp-default-method
or
tramp-default-method-alist
for these options are:
scp
Uses scp for copying, ssh for shell operations.
scp1
scp with forced SSH protocol version 1
scp2
scp with forced SSH protocol version 2
ssh
Uses ssh with encoding on stdin/stdout for file transfer.
ssh1
ssh with forced SSH protocol version 1
ssh2
ssh with forced SSH protocol version 2
pscp
Uses pscp for copying, plink for shell operations.
pscp1
pscp, with forced SSH protocol version 1
pscp2
pscp, with forced SSH protocol version 2
plink
Uses plink with encoding on stdin/stdout for file transfer.
plink1
plink with forced SSH protocol version 1
plink2
plink with forced SSH protocol version 2
To use telnet-mode on Windows, you need a telnet client that uses stdin and stdout for input and output. The default Windows client is a Windows application, and will not work as a subprocess. Several options exist, but information that was formerly in this FAQ is out of date now, so no concrete pointers are available.
You will need an implementation of TeX for Windows. A number of implementations are listed on the TeX Users Group website.
AUCTeX is an Emacs package for writing LaTeX files, which also includes preview-latex, an Emacs mode for previewing the formatted contents of LaTeX documents. Pre-compiled versions for Windows are available from the AUCTeX site.
Emacs has support for spell checking on demand (ispell
) and as
your type (flyspell
). Both packages depend on a copy of
ispell 3.2 or a compatible spell-checking program.
GNU Aspell is a popular choice these days, Windows installers are
available from the official site.
Once installed, you will need to configure ispell-program-name
to tell ispell and flyspell to use aspell as a replacement for
ispell. You can include the full path to the aspell binary, which
means you do not need to add its installation directory to the PATH.
GNU Privacy Guard is a Free replacement for PGP, with Windows binaries available. See http://www.gnupg.org/.
Some wheel mice ship with default settings that do not send the standard wheel events to programs, but instead try to simulate scroll bar events. Usually this is configurable from the hardware specific pages on the mouse control panel. The middle button is often mapped in the same settings to have some functionality other than sending middle mouse button events. In some cases, uninstalling the manufacturer's drivers and telling Windows to use the generic USB or PS/2 drivers is the only way to make the mouse work properly.
The best way to use M-x grep with Emacs is to download a port of GNU grep. See Other useful ports.
If you want a quick solution without installing extra tools, a poor substitute that works for simple text searches is to specify the built in Windows command findstr as the command to run at the M-x grep prompt. Normally you will want to use the /n argument to findstr.
The Emacs commands rgrep
, grep-find
and find-grep-dired
are all different interfaces for
grepping recursively into subdirectories. By default, they use the
command find to determine which files to work on, and either
run grep directly from find, or use xargs to batch
up files and reduce the number of invocations of grep.
Windows also comes with a find command, but it is not in any
way compatible with the POSIX find that Emacs tries to use.
Emacs expects a find compatible with GNU findutils.
See Other useful ports. After you have installed it, you will need
to make sure that Emacs finds this version, not the standard Windows
find command. You can do this by either renaming the
Windows command, changing your PATH to ensure that the directory
containing the findutils bin directory comes before the Windows
system directory, or set the variable find-program
to the full
path to the findutils find command.
An alternative if you have a recent version of grep is to customize
grep-find-command
to use ‘grep -r’ instead of both find
and grep. Another alternative if you don't need the full capabilities
of grep is to use ‘findstr /n /r’.
There are two ways you can use Emacs in conjunction with MSVC. You can use Emacs as the editor, and do everything else in the DevStudio IDE. Or you can use Emacs as an IDE, calling the MSVC command line tools to build your project.
Christopher Payne wrote a Visual Studio add-in that makes Emacs the default text editor, this has now been taken over by Jeff Paquette. See the following two URLS for details:
This is an app note on how to use Microsoft Visual C++ with Emacs. The experiments done below were done with Emacs 19.34.1 on Windows 95, using Visual C++ 4.0 Standard Edition. Your mileage may vary.
This writeup assumes minimal knowledge of Emacs hacking on the part of the reader.
There is a batch file in your VC++ installation's bin directory called vcvars32.bat, which sets up the environment variables needed to run the VC++ command line tools. Arrange for those same environment variables to be set in your Emacs session. You can do this on Windows 9x by calling the vcvars32.bat script from autoexec.bat. On other versions of Windows you can set the environment variables globally using the System control panel.
For all versions of Windows you can alternatively set the variables
just inside Emacs by using setenv
calls in your init file.
See Where do I put my init file?.
You should now be able to compile from Emacs. Load a source file from a VC++ project. Type M-x compile. Replace the proposed command line with:
nmake -f ProjectName.mak
You will find that this defaults to a debug build. You can change it to a release build with:
nmake -f ProjectName.mak CFG="ProjectName - Win32 Release"
Now set the default value for the compile command line. Add the following to your init file:
;; Set up for Visual C++ compiling (setq compile-command "nmake -f ")
If you work on the same project long term, you can add the project makefile to the string.
David Biesack suggests that perhaps it's easy to write a Makefile in the project directory which does
PROJECT=MyProject all: debug debug: FORCE nmake /f $(PROJECT).mak CFG="$(PROJECT) - Win32 Debug" release: FORCE nmake /f $(PROJECT).mak CFG="$(PROJECT) - Win32 Release" FORCE:
and then you can simply change compile-command to nmake.
Caleb T. Deupree reports that on VC++ 5.0 and up, "You can also set an option in Options/Build to export a makefile every time the project is saved, which you can then use to compile with ‘nmake -f project.mak’." VC++ 4.0 builds the make file every time, and there is no option.
It is recommended that you use auto-revert-mode
in buffers
that you have open in both Emacs and MSVC++ at the same time. Then if
you mistakenly edit the file in MSVC++, Emacs will pick up your
changes immediately, rather than after you have written lots more code
and attempt to save.
You can also set up VC++ to import a file into Emacs for you, all
ready for editing. In VC++, go to the Tools
pull-down menu, and
click on Customize...
. In the Tools
tab, click on
Add
. Use Browse
to locate the
emacsclientw.exe file in your Emacs bin directory, and
select it. For arguments, use +$(CurLine)
"$(FilePath)" and for the directory use the $(WkspDir)
(the quotes around FilePath handle paths with spaces in them). Set the
Menu Text to say "Em&acs". The +$(CurLine) will set point in
Emacs to the same line as the cursor position in VC++. The ampersand
in the word Em&acs
allows you to select emacs from the keyboard. (E
is already used for the OLE control test container.)
You should now be able to go to any source file in your project. Then,
use the pull-down menu Tools->Emacs
. The active file in your
VC++ IDE should now be front and center in Emacs, all ready to edit as
you wish. If you use keystrokes to work the menus, try Alt-T A to
move the file into Emacs. Binding this tool to a keystroke will be
left as an exercise for the student.
If you have the option of saving files before running tools, make sure this option is set. (I don't see it on VC++ 4.0.)
Jonathan Arnold has written an EmacsEdit “expert” for interfacing C++ Builder and Emacs.
If you are using a graphical revision control tool already, check if it comes with command-line tools. Many such GUI tools are just wrappers for the same command line tools that Emacs requires for its VC integration. Most of the supported VC systems have well supported Free native Windows binaries. For those that don't Cygwin may be an option. See Other useful ports.
From Jay Rogers
Some versions of the perl debugger itself need to be patched to work with emacs. They are perl versions 5.001 and less, and version 5.004_01. To fix, locate and change the code similar to the following code in lib/perl5db.pl
if (-e "/dev/tty") { $console = "/dev/tty"; $rcfile=".perldb"; } elsif (-e "con") { $console = ""; <---- change "con" to "" $rcfile="perldb.ini"; } else { $console = "sys\$command"; $rcfile="perldb.ini"; }
Doug Campbell also has some suggestions for improving the interaction of perldb and Emacs.
Cygwin is a popular complete POSIX emulation environment for Windows. Most of its tools can be used with Emacs, and it covers a wide range of ported software. The main shell used by Cygwin is GNU bash, but other shells are also available. Some Cygwin tools may not interoperate well with Emacs or other native Windows tools, due to the total immersion aspect of Cygwin, including its non-native filesystem mapping.
If you choose to use Cygwin, then its tools will probably be all that
you need, but you will need to get image libraries from elsewhere, as
the Cygwin ones are not compatible with non-Cygwin software. In fact,
if Cygwin is on your PATH when you run Emacs, and Emacs does not find
other versions of the image libraries first, then the Cygwin ones can
cause problems. Cygwin developers recommend that you do not put
Cygwin on your system PATH for this reason. Instead you can
make the Cygwin tools available within Emacs by setting exec-path
in your init file.
MinGW is a set of development tools that produce native Windows executables, not dependent on Cygwin's POSIX emulation DLLs.
MSYS is a POSIX shell and minimal set of tools that are commonly used in configure scripts. Like Cygwin, this environment uses a non-native filesystem mapping to appear more POSIX like to the scripts that it runs. This is intended to complement the MinGW tools to make it easier to port software to Windows.
http://www.research.att.com/sw/tools/uwin/
UWIN is another POSIX emulation environment, like Cygwin and MSYS, that provides a large number of ported tools. The shell used by UWIN is ksh, the Korn shell.
http://gnuwin32.sourceforge.net/
GnuWin32 provides precompiled native Windows ports of a wide selection of Free software and libraries. Tools available here that are useful for Emacs include:
archive-mode
to edit .arc files.
gnus
to display XFace headers in messages.
ediff
and producing patches
grep-find
and other file searches.
grep
.
archive-mode
to edit .lzh files.
compile
for building projects (also in MinGW)
gnus
to talk to servers over SSL.
ediff-patch-file
and others to apply patches.
tar-mode
to edit tar files.
archive-mode
for extracting zip files.
archive-mode
for editing zip files.
GTK is a potential source for some of the image libraries that Emacs requires. GTK is installed along with other ports of GUI software, such as the GIMP image editor, and Pidgin instant messenger client. If GTK is installed when you run addpm, Emacs will use the image libraries that it provides, even if they are not on the PATH. GTK ships with JPEG, PNG and TIFF support.
Man pages for Emacs and other ported programs that you have can be
read using Emacs' built-in manual reader woman
. This
requires no external programs, but if you do have a port of
man, there is also an Emacs wrapper man
that
which may be slightly faster.
If you have general questions about Emacs, the best places to start looking are the Emacs manual and the standard Emacs FAQ. If you already have Emacs, you can browse the manual using Info by typing C-h i m Emacs <RET>, and you can view the FAQ by typing C-h F. Or you can browse both of them online:
The official mailing list for Windows specific help and discussion is help-emacs-windows@gnu.org. It's a majordomo administered list, so, if you would like to subscribe to the mailing list, send a message to help-emacs-windows-request@gnu.org with the word subscribe in the body of the message.
To unsubscribe from the list, send a message to help-emacs-windows-request@gnu.org with the word unsubscribe in the body of the message. Please do not send the unsubscribe message to the list itself, but to the request alias instead. Sending the message to the list does not unsubscribe you from it, and it tends to be annoying to people on the list.
The mailing list has a web based interface, and an archive of the list..
add-untranslated-filesystem
: Fonts and text translationange-ftp-ftp-program-name
: Network accessauto-revert-mode
: Developing with Emacsbdf-directory-alist
: Fonts and text translationcomint-completion-addsuffix
: Sub-processescomint-eol-on-send
: Sub-processescomint-mode-hook
: Sub-processescomint-process-echoes
: Sub-processescomint-scroll-show-maximum-output
: Sub-processescompile
: Developing with Emacscompile-command
: Developing with Emacscreate-fontset-from-ascii-font
: Fonts and text translationcreate-fontset-from-fontset-spec
: Fonts and text translationcua-mode
: Installing Emacsexec-path
: Other useful portsexplicit-bash-args
: Sub-processesexplicit-bash.exe-args
: Sub-processesexplicit-cmd.exe-args
: Sub-processesexplicit-cmdproxy.exe-args
: Sub-processesexplicit-shell-file-name
: Sub-processesfile-name-buffer-file-type-alist
: Fonts and text translationfind-grep-dired
: Text and Utility modesfind-program
: Text and Utility modesflyspell-mode
: Text and Utility modesfocus-follows-mouse
: Installing Emacsfont-encoding-alist
: Fonts and text translationftp
: Sub-processesglobal-auto-revert-mode
: Developing with Emacsgrep
: Text and Utility modesgrep-find
: Text and Utility modesgrep-find-command
: Text and Utility modesinsert-directory-program
: Sub-processesispell-program-name
: Text and Utility modeslocale-coding-system
: Fonts and text translationls-lisp-use-insert-directory-program
: Sub-processesman
: Other useful portsmessage-send-mail-function
: Network accessprocess-send-eof
: Sub-processesremove-untranslated-filesystem
: Fonts and text translationrgrep
: Text and Utility modesrmail-pop-password-required
: Network accessrmail-primary-inbox-list
: Network accesssend-mail-command
: Network accessserver-start
: Installing Emacsset-face-font
: Fonts and text translationset-frame-font
: Fonts and text translationset-message-beep
: Display Settingsset-selection-coding-system
: Display Settingsshell
: Sub-processesshell-command
: Sub-processesshell-file-name
: Sub-processesshell-mode
: Sub-processesshell-mode-hook
: Sub-processessmtpmail-debug-info
: Network accesssmtpmail-default-smtp-server
: Network accesssmtpmail-send-it
: Network accesssmtpmail-smtp-server
: Network accesssql-mode
: Sub-processestelnet
: Network accesstramp-default-method
: Network accesstramp-default-method-alist
: Network accessuntranslated-filesystem-list
: Fonts and text translationuser-full-name
: Network accessuser-mail-address
: Network accessw32-bdf-filename-alist
: Fonts and text translationw32-enable-synthesized-fonts
: Fonts and text translationw32-enable-unicode-output
: Fonts and text translationw32-find-bdf-fonts
: Fonts and text translationw32-fixed-font-alist
: Fonts and text translationw32-mouse-button-tolerance
: Display Settingsw32-num-mouse-buttons
: Display Settingsw32-quote-process-args
: Sub-processesw32-select-font
: Fonts and text translationw32-swap-mouse-buttons
: Display Settingsw32-use-full-screen-buffer
: Display Settingsw32-use-w32-font-dialog
: Fonts and text translationwoman
: Other useful portsx-list-fonts
: Fonts and text translationaddpm
: Installing EmacsEmacsW32
: IntroductionMeadow
: IntroductionXEmacs
: Introduction