summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--emacs.org328
-rw-r--r--nixos.org248
-rw-r--r--readme.org2
3 files changed, 578 insertions, 0 deletions
diff --git a/emacs.org b/emacs.org
index e69de29..ac4d0c4 100644
--- a/emacs.org
+++ b/emacs.org
@@ -0,0 +1,328 @@
+#+TITLE:Emacs config
+#+AUTHOR: Crazazy
+#+PROPERTY: header-args :tangle yes :noweb yes :results silent
+
+Welp, here it goes. This is a literal config for my emacs setup
+I will prbably copy-paste what I have in my literal config, and provide small, fun explanations along the way
+For now, prepare this to be not the best documented literal config you've seen.
+Also, if you just stumbled accross this at random, there is an easy tangle button at [[file:readme.org][readme.org]]
+* Before we start lisping
+  This emacs config's dependencies are mostly managed by [[https://nixos.org][nix]], therefore we have to make a nix file before we
+  do any emacs configuring by ourselves
+  #+name: emacs.nix
+  #+begin_src nix
+    let
+      sources = import ./nix/sources.nix
+    in
+    sources.emacs { configDir = ./emacsconfig; }
+  #+end_src
+
+  This file will load in a emacs configuration framework that will take care of all our dependencies.
+  Kind of like an automatic =(setq use-package-ensure t)= without use having to set that ourselves
+* Emacs configuring
+  Now the real configuring begins!
+  for some backwards compat purposes I have decided to but different config subjects into different files
+  This won't matter too much as the nix framework is expecting multiple files anyway!
+** The bases
+   This is only better-defaults. It comes with ido-mode and some other defaults that I forgot to set in my
+   init file that I stole from [[https://github.com/editor-bootstrap/emacs-bootstrap][emacs-bootstrap]] months ago
+   #+name: emacsconfig/base.el
+   #+begin_src elisp :mkdirp yes
+     (use-package better-defaults)
+   #+end_src
+** Generally nice emacs tools
+*** Magit
+    Simple. Nice. default config. (almost)
+    #+name emacsconfig/extras.el
+    #+begin_src elisp
+      (use-package magit
+        :defer t
+        :config
+        (magit-add-section-hook 'magit-status-sections-hook
+                                'magit-insert-modules
+                                'magit-insert-stashes
+                                'append)
+        :bind
+        ("C-x g" . magit-status))
+      (use-package forge
+        :after magit)
+    #+end_src
+*** IRC
+    I use IRC in emacs, with ERC. There is even a small macro so that I can easily join new servers
+    with my preferred nickname
+    #+name: emacsconfig/extras.el
+    #+begin_src elisp
+      (use-package erc
+        :custom
+        (erc-server-reconnect-attempts 10)
+        (erc-nick "crazazy")
+        :config
+        (defmacro irc-quickjoin (servername url &optional nick)
+          "create a function to quickly join a server. Servers can be joined with M-x SERVERNAME-irc"
+          `(defun ,(intern (concat (symbol-name servername) "-irc")) (password)
+             (interactive (list (password-read "Password: ")))
+             (erc-tls :server ,url
+                      :nick ,(if nick
+                                 nick
+                               "crazazy")
+                      :port 6697
+                      :password password)))
+
+        (irc-quickjoin tilde "eu.tilde.chat")
+        (irc-quickjoin libera "irc.libera.chat"))
+    #+end_src
+*** Dashboard
+    Gives me access to the most recent files I edited, and some other stuff that I don't really care about
+    #+name: emacsconfig/extras.el
+    #+begin_src elisp
+      (use-package dashboard
+        :config (dashboard-setup-startup-hook))
+    #+end_src
+*** Elfeed
+    I don't use elfeed in emacs that much anymore, as I have switched to [[https://www.seamonkey-project.org/][seamonkey]] for my RSS needs.
+    Here is my old config anyways. If you want to browse through some default news feel free to remove the last
+    =:custom= option
+    #+name: emacsconfig/extras.el
+    #+begin_src elisp
+      (use-package elfeed
+        :bind
+        ("C-x w" . elfeed)
+        (:map elfeed-search-mode-map
+              ("C-c a" . elfeed-add-feed)
+              ("C-c u" . elfeed-update)
+              ("C-c f" . elfeed-update-feed)
+              ("C-c r" . elfeed-mark-all-as-read))
+        :config
+        (defun elfeed-mark-all-as-read ()
+          (interactive)
+          (mark-whole-buffer)
+          (elfeed-search-untag-all-unread))
+        :custom
+        (elfeed-search-filter  "@6-months-ago +quality")
+        (elfeed-feeds  '(("http://feeds.feedburner.com/tweakers/nieuws" NL tech exportable)
+                         ("https://discourse.nixos.org/c/announcements/8.rss" nixos programming quality)
+                         ("http://www.dnbradio.com/feeds" music podcasts)
+                         ("https://codepen.io/spark/feed/" programming quality)
+                         ("https://envs.net/~lucidiot/rsrsss/feed.xml" RSS quality)
+                         ("https://falseknees.tumblr.com/rss" comics quality)
+                         ("https://hackspace.raspberrypi.org/feed" tech programming)
+                         ("https://lobste.rs/rss" programming)
+                         ("https://news.rickcarlino.com/rss.rss" tech)
+                         ("https://nu.nl/rss" NL news exportable)
+                         ("https://planet.haskell.org/atom.xml" haskell programming)
+                         ("https://planet.nixos.org/atom.xml" nixos programming quality)
+                         ("https://reddit.com/r/dnb/.rss" reddit music)
+                         ("https://reddit.com/r/programming/.rss" reddit programming)
+                         ("https://reddit.com/r/realdubstep/.rss" reddit music)
+                         ("https://reddit.com/r/thenetherlands/.rss" NL reddit)
+                         ("https://sachachua.com/blog/category/emacs-news/feed" emacs quality programming)
+                         ("https://webzine.puffy.cafe/atom.xml" openbsd tech quality programming)
+                         ("https://www.fosskers.ca/en/rss" programming quality exportable)
+                         ("https://xkcd.com/atom.xml" comics)))
+        (elfeed-feeds nil))
+    #+end_src
+*** Evil mode
+    I am originally a vim user, and the standard vim bindings have not left my hands yet,
+    I am not a big configurer, so this is mostly just the standard configuration that [[https://github.com/emacs-evil/evil-collection#installation][evil-mode]] advices you to do
+    #+begin_src elisp :tangle emacsconfig/evil.el
+      (use-package evil
+        :init
+        (setq evil-want-integration t) ;; This is optional since it's already set to t by default.
+        (setq evil-want-keybinding nil)
+        :config
+        (evil-define-key 'normal global-map "," 'evil-execute-in-god-state)
+        (evil-mode 1))
+
+      (use-package evil-collection
+        :after evil
+        :config
+        (evil-collection-init))
+    #+end_src
+**** God-mode
+     To further prove that I have no intentions at all to be busy with making evil bindings for eveything I find
+     I have also installed god-mode to help me do effortless keybinding for those programs that don't have evil
+     support
+     #+begin_src elisp :tangle emacsconfig/evil.el
+       (use-package evil-god-state
+         :bind
+         ("M-," . evil-god-state-bail))
+
+       (use-package god-mode)
+     #+end_src
+**** Tree-sitter
+     There is a pre-configured package that allows for easy tree-sitter support for a few languages. Nixos + tree-sitter
+     is surprisingly painless, so I figured I'd just add it
+     #+begin_src elisp :tangle emacsconfig/evil.el
+       (use-package evil-tree-edit
+         :hook
+         (java-mode . evil-tree-edit-mode)
+         (python-mode . evil-tree-edit-mode))
+     #+end_src
+*** Which-key
+    Has god-mode support
+    #+name: emacsconfig/extras.el
+    #+begin_src elisp
+      (use-package which-key
+        :after god-mode
+        :config
+        (which-key-enable-god-mode-support)
+        (which-key-mode))
+    #+end_src
+** Programming-related emacs tools
+   I do computer science, so from now and then I tend to program a bit. Here are all the tools I use to accomplish
+   that stuff
+*** Company
+    Generally nice for auto-completion anywhere. I think here is also the place to note that I am not a huge fan
+    of language-servers, as I've had bad experiences with them when I was still using vim
+    #+name: emacsconfig/extras.el
+    #+begin_src elisp
+      (use-package company
+        :bind
+        ("C-SPC" . company-complete))
+    #+end_src
+*** Matching of parentheses and other stuff
+    "ERROR: Unmatched parenteses/braces/whatever" is really a thing I would prefer to never see again
+    It has nix and lisp support, but other langages are fairly standards so not much configuration needed there
+    #+name: emacsconfig/extras.el
+    #+begin_src elisp
+      (use-package smartparens
+        :hook
+        (emacs-lisp-mode . smartparens-mode)
+        (nix-mode . smartparens-mode)
+        (lisp-mode . smartparens-mode)
+        :config
+        (sp-with-modes '(lisp-mode emacs-lisp-mode)
+          (sp-local-pair "'" nil :actions nil)
+          (sp-local-pair "`" nil :actions nil))
+
+        (sp-with-modes '(nix-mode)
+          (sp-local-pair "'" nil :actions nil)
+          (sp-local-pair "''" "''")))
+    #+end_src
+*** Languages
+    Other than that, there are some language-specific setups that I want to do,which are a bit more complicated
+    than just "editing a file"
+**** Nix
+     Nix is a fairly essential language here. Not just because I run NixOS, but also because it provides
+     external packages (interpreters, compilers, tooling etc.) to the programs that need it
+***** Nix mode
+      This config is just part of editing nix config. It is supposed to come with company support, but
+      the auto-completion backend turns out to not be that great. We'll see what I do with it
+      #+name: emacsconfig/nix.el
+      #+begin_src elisp
+        (use-package nix-mode
+          :mode "\\.nix\\'"
+          :hook
+          (nix-mode . company-mode)
+          :config
+          ;; the company-nix backend is not available in melpa, but has no new dependencies
+          (unless (package-installed-p 'company-nix)
+            (with-temp-buffer
+              (url-insert-file-contents "https://github.com/NixOS/nix-mode/raw/master/nix-company.el")
+              (eval-buffer)))
+          (add-hook 'nix-mode-hook (lambda ()
+                                     (set (make-local-variable 'company-backends)
+                                          '((company-nix)))))
+          (add-hook 'nix-mode-hook 'company-mode))
+      #+end_src
+***** Nix package management
+      I use nix-sandbox for managing nix package for other languages.
+      One of the functions doesn't work that well for me so I replaced it with something that does
+      #+name: emacsconfig/nix.el
+      #+begin_src elisp
+        (use-package nix-sandbox
+          :config
+          (defun nix-executable-find (sandbox executable)
+            "finds an EXECUTABLE in SANDBOX"
+            (set (make-local-variable 'exec-path) (nix-exec-path sandbox))
+            (executable-find executable)))
+      #+end_src
+      Beyond that, there is a helper function that makes it easy to quickly define environments with the required
+      packages for a programming language
+      #+name: emacsconfig/nix.el
+      #+begin_src elisp
+        (defun nix-env-from-packages (name &rest packages)
+          "create a nix environment from nix packages. returns the location of the environment"
+          (interactive (append
+                        (list (read-string "Environment name: " nil nil "nameless"))
+                        (split-string (read-string "Packages: "))))
+          (with-temp-buffer
+            (insert (format "
+        { pkgs ? import %s {}}:
+        pkgs.mkShell {
+        buildInputs = with pkgs;[
+        %s
+        ];
+        }
+            " (or nix-nixpkgs-path "<nixpkgs>") (apply 'concat (intersperse "\n" packages))))
+            (write-file (concat temporary-file-directory name "-env/shell.nix"))
+            (nix-find-sandbox (concat temporary-file-directory name "-env"))))
+      #+end_src
+**** Python
+     Python is a bit weird. It had no intentions at all to do things the way I wanted it to do things with
+     use-package, so I had to find a weird work-arounds with add-hook and all that stuff
+     #+begin_src elisp :tangle emacsconfig/python.el :padline no :noweb no-export
+       (add-hook 'python-mode-hook (lambda ()
+                                     <<el-python-config>>
+                                     <<el-python-config-2>>))
+
+     #+end_src
+     First we set an interpreter with nix, it comes with all the python autocompletion tools we need
+     #+name: el-python-config
+     #+begin_src elisp
+       (setq python-shell-interpreter
+             (nix-executable-find
+              (nix-env-from-packages "python" "(python3.withPackages (p: with p; [pygame virtualenvwrapper pip sqlite jedi flake8 yapf autopep8 black]))")
+              "python"))
+
+     #+end_src
+     Then we introduce elpy with so that it can use all the tools immidiately without downloading them
+     #+name: el-python-config-2
+     #+begin_src elisp
+       (use-package elpy
+         :config
+         (elpy-enable)
+         (setq elpy-rpc-python-command python-shell-interpreter))
+
+     #+end_src
+**** Web stuff
+     I also have made some basic webpages. I haven't gotten too deep into JS with emacs yet, so this section
+     might expand later, but so far this is what I have
+***** Web mode
+      General xml stuff editing. Fairly standard
+      #+name: emacsconfig/web.el
+      #+begin_src elisp
+        (use-package web-mode
+          :mode (("\\.x?html?\\'" . web-mode)
+                 ("\\.x[sm]l\\'"  . web-mode)
+                 ("\\.css\\'"     . web-mode)
+                 ("\\.jsx?\\'"    . web-mode)
+                 ("\\.tsx?\\'"    . web-mode)
+                 ("\\.json\\'"    . web-mode))
+          :custom
+          (web-mode-markup-indent-offset 2) ; HTML
+          (web-mode-css-indent-offset 2)    ; CSS
+          (web-mode-code-indent-offset 2)   ; JS/JSX/TS/TSX
+          (web-mode-content-types-alist '(("jsx" . "\\.js[x]?\\'"))))
+        (use-package elnode)
+
+      #+end_src
+***** Emmet mode
+      for quickly inserting a whole XML tree
+      #+name: emacsconfig/web.el
+      #+begin_src elisp
+        (use-package emmet-mode
+          :hook
+          (sgml-mode . emmet-mode)
+          (web-mode . emmet-mode)
+          (css-mode . emmet-mode)
+          :bind
+          ("TAB" . emmet-dwim)
+          :config
+          (defun emmet-dwim (prefix)
+            (interactive "p")
+            (or
+             (emmet-go-to-edit-point prefix)
+             (emmet-expand-line prefix)
+             (evil-jump-forward prefix))))
+      #+end_src
diff --git a/nixos.org b/nixos.org
index e69de29..ac4ad81 100644
--- a/nixos.org
+++ b/nixos.org
@@ -0,0 +1,248 @@
+#+TITLE:Nixos Config
+#+AUTHOR: Crazazy
+
+This is the nixos config. Right now it is a bit of a hack because I don't have a [[https://github.com/rasendubi/dotfiles#patch-ob-tangle][ob-tangle patch]] but that can come
+later
+
+For now this is the way I'm configuring nixos. There is no flakes here, just a configuration.nix and a bunch of other
+stuff
+* Prefix
+  The nixos config is going to consist of a bunch of "imports" which are just a bunch of configs
+  in the imports part of the main configuration. Then we can put each part of said config on its own source block
+  This does require a bit of a prefix, that lets us access packages, existing configuration and library functions
+  #+begin_src nix :tangle configuration.nix
+    { config, lib, pkgs, ... }:
+    let
+      sources = import ./nix/sources.nix;
+      nur = import sources.nur { inherit pkgs; };
+      nurModules = import sources.nur { };
+    in
+    {
+      imports = [
+  #+end_src
+* Configuration
+** Hardware
+   Normal nixos installation comes with a hardware-configuration file. we are not going to add the contents of that
+   file here ourself, but instead add it as an external module. This is the only place where we'll do this
+   #+begin_src nix :tangle configuration.nix
+     ./hardware-configuration.nix
+   #+end_src
+** personal stuff
+   First, some personal stuff, so that I can tel people my computer is mine
+   #+begin_src nix :tangle configuration.nix
+     {
+       options.mainUser = with lib; mkOption {
+         type = types.str;
+         default = builtins.getEnv "USER";
+       };
+     }
+   #+end_src
+
+   and then the actual info:
+   #+begin_src nix :tangle configuration.nix
+     {
+       mainUser = "erik";
+       networking.hostName = "RACEMONSTER";
+       time.timeZone = "Europe/Amsterdam";
+     }
+   #+end_src
+** Init system
+   nixos is started with systemd-boot, since we don't run any other distros
+   #+begin_src nix
+     {
+       boot.loader.systemd-boot.enable = true;
+       boot.loader.efi.canTouchEfiVariables = true;
+     }
+   #+end_src
+** Networking
+   Some default network settings for my laptop
+   #+begin_src nix
+     {
+       networking.networkmanager.enable = true; # Enables wireless support via wpa_supplicant.
+       networking.useDHCP = false;
+       networking.interfaces.enp0s31f6.useDHCP = true;
+       networking.interfaces.wlp1s0.useDHCP = true;
+     }
+   #+end_src
+** nixpkgs setup
+   not much info here right now. emacs itself now refers to emacsng
+   #+begin_src nix :tangle configuration.nix
+     {
+       nix.package = pkgs.nixFlakes;
+       nixpkgs.config.allowUnfree = true;
+       nixpkgs.overlays = [
+         (final: prev: {
+           emacs = sources.emacs-ng.outputs.defaultPackage."x86_64-linux";
+         })
+       ];
+     }
+   #+end_src
+*** cachix
+    Cachix and other substitute servers allow you to not have to compile things as much as you are supposed to
+    We will create a small module for cachix before we put in the rest declaratively
+    #+begin_src nix :tangle configuration.nix
+      {
+        options.nix.cacheAttrs = with lib; mkOption {
+          type = with types; attrsOf str;
+          default = {};
+
+        };
+        config = with lib; {
+          nix.binaryCaches = builtins.attrNames config.nix.cacheAttrs;
+          nix.binaryCachePublicKeys = builtins.attrValues config.nix.cacheAttrs;
+        };
+      }
+    #+end_src
+    With the config in hand, we can now quickly and easily declare our substitute servers
+    #+begin_src nix :tangle configuration.nix
+      {
+        nix.cacheAttrs = {
+          "https://crazazy.cachix.org" = "crazazy.cachix.org-1:3KaIHK26pkvd5palJH5A4Re1Hn2+GDV+aXYnftMYAm4=";
+          "https://emacsng.cachix.org" = "emacsng.cachix.org-1:i7wOr4YpdRpWWtShI8bT6V7lOTnPeI7Ho6HaZegFWMI=";
+          "https://ethancedwards8.cachix.org" = "ethancedwards8.cachix.org-1:YMasjqyFnDreRQ9GXmnPIshT3tYyFHE2lUiNhbyIxOc=";
+          "https://nix-community.cachix.org" = "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=";
+          "https://nrdxp.cachix.org" = "nrdxp.cachix.org-1:Fc5PSqY2Jm1TrWfm88l6cvGWwz3s93c6IOifQWnhNW4=";
+          "https://rycee.cachix.org" = "rycee.cachix.org-1:TiiXyeSk0iRlzlys4c7HiXLkP3idRf20oQ/roEUAh/A=";
+        };
+      }
+    #+end_src
+** udev binds
+   I have a bindmount system so that I can easily make binds to persistent directories from my home directory
+   This should prevent clutter
+*** The config
+    This part is quite advanced. It makes entries for filesystems and then makes a systemd service to re-assign
+    generated temporary directories to the owner of the home folder
+    #+begin_src nix :tangle configuration.nix
+      {
+        options = with lib; {
+          homebinds = mkoption {
+            type = with types; listof str;
+            default = [ ];
+            description = "bind mounts in your home folder";
+          };
+          persistroot = mkoption {
+            type = types.str;
+            default = "/nix/persist";
+          };
+        };
+        config = with lib; mkif (config.homebinds != [ ]) {
+          filesystems = genattrs (map (loc: "/home/${config.mainuser}/${loc}") config.homebinds)
+            (loc: {
+              device = "${config.persistroot}${loc}";
+              fstype = "none";
+              options = [ "bind" ];
+            });
+          systemd.services.fix-home-perms = {
+            wantedby = [ "multi-user.target" ];
+            after = map (loc: "${builtins.replacestrings ["/"] ["-"] loc}.mount") config.homebinds;
+            serviceconfig.type = "oneshot";
+            script = "chown -r ${config.mainuser} /home/${config.mainuser}";
+          };
+        };
+      }
+    #+end_src
+*** The binds
+    These are the binds themselves, they change frequently
+    #+begin_src nix :tangle configuration.nix
+      {
+        homeBinds = [
+          ".config/keybase"
+          ".local/share/Steam"
+          ".local/share/keybase"
+          ".mozilla/seamonkey"
+          ".ssh"
+          ".wine"
+          "Desktop"
+          "Documents"
+          "Music"
+          "Videos"
+          "workbench/browsing"
+          "workbench/EMACS"
+        ];
+      }
+    #+end_src
+** packages
+*** Core packages
+    These are the normal packages that I use for core maintenance
+    #+begin_src nix :tangle configuration.nix
+      environment.systemPackages = with pkgs; [
+        gitFull
+        curl
+        vim
+        nur.repos.crazazy.seamonkey
+        (wine.override { wineBuild = "wineWow"; })
+      ];
+    #+end_src
+*** Steam
+    I like to play videogames sometimes, however steam also requires a little more special attention
+    #+begin_src nix :tangle configuration.nix
+      {
+        imports = [
+          nurModules.repos.crazazy.private.steam-config
+        ];
+        environment.systemPackages = with pkgs; [
+          steam
+        ];
+      }
+    #+end_src
+*** Emacs
+    Emacs needs to be integrated into the rest of the system. We are going to do that via a emacs daemon
+    #+begin_src nix :tangle configuration.nix
+      {
+        services.emacs = {
+          package = import ./emacsconfig.nix;
+          enable = true;
+        };
+      }
+    #+end_src
+*** qemu & frens
+    I also sometimes run qemu vms. The qemu's
+** Main user config
+   This sets up a (secret) default password for the main user and also sets some default groups
+   #+begin_src nix :tangle configuration.nix
+     {
+       users.mutableUsers = false;
+       # Define a user account. Don't forget to set a password with ‘passwd’.
+       users.users.${config.mainUser} = {
+         initialHashedPassword = "$6$XTH/sALyqg$G.bMWemErh4KGCAjUfT16DL96QMn/4NTmxlw6Z26wUVJn.tagQG.Fzmrz7uPkdiWZbBBFWP36.YA4hw9AcL8Q1";
+         isNormalUser = true;
+         extraGroups = [ "video" "wheel" "NetworkManager" ]; # Enable ‘sudo’ for the user.
+         # shell = pkgs.nushell;
+       }
+   #+end_src
+** Visual stuff
+   I don't acutally literally live in the terminal. So we have to implement some xorg and other stuff
+*** Basics
+    Enable printing, sound and a good keyboard, along with x11 itself
+    #+begin_src nix :tangle configuration.nix
+      {
+        # Enable CUPS to print documents.
+        services.printing.enable = true;
+
+        # Enable sound.
+        sound.enable = true;
+        hardware.pulseaudio.enable = true;
+
+        # Enable the X11 windowing system.
+        services.xserver.enable = true;
+        services.xserver.layout = "us";
+        services.xserver.xkbVariant = "altgr-intl";
+        services.xserver.xkbOptions = "eurosign:e";
+        # touchpad controls
+        services.xserver.libinput.enable = true;
+      }
+    #+end_src
+*** XFCE
+    I have decided to be lazy and not install a fancy window manager or whatever into the system. Thats headache
+    #+begin_src nix :tangle configration.nix
+      {
+        services.xserver.displayManager.lightdm.enable = true;
+        services.xserver.desktopManager.xfce.enable = true;
+      }
+    #+end_src
+* Postfix
+  We need to remember to close our main module that we started off with
+  #+begin_src nix :tangle configuration.nix
+      ];
+    }
+  #+end_src
diff --git a/readme.org b/readme.org
index 83ce6ea..f3093aa 100644
--- a/readme.org
+++ b/readme.org
@@ -45,3 +45,5 @@ You can then install required dependencies with [[shell:./bootstrap.sh &][the bo
 * Other stuff
   Other files that are available right now are [[file:nixos.org][the nixos config]] and [[file:emacs.org][the emacs config]]
   If you have any questions or comments about this repository, just HMU at [[mailto:crazazy@tilde.cafe]]
+** TODO import rasendubi's [[https://github.com/rasendubi/dotfiles][ob-tangle patch]]
+   This would clean up the nixos config that is written