EmacsMsWindowsIntegration

This page is about different ways to integrate Emacs into MS Windows:

Run Emacs from a `cmd' Window

Put the Emacs ‘bin’ folder in the Windows PATH environment variable (right-click Computer, Properties, Advanced, Environment Variables). This also simplifies other methods mentioned on this page (no explicit paths needed then).

Use a Shortcut

Use this code for a desktop/task-bar shortcut:

emacsclientw.exe -na runemacs.exe -c ""

This shortcut starts Emacs from scratch if it’s not running, and opens a new frame if it is.

The -c is key: without it, you have to pass a file to open (even if it’s "", which does work but is uglier) or else emacsclient will exit with an error. (Right-click on desktop, New Shortcut, etc., then drag the shortcut into the Quick-Launch bar if you want.)

  -n means no wait - don't wait for the server to return
  -a EDITOR specifies to the emacsclientw.exe which editor to run if emacs.exe is not already running
  -c tells emacs to create a new frame instead of trying to use the existing frame

Milouse, 2013/03/08: on Windows XP and Gnu/Emacs 24.2, I have to use the following shortcut to have things working as expected with a non integrated Emacs (just unziped version somewhere in my computer) [If you don’t want to or can’t add the emacs path to %PATH% as described above – garyo] :

C:\Path\To\emacsclientw.exe --alternate-editor="C:\Path\To\runemacs.exe" -c

And, more important thing: you have to put the (server-start) declaration in your init.el file, otherwise the shortcut will keep creating new and disconnected instance of emacs.

Create File Associations

Use Windows command-line commands ‘ftype’ and ‘assoc’:

    ftype txtfile=emacsclientw -na runemacs "%1"
    ftype EmacsLisp=emacsclientw -na runemacs "%1"
    ftype CodeFile=emacsclientw -na runemacs "%1"
    assoc .txt=txtfile
    assoc .text=txtfile
    assoc .log=txtfile
    assoc .el=EmacsLisp
    assoc .c=CodeFile
    assoc .h=CodeFile

Set `emacsclient' as Your Editor

This almost works:

  git config --global core.editor "emacsclient -a runemacs '%*'"

If Emacs is not already running then it starts Emacs OK, but it returns right away – doesn’t wait. So the git commit fails (because the default message is unchanged).

Anyone know how to make emacsclient wait in the case where it has to start the alternate editor? (Do not use emacsclientw here; it doesn’t wait.)

Replace `notepad.exe` calls

A quick and dirty way to replace all notepad.exe calls from any application (and your file manager) would be to use the Registry:

1. Start regedit.exe

2. Go to HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion?\Image File Execution Options

3. Add a new key named notepad.exe

4. Add (in there) a new string named Debugger and use this value: emacsclientw.exe -na runemacs.exe -F (requires emacsclientw to be in your PATH)

Note that this will pretty much break the usual -F behavior but it is needed as emacsclientw has no -z parameter (yet).


CategoryWThirtyTwo