emacs/config/defaults.org
Evie Litherland-Smith 74bbe0578f Guard against loading invalid config files
Ensure that config org-mode files don't contain "#" in the filename
when looping to call org-babel-load-file. These files only exist if a
file has unsaved changes, but directory-files will still find them as
.org files and attempt to load

Move package-archive definition and priorities into start of init.el,
since everything else actually depends on that (somewhat)
2024-04-05 15:22:48 +01:00

6 KiB

Emacs Config Defaults

  (setq custom-file (locate-user-emacs-file "custom.el"))
  (when (and custom-file (file-exists-p custom-file))
    (load custom-file nil 'nomessage))

  (setq user-full-name "Evie Litherland-Smith"
        user-mail-address "evie@xenia.me.uk"
        use-short-answers t
        load-prefer-newer t
        even-window-sizes t
        global-auto-revert-non-file-buffers t
        dired-auto-revert-buffer t
        dired-dwim-target t
        tab-always-indent t
        completion-cycle-threshold nil
        completions-detailed t
        xref-show-definitions-function #'xref-show-definitions-completing-read
        kill-do-not-save-duplicates t
        auto-window-vscroll nil
        fast-but-imprecise-scrolling t
        scroll-conservatively 101
        scroll-margin 0
        scroll-preserve-screen-position 1)


  ;; Bind normal forward/back buttons on mouse to next/previous buffer respectively
  (keymap-global-set "<mouse-8>" #'previous-buffer)
  (keymap-global-set "<mouse-9>" #'next-buffer)

  ;; Quick bind for calling `git-sync-all'
  (defun my/git-sync-all ()
    "Run shell command `git-sync-all' asynchronously."
    (interactive)
    (async-shell-command "git-sync-all" "*git-sync-all*" "*git-sync-errors*")
    (require 'org-journal)
    (org-journal-invalidate-cache))
  (keymap-global-set "C-c g s" #'my/git-sync-all)

  (set-default-coding-systems 'utf-8)
  (set-terminal-coding-system 'utf-8)
  (set-keyboard-coding-system 'utf-8)

  (global-auto-revert-mode +1)
  (delete-selection-mode +1)

  (setopt
   ;; No tabs
   indent-tabs-mode nil
   ;; Only display async output buffer when there's something to show
   async-shell-command-display-buffer nil
   ;; Scroll compilation buffer output
   compilation-scroll-output t)

  ;; Make shebang (#!) file executable when saved
  (add-hook 'after-save-hook #'executable-make-buffer-file-executable-if-script-p)

Auto-save file settings

  (setq backup-directory-alist '(("." . "~/.local/state/emacs/backups"))
        tramp-backup-directory-alist backup-directory-alist
        tramp-auto-save-directory (cdr (assoc "." tramp-backup-directory-alist)))

  (savehist-mode +1)

Recent files

  (use-package recentf
    :config
    (run-at-time nil (* 5 60) 'recentf-save-list)
    (recentf-mode +1)
    :custom
    (recentf-max-saved-items 2048))

diminish modes

  (use-package diminish :ensure t)

Authentication

  (when (require 'auth-source nil :noerror)
    (setq auth-sources '("secrets:Login"))
    (when (require 'auth-source-pass nil :noerror)
      (auth-source-pass-enable)))

Helpful

  ;; Make `describe-*' screens more helpful
  (use-package helpful
    :ensure t
    :bind (("<remap> <describe-command>" . helpful-command)
           ("<remap> <describe-function>" . helpful-callable)
           ("<remap> <describe-key>" . helpful-key)
           ("<remap> <describe-symbol>" . helpful-symbol)
           ("<remap> <describe-variable>" . helpful-variable)
           ("C-h F" . helpful-function)
           :map helpful-mode-map
           ("<remap> <revert-buffer>" . helpful-update)))

  ;; Bind extra `describe-*' commands
  (keymap-global-set "C-h K" #'describe-keymap)

Spell checking

  ;; turn on spell checking, if available.
  (use-package ispell
    :ensure t
    :diminish
    :custom
    (ispell-dictionary "en_GB"))

  (use-package flyspell
    :ensure t
    :diminish
    :hook ((text-mode . flyspell-mode)
           (prog-mode . flyspell-prog-mode))
    :init
    (require 'ispell)
    :custom
    (flyspell-mode-line-string nil)
    (flyspell-use-meta-tab nil)
    :config
    (require 'flyspell-correct)
    (require 'consult-flyspell))

  (use-package flyspell-correct
    :ensure t
    :diminish
    :after flyspell
    :bind ( :map flyspell-mode-map
            ("C-;" . flyspell-correct-wrapper)))

  (use-package consult-flyspell
    :ensure t
    :diminish
    :after (consult flyspell)
    :bind ( :map flyspell-mode-map
            ("C-c s ;" . consult-flyspell))
    :config
    (setq consult-flyspell-always-check-buffer t))

ibuffer

  (use-package ibuffer
    :ensure t
    :bind (("C-c b" . ibuffer)))

  (use-package ibuffer-project
    :ensure t
    :after ibuffer
    :hook ((ibuffer . (lambda ()
                        (setq ibuffer-filter-groups (ibuffer-project-generate-filter-groups))
                        (unless (eq ibuffer-sorting-mode 'project-file-relative)
                          (ibuffer-do-sort-by-project-file-relative))))))

Link hint keymaps

  (use-package link-hint
    :ensure t
    :bind (("C-c l o" . link-hint-open-link)
           ("C-c l c" . link-hint-copy-link)
           ("C-c l C-o" . link-hint-open-all-link)
           ("C-c l C-c" . link-hint-copy-all-link)))

Avy keymaps

  (use-package avy
    :ensure t
    :diminish
    :bind (("C-c j j" . avy-goto-char-2)
           ("C-c j w" . avy-goto-word-0)
           ("C-c j c" . avy-goto-char)
           ("C-c j l" . avy-goto-line)))

which-func config

  (use-package which-func
    :ensure t
    :init (which-function-mode))

Shells and terminals

  (use-package shell
    :bind (("C-c t s" . shell)))

  (use-package eshell
    :bind (("C-c t e" . eshell)))

Web browser

  (use-package eww
    :defer t
    :diminish
    :custom
    (browse-url-browser-function 'browse-url-default-browser)
    (browse-url-new-window-flag t)
    (eww-default-download-directory "~/Downloads/")
    (eww-auto-rename-buffer 'title)
    (eww-browse-url-new-window-is-tab nil))