literate-config

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit a8d5bbab5312593b875bf2390d442b6a5ead00b0
parent 8ca9ddc9d433c7cf76959f997541c7276932d3ae
Author: Crazazy <crazazy@tilde.cafe>
Date:   Sun, 30 Jan 2022 23:18:58 +0100

add initial full configs

Diffstat:
Memacs.org | 328+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mnixos.org | 248+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mreadme.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