From 4e16a4bb19cbb018b88bdc56d6f51a987bc37a57 Mon Sep 17 00:00:00 2001 From: Levi Neely <141506390+lneely@users.noreply.github.com> Date: Sun, 16 Jun 2024 11:30:38 +0200 Subject: [PATCH] merged dotemacs --- emacs/.gitignore | 22 ++ emacs/custom.el | 30 +++ emacs/early-init.el | 1 + emacs/init.el | 520 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 573 insertions(+) create mode 100644 emacs/.gitignore create mode 100644 emacs/custom.el create mode 100644 emacs/early-init.el create mode 100644 emacs/init.el diff --git a/emacs/.gitignore b/emacs/.gitignore new file mode 100644 index 0000000..8b8f9bd --- /dev/null +++ b/emacs/.gitignore @@ -0,0 +1,22 @@ +transient +.local +\#*\# +project-explorer-cache +projectile-bookmarks.eld +**/*.elc +persp-confs +elpa +eshell +auto-save-list +quelpa +*.*~ +.*~ +.lsp-session* +projects +*.cache +/emms/ +bookmarks +/.persistent-scratch +bookmarks +/var/ +.mc-lists.el diff --git a/emacs/custom.el b/emacs/custom.el new file mode 100644 index 0000000..c9cf759 --- /dev/null +++ b/emacs/custom.el @@ -0,0 +1,30 @@ +;; settings from customize + +(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. + '(custom-safe-themes + '("2078837f21ac3b0cc84167306fa1058e3199bbd12b6d5b56e3777a4125ff6851" "81f53ee9ddd3f8559f94c127c9327d578e264c574cda7c6d9daddaec226f87bb" "3770d0ae70172461ee0a02edcff71b7d480dc54066e8960d8de9367d12171efb" "f64189544da6f16bab285747d04a92bd57c7e7813d8c24c30f382f087d460a33" "f079ef5189f9738cf5a2b4507bcaf83138ad22d9c9e32a537d61c9aae25502ef" "835d934a930142d408a50b27ed371ba3a9c5a30286297743b0d488e94b225c5f" default)) + '(god-mode-alist '((nil . "C-") ("m" . "M-") ("M" . "C-M-"))) + '(mac-option-modifier '(:ordinary meta :function meta :mouse meta)) + '(mingus-mpd-host "192.168.178.67") + '(mingus-stream-alist + '(("CRo 1 - Radiozurnal (czech)" . "http://amp1.cesnet.cz:8000/cro1-256.ogg") + ("CRo 2 - Praha (czech)" . "http://amp1.cesnet.cz:8000/cro2-256.ogg") + ("CRo 3 - Vltava czech)" . "http://amp1.cesnet.cz:8000/cro3-256.ogg") + ("open radio" . "http://open-radio.nl:8000/org.ogg") + ("Radio Rota" . "http://streamer.radiorota.cz:8000/rota64.ogg") + ("anonradio" . "http://anonradio.net:8000/anonradio"))) + '(package-selected-packages + '(realgud projectile dash async yasnippet ace-jump ace-jump-mode acme-theme async-status cape corfu deft dired-git dired-git-info doom-modeline doom-themes embark emojify eshell-toggle eshell-vterm fic-mode flycheck fzf git-lens git-link go-projectile go-scratch god-mode graphviz-dot-mode json-mode kotlin-mode ligature lsp-mode magit mastodon mingus mmm-mode multi-web-mode multifiles multiple-cursors multishell nerd-icons-completion nerd-icons-corfu nerd-icons-dired nerd-icons-ibuffer nlinum notmuch orderless org-ai org-context org-dashboard persistent-scratch php-mode plan9-theme plantuml-mode prescient project-explorer projectile-ripgrep protobuf-mode quelpa-use-package rego-mode scratch switch-window unicode-fonts vertico vterm-toggle wgrep which-key yaml-mode zenburn-theme zetteldeft)) + '(tab-width 4) + '(tool-bar-mode nil) + '(use-short-answers t)) +(custom-set-faces + ;; custom-set-faces 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. + '(default ((t (:weight regular :height 150 :width normal :foundry " " :family "Go Mono" :slant normal))))) diff --git a/emacs/early-init.el b/emacs/early-init.el new file mode 100644 index 0000000..9d27528 --- /dev/null +++ b/emacs/early-init.el @@ -0,0 +1 @@ +;; (setenv "LSP_USE_PLISTS" "true") ;; doesn't work diff --git a/emacs/init.el b/emacs/init.el new file mode 100644 index 0000000..fed32c8 --- /dev/null +++ b/emacs/init.el @@ -0,0 +1,520 @@ +(use-package emacs + :init + ;; package management + (require 'package) + (add-to-list 'package-archives + '("melpa" . "https://melpa.org/packages/") t) + (unless (package-installed-p 'quelpa) + (with-temp-buffer + (url-insert-file-contents + "https://raw.githubusercontent.com/quelpa/quelpa/master/quelpa.el") + (eval-buffer) + (quelpa-self-upgrade))) + (quelpa + '(quelpa-use-package + :fetcher git + :url "https://github.com/quelpa/quelpa-use-package.git")) + (require 'quelpa-use-package) + + ;; basic cfg + (tool-bar-mode -1) + (require 'server) + (unless (server-running-p) (server-start)) + (setq gc-cons-threshold 100000000 + read-process-output-max (* 1024 1024) + custom-file (concat user-emacs-directory "custom.el") + create-lockfiles nil + tab-always-indent 'complete + mac-command-modifier 'super + backup-directory-alist `((".*" . + ,(concat user-emacs-directory "backup"))) + delete-old-versions t + kept-new-versions 20 + kept-old-versions 2 + version-control t + delete-old-versions t + backup-by-copying t + focus-follows-mouse t + mouse-autoselect-window t + enable-recursive-minibuffers t + warning-minimum-level :emergency + inhibit-startup-screen t + completion-cycle-threshold 3 + text-mode-ispell-word-completion nil + lsp-file-watch-threshold 3000 + read-extended-command-predicate #'command-completion-default-include-p + minibuffer-prompt-properties '(read-only t cursor-intangible t face minibuffer-prompt)) + (add-hook 'minibuffer-setup-hook #'cursor-intangible-mode) + (when (file-exists-p custom-file) + (load custom-file)) + (load-theme 'acme) + (add-hook 'eshell-mode-hook + (lambda () + (setq-local corfu-auto nil) + (corfu-mode))) + (with-eval-after-load 'lsp-mode + (add-hook 'lsp-mode-hook #'lsp-enable-which-key-integration) + (add-hook 'lsp-mode-hook + (lambda () + (remove-hook 'before-save-hook #'lsp-format-buffer t) + (remove-hook 'before-save-hook #'lsp-organize-imports t))) + (add-to-list 'lsp-file-watch-ignored-directories "[/\\\\]plz-out\\'")) + (add-to-list 'auto-mode-alist + '("BUILD\\'" . python-mode)) + (setq lsp-clients-clangd-args + '("-j=2" + "--background-index" + "--completion-style=bundled" + "--pch-storage=memory" + "--header-insertion=never" + "--header-insertion-decorators=0")) + (global-set-key (kbd "C-c r") 'replace-regexp) + (global-set-key (kbd "C-c R") 'replace-string)) + + +(use-package async :ensure t) +(use-package async-status :ensure t) +(use-package dash :ensure t) +(use-package nlinum :ensure t :defer t + :init (global-nlinum-mode 1)) +(use-package multiple-cursors :ensure t :defer t + :init (multiple-cursors-mode 1) + :bind (("C-S-c C-S-c" . 'mc/edit-lines) + ("C->" . 'mc/mark-next-like-this) + ("C-<" . 'mc/mark-previous-like-this) + ("C-c C->" . 'mc/mark-all-like-this))) + +;; minibuffer +;; === +(use-package embark :ensure t :defer t) +(use-package vertico :ensure t :defer t + :init (vertico-mode)) +(use-package which-key :ensure t :defer t + :init (which-key-mode) + :config (which-key-enable-god-mode-support)) + + +;; mass editing +;; === +(use-package multifiles :ensure t) +(use-package wgrep :ensure t) + +;; god-mode +;; === + +(use-package god-mode :ensure t + :config + (defun my/god-mode-update-cursor-type () + (setq cursor-type (if (or god-local-mode buffer-read-only) 'box 'bar))) + + (defun my/god-mode-update-mode-line () + (cond + (god-local-mode + (set-face-attribute 'mode-line nil + :foreground "#604000" + :background "#fff29a") + (set-face-attribute 'mode-line-inactive nil + :foreground "#3f3000" + :background "#fff3da")) + (t + (set-face-attribute 'mode-line nil + :foreground "#0a0a0a" + :background "#d7d7d7") + (set-face-attribute 'mode-line-inactive nil + :foreground "#404148" + :background "#efefef")))) + (add-hook 'post-command-hook #'my/god-mode-update-mode-line) + (add-hook 'post-command-hook #'my/god-mode-update-cursor-type) + (define-key god-local-mode-map (kbd ".") #'repeat) + (global-set-key (kbd "") #'god-local-mode) + (global-set-key (kbd "C-x C-1") #'delete-other-windows) + (global-set-key (kbd "C-x C-2") #'split-window-below) + (global-set-key (kbd "C-x C-3") #'split-window-right) + (global-set-key (kbd "C-x C-0") #'delete-window) + (global-set-key (kbd "C-x C-5 C-0") #'delete-frame) + (global-set-key (kbd "C-x C-5 C-u") #'undelete-frame) + (global-set-key (kbd "C-x C-5 C-1") #'delete-other-frames) + (global-set-key (kbd "C-x C-5 C-2") #'make-frame-command) + (global-set-key (kbd "C-x C-b") #'switch-to-buffer) + (global-set-key (kbd "C-x b") #'list-buffers) + (define-key god-local-mode-map (kbd "i") #'god-local-mode) + (add-to-list 'god-exempt-major-modes '(dired-mode + notmuch-show-mode + notmuch-message-mode))) + +;; eye candy +;; === + +(use-package acme-theme :ensure t :defer t) +(use-package zenburn-theme :ensure t :defer t) +(use-package doom-modeline :ensure t + :init (doom-modeline-mode 1)) +(use-package doom-themes :ensure t + :config + (progn + (setq doom-themes-enable-bold t + doom-themes-enable-italic t) + (doom-themes-visual-bell-config) + (setq doom-themes-treemacs-theme "doom-atom") + (doom-themes-treemacs-config) + (doom-themes-org-config))) +(use-package plan9-theme :ensure t :defer t) +(use-package nerd-icons :ensure t :defer t) +(use-package nerd-icons-corfu :ensure t :defer t) +(use-package nerd-icons-dired :ensure t :defer t + :hook (dired-mode . nerd-icons-dired-mode)) +(use-package nerd-icons-completion :ensure t :defer t) +(use-package nerd-icons-ibuffer :ensure t :defer t) +(use-package ligature :ensure t :defer t + :init (global-ligature-mode 1)) +(use-package emojify :ensure t :defer t) +(use-package unicode-fonts :ensure t) + +;; scratch buffers +;; === +(use-package persistent-scratch :ensure t :defer t + :init + (progn + (persistent-scratch-setup-default) + (persistent-scratch-autosave-mode 1))) +(use-package scratch :ensure t :defer t + :bind ("C-x ~" . 'scratch)) +(use-package go-scratch :ensure t :defer t) + + +;; multimedia +;; === +(use-package mingus :ensure t :defer t) + + +;; terminal / shell +;; === +(use-package multishell :ensure t :defer t) +(use-package vterm-toggle :ensure t + :bind (("C-c C-u C-t" . #'vterm-toggle))) +(use-package eshell-toggle :ensure t + :bind (("C-c C-t" . #'eshell-toggle))) +(use-package eshell-vterm :ensure t :defer t + :init (eshell-vterm-mode 1)) + + +;; org-mode +;; === + +(use-package org :ensure t :defer t + :mode (("\\.org$" . org-mode)) + :bind (("C-c C-o C-a" . org-agenda) + ("C-c C-o C-c" . org-capture)) + :config + (defun my/notes-refile-targets () + (directory-files "~/notes" t ".*\\.org$")) + (setq org-startup-indented t) + (setq org-archive-location "%s_archive::datetree/") + (setq org-src-tab-acts-natively t) + (setq org-stuck-projects + '("+proj-done-hold-maybe/-DONE" + ("STRT" "TODO") nil + "SCHEDULED:\\|DEADLINE:")) + (setq org-capture-templates + '(("t" "TODO" entry + (file+headline "~/notes/inbox.org" "Tasks") + "* TODO %?\n%i\n%a") + ("n" "Note" + entry (file+headline "~/notes/inbox.org" "Notes") + "* %?\n%i\n%a") + ("j" "Journal" + entry (file+datetree "~/notes/journal.org") + "* %?\nEntered on %U\n") + ("w" "Waiting For" + entry (file "~/org/waitingfor.org") + "* %? :@wait:\nEntered on %U\n") + ("c" "Calendar" + entry (file+headline "~/org/calendar.org" "Calendar") + "* %?\n"))) + (setq org-agenda-files + '("~/org/TODO.org" + "~/org/projects.org" + "~/org/calendar.org" + "~/org/waitingfor.org")) + (add-to-list 'org-refile-targets + '(my/notes-refile-targets :maxlevel . 3)) + (add-to-list 'org-refile-targets + '(org-agenda-files :maxlevel . 2)) + (setq org-refile-use-outline-path 'file) + (setq org-tags-exclude-from-inheritance '("proj")) + (setq org-outline-path-complete-in-steps nil) + (setq org-agenda-custom-commands + '(("w" "@work" tags "@work") + ("h" "@home" tags "@home") + ("W" "Waiting For" tags "@wait"))) + (setq org-todo-keywords + '((sequence "TODO(t)" "|" "DONE(d)"))) + (setq org-agenda-todo-keywords + '((sequence "TODO(t)" "|" "DONE(d)"))) + (setq org-hide-leading-stars nil + org-startup-indented t) + (setq org-mouse-1-follows-link nil) + (org-babel-do-load-languages + 'org-babel-load-languages '((plantuml . t) + (dot . t) + (go . t)))) + +(use-package org-dashboard :ensure t :defer t + :after (:all org)) + +(use-package org-context :ensure t :defer t + :after (:all org)) + +;; knowledge management +;; === + +(use-package deft :ensure t + :bind (("C-c C-n C-d" . #'deft) + ("C-c C-n C-f" . #'deft-find-file)) + :config + (setq deft-directory "~/notes") + (setq deft-recursive t) + (setq deft-extensions '("org" "txt" "tex" "md")) + (setq deft-text-mode 'org-mode)) +(use-package zetteldeft :ensure t) + + + +;; email +;; === + +(use-package notmuch :ensure t :defer t) + +;; projects +;; === + +(use-package projectile :ensure t :defer t + :bind (:map projectile-mode-map + ("C-c C-p" . projectile-command-map) + ("C-c C-p C-f" . #'projectile-find-file) + ("C-c C-p C-p" . #'projectile-switch-project) + ("C-c C-p C-/" . #'projectile-ripgrep) + ("C-c C-p C-b" . #'projectile-switch-to-buffer) + ("C-c C-p C-4 C-b" . #'projectile-switch-to-buffer-other-window) + ("C-c C-p C-5 C-b" . #'projectile-switch-to-buffer-other-frame) + ("C-c C-p C-d" . #'projectile-dired) + ("C-c C-p C-4 C-d" . #'projectile-dired-other-window) + ("C-c C-p C-4 C-d" . #'projectile-dired-other-frame)) + :diminish projectile-mode + :init (projectile-mode)) + + + +(use-package go-projectile :ensure t :defer t) +(use-package projectile-ripgrep :ensure t :defer t + :after (projectile)) +(use-package project-explorer :ensure t :defer t) + +;; version control +;; === +(use-package magit :ensure t :defer t + :bind ("C-c C-g" . magit-status) + :commands (magit-status-here magit-get-current-branch) + :custom (magit-display-buffer-function + #'magit-display-buffer-same-window-except-diff-v1)) +(use-package dired-git :ensure t :defer t) +(use-package dired-git-info :ensure t :defer t) +(use-package git-link :ensure t :defer t) +(use-package git-lens :ensure t :defer t) + +;; auto completion +;; === + + +(use-package corfu :ensure t :defer t + :bind (:map corfu-map + ("C-n" . corfu-next) + ("C-p" . corfu-previous) + ("SPC" . corfu-insert-separator)) + :custom + (corfu-cycle t) + (corfu-auto t) + (corfu-separator ?\s) + (corfu-preselect 'prompt) + (corfu-quit-at-boundary t) + (corfu-quit-no-match 'separator) + (corfu-scroll-margin 5) + :hook ((prog-mode . corfu-mode) + (shell-mode . corfu-mode) + (eshell-mode . corfu-mode)) + :init (global-corfu-mode) + :config + (defun corfu-send-shell (&rest _) + "Send completion candidate when inside comint/eshell." + (cond + ((and (derived-mode-p 'eshell-mode) + (fboundp 'eshell-send-input)) + (eshell-send-input)) + ((and (derived-mode-p 'comint-mode) + (fboundp 'comint-send-input)) + (comint-send-input)))) + (advice-add #'corfu-insert + :after #'corfu-send-shell) + (global-set-key [remap dabbrev-expand] + 'hippie-expand) + (add-to-list 'corfu-margin-formatters + #'nerd-icons-corfu-formatter)) + +(use-package dabbrev :ensure t :defer t + :bind (("M-/" . dabbrev-completion) + ("C-M-/" . dabbrev-expand)) + :config + (add-to-list 'dabbrev-ignored-buffer-regexps "\\` ") + (add-to-list 'dabbrev-ignored-buffer-modes 'doc-view-mode) + (add-to-list 'dabbrev-ignored-buffer-modes 'pdf-view-mode) + (add-to-list 'dabbrev-ignored-buffer-modes 'tags-table-mode)) + +(use-package orderless :ensure t :defer t + :init + (setq completion-styles '(orderless partial-completion basic) + completion-category-defaults nil + completion-category-overrides nil)) + +(setq text-mode-ispell-word-completion nil) +(setq read-extended-command-predicate + #'command-completion-default-include-p) +(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) +(setq read-extended-command-predicate + #'command-completion-default-include-p) + + +;; Add extensions +(use-package cape :ensure t :defer t + ;; Bind dedicated completion commands + ;; Alternative prefix keys: C-c p, M-p, M-+, ... + :bind (("C-c C-/ p" . completion-at-point) ;; capf + ("C-c C-/ t" . complete-tag) ;; etags + ("C-c C-/ d" . cape-dabbrev) ;; or dabbrev-completion + ("C-c C-/ h" . cape-history) + ("C-c C-/ f" . cape-file) + ("C-c C-/ k" . cape-keyword) + ("C-c C-/ s" . cape-elisp-symbol) + ("C-c C-/ e" . cape-elisp-block) + ("C-c C-/ a" . cape-abbrev) + ("C-c C-/ l" . cape-line) + ("C-c C-/ w" . cape-dict) + ("C-c C-/ :" . cape-emoji) + ("C-c C-/ \\" . cape-tex) + ("C-c C-/ _" . cape-tex) + ("C-c C-/ ^" . cape-tex) + ("C-c C-/ &" . cape-sgml) + ("C-c C-/ r" . cape-rfc1345)) + :init + ;; Add to the global default value of `completion-at-point-functions' which is + ;; used by `completion-at-point'. The order of the functions matters, the + ;; first function returning a result wins. Note that the list of buffer-local + ;; completion functions takes precedence over the global list. + (add-hook 'completion-at-point-functions #'cape-dabbrev) + (add-hook 'completion-at-point-functions #'cape-file) + (add-hook 'completion-at-point-functions #'cape-elisp-block) + (add-hook 'completion-at-point-functions #'cape-history) + (add-hook 'completion-at-point-functions #'cape-keyword)) + ;;(add-hook 'completion-at-point-functions #'cape-tex) + ;;(add-hook 'completion-at-point-functions #'cape-sgml) + ;;(add-hook 'completion-at-point-functions #'cape-rfc1345) + ;;(add-hook 'completion-at-point-functions #'cape-abbrev) + ;;(add-hook 'completion-at-point-functions #'cape-dict) + ;;(add-hook 'completion-at-point-functions #'cape-elisp-symbol) + ;;(add-hook 'completion-at-point-functions #'cape-line)) + +;; coding +;; === +(use-package yasnippet :ensure t) +(use-package fic-mode :ensure t :defer t) +(use-package lsp-mode :ensure t + :commands lsp + :custom + (lsp-completion-provider :none) ;; we use Corfu! + :init + (defun my/lsp-mode-setup-completion () + (lsp-enable-which-key-integration) + (setf + (alist-get 'styles + (alist-get 'lsp-capf completion-category-defaults)) + '(orderless))) + :config + (setq lsp-prefer-flymake nil + c-c++-enable-clang-format-on-save nil) + :hook + (prog-mode . lsp-mode) + (lsp-completion-mode . my/lsp-mode-setup-completion)) + + +(use-package flycheck :ensure t :defer t) +(use-package go-mode :ensure t :defer t + :mode (("\\.go$" . go-mode)) + :hook ((go-mode . lsp-deferred) + (before-save . lsp-format-buffer) + (before-save . lsp-organize-imports))) +(use-package yaml-mode :ensure t :defer t + :mode (("\\.yml$" . yaml-mode))) +(use-package json-mode :ensure t :defer t + :mode (("\\.json$" . json-mode))) +(use-package php-mode :ensure t :defer t + :mode (("\\.php$" . php-mode))) +(use-package mmm-mode :ensure t :defer t) +(use-package multi-web-mode :ensure t :defer t) +(use-package graphviz-dot-mode :ensure t :defer t) +(use-package protobuf-mode :ensure t :defer t) +(use-package rego-mode :ensure t :defer t) +(use-package plantuml-mode :ensure t :defer t) +(use-package kotlin-mode :ensure t :defer t) +(use-package realgud :ensure t :defer t) +(add-hook 'realgud-short-key-mode-hook + (lambda () + (local-set-key "\C-c" realgud:shortkey-mode-map))) + + +;; search & narrow +;; === +(use-package prescient :ensure t :defer t) +(use-package fzf :ensure t :defer t + :bind + ;; TODO + :config + (setq fzf/args "-x --color bw --print-query --margin=1,0 --no-hscroll" + fzf/executable "fzf" + fzf/git-grep-args "-i --line-number %s" + fzf/grep-command "rg --no-heading -nH" + fzf/position-bottom t + fzf/window-height 15)) + + +;; frame & window management +;; === +(use-package switch-window :ensure t :defer t) +(require 'switch-window) +(global-set-key (kbd "C-x C-o") 'switch-window) +(global-set-key (kbd "C-x C-1") 'switch-window-then-maximize) +(global-set-key (kbd "C-x C-2") 'switch-window-then-split-below) +(global-set-key (kbd "C-x C-3") 'switch-window-then-split-right) +(global-set-key (kbd "C-x C-0") 'switch-window-then-delete) + +;; navigation +;; === +(use-package ace-jump-mode :ensure t :defer t + :bind (("C-c SPC" . 'ace-jump-mode) + ("C-x SPC" . 'ace-jump-mode-pop-mark))) + +;; antisocial +;; === + +;; (use-package mastodon :ensure t :defer t) +;; (setq mastodon-instance-url "https://mastodon.sdf.org" +;; mastodon-active-user "me@lkn.uber.space") + +