commit a8d5bbab5312593b875bf2390d442b6a5ead00b0
parent 8ca9ddc9d433c7cf76959f997541c7276932d3ae
Author: Crazazy <crazazy@tilde.cafe>
Date: Sun, 30 Jan 2022 23:18:58 +0100
add initial full configs
Diffstat:
M | emacs.org | | | 328 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
M | nixos.org | | | 248 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
M | readme.org | | | 2 | ++ |
3 files changed, 578 insertions(+), 0 deletions(-)
diff --git 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
@@ -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
@@ -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