arroyo/arroyo-emacs.org

7.5 KiB
Raw Permalink Blame History

Arroyo Emacs Generator

Arroyo developed out of a system originally designed to assemble an Emacs init.el, and now it has some super-powers. The Arroyo Emacs configuration is pretty opinionated as it's a system designed to work around Evil Mode and EXWM.

Arroyo Emacs configuration is designed to work closely with the Arroyo Home Manager generator, nearly all system dependencies are installed through Home Manager, and certain submodules may require the use of Home Manager. No Arroyo Emacs features should require running NixOS though, and I'd like to maintain that as much as possible since getting Nix running everywhere is much more feasible than running NixOS everywhere.

Users of the Arroyo Home Manager generator will have access to features available in nix-community/emacs-overlay like:

  • the native-compile feature
  • Native GTK with Wayland support (though Wayland is not supported by impotant parts of Arroyo like the EXWM system)
  • When using use-package, packages will be downloaded and (natively!) compiled in the deploy phase rather than on Emacs startup

Arroyo Emacs init.el generator

arroyo-emacs-generate-init can be called interactively1[Modern Interface Terms]]] to assemble an init.el file which will have the dependencies ordered in such a way as to allow the user to user Emacs.

(defcustom arroyo-emacs-init-location (expand-file-name "~/arroyo-nix/files/init.el")
  "Where `arroyo-emacs-generate-init' writes the amalgamated init file."
  :group 'arroyo
  :type 'string)

(defun arroyo-emacs-generate-init ()
  (interactive)
  (arroyo-generate-imports "emacs" nil arroyo-emacs-init-location nil)
  (find-file arroyo-emacs-init-location))

The interactive function is more or less as it says on the tin it uses the Arcology stuff to write the init.el to a local directory for the arroyo-flood.

Arroyo Home Manager support for customized Emacs package

This Nix home-manager import installs Emacs with my generated init.el file included, packages installed, and custom overrides included. The versions come out of my Nix Version Pins.

The Emacs package uses, currently 28.0.90 which supports native compilation the so-called GccEmacs and the packages from the init.el, natively compiled and ready to go. This is overlayed in to nixpkgs using Arroyo Nix Support

{ pkgs, lib ? pkgs.lib, ... }:

let
  versions = import ../versions.nix {};
in pkgs.emacsWithPackagesFromUsePackage {
  package = pkgs.emacs-unstable;
  # package = pkgs.emacsGit.override {# 
  #   treeSitterPlugins = with pkgs.tree-sitter-grammars; [
  #     tree-sitter-eex
  #     tree-sitter-elisp
  #     tree-sitter-elixir
  #     tree-sitter-fennel
  #     tree-sitter-haskell
  #     tree-sitter-html
  #     tree-sitter-lua
  #     tree-sitter-markdown
  #     tree-sitter-nix
  #     tree-sitter-scheme
  #     tree-sitter-sql

  #     # builtins, mostly
  #     tree-sitter-bash
  #     tree-sitter-c
  #     tree-sitter-cmake
  #     tree-sitter-cpp
  #     tree-sitter-css
  #     tree-sitter-dockerfile
  #     tree-sitter-go
  #     tree-sitter-gomod
  #     tree-sitter-java
  #     tree-sitter-javascript
  #     tree-sitter-json
  #     tree-sitter-python
  #     tree-sitter-ruby
  #     tree-sitter-rust
  #     tree-sitter-toml
  #     tree-sitter-yaml
  #   ];
  # };
  config = <<arroyo-emacs-init-location()>>;
  alwaysEnsure = true;

  override = epkgs: epkgs // rec {
    <<generate_epkg_overrides()>>
  };

  extraEmacsPackages = epkgs: [
    epkgs.consult-org-roam
  ];
}
let emacsOverlay = (import ../versions.nix {}).emacsOverlay null;
in {
  nixpkgs.overlays = [
    (import emacsOverlay)
  ];
}
{ config, pkgs, lib, ...}:

let
  myEmacs = pkgs.myEmacs; # loads via overlay
in
{
  home.file.".emacs.d/init.el".source = <<arroyo-emacs-init-location()>>;

  programs.info.enable = true;

  services.emacs = {
    enable = false;
    package = myEmacs;
  };

  programs.emacs = {
    enable = true;
    package = myEmacs;
  };
}

Enable roam:ccache for emacsGcc builds in My NixOS configuration

,#+ARROYO_NIXOS_MODULE: nixos/ccache.nix

{ ... }:
{
  programs.ccache = {
    packageNames = ["emacs-unstable"];
  };
  nix.extraOptions = ''
    extra-sandbox-paths = /nix/var/cache/ccache
  '';
}

Literate Programming helpers

I want to be able to construct a home-manager import dynamically which can be used to install with emacs-overlay functionality. I also want it to be able to inject arbitrary packageOverrides in to it via references in stored in documents' ARROYO_HOME_EPKGS property keyword.

(defun arroyo-epkg-overrides (&optional role)
  (arroyo-generate-imports "epkgs" role nil nil))

arroyo-epkg-overrides can be used to insert any overridden elisp package in to the registry for use-package to install, including things with patches or personal forks. yummy. apply a ARROYO_HOME_EPKGS keyword to the page to include it here.

(arroyo-epkg-overrides)

arroyo-emacs-init-location above is simply the Arroyo Emacs-managed init.el:

; arroyo-emacs-init-location
"<arroyo/files/init.el>"

NEXT fix ccache support

DONE reenable ccache

SCHEDULED: <2021-09-22 Wed>

  • State "DONE" from "NEXT" [2021-10-05 Tue 19:34]
  • Note taken on [2021-10-05 Tue 19:33]
    This doesn't even work lul.

https://github.com/NixOS/nixpkgs/pull/137936

NEXT how to automate epkg tangling, etc.

can use org-roam's Arcology.Roam.File to know whether a file has been updated and tangle it as part of the dynamic-home-manager dynamic-nixops etc… those things will check a cache to see if the files have changed, and tangle them and then this file if so?

DONE need a reverse of ARROYO_MODULE_WANTS for specifying "wanted-by"s

  • State "DONE" from "NEXT" [2021-08-24 Tue 19:12]
(provide 'arroyo-emacs)

1

that is, by pressing Alt-x / M-x and then typing the name of the command; [[id:modern_interface_terms