{ config, zsh, pkgs ? (import ../pkgs.nix).edge {}, }: rec { defaultXDGOpenRules = [ { name = "open-url"; pattern = "(ipfs:|ipns:|magnet:|mailto:|gemini:|gopher:|https:|http:|news:|file:|git:|ssh:|ftp:)[^<>\"\\s{-}\\^⟨⟩`]+"; xdgOpen = "$1"; } ]; xdgOpenRules = defaultXDGOpenRules ++ config.alacritty.xdgOpenRules; alacrittyUnwrap = pkgs.writeShellScript "alacritty-unwrap" '' unset LD_LIBRARY_PATH unset LIBGL_DRIVERS_PATH unset LIBVA_DRIVERS_PATH unset __EGL_VENDOR_LIBRARY_DIRS exec "$@" ''; hints = { enabled = (builtins.map (r: { regex = r.pattern; hyperlinks = true; command = (pkgs.writeShellScript "alacritty-hints-${r.name}" '' ${alacrittyUnwrap} xdg-open "${r.xdgOpen}" ''); post_processing = true; mouse.enabled = true; } ) xdgOpenRules); }; configFile = pkgs.writeText "alacritty-config" ( builtins.replaceStrings ["$HINTS"] [(builtins.toJSON hints)] (builtins.readFile ./alacritty.yml) ); shellEntrypoint = pkgs.writeShellScript "alacritty-shell-entrypoint" '' exec ${alacrittyUnwrap} "${zsh}/bin/zsh" "$@" ''; alacritty = pkgs.writeShellScriptBin "alacritty" '' set -e -x host_ld_lib_path="$( ldconfig -v 2>/dev/null \ | grep -v ^$'\t' \ | tr -s ':\n' ':' \ | head -c-1 \ )" bin_ld_lib_path="$( objdump -x ${pkgs.alacritty}/bin/alacritty \ | grep "RUNPATH" \ | awk '{print $2}' \ )" host_dri_path="$( echo "$host_ld_lib_path" \ | tr -s ':' '\n' \ | while read d; do if [ -d "$d/dri" ]; then echo "$d"/dri; fi; done \ | tr '\n' ':' \ | head -c-1 )" # overwrite LD_LIBRARY_PATH such that the binary's ld search path is still # searched first, but afterwards the host's ld search path is looked # through. Similarly, the dri paths are set to be the hosts. This allows us # to use the host's graphics drivers for alacritty. export LD_LIBRARY_PATH="$bin_ld_lib_path":"$host_ld_lib_path" export LIBGL_DRIVERS_PATH="$host_dri_path" export LIBVA_DRIVERS_PATH="$host_dri_path" export __EGL_VENDOR_LIBRARY_DIRS=/usr/share/glvnd/egl_vendor.d exec ${pkgs.alacritty}/bin/alacritty \ -o font.size=${builtins.toString config.alacritty.fontSize} \ --config-file ${configFile} \ -e "${shellEntrypoint}" ''; }