From ddd3490dfb592417163e801994a60854dac135fe Mon Sep 17 00:00:00 2001 From: spl3g Date: Thu, 26 Oct 2023 14:44:22 +0300 Subject: configs for my laptop --- home-manager/programs/emacs/config.org | 528 ++++++++++++++++++++++++--------- 1 file changed, 384 insertions(+), 144 deletions(-) (limited to 'home-manager/programs/emacs/config.org') diff --git a/home-manager/programs/emacs/config.org b/home-manager/programs/emacs/config.org index f9938ce..a21da11 100644 --- a/home-manager/programs/emacs/config.org +++ b/home-manager/programs/emacs/config.org @@ -1,4 +1,4 @@ -#+TITLE: spl3g's Emacs config +#+Title: spl3g's Emacs config #+AUTHOR: spl3g #+STARTUP: showeverything #+PROPERTY: header-args :tangle init.el @@ -11,6 +11,7 @@ - [[#meow-mode][Meow mode]] - [[#general-keybindings][General keybindings]] - [[#gui-tweaks][GUI tweaks]] + - [[#disable-gui-shit][Disable gui shit]] - [[#fonts][Fonts]] - [[#display-line-numbers][Display line numbers]] - [[#theme][Theme]] @@ -18,28 +19,46 @@ - [[#modeline][Modeline]] - [[#smooth-scroll][Smooth scroll]] - [[#dashboard][Dashboard]] - - [[#popper][Popper]] + - [[#disable-ring-bell][Disable ring-bell]] + - [[#indent-guide][Indent guide]] + - [[#misc][Misc]] - [[#org-mode][Org mode]] - [[#enabling-toc][Enabling toc]] - [[#org-bullets][Org bullets]] - [[#auto-tangle][Auto-tangle]] + - [[#org-download][Org-download]] + - [[#direnv][Direnv]] - [[#better-ux][Better UX]] - [[#vertico][Vertico]] - [[#consult][Consult]] - [[#treemacs][Treemacs]] + - [[#pairs][Pairs]] + - [[#debugging][Debugging]] + - [[#move-lines][Move lines]] + - [[#truncate-lines][Truncate lines]] +- [[#eat-terminal][EAT terminal]] + - [[#eat][Eat]] - [[#lsp][LSP]] - [[#languages][Languages]] - - [[#corfu--cape][Corfu + cape]] + - [[#corfu][Corfu]] - [[#flycheck][Flycheck]] + - [[#tree-sitter][Tree-sitter]] + - [[#snippets][Snippets]] +- [[#additional-apps][Additional apps]] + - [[#telegram-lol][Telegram lol]] + - [[#magit][Magit]] + - [[#exwm][EXWM]] +- [[#dired][Dired]] + - [[#bindings][Bindings]] + - [[#icons-1][Icons]] * Progs to load first ** use-package -every package is installed by nix and configured by use-package #+begin_src emacs-lisp (require 'use-package) (eval-and-compile (setq use-package-always-ensure t - use-package-expand-minimally t)) + use-package-expand-minimally t)) #+end_src ** Meow mode #+begin_src emacs-lisp @@ -131,8 +150,7 @@ every package is installed by nix and configured by use-package '("z" . meow-pop-selection) '("'" . repeat) '("" . ignore))) - (setq meow-use-cursor-position-hack t - meow-use-enhanced-selection-effect t) + (setq meow-use-enhanced-selection-effect t) (meow-setup) (meow-global-mode 1)) #+end_src @@ -155,40 +173,52 @@ every package is installed by nix and configured by use-package "," '(consult-buffer :wk "Switch to buffer") "." '(find-file :wk "Find file") ;; Splits - "w" '(:ignore t :wk "Evil splits") + "w" '(:ignore t :wk "Splits") "wv" '(split-window-right :wk "Split vertical") "ws" '(split-window-below :wk "Split") "ww" '(other-window :wk "Cycle throug windows") "wc" '(delete-window :wk "Close window") "wd" '(delete-window :wk "Close window") + "wl" '(evil-window-right :wk "") + "wj" '(evil-window-down :wk "") + "wk" '(evil-window-up :wk "") + "wh" '(evil-window-left :wk "") + "wo" '(delete-other-windows :wk "") ;; Files "f" '(:ignore t :wk "Files") "fr" '(consult-recent-file :wk "Resent files") - "fc" '((lambda () (interactive) (find-file "~/.config/emacs/init.el")) :wk "Edit emacs config") + "fc" '((lambda () (interactive) (find-file "~/.nixfiles/home-manager/programs/emacs/config.org")) :wk "Edit emacs config") "fu" '(sudo-edit-find-file :wk "Sudo find file") "fU" '(sudo-edit :wk "Sudo edit file") - ;; Quiting - "q" '(:ignore t :wk "Quiting") - "qq" '(:ignore t :wk "Quit TBD") - "qr" '(:ignore t :wk "Restart TBD") - "qe" '(eval-buffer :wk "Eval buffer") - "r" '(reload-init-file :wk "Reload config") - "l" '(lsp-keymap-prefix :wk "LSP"))) + "l" '(lsp-keymap-prefix :wk "LSP") + ;; Opening.. things + "o" '(:ignore t) + "ot" '(eat-toggle :wk "Eat terminal"))) #+end_src + * GUI tweaks +** Disable gui shit +#+begin_src emacs-lisp + (defun spl3g/disable-scroll-bars (frame) + (modify-frame-parameters frame + '((vertical-scroll-bars . nil) + (horizontal-scroll-bars . nil)))) + (add-hook 'after-make-frame-functions 'spl3g/disable-scroll-bars) +#+end_src ** Fonts #+begin_src emacs-lisp + (setq default-frame-alist '((font . "Source Code Pro"))) (set-face-attribute 'default nil :font "Source Code Pro" - :height 113 + :height 110 :weight 'medium) (set-face-attribute 'fixed-pitch nil :font "Source Code Pro" - :height 113 + :height 110 :weight 'medium) (set-face-attribute 'variable-pitch nil :font "Rubik" - :height 113 + :height 110 :weight 'medium) (set-face-attribute 'font-lock-comment-face nil :slant 'italic) @@ -197,8 +227,8 @@ every package is installed by nix and configured by use-package #+end_src ** Display line numbers #+begin_src emacs-lisp -(global-display-line-numbers-mode 1) -(global-visual-line-mode t) +(add-hook 'prog-mode-hook 'display-line-numbers-mode) +(add-hook 'prog-mode-hook 'visual-line-mode) #+end_src ** Theme @@ -221,11 +251,13 @@ every package is installed by nix and configured by use-package ** Modeline #+begin_src emacs-lisp - (use-package mood-line - :init - (mood-line-mode) + (use-package doom-modeline + :init (doom-modeline-mode 1) :config - (setq mood-line-glyph-alist mood-line-glyphs-unicode)) + (setq doom-modeline-height 35 ;; sets modeline height + doom-modeline-bar-width 5 ;; sets right bar width + doom-modeline-persp-name t ;; adds perspective name to modeline + doom-modeline-persp-icon t)) ;; adds folder icon next to persp name #+end_src ** Smooth scroll @@ -243,27 +275,27 @@ every package is installed by nix and configured by use-package (setq initial-buffer-choice (lambda () (get-buffer-create "*dashboard*"))) (setq dashboard-banner-logo-title "Yep, it's emacs, not vim") (setq dashboard-startup-banner 'logo) - (setq dashboard-center-content t)) + (setq dashboard-center-content t) + (add-to-list 'dashboard-item-generators '(config . dashboard-open-config)) + (setq dashboard-items '((recents . 5) + (agenda . 5)))) #+end_src -** Popper +** Disable ring-bell #+begin_src emacs-lisp - (use-package popper - :ensure t ; or :straight t - :bind (("C-`" . popper-toggle-latest) - ("M-`" . popper-cycle) - ("C-M-`" . popper-toggle-type)) - :init - (setq popper-reference-buffers - '("\\*Messages\\*" - "Output\\*$" - "\\*Async Shell Command\\*" - help-mode - "^\\*vterm.*\\*$" vterm-mode - compilation-mode)) - (popper-mode +1) - (popper-echo-mode +1)) + (setq ring-bell-function 'ignore) +#+end_src +** Indent guide +#+begin_src emacs-lisp + (use-package indent-guide + :hook (prog-mode . indent-guide-mode)) +#+end_src +** Misc +#+begin_src emacs-lisp + (setq window-resize-pixelwise t) + (setq frame-resize-pixelwise t) + (save-place-mode t) + (defalias 'yes-or-no #'y-or-n-p) #+end_src - * Org mode #+begin_src emacs-lisp (add-hook 'org-mode-hook 'org-indent-mode) @@ -272,61 +304,75 @@ every package is installed by nix and configured by use-package ** Enabling toc #+begin_src emacs-lisp - (use-package toc-org) - (add-hook 'org-mode-hook 'toc-org-mode) + (use-package toc-org + :init (add-hook 'org-mode-hook 'toc-org-enable)) #+end_src ** Org bullets #+begin_src emacs-lisp - (use-package org-bullets) - (add-hook 'org-mode-hook 'org-bullets-mode) + (use-package org-bullets + :init (add-hook 'org-mode-hook (lambda () (org-bullets-mode 1)))) #+end_src ** Auto-tangle #+begin_src emacs-lisp - (use-package org-auto-tangle) - (add-hook 'org-mode-hook 'org-auto-tangle-mode) + (use-package org-auto-tangle + :init (add-hook 'org-mode-hook 'org-auto-tangle-mode)) +#+end_src +** Org-download +#+begin_src emacs-lisp + (use-package org-download + :hook (dired-mode-hook . org-download-enable)) +#+end_src +** Direnv +#+begin_src emacs-lisp + (use-package direnv + :config + (direnv-mode)) #+end_src * Better UX ** Vertico #+begin_src emacs-lisp - (use-package vertico + (use-package vertico + :init + (vertico-mode) + :bind (:map vertico-map + ("M-j" . vertico-next) + ("M-k" . vertico-previous)) + :config + (savehist-mode 1)) + (use-package emacs :init - (vertico-mode) - :config - (savehist-mode 1)) - (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)) + ;; 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)) #+end_src *** Ordeless #+begin_src emacs-lisp (use-package orderless :init (setq completion-styles '(orderless basic) - completion-category-defaults nil - completion-category-overrides '((file (styles partial-completion))))) + completion-category-defaults nil + completion-category-overrides '((file (styles partial-completion))))) #+end_src *** Marginalia #+begin_src emacs-lisp @@ -468,57 +514,156 @@ every package is installed by nix and configured by use-package #+begin_src emacs-lisp (use-package treemacs-all-the-icons) #+end_src +** Pairs +#+begin_src emacs-lisp + (use-package smartparens + :init (smartparens-global-mode) + :hook (prog-mode-hook . turn-on-smartparens-strict-mode) + :config + ;; Snitched from doom + (let ((unless-list '(sp-point-before-word-p + sp-point-after-word-p + sp-point-before-same-p))) + (sp-pair "'" nil :unless unless-list) + (sp-pair "\"" nil :unless unless-list)) + (dolist (brace '("(" "{" "[")) + (sp-pair brace nil + :post-handlers '(("||\n[i]" "RET") ("| " "SPC")) + :unless '(sp-point-before-word-p sp-point-before-same-p))) + (sp-local-pair sp-lisp-modes "(" ")" :unless '(:rem sp-point-before-same-p)) + (sp-local-pair sp-lisp-modes "(" ")" :unless '(:rem sp-point-before-same-p)) + + ;; Major-mode specific fixes + (sp-local-pair 'ruby-mode "{" "}" + :pre-handlers '(:rem sp-ruby-pre-handler) + :post-handlers '(:rem sp-ruby-post-handler)) + + ;; Don't eagerly escape Swift style string interpolation + (sp-local-pair 'swift-mode "\\(" ")" :when '(sp-in-string-p)) + + ;; Don't do square-bracket space-expansion where it doesn't make sense to + (sp-local-pair '(emacs-lisp-mode org-mode markdown-mode gfm-mode) + "[" nil :post-handlers '(:rem ("| " "SPC"))) + + ;; Reasonable default pairs for HTML-style comments + (sp-local-pair (append sp--html-modes '(markdown-mode gfm-mode)) + "" + :unless '(sp-point-before-word-p sp-point-before-same-p) + :actions '(insert) :post-handlers '(("| " "SPC"))) + ;; Expand C-style comment blocks. + (defun +default-open-doc-comments-block (&rest _ignored) + (save-excursion + (newline) + (indent-according-to-mode))) + (sp-local-pair + '(js2-mode typescript-mode rjsx-mode rust-mode c-mode c++-mode objc-mode + csharp-mode java-mode php-mode css-mode scss-mode less-css-mode + stylus-mode scala-mode) + "/*" "*/" + :actions '(insert) + :post-handlers '(("| " "SPC") + (" | " "*") + ("|[i]\n[i]" "RET")))) + ;; (use-package parinfer-rust-mode + ;; :hook (lisp-mode-hook . parinfer-rust-mode)) + ;; (electric-pair-mode 1) +#+end_src +** Debugging +#+begin_src emacs-lisp + (use-package dap-mode + :config + (require 'dap-python) + (setq dap-python-debugger 'debugpy)) +#+end_src +** Move lines +#+begin_src emacs-lisp + (use-package move-text + :bind (("C-M-k" . move-text-up) + ("C-M-j" . move-text-down))) +#+end_src +** Truncate lines +#+begin_src emacs-lisp + (set-default 'truncate-lines t) +#+end_src +* EAT terminal +** Eat +#+begin_src emacs-lisp + (use-package eat + :custom + (eat-semi-char-non-bound-keys + '(seq-difference eat-semi-char-non-bound-keys '([C-left] [C-right])))) +#+end_src +*** Eat-toggle +#+begin_src emacs-lisp + (defun eat-toggle() + "Open eat terminal as a popup." + (interactive) + (if (eq major-mode 'eat-mode) + (delete-window) + (let ((buff (get-buffer-create eat-buffer-name))) + (cl-assert (and buff (buffer-live-p buff))) + (funcall #'pop-to-buffer buff) + (with-current-buffer buff + (setq-local split-width-threshold nil) + (setq-local window-min-height 2) + (unless (derived-mode-p 'eat-mode) + (eat)))))) +#+end_src * LSP #+begin_src emacs-lisp (use-package lsp-mode + :custom + (lsp-completion-provider :none) + + :init + (defun my/orderless-dispatch-flex-first (_pattern index _total) + (and (eq index 0) 'orderless-flex)) + + (defun my/lsp-mode-setup-completion () + (setf (alist-get 'styles (alist-get 'lsp-capf completion-category-defaults)) + '(orderless))) + + (add-hook 'orderless-style-dispatchers #'my/orderless-dispatch-flex-first nil 'local) + (add-to-list 'completion-at-point-functions (cape-capf-buster #'lsp-completion-at-point)) + :hook - (python-mode . lsp) - (rust-mode . lsp) - (lsp-mode . lsp-enable-which-key-integration) - (sh-mode . lsp) - :commands lsp) + (lsp-completion-mode . my/lsp-mode-setup-completion)) #+end_src ** Languages *** Python #+begin_src emacs-lisp (use-package lsp-pyright - :ensure t) + :hook (python-mode . (lambda () + (require 'lsp-pyright) + (lsp)))) + (use-package py-autopep8 + :hook (python-mode . py-autopep8-mode)) #+end_src *** Rust #+begin_src emacs-lisp - (use-package rustic - :ensure - :bind (:map rustic-mode-map - ("M-j" . lsp-ui-imenu) - ("M-?" . lsp-find-references) - ("C-c C-c l" . flycheck-list-errors) - ("C-c C-c a" . lsp-execute-code-action) - ("C-c C-c r" . lsp-rename) - ("C-c C-c q" . lsp-workspace-restart) - ("C-c C-c Q" . lsp-workspace-shutdown) - ("C-c C-c s" . lsp-rust-analyzer-status)) - :config - ;; uncomment for less flashiness - ;; (setq lsp-eldoc-hook nil) - ;; (setq lsp-enable-symbol-highlighting nil) - ;; (setq lsp-signature-auto-activate nil) - - ;; comment to disable rustfmt on save - (setq rustic-format-on-save t) - (add-hook 'rustic-mode-hook 'rk/rustic-mode-hook)) - (use-package flycheck-rust - :config - (with eval-after-load 'rust-mode - (add-hook 'flycheck-mode-hook #'flycheck-rust-setup))) - - (defun rk/rustic-mode-hook () - ;; so that run C-c C-c C-r works without having to confirm, but don't try to - ;; save rust buffers that are not file visiting. Once - ;; https://github.com/brotzeit/rustic/issues/253 has been resolved this should - ;; no longer be necessary. - (when buffer-file-name - (setq-local buffer-save-without-query t)) - (add-hook 'before-save-hook 'lsp-format-buffer nil t)) + (use-package rustic + :ensure + :bind (:map rustic-mode-map + ("M-j" . lsp-ui-imenu) + ("M-?" . lsp-find-references) + ("C-c C-c l" . flycheck-list-errors) + ("C-c C-c a" . lsp-execute-code-action) + ("C-c C-c r" . lsp-rename) + ("C-c C-c q" . lsp-workspace-restart) + ("C-c C-c Q" . lsp-workspace-shutdown) + ("C-c C-c s" . lsp-rust-analyzer-status)) + :config + ;; uncomment for less flashiness + ;; (setq lsp-eldoc-hook nil) + ;; (setq lsp-enable-symbol-highlighting nil) + ;; (setq lsp-signature-auto-activate nil) + + ;; comment to disable rustfmt on save + (setq rustic-format-on-save t)) + (use-package flycheck-rust + :config + (with-eval-after-load 'rust-mode + (add-hook 'flycheck-mode-hook #'flycheck-rust-setup))) #+end_src *** Fish #+begin_src emacs-lisp @@ -528,44 +673,139 @@ every package is installed by nix and configured by use-package *** Nix #+begin_src emacs-lisp (use-package nix-mode - :mode "(.nix)$") + :mode ("\\.nix\\'" "\\.nix.in\\'")) + (use-package nix-drv-mode + :ensure nix-mode + :mode "\\.drv\\'") + (use-package nix-shell + :ensure nix-mode + :commands (nix-shell-unpack nix-shell-configure nix-shell-build)) + (use-package nix-repl + :ensure nix-mode + :commands (nix-repl)) #+end_src -** Corfu + cape +*** Yuck #+begin_src emacs-lisp - (use-package corfu - :custom - (corfu-cycle t) - (corfu-auto t) - (corfu-preselect 'prompt) - :bind - (:map corfu-map - ("TAB" . corfu-next) - ([tab] . corfu-next) - ("S-TAB" . corfu-previous) - ([backtab] . corfu-previous)) - :init - (global-corfu-mode)) + (use-package yuck-mode) #+end_src +*** Web #+begin_src emacs-lisp - (use-package cape - :init - (add-to-list 'completion-at-point-functions #'cape-file)) + (use-package web-mode + :config + (add-to-list 'auto-mode-alist '("\\.phtml\\'" . web-mode)) + (add-to-list 'auto-mode-alist '("\\.tpl\\.php\\'" . web-mode)) + (add-to-list 'auto-mode-alist '("\\.[agj]sp\\'" . web-mode)) + (add-to-list 'auto-mode-alist '("\\.as[cp]x\\'" . web-mode)) + (add-to-list 'auto-mode-alist '("\\.erb\\'" . web-mode)) + (add-to-list 'auto-mode-alist '("\\.mustache\\'" . web-mode)) + (add-to-list 'auto-mode-alist '("\\.djhtml\\'" . web-mode))) #+end_src +*** JavaScript #+begin_src emacs-lisp + (use-package js2-mode) +#+end_src +** Corfu +#+begin_src emacs-lisp + (use-package corfu + :custom + (corfu-cycle t) + (corfu-preselect 'prompt) + (corfu-auto t) + :bind + (:map corfu-map + ("TAB" . corfu-next) + ([tab] . corfu-next) + ("S-TAB" . corfu-previous) + ([backtab] . corfu-previous)) + + :init + (global-corfu-mode)) (use-package emacs :init (setq completion-cycle-threshold 3) + + (setq read-extended-command-predicate + #'command-completion-default-include-p) + (setq tab-always-indent 'complete)) #+end_src +*** Cape +#+begin_src emacs-lisp + (use-package cape + ;; Bind dedicated completion commands + :bind (("C-c p p" . completion-at-point) ;; capf + ("C-c p t" . complete-tag) ;; etags + ("C-c p d" . cape-dabbrev) ;; or dabbrev-completion + ("C-c p h" . cape-history) + ("C-c p f" . cape-file) + ("C-c p k" . cape-keyword) + ("C-c p s" . cape-elisp-symbol) + ("C-c p e" . cape-elisp-block) + ("C-c p a" . cape-abbrev) + ("C-c p l" . cape-line) + ("C-c p w" . cape-dict) + ("C-c p :" . cape-emoji)) + :init + (add-to-list 'completion-at-point-functions #'cape-dabbrev) + (add-to-list 'completion-at-point-functions #'cape-file) + (add-to-list 'completion-at-point-functions #'cape-elisp-block) + ) +#+end_src + ** Flycheck #+begin_src emacs-lisp - (use-package flycheck - :init (global-flycheck-mode)) + (use-package flycheck + :init (global-flycheck-mode)) #+end_src -*** Flycheck inline errors +** Tree-sitter #+begin_src emacs-lisp - (use-package flycheck-inline - :config - (with-eval-after-load 'flycheck - (add-hook 'flycheck-mode-hook #'flycheck-inline-mode))) + (use-package tree-sitter + :init + (global-tree-sitter-mode) + :config + (add-hook 'tree-sitter-mode-hook 'tree-sitter-hl-mode)) +#+end_src +*** Additional langs +#+begin_src emacs-lisp + (use-package tree-sitter-langs) #+end_src +** Snippets +#+begin_src emacs-lisp + (use-package yasnippet + :init (yas-global-mode)) + (use-package yasnippet-snippets) +#+end_src +* Additional apps +** Telegram lol +#+begin_src emacs-lisp + ;; (add-to-list 'load-path "~/telega.el") + ;; (require 'telega) +#+end_src +** Magit +#+begin_src emacs-lisp + (use-package magit) +#+end_src +** EXWM +#+begin_src emacs-lisp + ;; (use-package exwm) + ;; (require 'exwm) + ;; (require 'exwm-config) + ;; (exwm-config-example) +#+end_src +* Dired +** Bindings +#+begin_src emacs-lisp + (use-package dired + :ensure nil + :custom ((dired-listing-switches "-agho --group-directories-first")) + :bind (:map dired-mode-map + ("h" . 'dired-up-directory) + ("l" . 'dired-find-file) + ("v" . 'meow-visit))) +#+end_src +** Icons +#+begin_src emacs-lisp + (use-package all-the-icons-dired + :init (add-hook 'dired-mode-hook 'all-the-icons-dired-mode)) +#+end_src + -- cgit v1.2.3