all repos — nixfiles @ 4a59720d40524d89311467fa6e2d4df8741fa63a

System and user configuration, managed by nix and home-manager

user/settings/emacs.nix (view raw)

{
  config,
  pkgs,
  lib,
  ...
}:
let
  inherit (pkgs) stdenv;
  inherit (lib) removePrefix;

  nixfiles = config.home.homeDirectory + "/projects/alin.ovh/nixfiles";
  direct_symlink = path: config.lib.file.mkOutOfStoreSymlink "${nixfiles}/${removePrefix "/" path}";

  editorScript = pkgs.writeScriptBin "edit" ''
    #!${pkgs.runtimeShell}
    if [ -z "$1" ]; then
      exec ${config.programs.emacs.finalPackage}/bin/emacsclient --create-frame --alternate-editor ${config.programs.emacs.finalPackage}/bin/emacs
    else
      exec ${config.programs.emacs.finalPackage}/bin/emacsclient --alternate-editor ${config.programs.emacs.finalPackage}/bin/emacs --create-frame "$@"
    fi
  '';
in
{
  imports = [
    ../modules/eshell.nix
  ];

  programs.git.attributes = [
    "*.el diff=elisp"
  ];
  programs.git.extraConfig."diff.elisp" = {
    xfuncname = "^\\([^[:space:]]+[[:space:]]+([^()[:space:]]+)";
  };

  services.emacs = lib.mkIf stdenv.isLinux {
    enable = true;
    package = config.programs.emacs.finalPackage;
    client.enable = true;
  };
  programs.emacs = {
    enable = true;
    package = lib.mkDefault pkgs.emacs-gtk;

    eshell = {
      aliases = {
        pk = "eshell-up-pk $1";
        up = "eshell-up $1";

        ec = "find-file $1";

        l = "ls $*";
        la = "ls -A $*";
        ll = "ls -lh $*";
        lla = "ls -lhA $*";

        http = "xh";
        https = "xh --default-scheme https $*";
        xhs = "xh --default-scheme https $*";

        cdg = "cd (project-root)";
      };
    };

    extraPackages =
      epkgs:
      (with epkgs; [
        apheleia
        avy
        buffer-terminator
        cape
        cask-mode
        corfu
        consult
        consult-ghq
        consult-eglot
        consult-lsp
        crux
        difftastic
        docker-compose-mode
        doom-themes
        dtrt-indent
        envrc
        editorconfig
        eldoc-box
        eglot-booster
        embark
        embark-consult
        esh-buf-stack
        esh-help
        eshell-fringe-status
        eshell-toggle
        eshell-up
        evil
        evil-anzu
        evil-collection
        evil-commentary
        evil-embrace
        evil-exchange
        evil-lion
        evil-matchit
        evil-mu4e
        evil-numbers
        evil-org
        evil-quickscope
        evil-space
        evil-surround
        evil-textobj-tree-sitter
        exec-path-from-shell
        expand-region
        fish-mode
        feature-mode
        flycheck
        flymake-popon
        general
        git-gutter-fringe
        git-modes
        git-timemachine
        gl-conf-mode # gitolite
        goto-chg
        helpful
        jinx
        just-ts-mode
        kind-icon
        lua-mode
        lsp-mode
        link-hint
        lispyville
        magit
        magit-todos
        markdown-mode
        marginalia
        nerd-icons
        nix-ts-mode
        doom-modeline
        persist-state
        posframe
        quickrun
        rainbow-mode
        rainbow-delimiters
        ssh-deploy
        systemd
        tempel
        tempel-collection
        eglot-tempel
        treesit-auto
        (treesit-grammars.with-grammars (
          grammars: with grammars; [
            tree-sitter-nix
            tree-sitter-markdown
            tree-sitter-json
            tree-sitter-json5
            tree-sitter-toml
            tree-sitter-yaml
          ]
        ))
        try
        ultra-scroll
        vc-msg
        vertico
        vertico-prescient
        wgrep-ag
        ws-butler
        which-key
        yasnippet
        yasnippet-capf
      ]);
    overrides = self: super: {
      lsp-mode = self.melpaPackages.lsp-mode.overrideAttrs {
        env.LSP_USE_PLISTS = true; # must be set in early-init
      };
    };
    extraConfig = ''
      (with-eval-after-load 'editorconfig
        (setq editorconfig-exec-path "${pkgs.editorconfig-core-c}/bin/editorconfig"))
    ''
    + lib.optionalString stdenv.isDarwin ''
      (with-eval-after-load 'dired
        (setq insert-directory-program "${pkgs.coreutils-prefixed}/bin/gls"
              dired-use-ls-dired t))
    '';
  };
  home.packages = with pkgs; [
    editorScript
    enchant
    emacs-lsp-booster
  ];
  xdg.configFile."emacs/early-init.el" = {
    source = direct_symlink "user/settings/emacs/early-init.el";
  };
  xdg.configFile."emacs/init.el" = {
    source = direct_symlink "user/settings/emacs/init.el";
  };
}