Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

peccu/emacs-wslg

Open more actions menu

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

 
 
 
Morty Proxy This is a proxified and sanitized view of the page, visit original site.