mirror of
https://github.com/callumio/nixfiles.git
synced 2026-08-06 20:49:17 +01:00
emacs config
This commit is contained in:
parent
8229eb8fba
commit
83290b46f7
9 changed files with 538 additions and 266 deletions
95
modules/aspects/emacs/default.nix
Normal file
95
modules/aspects/emacs/default.nix
Normal file
|
|
@ -0,0 +1,95 @@
|
|||
{ inputs, ... }:
|
||||
{
|
||||
perSystem =
|
||||
{ inputs', ... }:
|
||||
let
|
||||
# pkgs' = pkgs.unstable;
|
||||
pkgs' = inputs'.unstable.legacyPackages;
|
||||
tangledConfig = pkgs'.runCommand "init.el" { buildInputs = [ pkgs'.emacs-nox ]; } ''
|
||||
emacs --batch \
|
||||
--eval "(require 'ob-tangle)" \
|
||||
--eval "(org-babel-tangle-file \"${./init.org}\" \"$out\" \"emacs-lisp\")"
|
||||
'';
|
||||
in
|
||||
{
|
||||
packages.emacs-c = inputs.nix-wrapper-modules.wrappers.emacs.wrap {
|
||||
pkgs = pkgs';
|
||||
package = pkgs'.emacs-pgtk;
|
||||
|
||||
emacsPackages =
|
||||
epkgs: with epkgs; [
|
||||
evil
|
||||
evil-collection
|
||||
evil-surround
|
||||
evil-commentary
|
||||
activities
|
||||
general
|
||||
which-key
|
||||
vertico
|
||||
orderless
|
||||
corfu
|
||||
magit
|
||||
consult
|
||||
marginalia
|
||||
nerd-icons-completion
|
||||
dirvish
|
||||
eglot
|
||||
consult-eglot
|
||||
eldoc-box
|
||||
cape
|
||||
|
||||
indent-bars
|
||||
rainbow-delimiters
|
||||
|
||||
rust-mode
|
||||
go-mode
|
||||
nix-mode
|
||||
markdown-mode
|
||||
|
||||
doom-themes
|
||||
flyover
|
||||
|
||||
diff-hl
|
||||
mood-line
|
||||
|
||||
org-modern
|
||||
envrc
|
||||
|
||||
eglot-booster
|
||||
|
||||
ghostel # FIX: wait for https://github.com/melpa/melpa/pull/9949 AND https://github.com/dakra/ghostel/issues/76
|
||||
|
||||
(treesit-grammars.with-grammars (
|
||||
g: with g; [
|
||||
tree-sitter-rust
|
||||
tree-sitter-yaml
|
||||
tree-sitter-dockerfile
|
||||
]
|
||||
))
|
||||
];
|
||||
|
||||
extraPackages = with pkgs'; [
|
||||
fd
|
||||
ripgrep
|
||||
nixfmt
|
||||
rust-analyzer
|
||||
clang-tools
|
||||
nil
|
||||
pyright
|
||||
gopls
|
||||
emacs-lsp-booster
|
||||
];
|
||||
|
||||
earlyConfigFile = builtins.readFile ./early-init.el;
|
||||
configFile = builtins.readFile tangledConfig;
|
||||
userDirectory = "~/.emacs.d";
|
||||
};
|
||||
};
|
||||
|
||||
flake.homeManagerModules.emacs =
|
||||
{ pkgs, ... }:
|
||||
{
|
||||
home.packages = [ pkgs.emacs-c ];
|
||||
# TODO: service for emacs daemon
|
||||
};
|
||||
}
|
||||
11
modules/aspects/emacs/early-init.el
Normal file
11
modules/aspects/emacs/early-init.el
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
;; Defer GC during startup
|
||||
(setq gc-cons-threshold most-positive-fixnum)
|
||||
(add-hook 'emacs-startup-hook
|
||||
(lambda () (setq gc-cons-threshold (* 16 1024 1024))))
|
||||
|
||||
;; Disable before frame init
|
||||
(setq default-frame-alist
|
||||
'((tool-bar-lines . 0)
|
||||
(menu-bar-lines . 0)
|
||||
(vertical-scroll-bars . nil)
|
||||
(horizontal-scroll-bars . nil)))
|
||||
366
modules/aspects/emacs/init.org
Normal file
366
modules/aspects/emacs/init.org
Normal file
|
|
@ -0,0 +1,366 @@
|
|||
#+TITLE: C's Emacs Config
|
||||
#+PROPERTY: header-args:emacs-lisp :lexical t
|
||||
|
||||
* Core
|
||||
#+begin_src emacs-lisp
|
||||
(setq inhibit-startup-message t
|
||||
ring-bell-function 'ignore
|
||||
make-backup-files nil
|
||||
auto-save-default nil
|
||||
display-line-numbers-type 'relative
|
||||
sentence-end-double-space nil
|
||||
require-final-newline t
|
||||
truncate-lines t
|
||||
use-short-answers t
|
||||
jit-lock-defer-time 0
|
||||
fast-but-imprecise-scrolling nil
|
||||
jit-lock-stealth-time 1
|
||||
jit-lock-stealth-nice 0.1
|
||||
scroll-margin 8
|
||||
scroll-conservatively 101)
|
||||
|
||||
(setq-default tab-width 2
|
||||
indent-tabs-mode nil)
|
||||
|
||||
(xterm-mouse-mode 1)
|
||||
(global-display-line-numbers-mode)
|
||||
(electric-pair-mode)
|
||||
(use-package envrc
|
||||
:hook (after-init . envrc-global-mode))
|
||||
#+end_src
|
||||
|
||||
* Org
|
||||
#+begin_src emacs-lisp
|
||||
(use-package org
|
||||
:custom
|
||||
(org-src-fontify-natively t)
|
||||
(org-src-tab-acts-natively t)
|
||||
(org-edit-src-content-indentation 0)
|
||||
(org-src-preserve-indentation t)
|
||||
:hook (org-mode . (lambda ()
|
||||
(display-line-numbers-mode -1)
|
||||
(variable-pitch-mode 1)))
|
||||
:config
|
||||
(custom-theme-set-faces 'user
|
||||
'(org-block ((t (:inherit fixed-pitch))))
|
||||
'(org-code ((t (:inherit fixed-pitch))))
|
||||
'(org-table ((t (:inherit fixed-pitch))))
|
||||
'(org-verbatim ((t (:inherit fixed-pitch))))))
|
||||
|
||||
(use-package org-modern
|
||||
:config (global-org-modern-mode))
|
||||
#+end_src
|
||||
|
||||
* Evil
|
||||
#+begin_src emacs-lisp
|
||||
(use-package evil
|
||||
:init
|
||||
(setq evil-want-integration t
|
||||
evil-want-keybinding nil
|
||||
evil-want-C-u-scroll t
|
||||
evil-want-C-i-jump t
|
||||
evil-undo-system 'undo-redo
|
||||
evil-vsplit-window-right t
|
||||
evil-split-window-below t)
|
||||
:config (evil-mode 1))
|
||||
|
||||
(use-package evil-collection
|
||||
:after evil
|
||||
:config (evil-collection-init))
|
||||
|
||||
(use-package evil-surround
|
||||
:after evil
|
||||
:config (global-evil-surround-mode 1))
|
||||
|
||||
(use-package evil-commentary
|
||||
:after evil
|
||||
:config (evil-commentary-mode))
|
||||
#+end_src
|
||||
|
||||
* Completion
|
||||
#+begin_src emacs-lisp
|
||||
(use-package vertico
|
||||
:config (vertico-mode))
|
||||
|
||||
(use-package orderless
|
||||
:custom
|
||||
(completion-styles '(orderless basic))
|
||||
(completion-category-overrides '((file (styles basic partial-completion))))
|
||||
(orderless-component-separator "[ /]")
|
||||
(orderless-matching-styles
|
||||
'(orderless-literal
|
||||
orderless-regexp
|
||||
orderless-initialism
|
||||
orderless-flex)))
|
||||
|
||||
(use-package marginalia
|
||||
:config (marginalia-mode))
|
||||
|
||||
(use-package consult
|
||||
:custom
|
||||
(consult-project-function #'consult--default-project-function)
|
||||
(consult-narrow-key "<"))
|
||||
|
||||
(use-package nerd-icons-completion
|
||||
:after marginalia
|
||||
:config (nerd-icons-completion-mode))
|
||||
|
||||
(use-package corfu
|
||||
:custom
|
||||
(corfu-auto t)
|
||||
(corfu-cycle t)
|
||||
:config (global-corfu-mode))
|
||||
|
||||
(use-package cape
|
||||
:init
|
||||
(add-to-list 'completion-at-point-functions #'cape-file)
|
||||
(add-to-list 'completion-at-point-functions #'cape-dabbrev))
|
||||
#+end_src
|
||||
|
||||
* UI
|
||||
#+begin_src emacs-lisp
|
||||
(use-package which-key
|
||||
:config (which-key-mode))
|
||||
|
||||
(use-package doom-themes
|
||||
:config (load-theme 'doom-one t))
|
||||
|
||||
(use-package mood-line
|
||||
:config (mood-line-mode))
|
||||
|
||||
(use-package rainbow-delimiters
|
||||
:hook (prog-mode . rainbow-delimiters-mode))
|
||||
|
||||
(use-package indent-bars
|
||||
:hook (prog-mode . indent-bars-mode))
|
||||
|
||||
(use-package tab-bar
|
||||
:custom
|
||||
(tab-bar-mode)
|
||||
(tab-bar-show 1)
|
||||
(tab-bar-new-tab-choice "*scratch")
|
||||
(tab-bar-close-button-show nil)
|
||||
(tab-bar-new-button-show nil))
|
||||
|
||||
#+end_src
|
||||
|
||||
* Files
|
||||
#+begin_src emacs-lisp
|
||||
(use-package dirvish
|
||||
:custom
|
||||
(dirvish-quick-access-entries
|
||||
'(("h" "~/" "Home")
|
||||
("d" "~/Downloads" "Downloads")))
|
||||
:config (dirvish-override-dired-mode))
|
||||
(use-package project
|
||||
:custom
|
||||
(project-switch-commands
|
||||
'((project-find-file "Find file" ?f)
|
||||
(consult-ripgrep "Search" ?g)
|
||||
(project-dired "Dired" ?d)
|
||||
(magit-project-status "Magit" ?m)
|
||||
(project-eshell "Eshell" ?e))))
|
||||
#+end_src
|
||||
|
||||
* Activities
|
||||
#+begin_src emacs-lisp
|
||||
(use-package activities
|
||||
:init (activities-mode)
|
||||
:config (activities-tabs-mode)
|
||||
:custom
|
||||
(activities-bookmark-store t)
|
||||
(activities-kill-buffers t)
|
||||
(activities-anti-save-predicates
|
||||
'(minibufferp
|
||||
(lambda () (string-match-p "^\\*scratch\\*" (buffer-name)))
|
||||
(lambda () (string-match-p "^\\*Messages\\*" (buffer-name)))
|
||||
(lambda () (string-match-p "^\\*Help\\*" (buffer-name)))
|
||||
(lambda () (string-match-p "^ " (buffer-name))))))
|
||||
|
||||
(defun my/project-switch-activity ()
|
||||
"Switch to a project, resuming its activity or creating one."
|
||||
(interactive)
|
||||
(let* ((project (project-prompt-project-dir))
|
||||
(path (expand-file-name project))
|
||||
(name (file-name-nondirectory (directory-file-name path)))
|
||||
(existing (alist-get name activities-activities nil nil #'equal)))
|
||||
(if existing
|
||||
(activities-resume existing :resetp nil)
|
||||
(let ((default-directory path))
|
||||
(activities-new name)
|
||||
(project-switch-project path)))))
|
||||
#+end_src
|
||||
|
||||
* LSP
|
||||
#+begin_src emacs-lisp
|
||||
(use-package rust-mode
|
||||
:init
|
||||
(setq rust-mode-treesitter-derive t)
|
||||
:custom
|
||||
(rust-format-on-save nil)
|
||||
(rust-format-show-buffer nil)
|
||||
(rust-format-goto-problem nil))
|
||||
(use-package eglot
|
||||
:custom
|
||||
(eglot-autoshutdown t)
|
||||
(eglot-confirm-server-edits nil)
|
||||
:hook
|
||||
((rust-mode rust-ts-mode
|
||||
c-mode c-ts-mode
|
||||
c++-mode c++-ts-mode
|
||||
python-mode python-ts-mode
|
||||
go-mode go-ts-mode
|
||||
nix-mode nix-ts-mode) . eglot-ensure)
|
||||
(eglot-managed-mode . eglot-inlay-hints-mode)
|
||||
(eglot-managed-mode . (lambda ()
|
||||
(add-hook 'before-save-hook #'eglot-format-buffer nil t))))
|
||||
|
||||
(use-package eglot-booster
|
||||
:after eglot
|
||||
:config (eglot-booster-mode))
|
||||
|
||||
(use-package eldoc-box
|
||||
:after eglot
|
||||
:custom
|
||||
(eldoc-echo-area-prefer-doc-buffer 'maybe)
|
||||
(eldoc-echo-area-use-multiline-p nil)
|
||||
(eldoc-message-function #'ignore))
|
||||
|
||||
(eldoc-mode -1)
|
||||
(add-hook 'prog-mode-hook
|
||||
(lambda ()
|
||||
(add-hook 'before-save-hook #'delete-trailing-whitespace nil t)))
|
||||
|
||||
(add-to-list 'auto-mode-alist '("\\.ya?ml\\'" . yaml-ts-mode))
|
||||
(add-to-list 'auto-mode-alist '("/\\(?:Docker\\|Container\\)file\\(?:\\..*\\)?\\'" . dockerfile-ts-mode))
|
||||
(add-to-list 'auto-mode-alist '("\\.dockerfile\\'" . dockerfile-ts-mode))
|
||||
(add-to-list 'auto-mode-alist '("\\.containerfile\\'" . dockerfile-ts-mode))
|
||||
#+end_src
|
||||
|
||||
* Diagnostics
|
||||
#+begin_src emacs-lisp
|
||||
(use-package flyover
|
||||
:hook (flymake-mode . flyover-mode)
|
||||
:custom
|
||||
(flyover-levels '(error warning info))
|
||||
(flyover-use-theme-colors t)
|
||||
(flyover-background-lightness 45)
|
||||
(flyover-checkers '(flymake))
|
||||
(flyover-wrap-messages t)
|
||||
(flyover-max-line-length 80)
|
||||
(flyover-info-icon "")
|
||||
(flyover-warning-icon "")
|
||||
(flyover-error-icon "")
|
||||
(flyover-virtual-line-type 'straight-arrow)
|
||||
(flyover-show-virtual-line t)
|
||||
(flyover-hide-checker-name t))
|
||||
#+end_src
|
||||
|
||||
* Git
|
||||
#+begin_src emacs-lisp
|
||||
(use-package magit)
|
||||
|
||||
(use-package diff-hl
|
||||
:config
|
||||
(global-diff-hl-mode)
|
||||
(diff-hl-flydiff-mode)
|
||||
:hook
|
||||
(magit-pre-refresh . diff-hl-magit-pre-refresh)
|
||||
(magit-post-refresh . diff-hl-magit-post-refresh))
|
||||
#+end_src
|
||||
|
||||
* Keybinds
|
||||
#+begin_src emacs-lisp
|
||||
(use-package general
|
||||
:config
|
||||
(general-create-definer leader
|
||||
:states '(normal visual)
|
||||
:keymaps 'override
|
||||
:prefix "SPC")
|
||||
|
||||
(general-define-key
|
||||
:states 'normal
|
||||
:keymaps 'override
|
||||
"gd" 'xref-find-definitions
|
||||
"gD" 'xref-find-declarations
|
||||
"gr" 'xref-find-references
|
||||
"K" (lambda () (interactive) (eldoc nil) (eldoc-box-help-at-point)))
|
||||
|
||||
(leader
|
||||
"SPC" '(project-find-file :which-key "find file in project")
|
||||
"." '(find-file :which-key "find file")
|
||||
":" '(execute-extended-command :which-key "M-x")
|
||||
|
||||
;; buffers
|
||||
"b" '(:ignore t :which-key "buffer")
|
||||
"bb" '(consult-project-buffer :which-key "project buffers")
|
||||
"bB" '(consult-buffer :which-key "all buffers")
|
||||
"bd" '(kill-this-buffer :which-key "kill")
|
||||
"bn" '(next-buffer :which-key "next")
|
||||
"bp" '(previous-buffer :which-key "prev")
|
||||
|
||||
;; files
|
||||
"f" '(:ignore t :which-key "file")
|
||||
"ff" '(project-find-file :which-key "find file (project)")
|
||||
"fF" '(find-file :which-key "find file")
|
||||
"fr" '(consult-recent-file :which-key "recent")
|
||||
"fs" '(save-buffer :which-key "save")
|
||||
"-" '(dirvish-dwim :which-key "dirvish")
|
||||
|
||||
;; project
|
||||
"p" '(:ignore t :which-key "project")
|
||||
"pp" '(my/project-switch-activity :which-key "switch")
|
||||
"pf" '(project-find-file :which-key "find file")
|
||||
"pb" '(consult-project-buffer :which-key "buffers")
|
||||
"pd" '(project-dired :which-key "dired")
|
||||
"pe" '(project-eshell :which-key "eshell")
|
||||
"pk" '(project-kill-buffers :which-key "kill buffers")
|
||||
"pc" '(project-compile :which-key "compile")
|
||||
|
||||
;; activities
|
||||
"a" '(:ignore t :which-key "activity")
|
||||
"aa" '(activities-resume :which-key "resume")
|
||||
"as" '(activities-suspend :which-key "suspend")
|
||||
"ak" '(activities-kill :which-key "kill")
|
||||
"al" '(activities-list :which-key "list")
|
||||
"ar" '(activities-revert :which-key "revert")
|
||||
"aS" '(activities-save :which-key "save")
|
||||
|
||||
;; tabs
|
||||
"TAB" '(:ignore t :which-key "tab")
|
||||
"TAB TAB" '(tab-switch :which-key "switch")
|
||||
"TAB l" '(tab-next :which-key "next")
|
||||
"TAB h" '(tab-previous :which-key "prev")
|
||||
"TAB n" '(my/project-switch-activity :which-key "new")
|
||||
"TAB d" '(activities-suspend :which-key "close")
|
||||
|
||||
;; search
|
||||
"s" '(:ignore t :which-key "search")
|
||||
"ss" '(consult-line :which-key "buffer")
|
||||
"sp" '(consult-ripgrep :which-key "project")
|
||||
"si" '(consult-imenu :which-key "symbol")
|
||||
|
||||
;; git
|
||||
"g" '(:ignore t :which-key "git")
|
||||
"gg" '(magit-status :which-key "status")
|
||||
"gb" '(magit-blame :which-key "blame")
|
||||
|
||||
;; code (LSP)
|
||||
"c" '(:ignore t :which-key "code")
|
||||
"cf" '(eglot-format-buffer :which-key "format")
|
||||
"cr" '(eglot-rename :which-key "rename")
|
||||
"ca" '(eglot-code-actions :which-key "actions")
|
||||
"cd" '(consult-flymake :which-key "diagnostics")
|
||||
|
||||
;; window
|
||||
"w" '(:ignore t :which-key "window")
|
||||
"wv" '(split-window-right :which-key "vsplit")
|
||||
"ws" '(split-window-below :which-key "hsplit")
|
||||
"wd" '(delete-window :which-key "close")
|
||||
"wo" '(delete-other-windows :which-key "only")
|
||||
|
||||
;; quit
|
||||
"q" '(:ignore t :which-key "quit")
|
||||
"qq" '(save-buffers-kill-emacs :which-key "save and quit")
|
||||
"qQ" '(kill-emacs :which-key "force quit")))
|
||||
#+end_src
|
||||
Loading…
Add table
Add a link
Reference in a new issue