nixos-dotfiles

nixos-dotfiles

https://git.tonybtw.com/nixos-dotfiles.git git://git.tonybtw.com/nixos-dotfiles.git
7,619 bytes raw
1
;;; packages.el --- Package configuration -*- lexical-binding: t -*-
2
3
;;; evil mode (vim bindings)
4
(setq evil-want-keybinding nil)  ; required before loading evil-collection
5
(setq evil-search-module 'evil-search)  ; required for cgn
6
(setq evil-undo-system 'undo-redo)  ; use emacs 28+ native undo-redo
7
(rc/require 'evil 'evil-leader 'evil-collection 'evil-commentary)
8
(global-evil-leader-mode)
9
(evil-leader/set-leader "<SPC>")
10
(evil-mode 1)
11
(evil-collection-init)
12
(evil-commentary-mode 1)
13
14
;;; Vertico + Consult + Orderless (telescope-like fuzzy finding)
15
(rc/require 'vertico 'consult 'orderless 'marginalia 'vertico-posframe 'fzf 'affe)
16
(vertico-mode 1)
17
(vertico-posframe-mode 1)
18
(marginalia-mode 1)
19
(recentf-mode 1)
20
21
(setq vertico-posframe-parameters
22
      '((left-fringe . 8)
23
        (right-fringe . 8)))
24
(setq vertico-posframe-poshandler #'posframe-poshandler-frame-center)
25
26
(setq completion-styles '(orderless basic)
27
      completion-category-defaults nil
28
      completion-category-overrides '((file (styles . (partial-completion)))))
29
30
;; Flex matching (fzf-style: characters in sequence)
31
(setq orderless-matching-styles '(orderless-literal orderless-flex))
32
33
;; Affe (async fuzzy finder using orderless)
34
(setq affe-find-command "fd --color=never -t f")
35
36
(setq consult-fd-args '("fd" "--color=never" "--type" "f" "--hidden" "--follow" "--exclude" ".git"))
37
38
;; Live preview as you navigate
39
(setq consult-preview-key 'any)
40
41
;;; magit
42
(rc/require 'magit)
43
(setq magit-auto-revert-mode nil)
44
45
;;; multiple cursors
46
(rc/require 'multiple-cursors)
47
48
;;; Move Text
49
(rc/require 'move-text)
50
51
;;; Company (autocompletion)
52
(rc/require 'company)
53
(global-company-mode)
54
55
;;; Language modes
56
(rc/require 'nix-mode 'zig-mode 'rust-mode 'php-mode 'web-mode 'go-mode 'typescript-mode)
57
58
59
;;; Tree-sitter text objects (vif, vaf, vic, vac, etc.)
60
(rc/require 'tree-sitter 'tree-sitter-langs 'evil-textobj-tree-sitter)
61
(global-tree-sitter-mode)
62
(add-hook 'tree-sitter-after-on-hook #'tree-sitter-hl-mode)
63
(define-key evil-outer-text-objects-map "f" (evil-textobj-tree-sitter-get-textobj "function.outer"))
64
(define-key evil-inner-text-objects-map "f" (evil-textobj-tree-sitter-get-textobj "function.inner"))
65
(define-key evil-outer-text-objects-map "c" (evil-textobj-tree-sitter-get-textobj "class.outer"))
66
(define-key evil-inner-text-objects-map "c" (evil-textobj-tree-sitter-get-textobj "class.inner"))
67
68
;;; CSS color preview
69
(rc/require 'rainbow-mode)
70
(add-hook 'css-mode-hook 'rainbow-mode)
71
(add-hook 'php-mode-hook 'rainbow-mode)
72
(add-hook 'html-mode-hook 'rainbow-mode)
73
(add-hook 'js-mode-hook 'rainbow-mode)
74
(add-hook 'web-mode-hook 'rainbow-mode)
75
(add-hook 'scss-mode-hook 'rainbow-mode)
76
(add-hook 'conf-mode-hook 'rainbow-mode)
77
(add-hook 'toml-mode-hook 'rainbow-mode)
78
(add-hook 'yaml-mode-hook 'rainbow-mode)
79
(add-hook 'conf-toml-mode-hook 'rainbow-mode)
80
81
;;; Treesitter context (sticky function header)
82
(rc/require 'topsy)
83
(add-hook 'prog-mode-hook 'topsy-mode)
84
85
;;; Org mode
86
(rc/require 'org-superstar 'org-fancy-priorities)
87
88
(setq org-directory "~/org/")
89
(setq org-agenda-files '("~/repos/agendas/private.org"))
90
91
;; Pretty bullets
92
(add-hook 'org-mode-hook #'org-superstar-mode)
93
(setq org-superstar-headline-bullets-list '("◉" "●" "○" "◆" "●" "○" "◆"))
94
95
;; Priority icons
96
(add-hook 'org-mode-hook #'org-fancy-priorities-mode)
97
(setq org-fancy-priorities-list '("⚑" "▲" "»"))
98
99
;; Syntax highlighting in code blocks
100
(setq org-src-fontify-natively t
101
      org-src-tab-acts-natively t
102
      org-hide-block-startup nil
103
      org-src-preserve-indentation nil
104
      org-edit-src-content-indentation 0)
105
106
;; Hide emphasis markers (*bold*, /italic/, etc.)
107
(setq org-hide-emphasis-markers t)
108
109
;; Visual tweaks
110
(setq org-ellipsis " ▾")           ; nicer fold indicator
111
(setq org-startup-folded 'content) ; show headings on open
112
(add-hook 'org-mode-hook #'org-indent-mode) ; clean indentation
113
114
;; Make RET follow links and toggle checkboxes
115
(setq org-return-follows-link t)
116
117
;;; Org Present (presentation mode)
118
(rc/require 'org-present 'visual-fill-column)
119
120
(defun my/org-present-start ()
121
  ;; Smaller, more readable font scaling
122
  (setq-local face-remapping-alist
123
              '((default (:height 1.3) default)
124
                (header-line (:height 2.0) variable-pitch)
125
                (org-document-title (:height 1.5) org-document-title)
126
                (org-level-1 (:height 1.3) org-level-1)
127
                (org-level-2 (:height 1.2) org-level-2)
128
                (org-level-3 (:height 1.1) org-level-3)
129
                (org-code (:height 1.0) org-code)
130
                (org-block (:height 1.0) org-block)))
131
  ;; Center content
132
  (setq visual-fill-column-width 80)
133
  (setq visual-fill-column-center-text t)
134
  (visual-fill-column-mode 1)
135
  ;; Word wrap
136
  (visual-line-mode 1)
137
  ;; Hide UI
138
  (setq header-line-format " ")
139
  (display-line-numbers-mode 0)
140
  (org-display-inline-images))
141
142
(defun my/org-present-end ()
143
  (setq-local face-remapping-alist nil)
144
  (setq header-line-format nil)
145
  (visual-fill-column-mode 0)
146
  (visual-line-mode 0)
147
  (display-line-numbers-mode 1)
148
  (org-remove-inline-images))
149
150
(add-hook 'org-present-mode-hook #'my/org-present-start)
151
(add-hook 'org-present-mode-quit-hook #'my/org-present-end)
152
153
;;; LSP (eglot is built-in to Emacs 29+)
154
(require 'eglot)
155
(rc/require 'eldoc-box)
156
157
;; Auto-start LSP for these modes
158
(add-hook 'zig-mode-hook 'eglot-ensure)
159
(add-hook 'nix-mode-hook 'eglot-ensure)
160
(add-hook 'rust-mode-hook 'eglot-ensure)
161
(add-hook 'c-mode-hook 'eglot-ensure)
162
(add-hook 'php-mode-hook 'eglot-ensure)
163
(add-hook 'go-mode-hook 'eglot-ensure)
164
(add-hook 'typescript-mode-hook 'eglot-ensure)
165
(add-hook 'tsx-ts-mode-hook 'eglot-ensure)
166
167
;; LSP server configurations
168
(with-eval-after-load 'eglot
169
  ;; PHP
170
  (add-to-list 'eglot-server-programs
171
               '(php-mode . ("intelephense" "--stdio")))
172
  (add-to-list 'eglot-server-programs
173
               '(web-mode . ("intelephense" "--stdio")))
174
  ;; TypeScript/TSX (typescript-language-server)
175
  (add-to-list 'eglot-server-programs
176
               '(typescript-mode . ("typescript-language-server" "--stdio")))
177
  (add-to-list 'eglot-server-programs
178
               '(tsx-ts-mode . ("typescript-language-server" "--stdio"))))
179
180
;; File associations for TypeScript React
181
(add-to-list 'auto-mode-alist '("\\.tsx\\'" . tsx-ts-mode))
182
(add-to-list 'auto-mode-alist '("\\.ts\\'" . typescript-mode))
183
184
;; Go format on save
185
(add-hook 'go-mode-hook
186
          (lambda ()
187
            (add-hook 'before-save-hook 'eglot-format-buffer nil t)))
188
189
(add-hook 'web-mode-hook 'eglot-ensure)
190
191
192
;;; Direnv integration (loads devshell environment)
193
(rc/require 'envrc)
194
(envrc-global-mode)
195
196
;;; vterm (terminal emulator)
197
(rc/require 'vterm)
198
(defun rc/find-shell ()
199
  "Find a suitable shell, checking common locations."
200
  (or (getenv "SHELL")
201
      (seq-find #'file-executable-p
202
                '("/bin/bash"                      ; FHS standard
203
                  "/usr/bin/bash"                  ; Some distros
204
                  "/run/current-system/sw/bin/bash" ; NixOS
205
                  "/bin/sh"))                      ; Ultimate fallback
206
      "/bin/sh"))
207
(setq vterm-shell (rc/find-shell))
208
(setq vterm-kill-buffer-on-exit t)
209
210
;;; Theme
211
;; (rc/require-theme 'gruber-darker)
212
(rc/require 'doom-themes)
213
(load-theme 'doom-palenight t)
214
215
;;; Clean up modeline (hide minor modes)
216
(setq eldoc-minor-mode-string nil)
217
(setq company-lighter nil)
218
(setq-default abbrev-mode nil)
219
(with-eval-after-load 'flymake (setq flymake-mode-line-format nil))
220
(with-eval-after-load 'envrc (setq envrc-lighter nil))
221
(with-eval-after-load 'evil-commentary (setq evil-commentary-mode-lighter nil))