Emacs For The Win
WSL2 woes
My IDE of choice for the past year has been Emacs, more specfically Doom Emacs. However in changing jobs I’ve found myself cornered on a Windows desktop. This has posed some challenges, specifically around having a fast and smooth development experience using Emacs. My get up and running approach was to install Emacs vanilla with a pre-built binary.
But alas, this resulted in a 20+ second load time. So I chose the next best thing, WSL2. WSL2 on Windows 11 is an amazing option given that you can now leverage GTK. For instructions on doing this look no further then Bozhidar Batsov.
I followed this process, compiled Emacs 29 with PGTK and even added the hack for copying from Windows to Emacs. But I was disappointed with an experience of instability, where Emacs would occassionally crash (without warning) and at times copying being sporadic or not working in certain screens. But the real killer was the networking from WSL2 to my Windows Host.
While everything worked largely, I run a VPN for work purposes. I solved that largely using WSL VpnKit. This however broke at times. Thereafter further complications resulted from requiring OpenSSL certificates found in Windows that were not in WSL2. So between random crashes, sporadic network failures and configuration pains was a huge loss of time. And for that I ditched Emacs, and moved to VSCode.
Emacs joy
But despite the smooth experience and easy configuration of VsCode, I just couldn’t push past the missing workflow, the keyboard shortcuts and the design. I will take my hat of to the amazing VsCode community, they have even taken some of the best things about Emacs and incorporated it, like Magit and an almost Org Roam or Custom second brain.
So I scratched the itch and found that I could significantly improve performance using MSYS2. While this is based of Cygwin, it first natively compiles and leverages off Cygwin secondarily.
Steps
- Install MSYS2
- Run “MSYS2 Msys”, and install some key compilation requirements:
pacman -Sy --needed filesystem msys2-runtime bash libreadline libiconv libarchive libgpgme libcurl pacman ncurses libintl
- Run the following, and then close and re-open.
pacman -Su
- Install the Emacs dependencies
pacman -Su autoconf autogen automake automake-wrapper diffutils git guile libgc libguile libltdl libunistring make mingw-w64-x86_64-binutils mingw-w64-x86_64-bzip2 mingw-w64-x86_64-cairo mingw-w64-x86_64-cloog mingw-w64-x86_64-crt-git mingw-w64-x86_64-dbus mingw-w64-x86_64-expat mingw-w64-x86_64-fontconfig mingw-w64-x86_64-freetype mingw-w64-x86_64-gcc mingw-w64-x86_64-gcc-libs mingw-w64-x86_64-gdk-pixbuf2 mingw-w64-x86_64-gettext mingw-w64-x86_64-giflib mingw-w64-x86_64-glib2 mingw-w64-x86_64-gmp mingw-w64-x86_64-gnutls mingw-w64-x86_64-harfbuzz mingw-w64-x86_64-headers-git mingw-w64-x86_64-imagemagick mingw-w64-x86_64-isl mingw-w64-x86_64-libcroco mingw-w64-x86_64-libffi mingw-w64-x86_64-libgccjit mingw-w64-x86_64-libiconv mingw-w64-x86_64-libjpeg-turbo mingw-w64-x86_64-libpng mingw-w64-x86_64-librsvg mingw-w64-x86_64-libtiff mingw-w64-x86_64-libwinpthread-git mingw-w64-x86_64-libxml2 mingw-w64-x86_64-mpc mingw-w64-x86_64-mpfr mingw-w64-x86_64-pango mingw-w64-x86_64-pixman mingw-w64-x86_64-winpthreads mingw-w64-x86_64-xpm-nox mingw-w64-x86_64-lcms2 mingw-w64-x86_64-xz mingw-w64-x86_64-zlib tar wget
- Clone Emacs
git clone http://git.savannah.gnu.org/r/emacs.git emacs-29
- Git Config requirement
git config core.autocrlf false
- Setup
cd emacs-29 ./autogen.sh
- Configure
Configure the features and functionality you may require. With the last argument ‘prefix’, you can define the location for your installation.
./configure --host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --build=x86_64-w64-mingw32 --with-native-compilation --with-gnutls --with-imagemagick --with-jpeg --with-json --with-png --with-rsvg --with-tiff --with-wide-int --with-xft --with-xml2 --with-xpm 'CFLAGS=-I/mingw64/include/noX' prefix=/c/emacs/
- Build and Install
make make install prefix=/c/emacs/
Success
Here on out you should have a successful build. It is from here I then install Doom Emacs. A key step I initially missed was setting an environment variable for the mingw64 libraries and binaries as a Windows environment variable.
C:\msys64\mingw64\bin
After Doom install, I use command prompt or Powershell to start Emacs
doom run
Installation Options Pros and Cons
Type of Install | Peformant | Native | Image paste | Broken dependencies | Complex setup | Networking issues | Terminal | Stability | Host OS | Version |
Windows Binary | Slow | Y | Y | N | N | N | Eshell | Very good | Windows | 28 |
Msys2 Binary | Very fast | Y | Y | Y (no java, dotnet) | Y | N | Eshell | Very good | Msys2 | 28 |
Msys2 Source | Very fast | Y | Y | Y (no java, dotnet) | Y | N | Eshell | Good | Msys2 | 29 |
WSL2 | Fast | N | N | N | Y | Y | VTerm | Good | Linux | 29 |