emacs/init.el

313 lines
8.1 KiB
EmacsLisp

;; -*- lexical-binding: t -*-
(progn
(setq inhibit-startup-buffer-menu t)
(setq inhibit-startup-screen t)
(setq initial-buffer-choice t)
(setq initial-scratch-message "")
(setq confirm-kill-emacs 'yes-or-no-p)
(scroll-bar-mode 0)
(tool-bar-mode 0)
(menu-bar-mode 0)
(setq ns-use-proxy-icon nil)
(setq frame-title-format nil)
(add-to-list 'default-frame-alist '(ns-transparent-titlebar . t))
(setq isearch-allow-scroll t)
(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)
(setq show-trailing-whitespace t)
(setq backup-by-copying t)
(setq backup-directory-alist '(("." . "~/.emacs.d/backups")))
(set-default-coding-systems 'utf-8)
(set-keyboard-coding-system 'utf-8)
(set-terminal-coding-system 'utf-8)
(defalias 'go-mode 'go-ts-mode)
(defalias 'gomod-mode 'go-mod-ts-mode)
(defvar modus-themes-italic-constructs t)
(defvar modus-themes-bold-constructs nil)
(defvar modus-themes-mode-line '(borderless accented))
(defvar modus-themes-region '(bg-only no-extend))
(load-theme 'modus-vivendi t)
(global-display-line-numbers-mode))
(eval-and-compile
(add-to-list 'load-path (expand-file-name "lib/borg/" user-emacs-directory))
(require 'borg)
(borg-initialize))
(use-package auto-compile
:config
(setq auto-compile-display-buffer nil)
(setq auto-compile-mode-line-counter t)
(setq auto-compile-source-recreate-deletes-dest t)
(setq auto-compile-toggle-deletes-nonlib-dest t))
(use-package epkg
:defer t
:init
(setq epkg-repository (expand-file-name "var/epkgs/" user-emacs-directory)))
(use-package dash
:config (global-dash-fontify-mode))
(use-package server
:commands (server-running-p)
:config (or (server-running-p) (server-mode)))
(use-package magit
:defer t
:commands (magit-add-section-hook)
:config
(magit-add-section-hook 'magit-status-sections-hook
'magit-insert-modules
'magit-insert-stashes
'append))
(use-package evil
:hook (after-init . evil-mode)
:init
(setq evil-want-integration t)
(setq evil-want-keybinding nil)
(evil-mode t)
:config
(evil-set-initial-state 'shell-mode 'normal)
(evil-set-initial-state 'doc-view-mode 'normal)
(evil-set-initial-state 'package-menu-mode 'normal)
(evil-set-initial-state 'biblio-selection-mode 'motion)
(evil-global-set-key 'motion "gs" 'tab-bar-switch-to-tab)
(setq doc-view-continuous t))
(use-package evil-collection
:after evil
:init
(evil-collection-init))
(use-package org
:config
(setq org-confirm-babel-evaluate nil)
(setq org-export-use-babel nil)
(add-hook 'org-babel-after-execute-hook 'org-redisplay-inline-images)
(org-babel-do-load-languages
'org-babel-load-languages
'((emacs-lisp . t)
(plantuml . t)
(restclient . t)
(C . t)
(java . t)
(shell . t)
(sql . t)
(go . t)
(python . t))))
(use-package vertico
:init
(vertico-mode))
(use-package orderless
:init
(setq completion-styles '(orderless basic)
completion-category-defaults nil
completion-category-overrides '((eglot (styles orderless)) (file (styles partial-completion)))))
(use-package consult
:config
(defun find-fd (&optional dir initial)
(interactive "P")
(let ((consult-find-args "fzf -e"))
(consult-find dir initial)))
(autoload 'projectile-project-root "projectile")
(setq consult-project-root-function #'projectile-project-root))
(use-package embark)
(use-package embark-consult
:hook
(embark-collect-mode . consult-preview-at-point-mode))
(use-package marginalia
:custom
(marginalia-align 'right)
:init
(marginalia-mode))
(use-package which-key
:init (which-key-mode t))
(use-package general
:after which-key
:config
(general-override-mode t)
(general-auto-unbind-keys)
(general-define-key
:keymaps 'key-translation-map
"ESC" (kbd "C-g"))
(general-def
"C-x x" 'eval-defun)
(general-create-definer tyrant-def
:states '(normal visual insert motion emacs)
:prefix "SPC"
:non-normal-prefix "C-SPC")
(tyrant-def
"" nil
"SPC" (general-simulate-key "M-x")
"c" (general-simulate-key "C-c")
"h" (general-simulate-key "C-h")
"u" (general-simulate-key "C-u")
"x" (general-simulate-key "C-x")
"w" (general-simulate-key "C-w")
":" 'shell-command
"git" 'magit
"rg" 'consult-ripgrep
"fzf" 'consult-find
"em" '(:ignore t :which-key "emacs")
"emr" (lambda ()
(interactive)
(load-file user-init-file))
"emd" (lambda ()
(interactive)
(find-file user-init-file))
"th" '(:ignore t :which-key "themes")
"ths" 'consult-theme
"ta" '(:ignore t :which-key "tabs")
"tac" 'tab-new
"taq" 'tab-close
"tar" 'tab-rename
"b" '(:ignore t :which-key "buffers")
"bl" 'switch-to-buffer
"bd" 'kill-this-buffer
"f" '(:ignore t :which-key "files")
"ff" 'find-file
"fr" 'rename-file-and-buffer
"p" '(:ignore t :which-key "projects")
"pf" 'projectile-find-file
"pp" 'projectile-switch-project
"pb" 'projectile-switch-to-buffer
"o" '(:ignore t :which-key "org")
"oi" 'org-insert-structure-template
"odu" 'org-update-all-dblocks
"n" '(:ignore t :which-key "notes")
"nl" 'consult-notes
"x" '(:ignore t :which-key "xref")
"xr" 'xref-find-references
"xd" 'xref-find-definitions
))
(use-package corfu
:init
(global-corfu-mode))
(use-package projectile
:init
(projectile-mode t)
:config
(setq projectile-require-project-root nil)
(setq projectile-find-dir-includes-top-level t)
(setq projectile-project-search-path '(
"~/work/ost/"
"~/work/private"
)))
(use-package denote
:config
(setq denote-directory (expand-file-name "~/denote"))
(defun x/denote-journal ()
(interactive)
(let* ((today (format-time-string "%A %e %B %Y"))
(string (denote-sluggify today))
(files (denote-directory-files-matching-regexp string)))
(cond
((> (length files) 1)
(find-file (completing-read "Select file: " files nil :require-match)))
(files
(find-file (car files)))
(t
(denote
today
'("journal"))))))
(defun x/denote-append-region-to-note (beg end)
(interactive "r")
(if-let (((region-active-p))
(text (buffer-substring-no-properties beg end)))
(progn
(consult-notes)
(goto-char (point-max))
(insert text))
(user-error "No region is available")))
)
(use-package consult-notes
:config
(consult-notes-denote-mode))
(use-package rainbow-delimiters
:config
(set-face-foreground 'rainbow-delimiters-depth-1-face "#c66")
(set-face-foreground 'rainbow-delimiters-depth-2-face "#6c6")
(set-face-foreground 'rainbow-delimiters-depth-3-face "#69f")
(set-face-foreground 'rainbow-delimiters-depth-4-face "#cc6")
(set-face-foreground 'rainbow-delimiters-depth-5-face "#6cc")
(set-face-foreground 'rainbow-delimiters-depth-6-face "#c6c")
(set-face-foreground 'rainbow-delimiters-depth-7-face "#ccc")
(set-face-foreground 'rainbow-delimiters-depth-8-face "#999")
(set-face-foreground 'rainbow-delimiters-depth-9-face "#666"))
(use-package lisp-mode
:config
(add-hook 'lisp-mode-hook 'rainbow-delimiters-mode)
(add-hook 'emacs-lisp-mode-hook 'rainbow-delimiters-mode))
(use-package no-littering)
(use-package custom
:no-require t
:config
(setq custom-file (expand-file-name "custom.el" user-emacs-directory))
(when (file-exists-p custom-file)
(load custom-file)))
;; http://steve.yegge.googlepages.com/my-dot-emacs-file
(defun rename-file-and-buffer (new-name)
"Renames both current buffer and file it's visiting to NEW-NAME."
(interactive "New name: ")
(let ((name (buffer-name))
(filename (buffer-file-name)))
(if (not filename)
(message "Buffer '%s' is not visiting a file!" name)
(if (get-buffer new-name)
(message "A buffer named '%s' already exists!" new-name)
(progn
(rename-file name new-name t)
(rename-buffer new-name)
(set-visited-file-name new-name)
(set-buffer-modified-p nil))))))