Skip to content

peccu/emacs-wslg

Repository files navigation

emacs-wslg

xwidget enabled Emacs for WSLg.

This docker image can launch emacs with GUI and xwidget.

Requirements

  • WSL2
  • Ubuntu 22.04

Usage

launch emacs container with mounts and environments for WSLg.

This sample additionally mounts home directory into /root.

  • reuse container

run with sleep infinity

docker run \ --rm \ --name emacs-wslg \ -d \ -v ~:/root \ -v /tmp/.X11-unix:/tmp/.X11-unix \ -v /mnt/wslg:/mnt/wslg \ -e DISPLAY \ -e WAYLAND_DISPLAY \ -e XDG_RUNTIME_DIR \ -e PULSE_SERVER \ peccu/emacs-wslg:latest

and exec emacs in it.

docker exec -it emacs emacs &
  • launch container each time
docker run \ --rm \ --name emacs-wslg \ -it \ --entrypoint emacs \ -v ~:/root \ -v /tmp/.X11-unix:/tmp/.X11-unix \ -v /mnt/wslg:/mnt/wslg \ -e DISPLAY \ -e WAYLAND_DISPLAY \ -e XDG_RUNTIME_DIR \ -e PULSE_SERVER \ peccu/emacs-wslg:latest
  • bash scripts
    • use exists container or reuse already running container (copy emacs-wslg.sh into /usr/local/bin/emacs-wslg and add execute permission)
      • this automatically mounts current working directory (pwd) into /app
#!/bin/bash # -*- shell-script -*- function inShortTime(){ local launch=$1 local restarttime=$2 [ $(($(date +%s) - launch)) -lt $restarttime ] } # try exec or up and exec if failed in 10 seconds # ignore when execed after 10 seconds restarttime=10 launch=$(date "+%s") # automatically mounts / into /mnt/host # workdir is corresponds directory in /mnt/host function docker_run_d(){ docker run \ --rm \ --name emacs-wslg \ -d \ --entrypoint /usr/bin/sleep \ -v /:/mnt/host \ -w "$(pwd | sed 's:^/:/mnt/host/:')" \ -v ~:/root \ -v /tmp/.X11-unix:/tmp/.X11-unix \ -v /mnt/wslg:/mnt/wslg \ -e DISPLAY \ -e WAYLAND_DISPLAY \ -e XDG_RUNTIME_DIR \ -e PULSE_SERVER \ peccu/emacs-wslg:latest \ infinity } docker exec emacs-wslg emacs "$@" \ || (\ inShortTime $launch $restarttime \ && docker_run_d \ && docker exec emacs-wslg emacs "$@" \ )
  • reuse the container with docker-compose version
    • copy emacs-wslg_docker-compose.sh into /usr/local/bin/emacs-wslg
    • add execute permission sudo chmod +x /usr/local/bin/emacs-wslg
    • change docker-compose.yml path in the file
    • host's root dir (/) is mounted in /mnt/host
#!/bin/bash # -*- shell-script -*- # automatically mounts / into /mnt/host # workdir is corresponds directory in /mnt/host # docker-compose.yml's path COMPOSE_FILE_PATH=~/Codes/emacs-wslg/docker-compose.yml function docker_compose_up-d(){ docker compose \ -f ${COMPOSE_FILE_PATH} \ up -d } function docker_exec(){ docker exec \ -it \ -w "$(pwd | sed 's:^/:/mnt/host/:')" \ emacs-wslg \ /usr/local/bin/emacs "$@" } # try exec or up and exec if failed docker_exec "$@" && : || (docker_compose_up-d && docker_exec "$@")

Some info

Based version is Emacs 29 (emacs-29 branch from emacs mirror git repo).

WSLg related document is here

TODO

  • emacs server and emacsclient
    • change CMD or ENTRYPOINT into emacs server
  • more emacs versions
  • script sample
  • test host dependencies
    • emacs can run without runtime libs like libgtk
  • change user in container from root to user

About

xwidget enabled emacs for WSLg

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages