.emacs.d

the most bloated Emacs config on this planet
git clone https://git.trogloxene.org/.emacs.d.git
Log | Files | Refs

init-base.el (10881B)


      1 ;;; init-base.el --- base config -*- lexical-binding: t -*-
      2 
      3 ;;; Commentary:
      4 
      5 ;;; Code:
      6 
      7 ;; keybindings
      8 (my-use-package general)
      9 
     10 ;; mode names in mode line
     11 (my-use-package delight
     12   :config
     13   (delight
     14    `((eldoc-mode nil eldoc)
     15      (org-indent-mode nil org-indent)
     16      (desktop-environment-mode nil desktop-environment)
     17      (hs-minor-mode nil hideshow))))
     18 
     19 ;; garbage collection
     20 (my-use-package gcmh
     21   :delight
     22   :hook
     23   (emacs-startup . gcmh-mode)
     24   :init
     25   (setq gcmh-idle-delay 'auto
     26         gcmh-auto-idle-delay-factor 10
     27         gcmh-high-cons-threshold #x4000000))
     28 
     29 ;; benchmark
     30 (my-use-package benchmark-init
     31   :init
     32   (add-hook 'after-init-hook #'benchmark-init/deactivate 100))
     33 
     34 ;; server-mode
     35 (my-use-package server my-enable-server
     36   :straight nil
     37   :demand t
     38   :hook
     39   (emacs-startup . my-enable-server)
     40   :init
     41   (defun my-enable-server ()
     42     (unless (server-running-p)
     43       (server-mode 1))))
     44 
     45 ;; recently opened files
     46 (my-use-package recentf
     47   :straight nil
     48   :hook
     49   (after-init . recentf-mode)
     50   :init
     51   (setq recentf-max-saved-items 30
     52         recentf-exclude
     53         '("\\.?cache" ".cask" "url" "COMMIT_EDITMSG\\'" "bookmarks"
     54           "\\.\\(?:gz\\|gif\\|svg\\|png\\|jpe?g\\|bmp\\|xpm\\)$"
     55           "\\.?ido\\.last$" "\\.revive$" "/G?TAGS$" "/.elfeed/"
     56           "^/tmp/" "^/var/folders/.+$" "^/ssh:" "/persp-confs/"
     57           (lambda (file) (file-in-directory-p file package-user-dir))))
     58   :config
     59   (add-to-list 'recentf-exclude "~/hywiki/.hywiki.eld")
     60   (add-to-list 'recentf-exclude (abbreviate-file-name (straight--build-dir)))
     61   (with-eval-after-load 'bookmark
     62     (add-to-list 'recentf-exclude bookmark-default-file)))
     63 
     64 ;; save minibuffer history
     65 (my-use-package savehist
     66   :straight nil
     67   :hook
     68   (after-init . savehist-mode)
     69   :init
     70   (setq history-length 50
     71         savehist-additional-variables '(mark-ring
     72                                         global-mark-ring
     73                                         search-ring
     74                                         regexp-search-ring
     75                                         extended-command-history)
     76         savehist-autosave-interval 300))
     77 
     78 ;; save cursor place
     79 (my-use-package saveplace
     80   :straight nil
     81   :hook
     82   (after-init . save-place-mode))
     83 
     84 ;; async
     85 (my-use-package async (not *is-android*)
     86   :hook
     87   (dired-mode . dired-async-mode))
     88 
     89 ;; autorevert buffer
     90 (my-use-package autorevert
     91   :straight nil
     92   :delight
     93   :hook
     94   (find-file . global-auto-revert-mode))
     95 
     96 ;; display keybindings
     97 (my-use-package which-key
     98   :straight nil
     99   :delight
    100   :commands which-key-enable-god-mode-support
    101   :hook
    102   (after-init . which-key-mode))
    103 
    104 ;; save window changes
    105 (my-use-package winner
    106   :straight nil
    107   :hook
    108   (after-init . winner-mode))
    109 
    110 ;; ibuffer
    111 (my-use-package ibuffer
    112   :straight nil
    113   :hook
    114   (ibuffer . my-ibuffer-setup)
    115   :init
    116   (defun my-ibuffer-setup () (ibuffer-switch-to-saved-filter-groups "Main"))
    117   :config
    118   (setq ibuffer-saved-filter-groups
    119         '(("Main"
    120            ("App" (mode . exwm-mode))
    121            ("Scratch" (or
    122                        (name . "^*scratch")))
    123            ("Text" (or
    124                     (predicate (lambda () (and (derived-mode-p 'org-mode)
    125                                                (not (memq 'gptel-mode local-minor-modes)))))
    126                     (mode . markdown-mode)
    127                     (mode . rst-mode)
    128                     (filename . ".\\.md")
    129                     (name . "^\\*\\[D\\] FILE backlinks for")))
    130            ("Scripts" (or
    131                        (mode . shell-script-mode)
    132                        (mode . sh-mode)
    133                        (mode . bat-mode)))
    134            ("Config" (or
    135                       (name . "\\.\\(toml\\|ya?ml\\|ini\\|cfg\\|conf\\|gitignore\\)$")
    136                       (mode . conf-mode)
    137                       (mode . conf-desktop-mode)
    138                       (mode . conf-toml-mode)
    139                       (mode . conf-xdefaults-mode)
    140                       (mode . conf-javaprop-mode)
    141                       (mode . conf-unix-mode)))
    142            ("Web" (or (name . "\\.\\(html?\\|xml\\|css\\|s[ac]ss\\|less\\|jsx?\\|tsx?\\|json\\|md\\)$")))
    143            ("LSP" (or (name . "\\*EGLOT")
    144                       (name . "\\*Flycheck")
    145                       (derived-mode . eglot--managed-mode)))
    146            ("C/C++" (name . "\\.\\(c\\|cpp\\|cc\\|h\\|hpp\\|cppm\\|ixx\\)$"))
    147            ("Elisp" (or (mode . emacs-lisp-mode)
    148                         (filename . ".\\.eld")))
    149            ("Emacs" (or (mode . emacs-lisp-compilation-mode)
    150                         (mode . inferior-emacs-lisp-mode)
    151                         (mode . debugger-mode)
    152                         (mode . messages-buffer-mode)
    153                         (mode . backtrace-mode)
    154                         (mode . eldoc-mode)
    155                         (mode . my-elisp-macroexpand-mode)))
    156            ("Scheme" (or
    157                       (mode . scheme-mode)))
    158            ("Geiser" (or
    159                       (name . "^Geiser")
    160                       (mode . geiser-repl-mode)
    161                       (mode . geiser-debug-mode)
    162                       (mode . geiser-messages-mode)
    163                       (mode . geiser-debug-mode)
    164                       (mode . geiser-doc-mode)
    165                       (mode . geiser-autodoc-mode)))
    166            ("Common-lisp" (or
    167                            (mode . common-lisp-mode)
    168                            (mode . lisp-mode)))
    169            ("Sly" (or
    170                    (mode . lisp-data-mode)
    171                    (mode . sly-db-mode)
    172                    (mode . sly-mrepl-mode)
    173                    (mode . sly-inspector-mode)
    174                    (name . "\\*sly-compilation\\*")
    175                    (name . "^\\*sly-inferior-lisp")
    176                    (name . "^\\*sly-events")
    177                    (name . "^\\*img-cache\\*")))
    178            ("Shell" (or
    179                      (mode . shell-mode)
    180                      (mode . eshell-mode)
    181                      (mode . term-mode)
    182                      (mode . ghostel-mode)))
    183            ("Tramp"(or
    184                     (name . "^\\*tramp")))
    185            ("VC" (or
    186                   (mode . magit-blame-mode)
    187                   (mode . magit-cherry-mode)
    188                   (mode . magit-diff-mode)
    189                   (mode . magit-log-mode)
    190                   (mode . magit-process-mode)
    191                   (mode . magit-status-mode)
    192                   (mode . magit-revision-mode)
    193                   (mode . magit-refs-mode)
    194                   (mode . vc-annotate-mode)
    195                   (name . "^\\*vc")))
    196            ("Assets" (or (name . "\\.\\(png\\|jpe?g\\|svg\\|webp\\|bpm\\|ppm\\|mp[34]\\|mov\\|avi\\|obj\\)$")))
    197            ("Directories" (or
    198                            (mode . dired-mode)
    199                            (name . "^*dirvish")
    200                            (mode . trashed-mode)))
    201            ("Eww" (or
    202                    (mode . eww-mode)
    203                    (mode . eww-bookmark-mode)
    204                    (mode . eww-buffers-mode)
    205                    (mode . eww-history-mode)))
    206            ("Feeds" (or
    207                      (name . "\\*elfeed-")))
    208            ("AI" (or
    209                   (predicate (lambda () (memq 'gptel-mode local-minor-modes)))
    210                   (name . "^\\*gptel-")
    211                   (name . "^\\*pilish")))
    212            ("Calc" (or
    213                     (mode . calc-mode)
    214                     (mode . calc-trail-mode)))
    215            ("Help" (or
    216                     (mode . help-mode)
    217                     (mode . helpful-mode)
    218                     (mode . Info-mode)  ;`Info' must be capitalized
    219                     (mode . Man-mode))) ;`Man' too
    220            ("Grep" (or
    221                     (mode . grep-mode)
    222                     (mode . xref--xref-buffer-mode)
    223                     (mode . xref-edit-mode)
    224                     (mode . occur-mode)
    225                     (mode . occur-edit-mode)))
    226            ("Diff" (or
    227                     (name . "^*Diff")
    228                     (mode . diff-mode)
    229                     (mode . ediff-mode)
    230                     (mode . vundo-diff-mode)
    231                     (name . "^\\*ediff-")
    232                     (name . "\\*Ediff Registry\\*")))
    233            ("Process" (predicate get-buffer-process (current-buffer))))))
    234 
    235   (setq ibuffer-formats
    236         '((mark modified read-only locked
    237                 " " (name 55 55 :left :elide)
    238                 " " (size 8 -1 :right)
    239                 " " (mode 18 18 :left :elide) " " filename-and-process)
    240           (mark " " (name 16 -1) " " filename)))
    241 
    242   (setq ibuffer-show-empty-filter-groups nil
    243         ibuffer-default-sorting-mode 'alphabetic
    244         ibuffer-human-readable-size t))
    245 
    246 (my-use-package simple
    247   :straight nil
    248   :hook
    249   (after-init . size-indication-mode)
    250   (after-init . column-number-mode)
    251   :config
    252   (setq kill-whole-line t
    253         set-mark-command-repeat-pop t)) ;easier to pop marks
    254 
    255 ;; scroll
    256 (my-use-package pixel-scroll (not *is-mac*)
    257   :straight nil
    258   :hook
    259   (after-init . pixel-scroll-precision-mode)
    260   :init
    261   (setq scroll-preserve-screen-position t
    262         scroll-conservatively 101)
    263 
    264   (defun my-pixel-scroll-precision-hack (fun event)
    265     (cl-letf (((symbol-function 'device-class)
    266                (lambda (&rest _) 'mouse)))
    267       (funcall fun event)))
    268   :config
    269   (advice-add 'pixel-scroll-precision :around #'my-pixel-scroll-precision-hack))
    270 
    271 ;; eww
    272 (my-use-package eww
    273   :straight nil
    274   :config
    275   (setq eww-auto-rename-buffer t))
    276 
    277 (my-use-package shr
    278   :straight nil
    279   :config
    280   (setq shr-use-fonts nil))
    281 
    282 ;; tramp
    283 (my-use-package tramp
    284   :straight nil
    285   :config
    286   (setq tramp-default-method 'ssh
    287         tramp-auto-save-directory
    288         (expand-file-name "tramp-auto-save" user-emacs-directory)
    289         tramp-completion-use-auth-sources nil))
    290 
    291 ;; speedbar
    292 (my-use-package speedbar
    293   :straight nil
    294   :init
    295   (setq speedbar-window-default-width 30)
    296 
    297   (defun my-speedbar ()
    298     "Run `speedbar-get-focus' if current buffer is not speedbar, otherwise run `speedbar'"
    299     (interactive)
    300     (if (or (not (boundp 'speedbar-buffer))
    301             (eq (current-buffer) speedbar-buffer))
    302         (speedbar)
    303       (speedbar-get-focus)))
    304 
    305   (defun my-speedbar-line-expanded-p ()
    306     "Return non-nil if the speedbar line at point is expanded."
    307     (save-excursion
    308       (beginning-of-line)
    309       (and (re-search-forward ":\\s-*.\\([-+?]\\)" (line-end-position) t)
    310            (equal (match-string 1) "-"))))
    311 
    312   (defun my-speedbar-tab ()
    313     "Expand or contract current line."
    314     (interactive)
    315     (if (my-speedbar-line-expanded-p)
    316         (speedbar-contract-line)
    317       (speedbar-expand-line)))
    318 
    319   :config
    320   (if (boundp 'speedbar-prefer-window)
    321       (setq speedbar-prefer-window t))
    322   (setq speedbar-use-images nil)
    323   (setq speedbar-file-unshown-regexp "\\`0123456789abcdefghijklmnopqrstuvwxyz\\'") ; nonsense here because I cannot set this to nil
    324   (setq speedbar-directory-unshown-regexp "\\`\\.\\.?\\'")
    325   (setq speedbar-show-unknown-files t))
    326 
    327 (provide 'init-base)
    328 ;;; init-base.el ends here