diff --git a/config/emacs/.gitignore b/config/emacs/.gitignore
new file mode 100644
index 0000000..1980dcd
--- /dev/null
+++ b/config/emacs/.gitignore
@@ -0,0 +1,62 @@
+/url/cache
+/.emacs.desktop
+/auto-save-list
+/network-security.data
+/.session
+/session.*
+/custom.el
+*.elc
+CVS
+.svn
+*~
+.cvsignore
+.*.lock
+/tramp
+/TODO
+/.org-id-locations
+cookies
+/newsticker
+\#*
+/tree-sitter
+/elpa
+/elpa-*
+site-lisp/package/
+/swank
+/.mc-lists.el
+/var
+/.sqli_history
+/frame-restore-parameters
+/.achievements
+/.bookmarks.el
+/history
+/helm-adaptive-history
+/thumbs/
+/emms/
+/.smex-items
+/image-dired/
+/eshell
+/.cask/
+/.sx/
+/org-clock-save.el
+/ditaa*.jar
+/ido.last
+/recentf
+/viper
+/projectile-bookmarks.eld
+/anaconda-mode/
+/.historian
+/.uptimes.el
+/rake.cache
+/plantuml.jar
+/magithub
+.cache/
+/forge-database.sqlite
+/transient
+/.lsp-session-v1
+/smex-items
+/eln-cache/
+/projects
+/forge-*.sqlite
+/projectile.cache
+config.el
+places
diff --git a/config/emacs/config.org b/config/emacs/config.org
new file mode 100644
index 0000000..d0a2ce3
--- /dev/null
+++ b/config/emacs/config.org
@@ -0,0 +1,950 @@
+#+TITLE: My Emacs Config
+#+AUTHOR: Venomade
+
+This is my Emacs config that is theoretically going to be simpler than my previous configs. I have been trying out neovim more recently and I liked how simple it can be, giving it very quick startup times. I've tried the Emacs Daemon in the past but have never really jived with it so I would rather just have a fast launch time instead. The target is that `emacs-init-time` should be <2 seconds.
+
+* Non-Package Configuration
+This section is the main non-package configuration of my Emacs config, everything here should be run before everything else in order to set up the basic environment for using packages.
+
+** Internal
+#+begin_src emacs-lisp
+ ;; Setup Native Compilation if available
+ (if (native-comp-available-p)
+ (setq package-native-compile t))
+
+ ;; Disable the command key on MacOS
+ (setq mac-command-modifier nil)
+
+ ;; Use a custom.el file instead of init.el to store uncommitable changes
+ (setq custom-file (expand-file-name "custom.el" user-emacs-directory))
+ (when (file-exists-p custom-file)
+ (load custom-file))
+
+ ;; Set Backups, Autosaves and Lockfiles to all be stored in the .emacs.d directory
+ (let* ((backup-dir (expand-file-name "backups/" user-emacs-directory))
+ (autosave-dir (expand-file-name "autosaves/" user-emacs-directory))
+ (lock-dir (expand-file-name "lock/" user-emacs-directory)))
+ (make-directory backup-dir t)
+ (make-directory autosave-dir t)
+ (make-directory lock-dir t)
+
+ (setq backup-directory-alist `((".*" . ,(directory-file-name backup-dir)))
+ auto-save-file-name-transforms `((".*" ,(directory-file-name autosave-dir) t))
+ lock-file-name-transforms `((".*" ,(directory-file-name lock-dir) t))))
+
+ ;; Don't show Warning and Compile-Log buffers in a window
+ (add-to-list 'display-buffer-alist
+ '("\\`\\*\\(Warnings\\|Compile-Log\\)\\*\\'"
+ (display-buffer-no-window)
+ (allow-no-window . t)))
+
+ ;; Use 'trash' to trash system files instead of permanently rm-ing
+ (setq trash-directory "~/.Trash")
+ (defun system-move-file-to-trash (file)
+ "Use \"trash\" to move FILE to the system trash."
+ (cl-assert (executable-find "trash") nil "'trash' executable not found.")
+ (call-process "trash" nil 0 nil "-F" file))
+#+end_src
+
+** User Interface
+#+begin_src emacs-lisp
+ ;; Allow any size of the Emacs GUI
+ (setq frame-resize-pixelwise t
+ ;; Configure line numbers display
+ display-line-numbers-width-start t
+ display-line-numbers-width 4
+ display-line-numbers-grow-only t
+ ;; Disable bell
+ ring-bell-function 'ignore
+ ;; Confirm on C-x C-c
+ ns-confirm-quit t
+ ;; Don't open files opened from an external source in a new frame
+ ns-pop-up-frames nil
+ ;; Add a scroll margin and improve scrolling
+ scroll-margin 10 ; Doesn't work with smooth-scrolling
+ scroll-conservatively 100
+ scroll-step 1)
+
+ ;; Default to no wrapping on buffers
+ (setq-default truncate-lines t)
+
+ ;; Replace the $ signs for truncation with spaces
+ (set-display-table-slot standard-display-table 'truncation 32)
+
+ ;; Disable extra GUI interfaces
+ (tool-bar-mode -1)
+ (scroll-bar-mode -1)
+ (menu-bar-mode -1)
+
+ ;; Display line numbers from startup
+ (add-hook 'emacs-startup-hook #'global-display-line-numbers-mode)
+
+ ;; Focus new frames on creation
+ (add-hook 'after-make-frame-functions
+ (lambda (f)
+ (select-frame-set-input-focus f)))
+
+ ;; Custom quit messages from DOOM and DOOM Emacs
+ (setq quit-messages
+ `(; from DOOM 1
+ ,(format "I wouldn't leave if I were you. %s is much worse."
+ (if (featurep 'windows-nt) "DOS" "UNIX"))
+ "Ya know, next time you come in here I'm gonna toast ya."
+ "Go ahead and leave. See if I care."
+ "Are you sure you want to quit this great editor?"
+ ; from DOOM Emacs
+ "(setq nothing t everything 'permitted)"
+ "Emacs will remember that."
+ "Emacs, Emacs never changes."
+ "Hey! Hey, M-x listen!"
+ "Wake up, Mr. Stallman. Wake up and smell the ashes."
+ "You are *not* prepared!"
+ "Please don't go. The drones need you. They look up to you."))
+
+ (defun random-quit-message ()
+ "Return a randomly chosen quit message from `quit-messages'."
+ (nth (random (length quit-messages)) quit-messages))
+
+ (defun message-confirm-kill-emacs (&rest _)
+ "Prompt the user with a random message before quitting.
+ Returns t to allow kill if the user answers yes; nil otherwise."
+ (let* ((msg (random-quit-message))
+ (prompt (format "%s Really quit Emacs? " msg)))
+ (yes-or-no-p (propertize prompt 'face '(italic default)))))
+
+ (setq confirm-kill-emacs #'message-confirm-kill-emacs)
+
+ ;; Enable which-key on startup
+ (add-hook 'emacs-startup-hook #'which-key-mode)
+
+ ;; Disable line numbers in fundamental mode
+ (let ((no-numbers-modes '(fundamental-mode-hook)))
+ (dolist (hk no-numbers-modes)
+ (add-hook hk (lambda () (display-line-numbers-mode 0)))))
+
+ ;; Colorise the compile-mode buffer
+ (require 'ansi-color)
+ (defun colorize-compilation-buffer ()
+ (ansi-color-apply-on-region compilation-filter-start (point)))
+ (add-hook 'compilation-filter-hook 'colorize-compilation-buffer)
+
+ ;; Shorten symbols into their single character equivalent
+ (global-prettify-symbols-mode 1)
+
+ ;; Font Setup
+ (let* ((fontconf '((fixed-font . "AporeticSansMonoNerdFont")
+ (variable-font . "Google Sans")
+ (size . 16)))
+ (fixed-font (cdr (assoc 'fixed-font fontconf)))
+ (variable-font (cdr (assoc 'variable-font fontconf)))
+ (pt-size (cdr (assoc 'size fontconf)))
+ (height (* pt-size 10))
+ (frame-font (concat fixed-font "-" (number-to-string pt-size))))
+ ; Fixed-width faces
+ (dolist (face '(default fixed-pitch))
+ (set-face-attribute face nil
+ :font fixed-font
+ :height height
+ :weight 'regular))
+ ; Variable-pitch face
+ (set-face-attribute 'variable-pitch nil
+ :font variable-font
+ :height height
+ :weight 'regular)
+
+ ; Syntax styling
+ (set-face-attribute 'font-lock-comment-face nil :slant 'italic)
+ (set-face-attribute 'font-lock-keyword-face nil :slant 'italic)
+
+ ; Frame font
+ (add-to-list 'default-frame-alist `(font . ,frame-font)))
+
+ ;; Spacious user interface elements
+ (use-package spacious-padding
+ :ensure t
+ :hook (after-init . spacious-padding-mode)
+ :config
+ (setq spacious-padding-widths
+ '( :internal-border-width 8
+ :header-line-width 4
+ :mode-line-width 6
+ :custom-button-width 3
+ :tab-width 4
+ :right-divider-width 30
+ :scroll-bar-width 8
+ :fringe-width 0))
+ (setq spacious-padding-subtle-frame-lines
+ '( :mode-line-active spacious-padding-line-active
+ :mode-line-inactive spacious-padding-line-inactive
+ :header-line-active spacious-padding-line-active
+ :header-line-inactive spacious-padding-line-inactive)))
+
+ ;; Enable line wrapping for text documents
+ (add-hook 'text-mode-hook 'visual-line-mode)
+ ;; Disable line numbers in text mode
+ (add-hook 'text-mode-hook (lambda () (display-line-numbers-mode -1)))
+#+end_src
+
+** Functionality
+#+begin_src emacs-lisp
+ ;; Indent with spaces
+ (setq-default indent-tabs-mode nil
+ ;; Use 2 spaces
+ tab-width 2
+ tab-stop-list (number-sequence 2 100 2)
+ c-basic-offset 2)
+
+ ;; Regex find and replace shortcut
+ (keymap-global-set "C-c r" 'replace-regexp)
+
+ ;; Functions to match vi's 'o' and 'O'
+ (cl-labels
+ ((vi-open-line-above ()
+ "Open line above the current line."
+ (interactive)
+ (unless (bolp) (beginning-of-line))
+ (newline)
+ (forward-line -1)
+ (indent-according-to-mode))
+ (vi-open-line-below ()
+ "Open line below the current line."
+ (interactive)
+ (unless (eolp) (end-of-line))
+ (newline-and-indent)))
+ (define-key (current-global-map) (kbd "C-c o") #'vi-open-line-above)
+ (define-key (current-global-map) (kbd "C-c O") #'vi-open-line-below)
+ (which-key-add-key-based-replacements "C-c o" "open-line-above")
+ (which-key-add-key-based-replacements "C-c O" "open-line-below"))
+
+ ;; Move to the beginning of the line with respect to context
+ (progn
+ (defun smart-beginning-of-line ()
+ "Move the cursor to the beginning of text on the line."
+ (interactive)
+ (let ((initial-point (point)))
+ (back-to-indentation)
+ (when (eq initial-point (point))
+ (move-beginning-of-line 1))))
+ (defun setup-prog-mode-c-a ()
+ (local-set-key (kbd "C-a") 'smart-beginning-of-line))
+ (add-hook 'prog-mode-hook 'setup-prog-mode-c-a)
+ (add-hook 'conf-mode-hook 'setup-prog-mode-c-a))
+
+ ;; Clean up trailing whitespace
+ (progn
+ (defun prog-nuke-trailing-whitespace ()
+ "Removes trailing whitespace at the end of the line."
+ (when (or (derived-mode-p 'prog-mode) (derived-mode-p 'conf-mode))
+ (delete-trailing-whitespace)))
+ (add-hook 'before-save-hook 'prog-nuke-trailing-whitespace))
+
+ ;; Enable overwriting selection with the built-in delsel package
+ (use-package delsel
+ :hook (after-init . delete-selection-mode))
+
+ ;; Use y/n and other similar shortenings for dialogue response
+ (setopt use-short-answers t)
+
+ ;; Configure the built-in file-manager dired
+ (use-package dired
+ :commands (dired)
+ :hook
+ ((dired-mode . dired-hide-details-mode)
+ (dired-mode . hl-line-mode))
+ :config
+ (setq dired-recursive-copies 'always
+ dired-recursive-deletes 'always
+ ; delete-by-moving-to-trash t ; FIXME: Currently Broken, need to find why
+ dired-dwim-target t
+ insert-directory-program "~/.nix-profile/bin/ls"
+ dired-listing-switches "-lah"))
+
+ ;; Return to last position after leaving a file
+ (add-hook 'emacs-startup-hook #'save-place-mode)
+
+ ;; Setup a pretty and useful eshell prompt
+ (progn
+ (dolist (spec
+ '((eshell-prompt-user-face font-lock-keyword-face "Face for the username in the eshell prompt.")
+ (eshell-prompt-venv-face font-lock-string-face "Face for the virtualenv name in the eshell prompt.")
+ (eshell-prompt-dir-face dired-directory "Face for the directory path in the eshell prompt.")
+ (eshell-prompt-git-face magit-tag "Face for the git branch in the eshell prompt.")
+ (eshell-prompt-git-dirty-face eshell-prompt-git-face "Face for the git dirty status in the eshell prompt.")
+ (eshell-prompt-symbol-face font-lock-builtin-face "Face for the prompt symbol in the eshell prompt.")))
+ (cl-destructuring-bind (name inherit doc) spec
+ (defface name
+ `((t (:inherit ,inherit)))
+ doc
+ :group 'eshell-prompt)))
+
+ (defun eshell-abbreviate-dir (dir)
+ "Abbreviate directory to show only the first and the last two components."
+ (let* ((abbrev (abbreviate-file-name dir))
+ (components (split-string abbrev "/" t))
+ (num-components (length components)))
+ (if (>= num-components 4)
+ (concat (car components) "/.../"
+ (mapconcat #'identity (last components 2) "/"))
+ abbrev)))
+
+ (defun eshell-prompt-git-branch ()
+ "Return the current git branch or short commit hash, if available."
+ (when (and (executable-find "git")
+ (locate-dominating-file default-directory ".git"))
+ (with-temp-buffer
+ (let ((ret (call-process "git" nil t nil "symbolic-ref" "--short" "HEAD")))
+ (if (zerop ret)
+ (string-trim (buffer-string))
+ (when (zerop (call-process "git" nil t nil "rev-parse" "--short" "HEAD"))
+ (string-trim (buffer-string))))))))
+
+ (defun eshell-prompt-git-dirty ()
+ "Return a dirty flag (✗ if dirty, ✓ if clean) for the git repository."
+ (when (eshell-prompt-git-branch)
+ (with-temp-buffer
+ (call-process "git" nil t nil "status" "--porcelain")
+ (if (> (buffer-size) 0) "✗" "✓"))))
+
+ (defun eshell-prompt ()
+ "Custom eshell prompt."
+ (let* ((user (propertize (user-login-name) 'face 'eshell-prompt-user-face))
+ (venv (when-let ((venv (getenv "VIRTUAL_ENV")))
+ (concat (propertize "(" 'face 'eshell-prompt-venv-face)
+ (propertize (file-name-nondirectory venv) 'face 'eshell-prompt-venv-face)
+ (propertize ")" 'face 'eshell-prompt-venv-face))))
+ (path (propertize (eshell-abbreviate-dir (eshell/pwd)) 'face 'eshell-prompt-dir-face))
+ (git-branch (eshell-prompt-git-branch))
+ (git-info (when git-branch
+ (concat " " (propertize "on" 'face 'font-lock-number-face) " "
+ (propertize git-branch 'face 'eshell-prompt-git-face)
+ (propertize (eshell-prompt-git-dirty) 'face 'eshell-prompt-git-dirty-face))))
+ (prompt (concat user " " (propertize "in" 'face 'font-lock-number-face) " "
+ (if venv (concat venv " ") "")
+ path git-info "\n"
+ (propertize "λ" 'face 'eshell-prompt-symbol-face) " ")))
+ prompt))
+
+ (setq eshell-prompt-function 'eshell-prompt
+ eshell-prompt-regexp "^[^λ\n]*λ "))
+
+ ;; Bind recent files to C-x C-r
+ (add-hook 'emacs-startup-hook #'recentf-mode)
+ (keymap-global-set "C-x C-r" 'recentf-open)
+ (which-key-add-key-based-replacements "C-x C-r" "Recent Files")
+ (put 'compile-command 'safe-local-variable #'stringp)
+
+ ;; Persistently save minibuffer history between sessions
+ (use-package savehist
+ :hook (after-init . savehist-mode))
+
+ ;; Local info files directory
+ (add-to-list 'Info-directory-list "/Users/venomade/Documents/Info/")
+
+ ;; Scroll on compilation mode output
+ (setq compilation-scroll-output t)
+
+ ;; Add keybinds for compiling
+ (keymap-global-set "C-c m c" 'compile)
+ (keymap-global-set "C-c m r" 'recompile)
+ (which-key-add-key-based-replacements "C-c m" "make")
+#+end_src
+
+* Basic Package Configuration
+This is the configuration for the necessary packages required for my base Emacs experience for all cases.
+
+** Setup
+#+begin_src emacs-lisp
+ ;; Setup Melpa
+ (require 'package)
+ (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)
+ (package-initialize)
+#+end_src
+
+** Internal Packages
+#+begin_src emacs-lisp
+ ;; Improved Garbage Collection
+ (use-package gcmh
+ :ensure t
+ :hook (after-init . gcmh-mode)
+ :config
+ (setq gcmh-high-cons-threshold (* 128 1024 1024) ; 128MB
+ gcmh-idle-delay 10
+ gcmh-verbose nil))
+
+ ;; Find executables that are usable from the specified shell
+ (use-package exec-path-from-shell
+ :ensure t
+ :config
+ (setq exec-path-from-shell-shell-name "/bin/zsh"
+ exec-path-from-shell-arguments '("-l" "-i" "-c"))
+ (when (memq window-system '(mac ns x))
+ (exec-path-from-shell-initialize)))
+#+end_src
+
+** User Interface Packages
+#+begin_src emacs-lisp
+ ;; Catppuccin Color Theme
+ (use-package catppuccin-theme
+ :ensure t
+ :config
+ (setq catppuccin-flavor 'mocha)
+ (catppuccin-set-color 'base "#000000")
+ (catppuccin-set-color 'mantle "#181818")
+ (catppuccin-set-color 'crust "#111111")
+ (catppuccin-set-color 'overlay2 "#9B9B9B")
+ (catppuccin-set-color 'overlay1 "#858585")
+ (catppuccin-set-color 'overlay0 "#707070")
+ (catppuccin-set-color 'surface2 "#5C5C5C")
+ (catppuccin-set-color 'surface1 "#474747")
+ (catppuccin-set-color 'surface0 "#333333")
+ (catppuccin-reload)
+ (load-theme 'catppuccin t))
+
+ ;; Automatically match the titlebar to the theme
+ (use-package ns-auto-titlebar
+ :ensure t
+ :config
+ (when (eq system-type 'darwin) (ns-auto-titlebar-mode)))
+
+ ;; More readable modeline from DOOM Emacs
+ (use-package doom-modeline
+ :ensure t
+ :hook (after-init . doom-modeline-mode)
+ :config
+ (setq doom-modeline-height 0 ; minimum
+ doom-modeline-bar-width 0 ; disabled
+ doom-modeline-project-detection 'project ; use project.el
+ doom-modeline-buffer-state-icon nil
+ doom-modeline-highlight-modified-buffer-name nil
+ doom-modeline-percent-position nil
+ line-number-mode nil
+ doom-modeline-buffer-encoding nil
+ doom-modeline-time-live-icon nil
+ doom-modeline-time-icon nil
+ display-time-default-load-average nil
+ display-time-format "%a %d %b | %R"
+ helm-ag-show-status-function nil)) ;HACK: Doom Modeline asks for this but I don't use helm
+
+ ;; Icons for use with a nerd-font
+ (use-package nerd-icons
+ :ensure t
+ :if (display-graphic-p))
+
+ ;; Nerd Icons in the file manager
+ (use-package nerd-icons-dired
+ :ensure t
+ :after nerd-icons
+ :hook
+ (dired-mode . nerd-icons-dired-mode))
+
+ ;; Nerd Icons in the buffer menu
+ (use-package nerd-icons-ibuffer
+ :ensure t
+ :after nerd-icons
+ :hook (ibuffer-mode . nerd-icons-ibuffer-mode))
+
+ ;; Color brackets for visual grepping
+ (use-package rainbow-delimiters
+ :ensure t
+ :hook (prog-mode . rainbow-delimiters-mode))
+
+ ;; Highlight todo comments
+ (use-package hl-todo
+ :ensure t
+ :hook ((org-mode . hl-todo-mode)
+ (prog-mode . hl-todo-mode))
+ :config
+ (add-to-list 'hl-todo-keyword-faces '("ERROR" . "#8c5353")))
+
+ ;; Highlight large changes
+ (use-package goggles
+ :ensure t
+ :hook ((prog-mode text-mode) . goggles-mode)
+ :config
+ (setq-default goggles-pulse t))
+
+ ;; Nicer view to manager project.el projects
+ (use-package disproject
+ :ensure t
+ :after project
+ :bind (:map ctl-x-map
+ ("p" . disproject-dispatch)))
+
+ ;; Sort buffers by project in the buffer manager
+ (use-package ibuffer-project
+ :ensure t
+ :after project
+ :config
+ (add-hook
+ 'ibuffer-hook
+ (lambda ()
+ (setq ibuffer-filter-groups (ibuffer-project-generate-filter-groups))
+ (unless (eq ibuffer-sorting-mode 'project-file-relative)
+ (ibuffer-do-sort-by-project-file-relative))))
+ (keymap-global-set "C-x C-b" 'ibuffer))
+#+end_src
+
+** Functionality Packages
+#+begin_src emacs-lisp
+ ;; Move text up and down with a single keybind
+ (use-package move-text
+ :ensure t
+ :config
+ (keymap-global-set "M-p" 'move-text-up)
+ (keymap-global-set "M-n" 'move-text-down)
+ (defun indent-region-advice (&rest ignored)
+ (let ((deactivate deactivate-mark))
+ (if (region-active-p)
+ (indent-region (region-beginning) (region-end))
+ (indent-region (line-beginning-position) (line-end-position)))
+ (setq deactivate-mark deactivate)))
+
+ (advice-add 'move-text-up :after 'indent-region-advice)
+ (advice-add 'move-text-down :after 'indent-region-advice))
+
+ ;; Automatically insert matching delimiters and jump between them
+ (use-package smartparens
+ :ensure t
+ :hook (prog-mode text-mode markdown-mode)
+ :config
+ (require 'smartparens-config)
+ (sp-use-paredit-bindings))
+
+ ;; Undo across history and across revisions
+ (use-package undo-tree
+ :ensure t
+ :init
+ (global-undo-tree-mode 1)
+ :config
+ (setq undo-tree-auto-save-history t
+ undo-tree-history-directory-alist `(("." . ,(expand-file-name ".cache" user-emacs-directory)))))
+
+ ;; Insert accents with a menu
+ (use-package accent
+ :ensure t
+ :bind* (("C-'" . accent-menu))
+ :config
+ (setq accent-diacritics '((a (á ã â à)) ; só para Português
+ (e (é ê))
+ (i (í))
+ (o (ó õ ô))
+ (u (ú))
+ (c (ç))
+ (A (Á Ã Â À))
+ (E (É Ê))
+ (I (Í))
+ (O (Ó Õ Ô))
+ (U (Ú)))))
+
+ ;; Allow recursive expansion in the dired file-manager
+ (use-package dired-subtree
+ :ensure t
+ :after dired
+ :bind
+ (:map dired-mode-map
+ ("TAB" . (lambda () (interactive) (dired-subtree-toggle) (revert-buffer)))
+ ("<backtab>" . dired-subtree-remove))
+ :config
+ (setq dired-subtree-use-backgrounds nil))
+#+end_src
+
+* Advanced Package Configuration
+This configuration is for specific filetypes/languages and more advanced packages. It is sorted by module for easy enabling and disabling, and ordered by relevance to most modes.
+
+** Corfu Completion
+#+begin_src emacs-lisp
+ ;; Make completion matching much more powerful
+ (use-package orderless
+ :ensure t
+ :config
+ (setq completion-styles '(orderless basic)
+ completion-category-defaults nil
+ completion-category-overrides '((file (styles . (partial-completion)))
+ (eglot (styles . (orderless))))))
+
+ ;; Snippet expansion allows for powerful multi-stage completion
+ (use-package yasnippet
+ :ensure t
+ :hook (prog-mode . yas-minor-mode)
+ :bind
+ (("C-c y n" . yas-new-snippet)
+ ("C-c y v" . yas-visit-snippet-file)
+ ("C-c y i" . yas-insert-snippet))
+ :config
+ (yas-reload-all))
+
+ ;; Add some base snippets
+ (use-package yasnippet-snippets
+ :after yasnippet
+ :ensure t)
+
+ ;; Combiner for multiple completion backends
+ (use-package cape
+ :ensure t
+ :config
+ ;; TODO find out what the wrap buster actually does (caching or whatever)
+ (advice-add 'eglot-completion-at-point :around #'cape-wrap-buster))
+
+ (use-package yasnippet-capf
+ :ensure t
+ :after cape)
+
+ (defun eglot-capf-with-yasnippet ()
+ (setq-local completion-at-point-functions
+ (list
+ (cape-capf-super
+ #'eglot-completion-at-point
+ #'yasnippet-capf))))
+ (with-eval-after-load 'eglot
+ (add-hook 'eglot-managed-mode-hook #'eglot-capf-with-yasnippet))
+
+ ;; The fast completion menu
+ (use-package corfu
+ :ensure t
+ :hook ((prog-mode . corfu-mode)
+ (eshell-mode . corfu-mode))
+ :bind (:map corfu-map
+ ("TAB" . corfu-insert)
+ ("<tab>" . corfu-insert)
+ ("RET" . nil)
+ ("C-n" . corfu-next)
+ ("C-p" . corfu-previous)
+ ("C-g" . corfu-quit))
+ :config
+ (setq corfu-cycle t
+ corfu-auto t
+ corfu-auto-delay 0.2
+ corfu-preselect 'first
+ corfu-quit-at-boundary t
+ corfu-quit-no-match t
+ corfu-scroll-margin 5
+ corfu-tab-always-indent 'complete
+ corfu-preview-current nil
+ corfu-min-width 20
+ corfu-popupinfo-delay '(1.25 . 0.5)
+ corfu-on-exact-match nil)
+ (corfu-popupinfo-mode 1)
+ (with-eval-after-load 'savehist
+ (corfu-history-mode 1)
+ (add-to-list 'savehist-additional-variables 'corfu-history)))
+
+ (use-package nerd-icons-corfu
+ :ensure t
+ :after nerd-icons corfu
+ :config
+ (add-to-list 'corfu-margin-formatters #'nerd-icons-corfu-formatter))
+#+end_src
+
+** Miscellaneous Completion
+#+begin_src emacs-lisp
+ ;; Powerful minibuffer completion
+ (use-package vertico
+ :ensure t
+ :hook (after-init . vertico-mode)
+ :bind (:map vertico-map
+ ("DEL" . vertico-directory-delete-char)))
+
+ ;; Powerful completion replacements for various other emacs functions
+ (use-package consult
+ :ensure t
+ :bind (("M-g g" . consult-goto-line)
+ ("M-g M-g" . consult-goto-line)
+ ("C-c s" . consult-line))
+
+ :config
+ (which-key-add-key-based-replacements "C-c s" "search-lines"))
+
+ ;; Powerful completion replacements for find-style emacs functions
+ (use-package affe
+ :ensure t
+ :after consult
+ :bind (("C-c f f" . affe-find)
+ ("C-c f g" . affe-grep))
+ :init
+ (which-key-add-key-based-replacements "C-c f" "find-file")
+ (which-key-add-key-based-replacements "C-c f f" "find-fuzzy")
+ (which-key-add-key-based-replacements "C-c f g" "find-greppy"))
+
+ ;; Add descriptive annotations to minibuffer completions
+ (use-package marginalia
+ :ensure t
+ :after vertico
+ :config (marginalia-mode 1))
+
+ ;; Add nerd-font icons to completions in minibuffer
+ (use-package nerd-icons-completion
+ :ensure t
+ :after vertico marginalia
+ :hook
+ (marginalia-mode . nerd-icons-completion-marginalia-setup)
+ (after-init . nerd-icons-completion-mode))
+#+end_src
+
+** Eglot
+#+begin_src emacs-lisp
+ (use-package eglot
+ :ensure t
+ :after cape
+ :config
+ ;; Disable progress indicator in the modeline
+ (setq eglot-report-progress nil
+ eglot-extend-to-xref t))
+
+ ;; Use a rust binary to do lsp communication and then send results to emacs
+ ; Booster at https://github.com/blahgeek/emacs-lsp-booster
+ (use-package eglot-booster
+ :vc (:url "https://github.com/jdtsmith/eglot-booster.git")
+ :ensure t
+ :after eglot
+ :config
+ ;; Use emacs-30's built in JSON handler
+ (setq eglot-booster-io-only t)
+ (eglot-booster-mode))
+
+ ;; Jump to workspace symbols from the LSP with consult
+ (use-package consult-eglot
+ :ensure t
+ :after eglot)
+
+ ;; Install markdown support for eldoc
+ (use-package markdown-mode
+ :ensure t)
+
+ ;; Popup lsp documentation information in a floating box
+ (use-package eldoc-box
+ :ensure t)
+ ;; Follow markdown links inside eldoc boxes on selection
+ (defun markdown-follow-help-or-link-at-point-advice (orig-fun &rest args)
+ "Prefer to use the help-echo property as `browse-url' target."
+ (let* ((event-win (posn-window (event-start last-input-event)))
+ (help-echo (with-selected-frame (window-frame event-win)
+ (with-current-buffer (window-buffer event-win)
+ (get-text-property (point) 'help-echo))))
+ (help-is-url (url-type (url-generic-parse-url help-echo))))
+ (message "if %s (browse-url %S)" help-is-url help-echo)
+ (if help-is-url
+ (browse-url help-echo)
+ (apply orig-fun args))))
+ (advice-add 'markdown-follow-link-at-point :around #'markdown-follow-help-or-link-at-point-advice)
+
+ ;; Menu for eglot and related functions
+ (require 'transient)
+ (transient-define-prefix eglot-transient ()
+ "Transient menu for Eglot."
+ [["Server"
+ ("c" "Reconnect" eglot-reconnect)
+ ("q" "Shutdown" eglot-shutdown)
+ ("I" "Server Info" eglot-show-workspace-configuration)]
+ ["Navigation"
+ ("g" "Go to Definition" xref-find-definitions)
+ ("d" "Describe Thing at Point" eldoc-box-help-at-point)
+ ("D" "Go to Declaration" eglot-find-declaration)
+ ("i" "Go to Implementation" eglot-find-implementation)
+ ("f" "Find References" xref-find-references)
+ ("t" "Type Definition" eglot-find-typeDefinition)
+ ("s" "Search Symbols"
+ (lambda ()
+ (interactive)
+ (if (eq major-mode 'java-mode)
+ (call-interactively 'consult-eglot-jdt-symbols)
+ (call-interactively 'consult-eglot-symbols))))]
+ ["Code Actions"
+ ("a" "Code Actions" eglot-code-actions)
+ ("q" "Quick Fix" eglot-code-action-quickfix)
+ ("=" "Format Buffer" eglot-format-buffer)
+ ("o" "Organize Imports" eglot-code-action-organize-imports)
+ ("r" "Rename Symbol" eglot-rename)]
+ ["Diagnostics"
+ ("l" "List Diagnostics" flycheck-list-errors)
+ ("L" "Project Diagnostics" flymake-show-project-diagnostics)]]
+ (interactive)
+ (transient-setup 'eglot-transient))
+
+ (define-key eglot-mode-map (kbd "C-c l") #'eglot-transient)
+
+ ;; Display error and warning highlighting from eglot
+ (use-package flycheck
+ :ensure t
+ :config
+ (global-flycheck-mode 1))
+
+ (use-package flycheck-eglot
+ :ensure t
+ :after (flycheck eglot)
+ :custom (flycheck-eglot-exclusive nil)
+ :config
+ (global-flycheck-eglot-mode 1))
+#+end_src
+
+** Org Mode
+#+begin_src emacs-lisp
+ ;; Open source blocks in the current window
+ (setq org-src-window-setup 'current-window
+ ;; Don't confirm when evaluating a code block
+ org-confirm-babel-evaluate nil
+ ;; Make org documents more seamless by hiding markup
+ org-hide-emphasis-markers t)
+
+ ;; A nicer org-bullets for headers
+ (use-package org-superstar
+ :ensure t
+ :hook (org-mode . org-superstar-mode)
+ :custom
+ (org-superstar-remove-leading-stars t)
+ (org-superstar-headline-bullets-list
+ '("•" "•" "•" "•" "•")))
+
+ ;; Specify the variable font for org-mode text
+ (let* ((variable-tuple
+ (cond ((x-list-fonts "Google Sans") '(:font "Google Sans"))
+ ((x-family-fonts "Sans Serif") '(:family "Sans Serif"))
+ (nil (warn "Cannot find a Sans Serif Font. Install Google Sans."))))
+ (base-font-color (face-foreground 'default nil 'default))
+ (headline `(:inherit default :weight bold :foreground ,base-font-color)))
+
+ (custom-theme-set-faces
+ 'user
+ `(org-level-8 ((t (,@headline ,@variable-tuple))))
+ `(org-level-7 ((t (,@headline ,@variable-tuple))))
+ `(org-level-6 ((t (,@headline ,@variable-tuple))))
+ `(org-level-5 ((t (,@headline ,@variable-tuple))))
+ `(org-level-4 ((t (,@headline ,@variable-tuple :height 1.1))))
+ `(org-level-3 ((t (,@headline ,@variable-tuple :height 1.2))))
+ `(org-level-2 ((t (,@headline ,@variable-tuple :height 1.3))))
+ `(org-level-1 ((t (,@headline ,@variable-tuple :height 1.4))))
+ `(org-document-title ((t (,@headline ,@variable-tuple :height 1.6 :underline nil))))))
+
+ ;; Enable a non-monospace font for org documents
+ (add-hook 'org-mode-hook 'variable-pitch-mode)
+ ;; Enable line wrapping for org documents
+ (add-hook 'org-mode-hook 'visual-line-mode)
+ ;; Disable line numbers in org mode
+ (add-hook 'org-mode-hook (lambda () (display-line-numbers-mode -1)))
+
+ ;; Theme the fonts and styles for various org elements
+ (custom-theme-set-faces
+ 'user
+ '(org-block ((t (:inherit fixed-pitch))))
+ '(org-code ((t (:inherit (shadow fixed-pitch)))))
+ '(org-document-info-keyword ((t (:inherit (shadow fixed-pitch)))))
+ '(org-indent ((t (:inherit (org-hide fixed-pitch)))))
+ '(org-link ((t (:foreground "#89b4fa" :underline t))))
+ '(org-meta-line ((t (:inherit (font-lock-comment-face fixed-pitch)))))
+ '(org-property-value ((t (:inherit fixed-pitch))) t)
+ '(org-special-keyword ((t (:inherit (font-lock-comment-face fixed-pitch)))))
+ '(org-table ((t (:inherit fixed-pitch))))
+ '(org-tag ((t (:inherit (shadow fixed-pitch) :weight bold :height 0.8))))
+ '(org-verbatim ((t (:inherit (shadow fixed-pitch))))))
+
+ ;; Provides quick snippets for common org templates
+ ;(add-to-list 'org-modules 'org-tempo)
+ (require 'org-tempo)
+ ; FIXME: Won't enable for some reason,
+ ; figure out why, and make it lazy
+
+ ;; Open org mode links in current window
+ (setq org-link-frame-setup
+ '((file . find-file)
+ (wl . wl-other-frame)
+ (vm . vm-visit-folder-other-frame)
+ (gnus . gnus)))
+
+ (add-hook 'org-mode-hook (lambda () (electric-indent-local-mode -1)))
+#+end_src
+
+* Language Specific Configuration
+These are the configurations for specific programming languages that should be enabled or disabled based on what is needed at any time.
+
+** Lua
+#+begin_src emacs-lisp
+ (use-package lua-mode
+ :ensure t
+ :hook (lua-mode . eglot-ensure)
+ :config
+ ;; Use a 2 space indent level for formatting
+ (setq lua-indent-level 2
+ ;; Use lua 5.4 for documentation
+ lua-documentation-url "https://www.lua.org/manual/5.4/manual.html"))
+
+ ;; Settings for lua_ls
+ (setq-default eglot-workspace-configuration
+ `(:Lua
+ (:completion (:callSnippet "Replace")
+ :runtime (:version "Lua 5.4"
+ :path ["?.lua"
+ "?/init.lua"
+ "./stubs/?.lua"
+ "./stubs/?/init.lua"])
+ :workspace (:library [,(concat (getenv "HOME") "/.luarocks/share/lua/5.4")
+ "./stubs"])
+ :diagnostics (:enable t))))
+
+ ; TODO Try fix this only for lua-mode as that is where the bug is
+ (setq eglot-ignored-server-capabilities
+ '(:documentOnTypeFormattingProvider))
+#+end_src
+
+** Nix
+#+begin_src emacs-lisp
+ (use-package nix-mode
+ :ensure t
+ :mode "\\.nix\\'"
+ :config
+ (add-hook 'nix-mode-hook #'eglot-ensure t)
+ (add-to-list 'eglot-server-programs '(nix-mode . ("nil"))))
+#+end_src
+
+** COMMENT ZK
+#+begin_src emacs-lisp
+ (use-package tomlparse
+ :ensure t)
+
+ (use-package zk4e
+ :ensure t
+ :after tomlparse
+ :vc ( :url "https://codeberg.org/mcookly/zk4e"
+ :branch "main"
+ :rev :newest)
+ :config
+ (setq zk4e-notebook-directories '(("Notes" . "~/Documents/Notes")))
+ (zk4e-select-notebook "Notes"))
+#+end_src
+
+** Denote
+#+begin_src emacs-lisp
+ (use-package denote
+ :ensure t
+ :hook (dired-mode . denote-dired-mode)
+ :bind
+ (("C-c n n" . denote)
+ ("C-c n N" . denote-type)
+ ("C-c n r" . denote-rename-file)
+ ("C-c n l f" . denote-link)
+ ("C-c n b" . denote-backlinks)
+ ("C-c n g" . denote-grep))
+ :config
+ (setq denote-directory (expand-file-name "~/Documents/Denotes/"))
+ (denote-rename-buffer-mode 1))
+
+ (use-package consult-denote
+ :ensure t
+ :bind
+ (("C-c n f" . consult-denote-find)
+ ("C-c n g" . consult-denote-grep))
+ :config
+ (consult-denote-mode 1))
+
+ ; TODO: Denote Explore https://lucidmanager.org/productivity/denote-explore/
+
+ (use-package denote-menu
+ :ensure t
+ :bind
+ (("C-c n d" . list-denotes))
+ :config
+ (add-hook 'denote-menu-mode-hook (lambda () (display-line-numbers-mode -1))))
+
+ (use-package denote-org
+ :ensure t
+ :bind
+ (("C-c n l h" . denote-org-link-to-heading)))
+#+end_src
diff --git a/config/emacs/early-init.el b/config/emacs/early-init.el
new file mode 100644
index 0000000..8ba547e
--- /dev/null
+++ b/config/emacs/early-init.el
@@ -0,0 +1,9 @@
+;; GC Perfomance Tweaks from DOOM Emacs
+(setq gc-cons-threshold most-positive-fixnum
+ gc-cons-percentage 1.0)
+(add-hook 'emacs-startup-hook
+ (lambda ()
+ (setq gc-cons-threshold (* 128 1024 1024) ;; 128MB
+ gc-cons-percentage 1.0)))
+
+(setenv "LSP_USE_PLISTS" "true")
diff --git a/config/emacs/init.el b/config/emacs/init.el
new file mode 100644
index 0000000..e11d303
--- /dev/null
+++ b/config/emacs/init.el
@@ -0,0 +1,5 @@
+(setq vc-follow-symlinks t)
+(org-babel-load-file
+ (expand-file-name
+ "config.org"
+ user-emacs-directory))
diff --git a/config/nvim/lua/config/keymaps.lua b/config/nvim/lua/config/keymaps.lua
index f30283e..514a311 100644
--- a/config/nvim/lua/config/keymaps.lua
+++ b/config/nvim/lua/config/keymaps.lua
@@ -20,7 +20,7 @@ vim.keymap.set("n", "<leader>lf", vim.lsp.buf.format,
{ desc = "Format Document" })
vim.keymap.set("n", "<leader>lr", vim.lsp.buf.rename,
{ desc = "Rename" })
-vim.keymap.set("n", "<leader>le", function()
+vim.keymap.set("n", "<leader>lk", function()
vim.diagnostic.jump({ count = 1, float = true })
end,
{ desc = "Next Error" })
diff --git a/config/nvim/lua/config/options.lua b/config/nvim/lua/config/options.lua
index ba0bb5a..f7bc9d8 100644
--- a/config/nvim/lua/config/options.lua
+++ b/config/nvim/lua/config/options.lua
@@ -44,7 +44,7 @@ vim.opt.title = true
vim.opt.clipboard = "unnamedplus"
-vim.opt.colorcolumn = "80"
+-- vim.opt.colorcolumn = "80"
vim.opt.signcolumn = 'no'
@@ -55,7 +55,7 @@ vim.wo.fillchars='eob: '
vim.opt.conceallevel = 3
-- Window Borders
-vim.o.winborder = 'single'
+vim.o.winborder = 'rounded'
-- Remove Whitespaces on File Save
vim.api.nvim_create_autocmd({ "BufWritePre" }, {
diff --git a/config/nvim/lua/plugins/catppuccin.lua b/config/nvim/lua/plugins/catppuccin.lua
new file mode 100644
index 0000000..9b09225
--- /dev/null
+++ b/config/nvim/lua/plugins/catppuccin.lua
@@ -0,0 +1,15 @@
+return {
+ 'catppuccin/nvim',
+ name = 'catppuccin',
+ priority = 1000,
+ config = function()
+ require('catppuccin').setup({
+ flavour = 'mocha',
+ transparent_background = true,
+ float = {
+ transparent = true,
+ },
+ })
+ vim.cmd.colorscheme('catppuccin')
+ end,
+}
diff --git a/config/nvim/lua/plugins/image.lua b/config/nvim/lua/plugins/image.lua
index 32c3540..1ab0f9a 100644
--- a/config/nvim/lua/plugins/image.lua
+++ b/config/nvim/lua/plugins/image.lua
@@ -9,12 +9,12 @@ return {
enabled = true,
only_render_image_at_cursor = true,
only_render_image_at_cursor_mode = "popup", -- or "inline"
- floating_windows = true, -- if true, images will be rendered in floating markdown windows
+ floating_windows = true, -- if true, images will be rendered in floating markdown windows
},
},
window_overlap_clear_ft_ignore = { "cmp_menu", "cmp_docs" },
- editor_only_render_when_focused = true, -- auto show/hide images when the editor gains/looses focus
+ editor_only_render_when_focused = true, -- auto show/hide images when the editor gains/looses focus
})
- end
-
+ end,
+ build = false,
}
diff --git a/config/nvim/lua/plugins/lastplace.lua b/config/nvim/lua/plugins/lastplace.lua
deleted file mode 100644
index a393a90..0000000
--- a/config/nvim/lua/plugins/lastplace.lua
+++ /dev/null
@@ -1,7 +0,0 @@
-return {
- 'ethanholz/nvim-lastplace',
- config = function()
- require'nvim-lastplace'.setup({})
- end
-}
-
diff --git a/config/nvim/lua/plugins/modus-themes.lua b/config/nvim/lua/plugins/modus-themes.lua
deleted file mode 100644
index 3058078..0000000
--- a/config/nvim/lua/plugins/modus-themes.lua
+++ /dev/null
@@ -1,13 +0,0 @@
-return {
- "miikanissi/modus-themes.nvim",
- priority = 1000,
- config = function ()
- require("modus-themes").setup({
- style = "modus_vivendi",
- sign_column_background = false,
- line_nr_column_background = false,
- })
- vim.cmd.colorscheme("modus")
- end
-}
-
diff --git a/config/nvim/lua/plugins/remember.lua b/config/nvim/lua/plugins/remember.lua
new file mode 100644
index 0000000..911d9c6
--- /dev/null
+++ b/config/nvim/lua/plugins/remember.lua
@@ -0,0 +1,7 @@
+return {
+ 'vladdoster/remember.nvim',
+ config = function()
+ require'remember'.setup({})
+ end
+}
+
diff --git a/config/nvim/lua/plugins/render-markdown.lua b/config/nvim/lua/plugins/render-markdown.lua
index 9d52c5b..b87f8a1 100644
--- a/config/nvim/lua/plugins/render-markdown.lua
+++ b/config/nvim/lua/plugins/render-markdown.lua
@@ -104,8 +104,11 @@ return {
enabled = false,
},
heading = {
- width = 'block',
- }
+ icons = { ' ', ' ', ' ', ' ', ' ', ' ' },
+ backgrounds = {},
+ },
+ nested = false,
})
- end
+ end,
}
+
diff --git a/config/nvim/lua/plugins/scratch-buffer.lua b/config/nvim/lua/plugins/scratch-buffer.lua
deleted file mode 100644
index a6526ab..0000000
--- a/config/nvim/lua/plugins/scratch-buffer.lua
+++ /dev/null
@@ -1,11 +0,0 @@
-return {
- 'miguelcrespo/scratch-buffer.nvim',
- event = 'VimEnter',
- config = function()
- require('scratch-buffer').setup()
- end,
- dependencies = {
- -- Recommended if you want interactive evaluation
- "Olical/conjure"
- }
-}
diff --git a/config/nvim/lua/plugins/telescope.lua b/config/nvim/lua/plugins/telescope.lua
index e761994..7cfe5c5 100644
--- a/config/nvim/lua/plugins/telescope.lua
+++ b/config/nvim/lua/plugins/telescope.lua
@@ -3,9 +3,9 @@ return {
dependencies = { "nvim-lua/plenary.nvim" },
config = function()
require("telescope").setup({
- defaults = {
- borderchars = { "─", "│", "─", "│", "┌", "┐", "┘", "└" },
- },
+ -- defaults = {
+ -- borderchars = { "─", "│", "─", "│", "┌", "┐", "┘", "└" },
+ -- },
})
local tscope = require('telescope.builtin')
diff --git a/config/nvim/lua/plugins/which-key.lua b/config/nvim/lua/plugins/which-key.lua
new file mode 100644
index 0000000..c068002
--- /dev/null
+++ b/config/nvim/lua/plugins/which-key.lua
@@ -0,0 +1,17 @@
+return {
+ 'folke/which-key.nvim',
+ event = 'VeryLazy',
+ opts = {
+ icons = { mappings = false },
+ delay = 1000
+ },
+ keys = {
+ {
+ '<leader>?',
+ function()
+ require('which-key').show({ global = false })
+ end,
+ desc = 'Buffer Local Keymaps',
+ },
+ },
+}
diff --git a/config/nvim/lua/scripts/init.lua b/config/nvim/lua/scripts/init.lua
index f0e0f11..0933bb0 100644
--- a/config/nvim/lua/scripts/init.lua
+++ b/config/nvim/lua/scripts/init.lua
@@ -1,3 +1,4 @@
require("scripts.diagnostics").setup({
- keymap = "<leader>lh"
+ keymap = '<leader>le'
+ -- TODO: Find out how to which-key this
})
diff --git a/config/shell/alias b/config/shell/alias
index 84eab84..8c17329 100644
--- a/config/shell/alias
+++ b/config/shell/alias
@@ -7,3 +7,4 @@ alias diff='batdiff'
alias fzf="fzf --preview 'bat --style=numbers --color=always {}'"
alias vi="nvim"
alias vim="nvim"
+alias em="emacs -nw"
diff --git a/config/shell/vars b/config/shell/vars
index 601d79f..b74f722 100644
--- a/config/shell/vars
+++ b/config/shell/vars
@@ -3,4 +3,3 @@ export ZK_NOTEBOOK_DIR=$HOME/Documents/Notes
export XDG_CONFIG_HOME=$HOME/.config
export GOPATH=$HOME/.go
export LIMA_SHELL=/bin/zsh
-export LIMA_INSTANCE=alpine
diff --git a/config/starship/config.toml b/config/starship/config.toml
index 6165b64..d9cd4d2 100644
--- a/config/starship/config.toml
+++ b/config/starship/config.toml
@@ -5,6 +5,7 @@
add_newline = true
format = """
+${custom.linux}
$nix_shell\
$directory\
$git_branch\
@@ -21,6 +22,14 @@ $cmd_duration\
$line_break\
$character"""
+[custom.linux]
+format = '[$symbol \[$output\]]($style) '
+symbol = ' '
+command = "cat /etc/os-release | grep '^ID=' | sed 's/ID=//' | sed 's/^./\\U&/'"
+os = 'linux'
+style = 'bold #f5e0dc'
+when = true
+
[nix_shell]
format = '[$symbol]($style) '
symbol = ' '
@@ -84,8 +93,5 @@ success_symbol = '[](bold #a6e3a1)'
error_symbol = '[](bold #f38ba8)'
# TODO
-# - [container]
-# - [docker_context]
# - [direnv]
-# CONTINUE FROM HERE
diff --git a/home.nix b/home.nix
index 7607adc..49dd79a 100644
--- a/home.nix
+++ b/home.nix
@@ -1,16 +1,26 @@
{ config, lib, pkgs, ... }:
+let
+ emacsFlake = builtins.getFlake "github:nix-giant/nix-darwin-emacs/065050b9e06a30c01b41539b75464fff972fecd6";
+in
{
home.username = "venomade";
home.homeDirectory = "/Users/venomade";
home.packages = with pkgs; [
+
# Neovim
neovim
imagemagick
fzf
ripgrep
+ # Emacs
+ (emacsFlake.packages.${system}.emacs-30)
+
+ # Nix
+ nil
+
# Lua
lua-language-server
lua5_4
@@ -25,7 +35,8 @@
yazi
zk
lima
- ];
+
+ ];
programs.git = {
enable = true;
|