;; use elpaca.el for package management ;; ;; load envs (exec-path-from-shell) ;; ;; general.el ;; SPC, like in DOOM ;; vertico config ;; lsp-mode? or eglot ;; C, C++ ;; Rust ;; VHDL, Verilog ;; Nix ;; Company, Vertico ;; Elpaca setup ;; TODO: put to conditions, etc. (eval-and-compile (defmacro my-use-package (&rest body) "Passes BODY to `use-package' and call it at comptime and runtime." (declare (indent defun)) `(eval-and-compile ,(cons 'use-package body)))) (defvar elpaca-installer-version 0.7) (defvar elpaca-directory (expand-file-name "elpaca/" user-emacs-directory)) (defvar elpaca-builds-directory (expand-file-name "builds/" elpaca-directory)) (defvar elpaca-repos-directory (expand-file-name "repos/" elpaca-directory)) (defvar elpaca-order '(elpaca :repo "https://github.com/progfolio/elpaca.git" :ref nil :depth 1 :files (:defaults "elpaca-test.el" (:exclude "extensions")) :build (:not elpaca--activate-package))) (let* ((repo (expand-file-name "elpaca/" elpaca-repos-directory)) (build (expand-file-name "elpaca/" elpaca-builds-directory)) (order (cdr elpaca-order)) (default-directory repo)) (add-to-list 'load-path (if (file-exists-p build) build repo)) (unless (file-exists-p repo) (make-directory repo t) (when (< emacs-major-version 28) (require 'subr-x)) (condition-case-unless-debug err (if-let ((buffer (pop-to-buffer-same-window "*elpaca-bootstrap*")) ((zerop (apply #'call-process `("git" nil ,buffer t "clone" ,@(when-let ((depth (plist-get order :depth))) (list (format "--depth=%d" depth) "--no-single-branch")) ,(plist-get order :repo) ,repo)))) ((zerop (call-process "git" nil buffer t "checkout" (or (plist-get order :ref) "--")))) (emacs (concat invocation-directory invocation-name)) ((zerop (call-process emacs nil buffer nil "-Q" "-L" "." "--batch" "--eval" "(byte-recompile-directory \".\" 0 'force)"))) ((require 'elpaca)) ((elpaca-generate-autoloads "elpaca" repo))) (progn (message "%s" (buffer-string)) (kill-buffer buffer)) (error "%s" (with-current-buffer buffer (buffer-string)))) ((error) (warn "%s" err) (delete-directory repo 'recursive)))) (unless (require 'elpaca-autoloads nil t) (require 'elpaca) (elpaca-generate-autoloads "elpaca" repo) (load "./elpaca-autoloads"))) (add-hook 'after-init-hook #'elpaca-process-queues) (elpaca `(,@elpaca-order)) (elpaca elpaca-use-package (elpaca-use-package-mode)) ;; Basic keybindings, etc. (setq evil-want-keybinding nil) (my-use-package evil :ensure t :demand t :custom (evil-undo-system 'undo-redo) :config (evil-mode)) (my-use-package evil-collection :after evil :ensure t :demand t) (my-use-package evil-easymotion :after evil :ensure t :demand t :config (evilem-default-keybindings "\\") ) (my-use-package evil-surround :after evil :ensure t :demand t :config (global-evil-surround-mode t)) (my-use-package evil-goggles :after evil :ensure t :demand t :custom (evil-goggles-duration 0.1) :config (evil-goggles-mode)) (my-use-package evil-commentary :after evil :ensure t :demand t :config (evil-commentary-mode)) (my-use-package evil-snipe :after evil :ensure t :demand t :config (evil-snipe-mode)) (my-use-package which-key :ensure t :demand t :custom (which-key-idle-delay 0.6) :config (which-key-mode)) (my-use-package nordic-night-theme :ensure t :demand t :config (load-theme 'nordic-night t) ) ;; Vertico, consult, history (my-use-package vertico :ensure t :init (vertico-mode)) (use-package marginalia :ensure t :config (marginalia-mode)) (use-package embark :ensure t :bind (("C-." . embark-act) ;; pick some comfortable binding ("C-;" . embark-dwim) ;; good alternative: M-. ("C-h B" . embark-bindings)) ;; alternative for `describe-bindings' :init ;; Optionally replace the key help with a completing-read interface (setq prefix-help-command #'embark-prefix-help-command) ;; Show the Embark target at point via Eldoc. You may adjust the ;; Eldoc strategy, if you want to see the documentation from ;; multiple providers. Beware that using this can be a little ;; jarring since the message shown in the minibuffer can be more ;; than one line, causing the modeline to move up and down: ;; (add-hook 'eldoc-documentation-functions #'embark-eldoc-first-target) ;; (setq eldoc-documentation-strategy #'eldoc-documentation-compose-eagerly) :config ;; Hide the mode line of the Embark live/completions buffers (add-to-list 'display-buffer-alist '("\\`\\*Embark Collect \\(Live\\|Completions\\)\\*" nil (window-parameters (mode-line-format . none))))) ;; Consult users will also want the embark-consult package. (use-package embark-consult :ensure t :hook (embark-collect-mode . consult-preview-at-point-mode)) (my-use-package consult :ensure t :init (setq register-preview-delay 0.5 register-preview-function #'consult-register-format) :config (setq consult-narrow-key "<") ;; "C-+" ) (my-use-package savehist :init (savehist-mode)) (my-use-package emacs :init (setq minibuffer-prompt-properties '(read-only t cursor-intangible t face minibuffer-prompt)) (add-hook 'minibuffer-setup-hook #'cursor-intangible-mode) ;; Support opening new minibuffers from inside existing minibuffers. (setq enable-recursive-minibuffers t) ;; Emacs 28 and newer: Hide commands in M-x which do not work in the current ;; mode. Vertico commands are hidden in normal buffers. This setting is ;; useful beyond Vertico. (setq read-extended-command-predicate #'command-completion-default-include-p)) ;; Modeline (my-use-package vs-modeline :ensure (vs-modeline :type git :host github :repo "VojtechStep/vs-modeline.el") :demand t :config (vs-modeline-mode)) (my-use-package orderless :ensure t :init ;; Configure a custom style dispatcher (see the Consult wiki) (setq orderless-style-dispatchers '(+orderless-consult-dispatch orderless-affix-dispatch)) ;; orderless-component-separator #'orderless-escapable-split-on-space) (setq completion-styles '(orderless basic) completion-category-defaults nil completion-category-overrides '((file (styles partial-completion))))) ;; Git ;; TODO: some config. ;; Magit todos (my-use-package transient :ensure t) (my-use-package magit :ensure t :custom (magit-save-repository-buffers nil) (magit-diff-refine-hunk 'all) (evil-collection-magit-want-horizontal-movement t) :preface (declare-function evil-collection-magit-setup "modes/magit/evil-collection-magit") :init (with-eval-after-load 'magit-repos ; magit-repos does not load magit, so the evil-collection setup is not triggered (evil-collection-magit-setup))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Languages ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Lisp (my-use-package elisp-mode :custom (lisp-indent-offset 2)) (defun my-use-package-indent (indent-point state) "Indent always by two" (goto-char (elt state 1)) (+ 2 (current-column))) (put 'my-use-package 'lisp-indent-function 'my-use-package-indent) ;; Some additional stuff (add-hook 'write-file-hooks 'delete-trailing-whitespace nil t) ;; some visual configs (setq menu-bar-mode nil tool-bar-mode nil scroll-bar-mode nil tab-bar-mode nil blink-cursor-mode nil ring-bell-function #'ignore) (setq display-line-numbers-type 'relative) (global-display-line-numbers-mode) (setq tab-width 2) (elpaca-process-queues)