nix-config/modules/home/emacs/config/init.el
2024-08-12 19:53:56 -04:00

200 lines
6.5 KiB
EmacsLisp

; Catppuccin theme
(load-theme 'catppuccin :no-confirm)
; Doom modeline
(require 'doom-modeline)
(doom-modeline-mode 1)
; Set titlebar
(when (eq system-type 'darwin) (ns-auto-titlebar-mode))
; Set font
(set-frame-font "Maple Mono NF 16" nil t)
; Show line numbers
(add-hook 'prog-mode-hook 'display-line-numbers-mode)
(setq display-line-numbers-type 'relative)
; Change default indent size to 2 spaces
(setq-default indent-tabs-mode nil) ;; Use spaces instead of tabs
(setq-default standard-indent 2) ;; Change indent
(setq-default tab-width 2) ;; Change tab width
; Vim-like Scrolling
(setq scroll-step 3)
(setq scroll-margin 3)
(setq scroll-conservatively 9999)
; Evil mode
(setq evil-want-C-u-scroll t)
(require 'evil)
(evil-mode 1)
;; Treemacs (+ evil mode support)
(require 'treemacs)
(require 'treemacs-evil) ; Optional: if you want Evil keybindings for Treemacs
;; Evil leader
(global-evil-leader-mode)
(evil-leader/set-leader "<SPC>")
(evil-leader/set-key "e" 'treemacs)
;; Centered scrolling
(defun my/evil-scroll-up ()
"Scroll up half a screen and center the line."
(interactive)
(evil-scroll-up nil)
(recenter))
(defun my/evil-scroll-down ()
"Scroll down half a screen and center the line."
(interactive)
(evil-scroll-down nil)
(recenter))
(define-key evil-normal-state-map (kbd "C-u") 'my/evil-scroll-up)
(define-key evil-normal-state-map (kbd "C-d") 'my/evil-scroll-down)
; Disable unnecessary bars
(menu-bar-mode -1)
(scroll-bar-mode -1)
(tool-bar-mode -1)
; Dashboard
(require 'dashboard)
(dashboard-setup-startup-hook)
(setq dashboard-startup-banner 'logo)
; Direnv
(direnv-mode)
; Nix setup
(require 'nix-mode)
(add-to-list 'auto-mode-alist '("\\.nix\\'" . nix-mode))
(add-to-list 'interpreter-mode-alist '("nix" . nix-mode))
; Lua setup
(require 'lua-mode)
(add-to-list 'auto-mode-alist '("\\.lua$" . lua-mode))
(add-to-list 'interpreter-mode-alist '("lua" . lua-mode))
; Tree-sitter setup
(require 'treesit)
(require 'tree-sitter-langs)
(require 'treesit-auto)
(global-treesit-auto-mode)
(add-hook 'prog-mode-hook #'tree-sitter-mode)
(add-hook 'prog-mode-hook #'tree-sitter-hl-mode)
;; Use Tree-sitter for better syntax highlighting
(dolist (lang treesit-language-source-alist)
(let ((mode (intern (format "%s-ts-mode" (car lang)))))
(when (fboundp mode)
(add-to-list 'major-mode-remap-alist
(cons (intern (car lang)) mode)))))
; Eglot setup
(add-hook 'prog-mode-hook 'eglot-ensure)
(add-hook 'nix-mode-hook 'eglot-ensure)
;; Function to format the buffer using Eglot
(defun my/eglot-format-buffer-on-save ()
"Format the current buffer if Eglot is active."
(when (bound-and-true-p eglot--managed-p)
(eglot-format-buffer)))
;; Add the function to the save-hook
(add-hook 'before-save-hook #'my/eglot-format-buffer-on-save)
; Flycheck setup
(require 'flycheck)
(flycheck-mode . sideline-mode)
(require 'sideline-flycheck)
(flycheck-mode . sideline-flycheck-setup)
; Key bindings for company mode
(setq company-idle-delay 0.2) ; Start completion after a short delay
(setq company-minimum-prefix-length 1) ; Start completion after typing 1 character
(setq company-show-numbers t) ; Show numbers for completion candidates
(global-set-key (kbd "M-/") 'company-complete) ; Trigger completion manually with M-/
(defun my/compile-and-focus-treemacs ()
"Run `compile` and focus on the project root in `Treemacs`."
(interactive)
(let ((default-directory (project-root (project-current t))))
(compile (read-shell-command "Compile command: " (concat (or compile-command "make") " ")))
(treemacs-select-window)))
(global-set-key (kbd "C-c C-c") 'my/compile-and-focus-treemacs)
; Ligatures
(setq maple-ligatures
'(;; coding ligatures
"==" "===" "!=" "=/=" "!==" ">=" "<=" "<<<"
"->" "=>" "-->" "==>" "<->" "<=>" "<==>"
"->>" "-<<" "=<<" ">>=" ">>-" "<<-" "<-<"
"</" "/>" "<>" "</>" "<!--" "<--" "-<"
"|>" "||>" "|||>" "<|>" ">=>" "=>>" "<|"
"<||" "<|||" "<<=" ">-" "<-" "++" "--"
"&&" "||" "!!" "??" ".." "::" "##" "###"
"####" "#####" "######" "#_(" "|->" ">->"
"<==" "<=<" "<~>" "<~~" "~~>" "-~" ".="
"#_" "<~" "~-" "~@" "~>" "~~" "---" "..."
"{|" "[|" ":::" "::=" ":=" ":>" ":<" "!!!"
"?." "?:" "***" "*/" "/*" "//" "/**" "///"
"|}" "|]" "+++" "+>" "=:=" "=!=" ">:" ">>"
">>>" "<:" "<*" "<*>" "<$>" "<+" "<+>" "<<"
;; misc. ligatures
"[TODO]" "TODO))" "todo))" "[FIXME]" "FIXME))" "fixme))"
"[TRACE]" "[DEBUG]" "[INFO]" "[WARN]" "[ERROR]" "[FATAL]"))
(ligature-set-ligatures 'prog-mode maple-ligatures)
(global-ligature-mode t)
; Codeium
(add-to-list 'completion-at-point-functions #'codeium-completion-at-point)
(setq use-dialog-box nil) ;; do not use popup boxes
;; if you don't want to use customize to save the api-key
;; (setq codeium/metadata/api_key "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")
;; get codeium status in the modeline
(setq codeium-mode-line-enable
(lambda (api) (not (memq api '(CancelRequest Heartbeat AcceptCompletion)))))
(add-to-list 'mode-line-format '(:eval (car-safe codeium-mode-line)) t)
;; use M-x codeium-diagnose to see apis/fields that would be sent to the local language server
(setq codeium-api-enabled
(lambda (api)
(memq api '(GetCompletions Heartbeat CancelRequest GetAuthToken RegisterUser auth-redirect AcceptCompletion))))
;; You can overwrite all the codeium configs!
;; for example, we recommend limiting the string sent to codeium for better performance
(defun my-codeium/document/text ()
(buffer-substring-no-properties (max (- (point) 3000) (point-min)) (min (+ (point) 1000) (point-max))))
;; if you change the text, you should also change the cursor_offset
;; warning: this is measured by UTF-8 encoded bytes
(defun my-codeium/document/cursor_offset ()
(codeium-utf8-byte-length
(buffer-substring-no-properties (max (- (point) 3000) (point-min)) (point))))
(setq codeium/document/text 'my-codeium/document/text)
(setq codeium/document/cursor_offset 'my-codeium/document/cursor_offset)
; Corfu mode setup
(require 'corfu)
(global-corfu-mode) ; Enable Corfu mode globally
(setq corfu-auto t)
(defun corfu-codeium-completion-at-point ()
"Completion at point with codeium using corfu."
(when (and (bound-and-true-p codeium-mode)
(or (not (bound-and-true-p corfu-mode))
corfu-mode))
(codeium--completion-at-point)))
;; Add corfu-codeium-completion-at-point to the completion-at-point-functions
(add-hook 'completion-at-point-functions #'corfu-codeium-completion-at-point)