         (apply yas--make-control-overlay args))))
 
   :blackout yas-minor-mode)
+
+;;; IDE features
+;;;; Indentation
+
+;; Don't use tabs for indentation. Use only spaces. Frankly, the fact
+;; that `indent-tabs-mode' is even *available* as an *option* disgusts
+;; me, much less the fact that it's *enabled* by default (meaning that
+;; *both* tabs and spaces are used at the same time).
+(setq-default indent-tabs-mode nil)
+
+(defun radian-indent-defun ()
+  "Indent the surrounding defun."
+  (interactive)
+  (save-excursion
+    (when (beginning-of-defun)
+      (let ((beginning (point)))
+        (end-of-defun)
+        (let ((end (point)))
+          (let ((inhibit-message t)
+                (message-log-max nil))
+            (indent-region beginning end)))))))
+
+(bind-key* "C-M-q" #'radian-indent-defun)
+
+;;;; Autocompletion
+
+;; Package `company' provides an in-buffer autocompletion framework.
+;; It allows for packages to define backends that supply completion
+;; candidates, as well as optional documentation and source code. Then
+;; Company allows for multiple frontends to display the candidates,
+;; such as a tooltip menu. Company stands for "Complete Anything".
+(use-package company
+  :defer 3
+  :init
+
+  (defvar radian--company-backends-global
+    '(company-capf
+      company-files
+      (company-dabbrev-code company-keywords)
+      company-dabbrev)
+    "Values for `company-backends' used everywhere.
+If `company-backends' is overridden by Radian, then these
+backends will still be included.")
+
+  :bind (;; Remap the standard Emacs keybindings for invoking
+         ;; completion to instead use Company. You might think this
+         ;; could be put in the `:bind*' declaration below, but it
+         ;; seems that `bind-key*' does not work with remappings.
+         ([remap completion-at-point] . company-manual-begin)
+         ([remap complete-symbol] . company-manual-begin)
+
+         ;; The following are keybindings that take effect whenever
+         ;; the completions menu is visible, even if the user has not
+         ;; explicitly interacted with Company.
+
+         :map company-active-map
+
+         ;; Make TAB always complete the current selection, instead of
+         ;; only completing a common prefix.
+         ("<tab>" . company-complete-selection)
+         ("TAB" . company-complete-selection)
+
+         ;; The following are keybindings that only take effect if the
+         ;; user has explicitly interacted with Company. Note that
+         ;; `:map' from above is "sticky", and applies also below: see
+         ;; https://github.com/jwiegley/use-package/issues/334#issuecomment-349473819.
+
+         :filter (company-explicit-action-p)
+
+         ;; Make RET trigger a completion if and only if the user has
+         ;; explicitly interacted with Company, instead of always
+         ;; doing so.
+         ("<return>" . company-complete-selection)
+         ("RET" . company-complete-selection)
+
+         ;; We then make <up> and <down> abort the completions menu
+         ;; unless the user has interacted explicitly. Note that we
+         ;; use `company-select-previous' instead of
+         ;; `company-select-previous-or-abort'. I think the former
+         ;; makes more sense since the general idea of this `company'
+         ;; configuration is to decide whether or not to steal
+         ;; keypresses based on whether the user has explicitly
+         ;; interacted with `company', not based on the number of
+         ;; candidates.
+         ;;
+         ;; Note that M-p and M-n work regardless of whether explicit
+         ;; interaction has happened yet, and note also that M-TAB
+         ;; when the completions menu is open counts as an
+         ;; interaction.
+         ("<up>" . company-select-previous)
+         ("<down>" . company-select-next))
+
+  :bind* (;; The default keybinding for `completion-at-point' and
+          ;; `complete-symbol' is M-TAB or equivalently C-M-i. We
+          ;; already remapped those bindings to `company-manual-begin'
+          ;; above. Here we make sure that they definitely invoke
+          ;; `company-manual-begin' even if a minor mode binds M-TAB
+          ;; directly.
+          ("M-TAB" . company-manual-begin))
+
+  :config
+
+  ;; Always display the entire suggestion list onscreen, placing it
+  ;; above the cursor if necessary.
+  (setq company-tooltip-minimum company-tooltip-limit)
+
+  ;; Always display suggestions in the tooltip, even if there is only
+  ;; one. Also, don't display metadata in the echo area. (This
+  ;; conflicts with ElDoc.)
+  (setq company-frontends '(company-pseudo-tooltip-frontend))
+
+  ;; Show quick-reference numbers in the tooltip. (Select a completion
+  ;; with M-1 through M-0.)
+  (setq company-show-numbers t)
+
+  ;; Prevent non-matching input (which will dismiss the completions
+  ;; menu), but only if the user interacts explicitly with Company.
+  (setq company-require-match #'company-explicit-action-p)
+
+  ;; Company appears to override our settings in `company-active-map'
+  ;; based on `company-auto-complete-chars'. Turning it off ensures we
+  ;; have full control.
+  (setq company-auto-complete-chars nil)
+
+  ;; Only search the current buffer to get suggestions for
+  ;; `company-dabbrev' (a backend that creates suggestions from text
+  ;; found in your buffers). This prevents Company from causing lag
+  ;; once you have a lot of buffers open.
+  (setq company-dabbrev-other-buffers nil)
+
+  ;; Make the `company-dabbrev' backend fully case-sensitive, to
+  ;; improve the UX when working with domain-specific words that have
+  ;; particular casing.
+  (setq company-dabbrev-ignore-case nil)
+  (setq company-dabbrev-downcase nil)
+
+  ;; When candidates in the autocompletion tooltip have additional
+  ;; metadata, like a type signature, align that information to the
+  ;; right-hand side. This usually makes it look neater.
+  (setq company-tooltip-align-annotations t)
+
+  (global-company-mode +1)
+
+  :blackout t)
+
+;; Package `company-prescient' provides intelligent sorting and
+;; filtering for candidates in Company completions.
+(use-package company-prescient
+  :demand t
+  :after company
+  :config
+
+  ;; Use `prescient' for Company menus.
+  (company-prescient-mode +1))
+
+;;;;; Definition location
+
+;; Package `dumb-jump' provides a mechanism to jump to the definitions
+;; of functions, variables, etc. in a variety of programming
+;; languages. The advantage of `dumb-jump' is that it doesn't try to
+;; be clever, so it "just works" instantly for dozens of languages
+;; with zero configuration.
+(use-package dumb-jump
+  :init
+
+  (dumb-jump-mode +1)
+
+  :bind (:map dumb-jump-mode-map
+              ("M-Q" . dumb-jump-quick-look)))
+
+;;;; Display contextual metadata
+
+;; Feature `eldoc' provides a minor mode (enabled by default in Emacs
+;; 25) which allows function signatures or other metadata to be
+;; displayed in the echo area.
+(use-feature eldoc
+  :demand t
+  :config
+
+  ;; Always truncate ElDoc messages to one line. This prevents the
+  ;; echo area from resizing itself unexpectedly when point is on a
+  ;; variable with a multiline docstring.
+  (setq eldoc-echo-area-use-multiline-p nil)
+
+  ;; Original code from
+  ;; https://github.com/PythonNut/emacs-config/blob/1a92a1ff1d563fa6a9d7281bbcaf85059c0c40d4/modules/config-intel.el#L130-L137,
+  ;; thanks!
+  (radian-defadvice radian--advice-disable-eldoc-on-flycheck
+      (&rest _)
+    :after-while eldoc-display-message-no-interference-p
+    "Disable ElDoc when point is on a Flycheck overlay.
+This prevents ElDoc and Flycheck from fighting over the echo
+area."
+    (not (and (bound-and-true-p flycheck-mode)
+              (flycheck-overlay-errors-at (point)))))
+
+  :blackout t)
+
+;;;; Syntax checking and code linting
+
+;; Package `flycheck' provides a framework for in-buffer error and
+;; warning highlighting, or more generally syntax checking. It comes
+;; with a large number of checkers pre-defined, and other packages
+;; define more.
+(use-package flycheck
+  :defer 4
+  :init
+
+  (defun radian--flycheck-disable-checkers (&rest checkers)
+    "Disable the given Flycheck syntax CHECKERS, symbols.
+This function affects only the current buffer, and neither causes
+nor requires Flycheck to be loaded."
+    (unless (boundp 'flycheck-disabled-checkers)
+      (setq flycheck-disabled-checkers nil))
+    (make-local-variable 'flycheck-disabled-checkers)
+    (dolist (checker checkers)
+      (cl-pushnew checker flycheck-disabled-checkers)))
+
+  :bind-keymap (("C-c !" . flycheck-command-map))
+
+  :config
+
+  (global-flycheck-mode +1)
+
+  (dolist (name '("python" "python2" "python3"))
+    (add-to-list 'safe-local-variable-values
+                 `(flycheck-python-pycompile-executable . ,name)))
+
+  ;; Run a syntax check when changing buffers, just in case you
+  ;; modified some other files that impact the current one. See
+  ;; https://github.com/flycheck/flycheck/pull/1308.
+  (add-to-list 'flycheck-check-syntax-automatically 'idle-buffer-switch)
+
+  ;; For the above functionality, check syntax in a buffer that you
+  ;; switched to only briefly. This allows "refreshing" the syntax
+  ;; check state for several buffers quickly after e.g. changing a
+  ;; config file.
+  (setq flycheck-buffer-switch-check-intermediate-buffers t)
+
+  ;; Display errors in the echo area after only 0.2 seconds, not 0.9.
+  (setq flycheck-display-errors-delay 0.2)
+
+  :config
+
+  (radian-bind-key "p" #'flycheck-previous-error)
+  (radian-bind-key "n" #'flycheck-next-error)
+
+  :blackout t)
 
 ;;; Language support
 ;;;; Text-based languages


  :blackout t)

;;;; Autocompletion

;; Package `company' provides an in-buffer autocompletion framework.
;; It allows for packages to define backends that supply completion
;; candidates, as well as optional documentation and source code. Then
;; Company allows for multiple frontends to display the candidates,
;; such as a tooltip menu. Company stands for "Complete Anything".
(use-package company
  :defer 3
  :init

  (defvar radian--company-backends-global
    '(company-capf
      company-files
      (company-dabbrev-code company-keywords)
      company-dabbrev)
    "Values for `company-backends' used everywhere.
If `company-backends' is overridden by Radian, then these
backends will still be included.")

  :bind (;; Remap the standard Emacs keybindings for invoking
         ;; completion to instead use Company. You might think this
         ;; could be put in the `:bind*' declaration below, but it
         ;; seems that `bind-key*' does not work with remappings.
         ([remap completion-at-point] . company-manual-begin)
         ([remap complete-symbol] . company-manual-begin)

         ;; The following are keybindings that take effect whenever
         ;; the completions menu is visible, even if the user has not
         ;; explicitly interacted with Company.

         :map company-active-map

         ;; Make TAB always complete the current selection, instead of
         ;; only completing a common prefix.
         ("<tab>" . company-complete-selection)
         ("TAB" . company-complete-selection)

         ;; The following are keybindings that only take effect if the
         ;; user has explicitly interacted with Company. Note that
         ;; `:map' from above is "sticky", and applies also below: see
         ;; https://github.com/jwiegley/use-package/issues/334#issuecomment-349473819.

         :filter (company-explicit-action-p)

         ;; Make RET trigger a completion if and only if the user has
         ;; explicitly interacted with Company, instead of always
         ;; doing so.
         ("<return>" . company-complete-selection)
         ("RET" . company-complete-selection)

         ;; We then make <up> and <down> abort the completions menu
         ;; unless the user has interacted explicitly. Note that we
         ;; use `company-select-previous' instead of
         ;; `company-select-previous-or-abort'. I think the former
         ;; makes more sense since the general idea of this `company'
         ;; configuration is to decide whether or not to steal
         ;; keypresses based on whether the user has explicitly
         ;; interacted with `company', not based on the number of
         ;; candidates.
         ;;
         ;; Note that M-p and M-n work regardless of whether explicit
         ;; interaction has happened yet, and note also that M-TAB
         ;; when the completions menu is open counts as an
         ;; interaction.
         ("<up>" . company-select-previous)
         ("<down>" . company-select-next))

  :bind* (;; The default keybinding for `completion-at-point' and
          ;; `complete-symbol' is M-TAB or equivalently C-M-i. We
          ;; already remapped those bindings to `company-manual-begin'
          ;; above. Here we make sure that they definitely invoke
          ;; `company-manual-begin' even if a minor mode binds M-TAB
          ;; directly.
          ("M-TAB" . company-manual-begin))

  :config

  ;; Always display the entire suggestion list onscreen, placing it
  ;; above the cursor if necessary.
  (setq company-tooltip-minimum company-tooltip-limit)

  ;; Always display suggestions in the tooltip, even if there is only
  ;; one. Also, don't display metadata in the echo area. (This
  ;; conflicts with ElDoc.)
  (setq company-frontends '(company-pseudo-tooltip-frontend))

  ;; Show quick-reference numbers in the tooltip. (Select a completion
  ;; with M-1 through M-0.)
  (setq company-show-numbers t)

  ;; Prevent non-matching input (which will dismiss the completions
  ;; menu), but only if the user interacts explicitly with Company.
  (setq company-require-match #'company-explicit-action-p)

  ;; Company appears to override our settings in `company-active-map'
  ;; based on `company-auto-complete-chars'. Turning it off ensures we
  ;; have full control.
  (setq company-auto-complete-chars nil)

  ;; Only search the current buffer to get suggestions for
  ;; `company-dabbrev' (a backend that creates suggestions from text
  ;; found in your buffers). This prevents Company from causing lag
  ;; once you have a lot of buffers open.
  (setq company-dabbrev-other-buffers nil)

  ;; Make the `company-dabbrev' backend fully case-sensitive, to
  ;; improve the UX when working with domain-specific words that have
  ;; particular casing.
  (setq company-dabbrev-ignore-case nil)
  (setq company-dabbrev-downcase nil)

  ;; When candidates in the autocompletion tooltip have additional
  ;; metadata, like a type signature, align that information to the
  ;; right-hand side. This usually makes it look neater.
  (setq company-tooltip-align-annotations t)

  (global-company-mode +1)

  :blackout t)

;; Package `company-prescient' provides intelligent sorting and
;; filtering for candidates in Company completions.
(use-package company-prescient
  :demand t
  :after company
  :config

  ;; Use `prescient' for Company menus.
  (company-prescient-mode +1))

;;;; Automatic display of documentation in the minibuffer

;; Feature `eldoc' provides a minor mode (enabled by default in Emacs
;; 25) which allows function signatures or other metadata to be
;; displayed in the echo area.
(use-feature eldoc
  :demand t
  :config

  ;; Always truncate ElDoc messages to one line. This prevents the
  ;; echo area from resizing itself unexpectedly when point is on a
  ;; variable with a multiline docstring.
  (setq eldoc-echo-area-use-multiline-p nil)

  ;; Original code from
  ;; https://github.com/PythonNut/emacs-config/blob/1a92a1ff1d563fa6a9d7281bbcaf85059c0c40d4/modules/config-intel.el#L130-L137,
  ;; thanks!
  (radian-defadvice radian--advice-disable-eldoc-on-flycheck
      (&rest _)
    :after-while eldoc-display-message-no-interference-p
    "Disable ElDoc when point is on a Flycheck overlay.
This prevents ElDoc and Flycheck from fighting over the echo
area."
    (not (and (bound-and-true-p flycheck-mode)
              (flycheck-overlay-errors-at (point)))))

  :blackout t)

;;;; Automatic syntax checking

;; Package `flycheck' provides a framework for in-buffer error and
;; warning highlighting, or more generally syntax checking. It comes
;; with a large number of checkers pre-defined, and other packages
;; define more.
(use-package flycheck
  :defer 4
  :init

  (defun radian--flycheck-disable-checkers (&rest checkers)
    "Disable the given Flycheck syntax CHECKERS, symbols.
This function affects only the current buffer, and neither causes
nor requires Flycheck to be loaded."
    (unless (boundp 'flycheck-disabled-checkers)
      (setq flycheck-disabled-checkers nil))
    (make-local-variable 'flycheck-disabled-checkers)
    (dolist (checker checkers)
      (cl-pushnew checker flycheck-disabled-checkers)))

  :bind-keymap (("C-c !" . flycheck-command-map))

  :config

  (global-flycheck-mode +1)

  (dolist (name '("python" "python2" "python3"))
    (add-to-list 'safe-local-variable-values
                 `(flycheck-python-pycompile-executable . ,name)))

  ;; Run a syntax check when changing buffers, just in case you
  ;; modified some other files that impact the current one. See
  ;; https://github.com/flycheck/flycheck/pull/1308.
  (add-to-list 'flycheck-check-syntax-automatically 'idle-buffer-switch)

  ;; For the above functionality, check syntax in a buffer that you
  ;; switched to only briefly. This allows "refreshing" the syntax
  ;; check state for several buffers quickly after e.g. changing a
  ;; config file.
  (setq flycheck-buffer-switch-check-intermediate-buffers t)

  ;; Display errors in the echo area after only 0.2 seconds, not 0.9.
  (setq flycheck-display-errors-delay 0.2)

  :config

  (radian-bind-key "p" #'flycheck-previous-error)
  (radian-bind-key "n" #'flycheck-next-error)

  :blackout t)

;;;; Indentation

;; Don't use tabs for indentation. Use only spaces. Frankly, the fact
;; that `indent-tabs-mode' is even *available* as an *option* disgusts
;; me, much less the fact that it's *enabled* by default (meaning that
;; *both* tabs and spaces are used at the same time).
(setq-default indent-tabs-mode nil)

(defun radian-indent-defun ()
  "Indent the surrounding defun."
  (interactive)
  (save-excursion
    (when (beginning-of-defun)
      (let ((beginning (point)))
        (end-of-defun)
        (let ((end (point)))
          (let ((inhibit-message t)
                (message-log-max nil))
            (indent-region beginning end)))))))

(bind-key* "C-M-q" #'radian-indent-defun)

;;;; Snippet expansion

;; Feature `abbrev' provides functionality for expanding user-defined

    :override bookmark-maybe-message
    "Silence useless messages from bookmark.el."))

;;;; Find and replace

;; Package `visual-regexp' provides an alternate version of
