Site Map - skip to main content

Hacker Public Radio

Your ideas, projects, opinions - podcasted.

New episodes every weekday Monday through Friday.
This page was generated by The HPR Robot at


hpr3892 :: Emacs package curation, part 1

Let's go through every single package installed in my Emacs configuration.

<< First, < Previous, , Latest >>

Hosted by dnt on Tuesday, 2023-07-04 is flagged as Clean and is released under a CC-BY-SA license.
emacs, elisp. 2.
The show is available on the Internet Archive at: https://archive.org/details/hpr3892

Listen in ogg, spx, or mp3 format. Play now:

Duration: 00:35:32

general.

Not really every single one, because straight.el installs dependencies automatically.

Here's the file I went through during this recording. Some things may have changed slightly since the time of recording. Save this file in ~/.emacs.d/init.el to reproduce my exact Emacs configuration that I use at home and at work.

;;; init.el ---  This is Tiago's init.el file
;;; Commentary:
;;; Thanks to everyone that curates Emacs packages.

;;; Code:
;; BEGIN Straight.el bootstrap
(defvar bootstrap-version)
(let ((bootstrap-file
       (expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory))
      (bootstrap-version 6))
  (unless (file-exists-p bootstrap-file)
    (with-current-buffer
        (url-retrieve-synchronously
         "https://raw.githubusercontent.com/radian-software/straight.el/develop/install.el"
         'silent 'inhibit-cookies)
      (goto-char (point-max))
      (eval-print-last-sexp)))
  (load bootstrap-file nil 'nomessage))
;; END Straight.el bootstrap

(straight-use-package 'use-package)
(setq straight-use-package-by-default t)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; <<< THE ESSENTIALS >>>  ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; Get minor modes off the modeline
(use-package diminish)

(use-package evil
  :init (setq evil-want-keybinding nil)
  :config (evil-mode)
  :custom (evil-undo-system 'undo-redo)
  :bind ("C-u" . evil-scroll-up))

(use-package evil-collection
  :diminish evil-collection-unimpaired-mode
  :after evil
  :config (evil-collection-init))

(use-package evil-surround
  :after evil
  :config
  (global-evil-surround-mode 1))

;; In-Buffer Completion
(use-package company
  :diminish
  :config (global-company-mode))

;; completion with extra info box
(use-package company-box
  :diminish
  :hook (company-mode . company-box-mode))

;; Show key bindings as you go
(use-package which-key
  :diminish
  :config (which-key-mode))

;; search query feedback in the buffer
(use-package anzu
  :diminish
  :config (global-anzu-mode +1))

(use-package evil-anzu)

;; Completion in the minibuffer (snippet from vertico)
(use-package vertico
  :init
  (vertico-mode)

  ;; Different scroll margin
  ;; (setq vertico-scroll-margin 0)

  ;; Show more candidates
  ;; (setq vertico-count 20)

  ;; Grow and shrink the Vertico minibuffer
  ;; (setq vertico-resize t)

  ;; Optionally enable cycling for `vertico-next' and `vertico-previous'.
  ;; (setq vertico-cycle t)
  )

;; Persist history over Emacs restarts. Vertico sorts by history position.
;; (use-package savehist
;;   :init
;;   (savehist-mode))

;; A few more useful configurations...
(use-package emacs
  :init
  ;; Add prompt indicator to `completing-read-multiple'.
  ;; We display [CRM<separator>], 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))

;; Optionally use the `orderless' completion style.
;; Get completion even if you type substrings that don't match in the
;; same order you typed them in.
(use-package orderless
  :init
  ;; Configure a custom style dispatcher (see the Consult wiki)
  ;; (setq orderless-style-dispatchers '(+orderless-consult-dispatch orderless-affix-dispatch)
  ;;       orderless-component-separator #'orderless-escapable-split-on-space)
  (setq completion-styles '(orderless basic)
        completion-category-defaults nil
        completion-category-overrides '((file (styles partial-completion)))))

;; Enable rich annotations in the completion
(use-package marginalia
  ;; Either bind `marginalia-cycle' globally or only in the minibuffer
  :bind (("M-A" . marginalia-cycle)
         :map minibuffer-local-map
         ("M-A" . marginalia-cycle))

  ;; The :init configuration is always executed (Not lazy!)
  :init

  ;; Must be in the :init section of use-package such that the mode gets
  ;; enabled right away. Note that this forces loading the package.
  (marginalia-mode))

;; Searching commands and lots of other stuff
;; This is a snippet taken from consult
(use-package consult
  ;; Replace bindings. Lazily loaded due by `use-package'.
  :bind (;; C-c bindings in `mode-specific-map'
         ("C-c M-x" . consult-mode-command)
         ("C-c h" . consult-history)
         ("C-c k" . consult-kmacro)
         ("C-c m" . consult-man)
         ("C-c i" . consult-info)
         ([remap Info-search] . consult-info)
         ;; C-x bindings in `ctl-x-map'
         ("C-x M-:" . consult-complex-command)     ;; orig. repeat-complex-command
         ("C-x b" . consult-buffer)                ;; orig. switch-to-buffer
         ("C-x 4 b" . consult-buffer-other-window) ;; orig. switch-to-buffer-other-window
         ("C-x 5 b" . consult-buffer-other-frame)  ;; orig. switch-to-buffer-other-frame
         ("C-x r b" . consult-bookmark)            ;; orig. bookmark-jump
         ("C-x p b" . consult-project-buffer)      ;; orig. project-switch-to-buffer
         ;; Custom M-# bindings for fast register access
         ("M-#" . consult-register-load)
         ("M-'" . consult-register-store)          ;; orig. abbrev-prefix-mark (unrelated)
         ("C-M-#" . consult-register)
         ;; Other custom bindings
         ("M-y" . consult-yank-pop)                ;; orig. yank-pop
         ;; M-g bindings in `goto-map'
         ("M-g e" . consult-compile-error)
         ("M-g f" . consult-flymake)               ;; Alternative: consult-flycheck
         ("M-g g" . consult-goto-line)             ;; orig. goto-line
         ("M-g M-g" . consult-goto-line)           ;; orig. goto-line
         ("M-g o" . consult-outline)               ;; Alternative: consult-org-heading
         ("M-g m" . consult-mark)
         ("M-g k" . consult-global-mark)
         ("M-g i" . consult-imenu)
         ("M-g I" . consult-imenu-multi)
         ;; M-s bindings in `search-map'
         ("M-s d" . consult-find)
         ("M-s D" . consult-locate)
         ("M-s g" . consult-grep)
         ("M-s G" . consult-git-grep)
         ("M-s r" . consult-ripgrep)
         ("M-s l" . consult-line)
         ("M-s L" . consult-line-multi)
         ("M-s k" . consult-keep-lines)
         ("M-s u" . consult-focus-lines)
         ;; Isearch integration
         ("M-s e" . consult-isearch-history)
         :map isearch-mode-map
         ("M-e" . consult-isearch-history)         ;; orig. isearch-edit-string
         ("M-s e" . consult-isearch-history)       ;; orig. isearch-edit-string
         ("M-s l" . consult-line)                  ;; needed by consult-line to detect isearch
         ("M-s L" . consult-line-multi)            ;; needed by consult-line to detect isearch
         ;; Minibuffer history
         :map minibuffer-local-map
         ("M-s" . consult-history)                 ;; orig. next-matching-history-element
         ("M-r" . consult-history))                ;; orig. previous-matching-history-element

  ;; Enable automatic preview at point in the *Completions* buffer. This is
  ;; relevant when you use the default completion UI.
  :hook (completion-list-mode . consult-preview-at-point-mode)

  ;; The :init configuration is always executed (Not lazy)
  :init

  ;; Optionally configure the register formatting. This improves the register
  ;; preview for `consult-register', `consult-register-load',
  ;; `consult-register-store' and the Emacs built-ins.
  (setq register-preview-delay 0.5
        register-preview-function #'consult-register-format)

  ;; Optionally tweak the register preview window.
  ;; This adds thin lines, sorting and hides the mode line of the window.
  (advice-add #'register-preview :override #'consult-register-window)

  ;; Use Consult to select xref locations with preview
  (setq xref-show-xrefs-function #'consult-xref
        xref-show-definitions-function #'consult-xref)

  ;; Configure other variables and modes in the :config section,
  ;; after lazily loading the package.
  :config

  ;; Optionally configure preview. The default value
  ;; is 'any, such that any key triggers the preview.
  ;; (setq consult-preview-key 'any)
  ;; (setq consult-preview-key "M-.")
  ;; (setq consult-preview-key '("S-<down>" "S-<up>"))
  ;; For some commands and buffer sources it is useful to configure the
  ;; :preview-key on a per-command basis using the `consult-customize' macro.
  (consult-customize
   consult-theme :preview-key '(:debounce 0.2 any)
   consult-ripgrep consult-git-grep consult-grep
   consult-bookmark consult-recent-file consult-xref
   consult--source-bookmark consult--source-file-register
   consult--source-recent-file consult--source-project-recent-file
   ;; :preview-key "M-."
   :preview-key '(:debounce 0.4 any))

  ;; Optionally configure the narrowing key.
  ;; Both < and C-+ work reasonably well.
  (setq consult-narrow-key "<") ;; "C-+"

  ;; Optionally make narrowing help available in the minibuffer.
  ;; You may want to use `embark-prefix-help-command' or which-key instead.
  ;; (define-key consult-narrow-map (vconcat consult-narrow-key "?") #'consult-narrow-help)

  ;; By default `consult-project-function' uses `project-root' from project.el.
  ;; Optionally configure a different project root function.
  ;;;; 1. project.el (the default)
  ;; (setq consult-project-function #'consult--default-project--function)
  ;;;; 2. vc.el (vc-root-dir)
  ;; (setq consult-project-function (lambda (_) (vc-root-dir)))
  ;;;; 3. locate-dominating-file
  ;; (setq consult-project-function (lambda (_) (locate-dominating-file "." ".git")))
  ;;;; 4. projectile.el (projectile-project-root)
  ;; (autoload 'projectile-project-root "projectile")
  ;; (setq consult-project-function (lambda (_) (projectile-project-root)))
  ;;;; 5. No project support
  ;; (setq consult-project-function nil)
)

;; workspaces
(use-package perspective
  :bind ("C-x C-b" . persp-list-buffers)         ; or use a nicer switcher, see below
  :custom (persp-mode-prefix-key (kbd "C-c M-p"))  ; pick your own prefix key here
  :init (persp-mode))

;; theme
(use-package doom-themes
  :config
  ;; Global settings (defaults)
  (setq doom-themes-enable-bold t    ; if nil, bold is universally disabled
        doom-themes-enable-italic t) ; if nil, italics is universally disabled
  (load-theme 'doom-one t)

  ;; Corrects (and improves) org-mode's native fontification.
  (doom-themes-org-config))

;; modeline
(use-package powerline
  :straight (:host github :repo "milkypostman/powerline")
  :config (powerline-default-theme))

;; modeline theme
(use-package airline-themes
  :config (load-theme 'airline-onedark t))

;; makes temporary or non-editing buffers darker
(use-package solaire-mode
  :config (solaire-global-mode +1))

;; snippets
(use-package yasnippet
  :diminish yas-minor-mode
  :straight (:host github :repo "joaotavora/yasnippet")
  :config (yas-global-mode 1))

;; projects
(use-package projectile
  :bind-keymap
  ("C-c p" . projectile-command-map))

(use-package rg)

;;;;;;;;;;;
;;; Org ;;;
;;;;;;;;;;;

(use-package org
  :commands (org-mode)
  :init (setq org-directory "~/org/"
              org-noter-notes-search-path '("~/org/roam/")
              org-cite-global-bibliography '("~/org/biblio.bib")
              org-capture-templates
                     '(("n" "Note" entry
                              (file "~/org/todo.org")
                              "* %^{prompt}\n%U\n\n%?")
                       ("r" "Reading list note" entry
                              (file "~/org/reading.org")
                              "* %^{prompt}\n%U\n\n%x"
                              :immediate-finish :jump-to-captured)))
  :config (require 'org-crypt)
          (org-crypt-use-before-save-magic)
          (require 'org-id)
          (defun tgdnt/advice-org-ctrl-c-ctrl-c (&rest args)
            "Run `org-todo' if point is on a visible heading."
            (let ((do-not-run-orig-fn (org-at-heading-p t)))
                (when do-not-run-orig-fn
                (call-interactively #'org-todo))
                do-not-run-orig-fn))
          (advice-add 'org-ctrl-c-ctrl-c :before-until #'tgdnt/advice-org-ctrl-c-ctrl-c)
  :hook (org-mode . auto-fill-mode)
  :bind ("C-x h" . visible-mode)
        ("C-c n a" . org-agenda)
  :custom (org-tags-column 2)
          (org-tags-exclude-from-inheritance '("crypt"))
          (org-crypt-key "90A77BEA68A05915")
          (org-crypt-disable-auto-save t)
          (org-adapt-indentation nil)
          (org-clock-ask-before-exiting nil)
          (org-startup-folded t)
          (org-startup-indented t)
          (org-priority-start-cycle-with-default nil)
          (org-id-link-to-org-use-id 'use-existing)
          (org-agenda-files (append (directory-files "~/org/" t ".+\.org$")))
          (org-agenda-custom-commands
                '(("A" "Agenda and Unscheduled TODOs"
                   ((agenda "")
                    (todo "TODO" ((org-agenda-overriding-header "Unscheduled actions:")))
                    (todo "PROJ" ((org-agenda-overriding-header "Projects:")))
                    (todo "OPEN" ((org-agenda-overriding-header "Open items:")))
                    (todo "HOLD" ((org-agenda-overriding-header "On Hold:"))))
                    ((org-agenda-dim-blocked-tasks 'invisible))
                                    nil)))
          (org-agenda-todo-ignore-with-date t)
          (org-agenda-start-day nil)
          (org-agenda-start-on-weekday nil)
          (org-agenda-span 1)
          (org-agenda-skip-deadline-prewarning-if-scheduled t)
          (org-agenda-prefix-format '((agenda . "%?-12t% s")
                                      (todo . "  ")
                                      (tags . "  ")
                                      (search . "  ")))
          (org-agenda-deadline-leaders '("!" "%1d" "‼"))
          (org-agenda-scheduled-leaders '("#" "%1d"))
          (org-enforce-todo-dependencies t)
          (org-refile-targets '((nil :maxlevel . 2)
                                (org-agenda-files :maxlevel . 2)))
          (org-attach-id-dir "~/org/attachments")
          (org-crypt-disable-auto-save t)
          (org-crypt-tag-matcher "crypt")
          (org-archive-location "~/org/archive/archive.org::")
          (org-deadline-warning-days 5)
          (org-archive-save-context-info '(time file olpath ltags itags category))
          (org-id-link-to-org-use-id 'use-existing)
          (org-todo-keywords '((type "TODO(t)" ;; A clearly defined action
                                     "OPEN(o)" ;; An open item, must be clarified
                                     "HOLD(h)" ;; An open item, must be clarified
                                     "PROJ(p)" ;; A project, with actions within it
                                   "|" "DONE(d)" "QUIT(q)"))))

;; make visible-mode automatic when entering insert mode
(use-package org-appear
  :init (setq org-hide-emphasis-markers t)
  :hook (org-mode . org-appear-mode)
  :custom (org-appear-autolinks t))

(use-package evil-org
  :after org
  :hook (org-mode . (lambda () evil-org-mode))
  :config
  (require 'evil-org-agenda)
  (evil-org-agenda-set-keys))

;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; more basic settings ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;
(setq backup-directory-alist
              `(("." . ,(concat user-emacs-directory "backups")))
      backup-by-copying t
      delete-old-versions t
      kept-new-versions 6
      kept-old-versions 2
      version-control t)

(setq-default fill-column 64
              indent-tabs-mode nil
              display-time-day-and-date t
              display-time-24hr-format t)

(setq custom-file (expand-file-name "custom.el" user-emacs-directory))
(load custom-file t)

(when window-system
  (scroll-bar-mode -1)
  (menu-bar-mode -1)
  (tool-bar-mode -1))

;; (toggle-frame-fullscreen)
(display-time)
(display-battery-mode)
(server-start)
(setq inhibit-startup-screen t)

;; If on a graphical env, load init-base, if not on windows, load init-extra
(when window-system
  (load-file (expand-file-name "init-base.el" user-emacs-directory))
  (require 'init-base)
  (unless (string= (x-server-vendor) "Microsoft Corp.")
      (load-file (expand-file-name "init-extra.el" user-emacs-directory))
      (require 'init-extra)))

(provide 'init)
;;; init.el ends here

In part 2, coming soon, we'll go through init-base.el and init-extra.el.


Comments

Subscribe to the comments RSS feed.

Comment #1 posted on 2023-07-05 02:37:03 by Klaatu

I love this topic

This is such a great idea for a show. My .emacs file is an unholy mess of config options stolen from colleagues over the years...maybe recording an episode of my own about my configuration would help me clean it up.

Comment #2 posted on 2023-07-11 01:59:18 by dnt

Do it!

Yes! It turns out that, by completing the sentence "Let's go through every single package installed in a...", you can get a bunch of shows! Looking forward to your review of your .emacs

Leave Comment

Note to Verbose Commenters
If you can't fit everything you want to say in the comment below then you really should record a response show instead.

Note to Spammers
All comments are moderated. All links are checked by humans. We strip out all html. Feel free to record a show about yourself, or your industry, or any other topic we may find interesting. We also check shows for spam :).

Provide feedback
Your Name/Handle:
Title:
Comment:
Anti Spam Question: What does the letter P in HPR stand for?
Are you a spammer?
Who is the host of this show?
What does HPR mean to you?