nixos: add emacs-auto wrapper + desktop files
This commit is contained in:
@@ -4,7 +4,7 @@
|
|||||||
./essential.nix
|
./essential.nix
|
||||||
];
|
];
|
||||||
environment.systemPackages = with pkgs; [
|
environment.systemPackages = with pkgs; [
|
||||||
emacs
|
emacs-auto
|
||||||
];
|
];
|
||||||
programs.zsh.enable = true;
|
programs.zsh.enable = true;
|
||||||
networking.firewall.enable = false;
|
networking.firewall.enable = false;
|
||||||
|
|||||||
132
nixos/emacs-overlay.nix
Normal file
132
nixos/emacs-overlay.nix
Normal file
@@ -0,0 +1,132 @@
|
|||||||
|
final: prev:
|
||||||
|
{
|
||||||
|
# Keep pkgs.emacs as a real Emacs package (used by other derivations / emacsPackages),
|
||||||
|
# but provide an "auto" wrapper for interactive use that selects the right GUI backend.
|
||||||
|
emacs = prev."emacs30-pgtk".override {
|
||||||
|
withNativeCompilation = true;
|
||||||
|
withTreeSitter = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
emacs-wayland = final.emacs;
|
||||||
|
|
||||||
|
emacs-x11 = prev.emacs30.override {
|
||||||
|
withNativeCompilation = true;
|
||||||
|
withTreeSitter = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Runtime launcher that chooses:
|
||||||
|
# - Wayland session: pgtk build with GDK_BACKEND=wayland (avoids XWayland)
|
||||||
|
# - X11 session: X11 build with GDK_BACKEND=x11
|
||||||
|
# - No display: falls back to -nw
|
||||||
|
#
|
||||||
|
# Override with EMACS_AUTO_BACKEND=wayland|x11|tty.
|
||||||
|
emacs-auto = final.stdenvNoCC.mkDerivation {
|
||||||
|
pname = "emacs-auto";
|
||||||
|
version = final.emacs.version or "unknown";
|
||||||
|
dontUnpack = true;
|
||||||
|
nativeBuildInputs = [ final.makeWrapper ];
|
||||||
|
|
||||||
|
installPhase =
|
||||||
|
let
|
||||||
|
emacsWayland = final.emacs-wayland;
|
||||||
|
emacsX11 = final.emacs-x11;
|
||||||
|
in
|
||||||
|
''
|
||||||
|
mkdir -p "$out/bin" "$out/share/applications" "$out/share/icons" "$out/share/pixmaps"
|
||||||
|
|
||||||
|
# Ensure desktop integrations (icons) exist even though we don't install the raw emacs packages.
|
||||||
|
if [ -d "${emacsWayland}/share/icons" ]; then
|
||||||
|
ln -s "${emacsWayland}/share/icons/hicolor" "$out/share/icons/hicolor"
|
||||||
|
fi
|
||||||
|
if [ -d "${emacsWayland}/share/pixmaps" ]; then
|
||||||
|
ln -s "${emacsWayland}/share/pixmaps/"* "$out/share/pixmaps/" || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Convenience explicit launchers.
|
||||||
|
makeWrapper ${emacsWayland}/bin/emacs "$out/bin/emacs-wayland" \
|
||||||
|
--set GDK_BACKEND wayland
|
||||||
|
makeWrapper ${emacsX11}/bin/emacs "$out/bin/emacs-x11" \
|
||||||
|
--set GDK_BACKEND x11
|
||||||
|
|
||||||
|
# Main launcher.
|
||||||
|
cat > "$out/bin/emacs" <<'EOF_EMACS_WRAPPER'
|
||||||
|
#!${final.runtimeShell}
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
backend="''${EMACS_AUTO_BACKEND:-}"
|
||||||
|
tty=0
|
||||||
|
for a in "$@"; do
|
||||||
|
case "$a" in
|
||||||
|
-nw|--nw|--tty|--terminal|--no-window-system) tty=1 ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "$backend" = "wayland" ] || [ "$backend" = "pgtk" ]; then
|
||||||
|
exec "@out@/bin/emacs-wayland" "$@"
|
||||||
|
fi
|
||||||
|
if [ "$backend" = "x11" ]; then
|
||||||
|
exec "@out@/bin/emacs-x11" "$@"
|
||||||
|
fi
|
||||||
|
if [ "$backend" = "tty" ]; then
|
||||||
|
exec "@emacsX11@/bin/emacs" -nw "$@"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$tty" -eq 1 ]; then
|
||||||
|
# Respect the user's explicit -nw, but still run a consistent binary.
|
||||||
|
exec "@emacsX11@/bin/emacs" "$@"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Prefer Wayland if it looks like a Wayland session.
|
||||||
|
if [ -n "''${WAYLAND_DISPLAY:-}" ] || [ "''${XDG_SESSION_TYPE:-}" = "wayland" ] || [ -n "''${HYPRLAND_INSTANCE_SIGNATURE:-}" ]; then
|
||||||
|
exec "@out@/bin/emacs-wayland" "$@"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Otherwise, if X is available, use the X11 build.
|
||||||
|
if [ -n "''${DISPLAY:-}" ] || [ "''${XDG_SESSION_TYPE:-}" = "x11" ]; then
|
||||||
|
exec "@out@/bin/emacs-x11" "$@"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Headless fallback.
|
||||||
|
exec "@emacsX11@/bin/emacs" -nw "$@"
|
||||||
|
EOF_EMACS_WRAPPER
|
||||||
|
|
||||||
|
substituteInPlace "$out/bin/emacs" \
|
||||||
|
--subst-var out \
|
||||||
|
--replace-fail "@emacsX11@" "${emacsX11}"
|
||||||
|
chmod +x "$out/bin/emacs"
|
||||||
|
|
||||||
|
# emacsclient is compatible across builds as long as versions match; use one.
|
||||||
|
ln -s ${emacsX11}/bin/emacsclient "$out/bin/emacsclient"
|
||||||
|
|
||||||
|
cat > "$out/share/applications/emacs.desktop" <<'EOF'
|
||||||
|
[Desktop Entry]
|
||||||
|
Name=Emacs
|
||||||
|
GenericName=Text Editor
|
||||||
|
Comment=Edit text
|
||||||
|
Exec=emacs %F
|
||||||
|
TryExec=emacs
|
||||||
|
Icon=emacs
|
||||||
|
Type=Application
|
||||||
|
Terminal=false
|
||||||
|
Categories=Development;TextEditor;
|
||||||
|
MimeType=text/plain;
|
||||||
|
StartupWMClass=Emacs
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat > "$out/share/applications/emacsclient.desktop" <<'EOF'
|
||||||
|
[Desktop Entry]
|
||||||
|
Name=Emacs (Client)
|
||||||
|
GenericName=Text Editor
|
||||||
|
Comment=Edit text using a running Emacs server
|
||||||
|
Exec=emacsclient -c -a emacs %F
|
||||||
|
TryExec=emacsclient
|
||||||
|
Icon=emacs
|
||||||
|
Type=Application
|
||||||
|
Terminal=false
|
||||||
|
Categories=Development;TextEditor;
|
||||||
|
MimeType=text/plain;
|
||||||
|
StartupWMClass=Emacs
|
||||||
|
EOF
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
direnv
|
direnv
|
||||||
dpkg
|
dpkg
|
||||||
efibootmgr
|
efibootmgr
|
||||||
emacs
|
emacs-auto
|
||||||
fd
|
fd
|
||||||
ffmpeg
|
ffmpeg
|
||||||
file
|
file
|
||||||
|
|||||||
@@ -55,6 +55,7 @@
|
|||||||
nixpkgs.overlays = [
|
nixpkgs.overlays = [
|
||||||
# (import ./nvidia-container-toolkit-overlay.nix)
|
# (import ./nvidia-container-toolkit-overlay.nix)
|
||||||
(import ./runc-overlay.nix)
|
(import ./runc-overlay.nix)
|
||||||
|
(import ./emacs-overlay.nix)
|
||||||
(import ./overlay.nix)
|
(import ./overlay.nix)
|
||||||
# Use codex and claude-code from dedicated flakes with cachix
|
# Use codex and claude-code from dedicated flakes with cachix
|
||||||
(final: prev: {
|
(final: prev: {
|
||||||
|
|||||||
@@ -248,11 +248,6 @@ in
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
emacs = prev."emacs30-pgtk".override {
|
|
||||||
withNativeCompilation = true;
|
|
||||||
withTreeSitter = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
python-with-my-packages = let
|
python-with-my-packages = let
|
||||||
my-python-packages = python-packages:
|
my-python-packages = python-packages:
|
||||||
with python-packages; [
|
with python-packages; [
|
||||||
|
|||||||
Reference in New Issue
Block a user