emacs/config/qol.org
2026-04-04 23:50:53 -05:00

4.5 KiB

Quality of Life

These packages make my emacs usage a lot more pleasant. Many packages that are mostly aimed towards this end will go here.

which-key

This is now included in emacs, but I do make a slight modification to the default behavior as I enable it.

(which-key-mode)
(which-key-setup-side-window-bottom)

anzu

Great package that highlights matches and displays match total on the status bar.

(use-package anzu
  :defer 10
  :config (global-anzu-mode))

Casual

I'd like to start using transient over hydra. Casual does a lot of the leg work for us.

(use-package casual
  :ensure t
  :bind
  ("C-o" . casual-editkit-main-tmenu) ;; Global EditKit menu
  (:map dired-mode-map
        ("C-o" . casual-dired-tmenu)
        ("s" . casual-dired-sort-by-tmenu)
        ("/" . casual-dired-search-replace-tmenu))
  (:map org-agenda-mode-map
        ("C-o" . casual-agenda-tmenu)
        ("M-j" . org-agenda-clock-goto)
        ("J" . bookmark-jump))
  (:map ibuffer-mode-map
        ("C-o" . casual-ibuffer-tmenu)
        ("F" . casual-ibuffer-filter-tmenu)
        ("s" . casual-ibuffer-sortby-tmenu)
        ("{" . ibuffer-backwards-next-marked)
        ("}" . ibuffer-forward-next-marked)
        ("[" . ibuffer-backward-filter-group)
        ("]" . ibuffer-forward-filter-group)
        ("$" . ibuffer-toggle-filter-group))
  (:map calc-mode-map
        ("C-o" . casual-calc-tmenu))
  (:map calc-alg-map
        ("C-o" . casual-calc-tmenu))
  (:map eshell-mode-map
        ("C-o" . casual-eshell-tmenu))
  (:map eww-mode-map
        ("C-o" . casual-eww-tmenu))
  (:map eww-bookmark-mode-map
        ("C-o" . casual-eww-bookmarks-tmenu))
  (:map help-mode-map
        ("C-o" . casual-help-tmenu))
  (:map Info-mode-map
        ("C-o" . casual-info-tmenu))
  :config
  ;; Dired configuration
  (add-hook 'dired-mode-hook #'hl-line-mode)
  (add-hook 'dired-mode-hook #'context-menu-mode)

  ;; IBuffer configuration
  (add-hook 'ibuffer-mode-hook #'hl-line-mode)
  (add-hook 'ibuffer-mode-hook #'ibuffer-auto-mode)
  (keymap-set ibuffer-mode-map "<double-mouse-1>" #'ibuffer-visit-buffer)
  (keymap-set ibuffer-mode-map "M-<double-mouse-1>" #'ibuffer-visit-buffer-other-window)

  ;; Info configuration
  (add-hook 'Info-mode-hook #'hl-line-mode)
  (add-hook 'Info-mode-hook #'scroll-lock-mode))

Embark

Embark is like a DWIM version of which-key in a sense. Though it is more oriented towards maps rather than every possible key. Before reaching for a manual I often give embark a try in the buffer and find what I'm looking for.

(use-package embark
  :ensure t

  :bind
  (("C-." . embark-act)         ;; pick some comfortable binding
   ("C-;" . embark-dwim)        ;; good alternative: M-.
   ("C-h B" . embark-bindings)) ;; alternative for `describe-bindings'

  :init

  ;; Optionally replace the key help with a completing-read interface
  (setq prefix-help-command #'embark-prefix-help-command)

  ;; Show the Embark target at point via Eldoc. You may adjust the
  ;; Eldoc strategy, if you want to see the documentation from
  ;; multiple providers. Beware that using this can be a little
  ;; jarring since the message shown in the minibuffer can be more
  ;; than one line, causing the modeline to move up and down:

  ;; (add-hook 'eldoc-documentation-functions #'embark-eldoc-first-target)
  ;; (setq eldoc-documentation-strategy #'eldoc-documentation-compose-eagerly)

  :config

  ;; Hide the mode line of the Embark live/completions buffers
  (add-to-list 'display-buffer-alist
               '("\\`\\*Embark Collect \\(Live\\|Completions\\)\\*"
                 nil
                 (window-parameters (mode-line-format . none)))))

;; Consult users will also want the embark-consult package.
(use-package embark-consult
  :ensure t ; only need to install it, embark loads it after consult if found
  :hook
  (embark-collect-mode . consult-preview-at-point-mode))

I've been using some LLMs for test generation, and search lately. For now I'm going to try out gptel and see how I like it.

(use-package gptel
  :config
  (setq
   gptel-model 'gemini-3-pro-preview
   gptel-api-key (lambda () (auth-source-pick-first-password :host "generativelanguage.googleapis.com"))
   gptel-backend (gptel-make-gemini "Gemini"
                   :stream t
                   :key #'gptel-api-key-from-auth-source)))