dotfiles/guix/init.el

366 lines
10 KiB
EmacsLisp
Raw Normal View History

2023-11-07 10:40:49 -05:00
(setq inhibit-startup-message t)
(menu-bar-mode -1)
(tool-bar-mode -1)
(scroll-bar-mode -1)
2023-11-10 14:17:31 -05:00
2023-11-07 10:40:49 -05:00
(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)
2023-11-10 14:17:31 -05:00
(set-frame-font "DejaVu Sans Mono 14")
2023-11-07 10:40:49 -05:00
;; 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<separator>], 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)
2023-11-10 14:17:31 -05:00
(load-theme 'base16-oceanicnext t)
2023-11-07 10:40:49 -05:00
(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)
2023-11-10 14:17:31 -05:00
(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
("<tab>" . company-select-next)
("TAB" . company-select-next)
("<backtab>" . company-select-previous)
("<S-tab>" . company-select-previous))
(:map lsp-mode-map ; more general mode than this?
("<tab>" . 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."
;; <add other stuff here>
(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)