(setq inhibit-startup-message t) (menu-bar-mode -1) (tool-bar-mode -1) (scroll-bar-mode -1) (recentf-mode 1) (savehist-mode 1) ; remember previous commands in minibuffer (save-place-mode 1) ; put cursor in last place when opening a file ;; Avoid customization UI auto-variables in init.el (setq custom-file (locate-user-emacs-file "custom-vars.el")) (load custom-file 'noerror 'nomessage) ;; Don't show popup UI when prompting (setq use-dialog-box nil) ;; Update files when changed on disk (global-auto-revert-mode 1) (set-frame-font "DejaVu Sans Mono 14") ;; Initialize Package Sources (require 'package) (setq package-archives '(("melpa" . "https://melpa.org/packages/") ("org" . "https://orgmode.org/elpa/") ("elpa" . "https://elpa.gnu.org/packages/"))) (package-initialize) (unless package-archive-contents (package-refresh-contents)) ;; Initialize use-package on non-linux platforms (unless (package-installed-p 'use-package) (package-install 'use-package)) (require 'use-package) (setq use-package-always-ensure t) ;; Persist history over Emacs restarts. Vertico sorts by history position. (use-package savehist :init (savehist-mode)) ;; Enable vertico (use-package vertico :init (vertico-mode) ;; Different scroll margin ;; (setq vertico-scroll-margin 0) ;; Show more candidates ;; (setq vertico-count 20) ;; Grow and shrink the Vertico minibuffer ;; (setq vertico-resize t) ;; Optionally enable cycling for `vertico-next' and `vertico-previous'. ;; (setq vertico-cycle t) ) ;; A few more useful configurations... (use-package emacs :init ;; Add prompt indicator to `completing-read-multiple'. ;; We display [CRM], e.g., [CRM,] if the separator is a comma. (defun crm-indicator (args) (cons (format "[CRM%s] %s" (replace-regexp-in-string "\\`\\[.*?]\\*\\|\\[.*?]\\*\\'" "" crm-separator) (car args)) (cdr args))) (advice-add #'completing-read-multiple :filter-args #'crm-indicator) ;; Do not allow the cursor in the minibuffer prompt (setq minibuffer-prompt-properties '(read-only t cursor-intangible t face minibuffer-prompt)) (add-hook 'minibuffer-setup-hook #'cursor-intangible-mode) ;; Emacs 28: Hide commands in M-x which do not work in the current mode. ;; Vertico commands are hidden in normal buffers. ;; (setq read-extended-command-predicate ;; #'command-completion-default-include-p) ;; Enable recursive minibuffers (setq enable-recursive-minibuffers t)) ;; todo: evaluate this ;; Optionally use the `orderless' completion style. (use-package orderless :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))))) (setq completion-styles '(basic substring partial-completion flex)) ;; Enable rich annotations using the Marginalia package (use-package marginalia ;; Bind `marginalia-cycle' locally in the minibuffer. To make the binding ;; available in the *Completions* buffer, add it to the ;; `completion-list-mode-map'. :bind (:map minibuffer-local-map ("M-A" . marginalia-cycle)) ;; The :init section is always executed. :init ;; Marginalia must be activated in the :init section of use-package such that ;; the mode gets enabled right away. Note that this forces loading the ;; package. (marginalia-mode)) (custom-set-variables ;; custom-set-variables was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. '(package-selected-packages '(counsel ivy))) (use-package simple-modeline :hook (after-init . simple-modeline-mode)) (use-package base16-theme) (load-theme 'base16-oceanicnext t) (global-display-line-numbers-mode t) (dolist (mode '(org-mode-hook term-mode-hook eshell-mode-hook)) (add-hook mode (lambda () (display-line-numbers-mode 0)))) (column-number-mode) (use-package rainbow-delimiters :hook (prog-mode . rainbow-delimiters-mode)) (use-package which-key :init (which-key-mode) :diminish which-key-mode :config(setq which-key-idle-delay 0.3)) (use-package helpful) ;; Note that the built-in `describe-function' includes both functions ;; and macros. `helpful-function' is functions only, so we provide ;; `helpful-callable' as a drop-in replacement. (global-set-key (kbd "C-h f") #'helpful-callable) (global-set-key (kbd "C-h v") #'helpful-variable) (global-set-key (kbd "C-h k") #'helpful-key) (global-set-key (kbd "C-h x") #'helpful-command) ;; Lookup the current symbol at point. C-c C-d is a common keybinding ;; for this in lisp modes. (global-set-key (kbd "C-c C-d") #'helpful-at-point) ;; Look up *F*unctions (excludes macros). ;; ;; By default, C-h F is bound to `Info-goto-emacs-command-node'. Helpful ;; already links to the manual, if a function is referenced there. (global-set-key (kbd "C-h F") #'helpful-function) (defconst IS-MAC (eq system-type 'darwin)) (when IS-MAC ;; mac specific settings ) ;; General Emacs keybindings (which-key-add-key-based-replacements "C-x" "Ctrl-X-prefix" "C-c" "Ctrl-C-prefix" "C-h" "Help" "M-x" "M-x-commands" "C-x r" "Rectangles/Registers" "C-x 4" "Other-window" "C-x 5" "Frames" "C-x 8" "Unicode" "C-x @" "Event-modifiers" "C-x a" "Abbreviations" "C-x n" "Narrowing" "C-x g" "Magit-status" "C-c M-g" "Magit-file-dispatch" "C-x v" "Version-Control" "C-x X" "Font/Encoding" "C-x p" "Project/Buffer" "C-x t" "Tabs/Terminal" "C-x w" "Windows/Workspaces" "C-x x" "Text/Rectangle" "C-x C-a" "Emacs-Lisp-Debug" "C-x RET" "Coding-system") ;; Emacs major modes and related prefixes (which-key-add-key-based-replacements "C-c m" "Major-mode-cmds" "C-c p" "Projectile" "C-c g" "Magit" "C-c l" "Lisp" "C-c @" "HS-minor-mode" "C-c t" "Toggle" "C-c /" "Comment") ;; Org mode specific bindings (which-key-add-key-based-replacements "C-c C-x" "Org-mode-C-c-C-x" "C-c C-w" "Org-refile" "C-c [" "Org-agenda") (defun split-and-follow-horizontally () (interactive) (split-window-below) (balance-windows) (other-window 1)) (defun split-and-follow-vertically () (interactive) (split-window-right) (balance-windows) (other-window 1)) (global-set-key (kbd "s-c") 'delete-window) (global-set-key (kbd "s-h") 'windmove-left) (global-set-key (kbd "s-j") 'windmove-down) (global-set-key (kbd "s-k") 'windmove-up) (global-set-key (kbd "s-l") 'windmove-right) ; (define-key evil-normal-state-map (kbd "s-d") 'kill-this-buffer) ; (define-key evil-normal-state-map (kbd "s-n") 'projectile-next-project-buffer) ; (define-key evil-normal-state-map (kbd "s-p") 'projectile-previous-project-buffer) ; (define-key evil-normal-state-map (kbd "s-J") 'split-and-follow-horizontally) ; (define-key evil-normal-state-map (kbd "s-L") 'split-and-follow-vertically) ; (define-key evil-normal-state-map (kbd "s-b") 'buffer-menu) ; (define-key evil-normal-state-map (kbd "s-x") 'execute-extended-command) (global-set-key (kbd "s-SPC") 'tab-next) (use-package magit) (use-package treemacs) (use-package org) (use-package projectile) (use-package lsp-mode :commands (lsp lsp-deferred) :init (setq lsp-keymap-prefix "C-c l") :config (lsp-enable-which-key-integration t)) (use-package lsp-ui) (use-package lsp-treemacs) ;; todo ;; projectile ;; deft ;; roam ;; ivy + fuzzzy +prescient? ;; ivy-lsp ;; hl-todo ;; gitgutter ;; perspective ;; workspaces? ;; paredit ;; lispy ;; persistent undo ;; org : roam2, hugo, pretty, dragndrop, bullet ;; dap-mode ;; dabbrev-expand or company on c-n c-p ;; c-N c-P for expand full line ;; yasnippet ;; tramp ;; flesh out treemacs ;; (setq deft-directory "~/notes/deft" ;; deft-extensions '("org" "txt") ;; deft-recursive t) ;; (setq org-roam-directory "~/notes/roam") (setq projectile-project-search-path '("~/code/")) ;; (setq company-minimum-prefix-length 100) ;; (map! :i "S-o" #'company-complete) (setq tab-always-indent 'complete) (setq tab-first-completion 'word) (use-package company :ensure t :hook (prog-mode . company-mode) :diminish :bind (:map company-active-map ("" . company-select-next) ("TAB" . company-select-next) ("" . company-select-previous) ("" . company-select-previous)) (:map lsp-mode-map ; more general mode than this? ("" . company-indent-or-complete-common)) :config (global-company-mode 1) :init (setq company-idle-delay nil)) (use-package rust-mode :ensure t :mode "\\.rs\\'" :config (setq rust-format-on-save t)) ; Automatically format rust files on save (use-package cargo :ensure t :hook (rust-mode . cargo-minor-mode)) (use-package eshell) (use-package vterm) (use-package treemacs-projectile) ;(use-package treemacs-nerd-icons ; :config ; (treemacs-load-theme "nerd-icons")) (setq ring-bell-function 'ignore) (setq dired-listing-switches "-al") (setq backup-directory-alist `(("." . "~/.config/emacs/backups/"))) (setq auto-save-file-name-transforms `((".*" "~/.config/emacs/autosaves/" t))) (setq dired-dwim-target t) ; opening 'other window' on a subdir enters 2 window dired mode for copy/paste (use-package dired-single) (defun my-dired-init () "Bunch of stuff to run for dired, either immediately or when it's loaded." ;; (define-key dired-mode-map [remap dired-find-file] 'dired-single-buffer) (define-key dired-mode-map [remap dired-mouse-find-file-other-window] 'dired-single-buffer-mouse) (define-key dired-mode-map [remap dired-up-directory] 'dired-single-up-directory)) ;; if dired's already loaded, then the keymap will be bound (if (boundp 'dired-mode-map) ;; we're good to go; just add our bindings (my-dired-init) ;; it's not loaded yet, so add our bindings to the load-hook (add-hook 'dired-load-hook 'my-dired-init)) (use-package dired-open :config (setq dired-open-extensions '(("png" . "sxiv") ("mkv" . "mpv") ("avi" . "mpv")))) (use-package all-the-icons-dired :hook (dired-mode . all-the-icons-dired-mode)) (use-package treemacs-all-the-icons)