2022-04-04 11:45:24 +02:00
|
|
|
;;; $DOOMDIR/config.el -*- lexical-binding: t; -*-
|
|
|
|
|
|
|
|
;; Place your private configuration here! Remember, you do not need to run 'doom
|
|
|
|
;; sync' after modifying this file!
|
|
|
|
|
|
|
|
|
|
|
|
;; Some functionality uses this to identify you, e.g. GPG configuration, email
|
|
|
|
;; clients, file templates and snippets. It is optional.
|
2022-04-10 12:04:27 +02:00
|
|
|
;; (setq user-full-name "John Doe"
|
|
|
|
;; user-mail-address "john@doe.com")
|
2022-04-04 11:45:24 +02:00
|
|
|
|
|
|
|
;; Doom exposes five (optional) variables for controlling fonts in Doom:
|
|
|
|
;;
|
|
|
|
;; - `doom-font' -- the primary font to use
|
|
|
|
;; - `doom-variable-pitch-font' -- a non-monospace font (where applicable)
|
|
|
|
;; - `doom-big-font' -- used for `doom-big-font-mode'; use this for
|
|
|
|
;; presentations or streaming.
|
|
|
|
;; - `doom-unicode-font' -- for unicode glyphs
|
|
|
|
;; - `doom-serif-font' -- for the `fixed-pitch-serif' face
|
|
|
|
;;
|
|
|
|
;; See 'C-h v doom-font' for documentation and more examples of what they
|
|
|
|
;; accept. For example:
|
|
|
|
;;
|
|
|
|
;;(setq doom-font (font-spec :family "Fira Code" :size 12 :weight 'semi-light)
|
|
|
|
;; doom-variable-pitch-font (font-spec :family "Fira Sans" :size 13))
|
|
|
|
;;
|
|
|
|
;; If you or Emacs can't find your font, use 'M-x describe-font' to look them
|
|
|
|
;; up, `M-x eval-region' to execute elisp code, and 'M-x doom/reload-font' to
|
|
|
|
;; refresh your font settings. If Emacs still can't find your font, it likely
|
|
|
|
;; wasn't installed correctly. Font issues are rarely Doom issues!
|
|
|
|
|
|
|
|
;; There are two ways to load a theme. Both assume the theme is installed and
|
|
|
|
;; available. You can either set `doom-theme' or manually load a theme with the
|
|
|
|
;; `load-theme' function. This is the default:
|
|
|
|
(setq doom-theme 'doom-one)
|
2022-04-11 12:54:16 +02:00
|
|
|
(custom-theme-set-faces! nil
|
|
|
|
'((font-lock-constant-face
|
|
|
|
font-lock-function-name-face
|
|
|
|
font-lock-keyword-face
|
|
|
|
font-lock-type-face)
|
|
|
|
:weight bold)
|
|
|
|
'((show-paren-match
|
|
|
|
whitespace-line)
|
|
|
|
:background nil)
|
|
|
|
`((line-number-current-line)
|
|
|
|
:inherit ,(remq 'hl-line (internal-get-lisp-face-attribute
|
|
|
|
'line-number-current-line
|
|
|
|
:inherit))))
|
2022-04-12 16:11:22 +02:00
|
|
|
(after! avy
|
|
|
|
(let ((avy-lead-face-fg (internal-get-lisp-face-attribute 'avy-lead-face
|
|
|
|
:background))
|
|
|
|
(avy-lead-face-0-fg (internal-get-lisp-face-attribute 'avy-lead-face-0
|
|
|
|
:background))
|
|
|
|
(avy-lead-face-1-fg (internal-get-lisp-face-attribute 'avy-lead-face-1
|
|
|
|
:background))
|
|
|
|
(avy-lead-face-2-fg (internal-get-lisp-face-attribute 'avy-lead-face-2
|
|
|
|
:background)))
|
|
|
|
(custom-theme-set-faces! 'doom-one
|
|
|
|
`(avy-lead-face :foreground ,avy-lead-face-fg
|
|
|
|
:background nil
|
|
|
|
:weight bold)
|
|
|
|
`(avy-lead-face-0 :foreground ,avy-lead-face-0-fg
|
|
|
|
:inherit avy-lead-face)
|
|
|
|
`(avy-lead-face-1 :foreground ,avy-lead-face-1-fg
|
|
|
|
:inherit avy-lead-face)
|
|
|
|
`(avy-lead-face-2 :foreground ,avy-lead-face-2-fg
|
|
|
|
:inherit avy-lead-face))))
|
2022-04-13 00:55:46 +02:00
|
|
|
(after! symbol-overlay
|
|
|
|
(custom-theme-set-faces! nil
|
|
|
|
'(symbol-overlay-default-face :inherit hl-line)))
|
2022-04-04 11:45:24 +02:00
|
|
|
|
|
|
|
;; This determines the style of line numbers in effect. If set to `nil', line
|
|
|
|
;; numbers are disabled. For relative line numbers, set this to `relative'.
|
|
|
|
(setq display-line-numbers-type t)
|
|
|
|
|
|
|
|
;; If you use `org' and don't want your org files in the default location below,
|
|
|
|
;; change `org-directory'. It must be set before org loads!
|
2022-04-10 19:38:54 +02:00
|
|
|
(setq org-directory "~/Workspace/org/")
|
2022-04-04 11:45:24 +02:00
|
|
|
|
|
|
|
|
|
|
|
;; Whenever you reconfigure a package, make sure to wrap your config in an
|
|
|
|
;; `after!' block, otherwise Doom's defaults may override your settings. E.g.
|
|
|
|
;;
|
|
|
|
;; (after! PACKAGE
|
|
|
|
;; (setq x y))
|
|
|
|
;;
|
|
|
|
;; The exceptions to this rule:
|
|
|
|
;;
|
|
|
|
;; - Setting file/directory variables (like `org-directory')
|
|
|
|
;; - Setting variables which explicitly tell you to set them before their
|
|
|
|
;; package is loaded (see 'C-h v VARIABLE' to look up their documentation).
|
|
|
|
;; - Setting doom variables (which start with 'doom-' or '+').
|
|
|
|
;;
|
|
|
|
;; Here are some additional functions/macros that will help you configure Doom.
|
|
|
|
;;
|
|
|
|
;; - `load!' for loading external *.el files relative to this one
|
|
|
|
;; - `use-package!' for configuring packages
|
|
|
|
;; - `after!' for running code after a package has loaded
|
|
|
|
;; - `add-load-path!' for adding directories to the `load-path', relative to
|
|
|
|
;; this file. Emacs searches the `load-path' when you load packages with
|
|
|
|
;; `require' or `use-package'.
|
|
|
|
;; - `map!' for binding new keys
|
|
|
|
;;
|
|
|
|
;; To get information about any of these functions/macros, move the cursor over
|
|
|
|
;; the highlighted symbol at press 'K' (non-evil users must press 'C-c c k').
|
|
|
|
;; This will open documentation for it, including demos of how they are used.
|
|
|
|
;; Alternatively, use `C-h o' to look up a symbol (functions, variables, faces,
|
|
|
|
;; etc).
|
|
|
|
;;
|
|
|
|
;; You can also try 'gd' (or 'C-c c d') to jump to their definition and see how
|
|
|
|
;; they are implemented.
|
2022-04-08 20:51:55 +02:00
|
|
|
|
|
|
|
;; -----------------------------------------------------------------------------
|
|
|
|
;; Override doom configuration.
|
|
|
|
;; -----------------------------------------------------------------------------
|
|
|
|
|
2022-04-12 16:11:22 +02:00
|
|
|
;; Remove background from `avy'.
|
|
|
|
(after! avy (setq avy-background t))
|
|
|
|
|
2022-08-13 22:38:19 +02:00
|
|
|
(after! org
|
|
|
|
(defvar +x/org-capture-inbox-file "inbox.org")
|
|
|
|
(defvar +x/org-capture-reading-list-file "reading.org")
|
|
|
|
(add-to-list 'org-capture-templates
|
|
|
|
`("r" "Reading list" entry
|
|
|
|
(file+headline ,+x/org-capture-reading-list-file "Inbox")
|
|
|
|
"* %?"))
|
|
|
|
(add-to-list 'org-capture-templates
|
|
|
|
`("i" "Inbox" entry
|
|
|
|
(file ,+x/org-capture-inbox-file)
|
|
|
|
"* HOLD [#C] %?" :prepend t))
|
|
|
|
|
|
|
|
(setq org-todo-keywords
|
|
|
|
'((sequence
|
|
|
|
"HOLD(h)" ; This task needs doing eventually, but not yet
|
|
|
|
"NEXT(n)" ; A task that needs doing and is ready to do
|
|
|
|
"WEEK(w)" ; A task that is scheduled to work on this week
|
|
|
|
"TODO(d)" ; A task that is currently getting done
|
|
|
|
"WAIT(t)" ; Something external is holding up this task
|
|
|
|
"|"
|
|
|
|
"DONE(x)")); Task successfully completed
|
|
|
|
org-todo-keyword-faces
|
|
|
|
'(("HOLD" . +org-todo-onhold)
|
|
|
|
("NEXT" . +org-todo-active)
|
|
|
|
("WEEK" . org-todo)
|
|
|
|
("WAIT" . +org-todo-cancel)))
|
|
|
|
|
|
|
|
(add-to-list 'org-after-todo-state-change-hook
|
|
|
|
(lambda ()
|
|
|
|
(when (equal org-state "DONE")
|
|
|
|
(org-archive-to-archive-sibling)))))
|
|
|
|
|
|
|
|
(after! org-agenda
|
|
|
|
(setq org-agenda-custom-commands
|
|
|
|
'(("d" "Agenda and tasklist for the day"
|
|
|
|
((agenda "")
|
|
|
|
(todo "TODO"))
|
|
|
|
((org-agenda-span 'day)
|
|
|
|
(org-agenda-start-day "")
|
|
|
|
(org-deadline-warning-days 0)))
|
|
|
|
("w" "Agenda and tasklist for the week"
|
|
|
|
((agenda "")
|
|
|
|
(todo "TODO")
|
|
|
|
(todo "WEEK"))
|
|
|
|
((org-agenda-start-on-weekday 1)
|
|
|
|
(org-agenda-span 'week)
|
|
|
|
(org-agenda-start-day "")
|
|
|
|
(org-deadline-warning-days 0)))
|
|
|
|
("p" . "Planning lists")
|
|
|
|
("pd" "Agenda and tasklist for daily planning"
|
|
|
|
((agenda "")
|
|
|
|
(todo "WEEK")
|
|
|
|
(todo "TODO"))
|
|
|
|
((org-agenda-start-on-weekday 1)
|
|
|
|
(org-agenda-span 'week)
|
|
|
|
(org-agenda-start-day "")
|
|
|
|
(org-deadline-warning-days 0)))
|
|
|
|
("pw" "Agenda and tasklist for weekly planning"
|
|
|
|
((agenda "")
|
|
|
|
(todo "NEXT")
|
|
|
|
(todo "HOLD")
|
|
|
|
(todo "WEEK")
|
|
|
|
(todo "TODO"))
|
|
|
|
((org-agenda-start-on-weekday 1)
|
|
|
|
(org-agenda-span 'fortnight)
|
|
|
|
(org-agenda-start-day "")
|
|
|
|
(org-deadline-warning-days 0)))
|
|
|
|
("r" . "Weekly review lists")
|
|
|
|
("rl" "Tasklist of leftover work"
|
|
|
|
((todo "TODO")
|
|
|
|
(todo "WEEK")))
|
|
|
|
("rn" "Agenda and tasklist of upcoming tasks"
|
|
|
|
((agenda "")
|
|
|
|
(todo "WAIT")
|
|
|
|
(todo "NEXT")
|
|
|
|
(todo "HOLD"))
|
|
|
|
((org-agenda-start-on-weekday 1)
|
|
|
|
(org-agenda-span 'month)
|
|
|
|
(org-agenda-start-day "")
|
|
|
|
(org-deadline-warning-days 0))))))
|
2022-04-08 20:51:55 +02:00
|
|
|
|
|
|
|
;; Remove the silly doom newline advice.
|
2022-04-10 21:21:41 +02:00
|
|
|
(advice-remove 'newline-and-indent
|
|
|
|
#'+default--newline-indent-and-continue-comments-a)
|
2022-04-08 20:51:55 +02:00
|
|
|
|
2022-04-11 17:15:26 +02:00
|
|
|
;; Doom already uses whitespace-mode to highlight unexpected indentation. Add
|
|
|
|
;; some extras by defining an advice function.
|
2022-04-11 17:37:16 +02:00
|
|
|
(defadvice! +x-doom--highlight-unwanted-space-a nil
|
2022-04-11 17:15:26 +02:00
|
|
|
"Add some extra whitespace highlights to doom's opinion"
|
|
|
|
:after #'doom-highlight-non-default-indentation-h
|
|
|
|
(when (bound-and-true-p whitespace-mode)
|
2022-08-13 22:38:19 +02:00
|
|
|
(appendq! whitespace-style '(trailing empty))
|
|
|
|
(when (not (eq major-mode 'org-mode))
|
|
|
|
(appendq! whitespace-style '(lines-tail)))
|
2022-04-11 17:15:26 +02:00
|
|
|
(whitespace-mode +1)))
|
2022-04-08 20:51:55 +02:00
|
|
|
|
2022-04-10 23:38:27 +02:00
|
|
|
;; I actually like it when Emacs recenters the screen while scrolling. This may
|
|
|
|
;; be an issue in large files. When that becomes an issue add an exception here.
|
|
|
|
(setq scroll-conservatively 0)
|
|
|
|
|
2022-04-08 20:51:55 +02:00
|
|
|
;; -----------------------------------------------------------------------------
|
|
|
|
;; Additional coniguration for doom modules.
|
|
|
|
;; -----------------------------------------------------------------------------
|
|
|
|
|
2022-08-14 01:10:51 +02:00
|
|
|
;; Clangd LSP configuration.
|
|
|
|
(after! lsp-clangd
|
|
|
|
(setq lsp-clients-clangd-args
|
|
|
|
'("-j=3"
|
|
|
|
"--background-index"
|
|
|
|
"--clang-tidy"
|
|
|
|
"--completion-style=detailed"
|
|
|
|
"--header-insertion=never"
|
|
|
|
"--header-insertion-decorators=0"))
|
|
|
|
(set-lsp-priority! 'clangd 2))
|
|
|
|
|
2022-04-21 09:18:20 +02:00
|
|
|
;; Podman > docker.
|
|
|
|
(after! docker (setq docker-command "podman"))
|
|
|
|
(after! dockerfile-mode (setq dockerfile-mode-command "podman"))
|
|
|
|
|
2022-04-10 23:38:51 +02:00
|
|
|
;; Fix git-gutter advice for magit.
|
|
|
|
(after! (:all git-gutter magit)
|
2022-04-11 17:15:26 +02:00
|
|
|
;; Update all visible buffers when (un)staging in the magit buffer.
|
2022-04-11 17:37:16 +02:00
|
|
|
(defadvice! +x-vc-gutter--update-visible-buffers-a (&rest _)
|
2022-04-11 17:15:26 +02:00
|
|
|
"Update vc-gutter in all visible buffers."
|
|
|
|
:after #'magit-stage
|
|
|
|
:after #'magit-unstage
|
2022-04-10 23:38:51 +02:00
|
|
|
(save-excursion
|
|
|
|
(dolist (buffer (doom-visible-buffers) nil)
|
|
|
|
(with-current-buffer buffer
|
2022-04-11 17:15:26 +02:00
|
|
|
(+vc-gutter-update-h))))))
|
2022-04-10 23:38:51 +02:00
|
|
|
|
2022-04-10 22:09:25 +02:00
|
|
|
;; Disable hl-line-mode everywhere.
|
|
|
|
(after! hl-line (setq global-hl-line-modes nil))
|
|
|
|
|
2022-04-08 21:32:56 +02:00
|
|
|
;; Don't use the LSP formatter.
|
|
|
|
(after! lsp (setq +format-with-lsp nil))
|
|
|
|
|
2022-04-08 20:52:38 +02:00
|
|
|
;; Python virtualenv configuration.
|
2022-04-10 21:21:41 +02:00
|
|
|
(after! lsp-pyright
|
|
|
|
(setq lsp-pyright-venv-path (concat (getenv "HOME") "/.virtualenvs")))
|
2022-04-08 20:52:38 +02:00
|
|
|
|
2022-04-10 23:38:27 +02:00
|
|
|
;; Always open magit in other window.
|
|
|
|
(after! magit
|
|
|
|
(setq magit-display-buffer-function #'magit-display-buffer-traditional))
|
|
|
|
|
2022-04-10 19:38:45 +02:00
|
|
|
;; Rainbow delimiters in all prog-mode buffers.
|
2022-04-11 12:54:52 +02:00
|
|
|
(add-hook 'prog-mode-hook #'rainbow-delimiters-mode-enable)
|
2022-04-10 19:38:45 +02:00
|
|
|
|
2022-04-11 00:06:16 +02:00
|
|
|
;; Make pyvenv more convenient by defaulting to the correct directory.
|
|
|
|
(after! pyvenv
|
|
|
|
(setq pyvenv-default-virtual-env-name
|
|
|
|
(file-name-as-directory (pyvenv-workon-home))))
|
|
|
|
|
2022-04-10 19:38:45 +02:00
|
|
|
;; Make TRAMP easier to use for sudo on remote hosts.
|
|
|
|
(after! tramp
|
2022-04-10 21:21:41 +02:00
|
|
|
;; Proxy all sudo connections via an ssh connection to the provided hostname.
|
2022-04-10 19:38:45 +02:00
|
|
|
(add-to-list 'tramp-default-proxies-alist '(nil "\\`root\\'" "/ssh:%h:"))
|
2022-04-10 21:21:41 +02:00
|
|
|
;; This rule is an exception to the above so that local sudo does not proxy
|
|
|
|
;; via ssh. This has to be added last so that it is the first element.
|
2022-04-10 19:38:45 +02:00
|
|
|
(add-to-list 'tramp-default-proxies-alist '("localhost" "\\`root\\'" nil)))
|
|
|
|
|
2022-04-11 17:16:13 +02:00
|
|
|
;; Configure undo-tree.
|
|
|
|
(after! undo-tree
|
2022-04-12 18:28:55 +02:00
|
|
|
;; Doom's default is to popup on the left, but undo-tree can get really wide.
|
|
|
|
;; It would actually be better to open it in its own window as is the default,
|
|
|
|
;; but then the diff window has annoying graphical glitches which for some
|
|
|
|
;; reason don't happen when a popup is used with the diff window configuration
|
|
|
|
;; hack further below.
|
|
|
|
(set-popup-rule! undo-tree-visualizer-buffer-name
|
|
|
|
:slot 2 :side 'top :size 20 :select t :quit t)
|
2022-04-11 17:16:13 +02:00
|
|
|
;; Doom just gives up on the diff visualizer, because it is impossible to work
|
|
|
|
;; around undo-tree's window management opinions in a consistent way. For now,
|
|
|
|
;; hack it to work in some sensible way.
|
2022-04-11 17:37:16 +02:00
|
|
|
(defadvice! +x-undo-tree--visualizer-show-diff-a (fn &rest args)
|
2022-04-11 17:16:13 +02:00
|
|
|
"Display the undo-tree diff buffer underneath undo-tree's parent buffer."
|
|
|
|
:around #'undo-tree-visualizer-show-diff
|
2022-04-11 17:37:16 +02:00
|
|
|
(defadvice! +x-undo-tree--visualizer-show-diff-split-window-a (&rest _)
|
2022-04-11 17:16:13 +02:00
|
|
|
"Hack `split-window' to open the diff window where we want it."
|
|
|
|
:filter-args #'split-window
|
|
|
|
(list (get-buffer-window undo-tree-visualizer-parent-buffer) nil 'below))
|
|
|
|
(apply fn args)
|
2022-04-11 17:37:16 +02:00
|
|
|
(advice-remove 'split-window
|
|
|
|
#'+x-undo-tree--visualizer-show-diff-split-window-a))
|
2022-04-11 17:16:13 +02:00
|
|
|
(setq
|
|
|
|
;; Don't keep persistent history - that's what git is for.
|
|
|
|
undo-tree-auto-save-history nil
|
|
|
|
;; This is nice, but this variables turns nil for some reason after leaving
|
|
|
|
;; undo-tree. A more consistent experience is to just toggle it with "d".
|
|
|
|
undo-tree-visualizer-diff nil))
|
|
|
|
|
2022-04-11 00:46:44 +02:00
|
|
|
;; The only thing I actually missed from helm.
|
|
|
|
(map! (:when (featurep! :completion vertico)
|
|
|
|
:map vertico-map
|
2022-04-11 17:37:16 +02:00
|
|
|
"C-l" (defun +x-vertico/directory-delete-one-word ()
|
2022-04-11 17:15:26 +02:00
|
|
|
"Delete one directory or word before point."
|
2022-04-11 00:46:44 +02:00
|
|
|
(interactive)
|
|
|
|
(vertico-directory-delete-word 1))))
|
|
|
|
|
2022-04-08 20:52:20 +02:00
|
|
|
;; Extra VTerm configuration.
|
|
|
|
(after! vterm
|
|
|
|
(setq vterm-shell "/bin/zsh"
|
|
|
|
vterm-max-scrollback 10000))
|
|
|
|
|
|
|
|
(map! :leader
|
|
|
|
(:prefix-map ("o" . "open")
|
|
|
|
(:when (featurep! :term vterm)
|
|
|
|
:desc "Project VTerm" "p" #'+vterm/project/other-window
|
|
|
|
:desc "Project VTerm (same window)" "P" #'+vterm/project/here
|
|
|
|
:desc "VTerm" "t" #'+vterm/other-window
|
|
|
|
:desc "VTerm (same window)" "T" #'+vterm/here)))
|
|
|
|
|
2022-04-13 00:55:46 +02:00
|
|
|
;; Tab key should indent and absolutely nothing more.
|
|
|
|
(after! yasnippet
|
|
|
|
(map! (:map yas-minor-mode-map
|
|
|
|
"<tab>" nil
|
|
|
|
"TAB" nil
|
|
|
|
"<C-return>" #'yas-expand)))
|
|
|
|
|
2022-04-08 20:51:55 +02:00
|
|
|
;; -----------------------------------------------------------------------------
|
|
|
|
;; Configuration for additional packages on top of doom and its modules.
|
|
|
|
;; -----------------------------------------------------------------------------
|
|
|
|
|
2022-04-13 00:55:46 +02:00
|
|
|
;; Nicer box comments.
|
|
|
|
(use-package! box-comments
|
|
|
|
:bind (("C-x C-'" . +x-box-comment/box-comment)))
|
2022-04-10 19:38:45 +02:00
|
|
|
|
|
|
|
;; A nicer interface for ripgrep. Note that since doom required rg we don't
|
|
|
|
;; consider the case if it's not installed.
|
|
|
|
(use-package! deadgrep
|
2022-04-11 17:15:26 +02:00
|
|
|
:bind (("C-x C-g" . deadgrep))
|
2022-04-10 19:38:45 +02:00
|
|
|
:init
|
|
|
|
(setq deadgrep-project-root-function
|
2022-04-11 17:37:16 +02:00
|
|
|
(defun +x-deadgrep-project-root-fn ()
|
2022-04-11 17:15:26 +02:00
|
|
|
"Provide a base directory for deadgrep."
|
2022-04-10 19:38:45 +02:00
|
|
|
(read-directory-name "Base directory: " nil default-directory t)))
|
|
|
|
:config
|
2022-04-11 17:15:26 +02:00
|
|
|
(map! (:map deadgrep-mode-map
|
2022-04-11 17:37:16 +02:00
|
|
|
"C-o" (defun +x-deadgrep/open-result-other-window ()
|
2022-04-11 17:15:26 +02:00
|
|
|
"Open the result in other window without changing to it."
|
|
|
|
(interactive)
|
|
|
|
(save-selected-window (deadgrep-visit-result-other-window)))
|
2022-04-13 00:55:46 +02:00
|
|
|
"RET" #'deadgrep-visit-result-other-window)))
|
2022-04-10 19:38:45 +02:00
|
|
|
|
|
|
|
;; Duplicate things.
|
|
|
|
(use-package! duplicate-thing
|
|
|
|
:bind (("M-C" . duplicate-thing)))
|
|
|
|
|
2022-08-13 22:39:40 +02:00
|
|
|
;; P4 programming mode.
|
|
|
|
(use-package! p4_16-mode
|
|
|
|
:mode (("\\.p4\\'" . p4_16-mode)
|
|
|
|
("\\.p4i\\'" . p4_16-mode)))
|
|
|
|
|
2022-04-13 00:55:46 +02:00
|
|
|
;; Navigate betweeon occurences of the same symbol.
|
|
|
|
(use-package! symbol-overlay
|
|
|
|
:bind (("M-RET" . symbol-overlay-put)
|
|
|
|
("M-n" . symbol-overlay-switch-forward)
|
|
|
|
("M-p" . symbol-overlay-switch-backward)
|
|
|
|
("<C-M-return>" . symbol-overlay-remove-all))
|
|
|
|
:hook (prog-mode . symbol-overlay-mode)
|
|
|
|
:config
|
|
|
|
;; Since we're reusing colours from orderless which only has four faces.
|
|
|
|
(setq symbol-overlay-faces '(orderless-match-face-0
|
|
|
|
orderless-match-face-1
|
|
|
|
orderless-match-face-2
|
|
|
|
orderless-match-face-3)))
|
|
|
|
|
2022-04-10 19:38:45 +02:00
|
|
|
;; It's the 21st century, a file explorer should be pretty.
|
|
|
|
(use-package! treemacs-icons-dired
|
|
|
|
:after dired
|
|
|
|
:hook (dired-mode . treemacs-icons-dired-mode))
|
|
|
|
|
2022-04-08 20:51:55 +02:00
|
|
|
;; Kill line when calling kill-region without a selected region.
|
|
|
|
(use-package! whole-line-or-region
|
|
|
|
:config
|
|
|
|
(define-key whole-line-or-region-local-mode-map [remap comment-dwim] nil)
|
2022-04-10 19:39:02 +02:00
|
|
|
(whole-line-or-region-global-mode +1))
|
2022-04-08 20:51:55 +02:00
|
|
|
|
2022-04-11 18:54:30 +02:00
|
|
|
;; Defer loading of local configuration library.
|
|
|
|
(use-package! x-lib
|
|
|
|
:defer t)
|
|
|
|
|
2022-04-13 00:55:46 +02:00
|
|
|
;; Load `yank-indent' without deferring.
|
|
|
|
(use-package! yank-indent
|
|
|
|
:config
|
|
|
|
(advice-add 'yank :after #'+x-yank-indent-a)
|
|
|
|
(advice-add 'yank-pop :after #'+x-yank-indent-a)
|
|
|
|
(advice-add 'consult-yank-pop :after #'+x-yank-indent-a))
|
|
|
|
|
2022-04-10 19:38:45 +02:00
|
|
|
;; -----------------------------------------------------------------------------
|
|
|
|
;; Global configuration.
|
|
|
|
;; -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
(setq-default
|
|
|
|
;; Standard fill-column width.
|
|
|
|
fill-column 100
|
|
|
|
;; Do not use tab characters for indentation.
|
|
|
|
indent-tabs-mode nil
|
|
|
|
;; Kill whole line when point at beginning of line.
|
|
|
|
kill-whole-line t
|
|
|
|
;; Always indent. Why would I ever want to insert a tab?
|
|
|
|
tab-always-indent t
|
|
|
|
;; Default indentation size - applies even when indent-tabs-mode is nil.
|
2022-04-10 21:21:41 +02:00
|
|
|
tab-width 8)
|
|
|
|
|
|
|
|
;; Highlight lines that are too long in whitespace mode. We set this with a hook
|
|
|
|
;; after local variables as fill-column is often set through dir-locals.
|
2022-04-11 17:15:26 +02:00
|
|
|
(add-hook! 'hack-local-variables-hook
|
2022-04-11 17:37:16 +02:00
|
|
|
(defun +x-whitespace--update-whitespace-line-column-h ()
|
2022-04-11 17:15:26 +02:00
|
|
|
"Change `whitespace-line-column' to that of `fill-column'."
|
|
|
|
(setq-local whitespace-line-column fill-column)))
|
2022-04-10 19:38:45 +02:00
|
|
|
|
|
|
|
;; CamelCase as separate words.
|
2022-04-10 19:39:02 +02:00
|
|
|
(global-subword-mode +1)
|
2022-04-10 19:38:45 +02:00
|
|
|
|
|
|
|
;; Doom emacs recommends `visual-line-mode' as it claims wrapping is expensive.
|
2022-04-10 19:39:02 +02:00
|
|
|
(global-visual-line-mode +1)
|
2022-04-10 19:38:45 +02:00
|
|
|
|
2022-04-10 21:21:41 +02:00
|
|
|
;; But "C-e" behaves differently in `visual-line-mode' than when wrapping. It
|
|
|
|
;; goes to the end of the visual line, not the logical line. This can be fixed
|
|
|
|
;; by defining the following aliases.
|
2022-04-10 19:38:45 +02:00
|
|
|
(defalias #'end-of-visual-line #'end-of-line)
|
|
|
|
(defalias #'beginning-of-visual-line #'beginning-of-line)
|
|
|
|
|
2022-04-13 00:55:46 +02:00
|
|
|
;; Enable the fill column indicator.
|
|
|
|
(add-hook 'prog-mode-hook #'display-fill-column-indicator-mode)
|
2022-04-08 20:51:55 +02:00
|
|
|
|
2022-08-13 22:39:14 +02:00
|
|
|
;; Allow Emacs in WSL to open links in a browser on the Windows host.
|
|
|
|
(when (and (eq system-type 'gnu/linux)
|
|
|
|
(string-match
|
|
|
|
"Linux.*Microsoft.*Linux"
|
|
|
|
(shell-command-to-string "uname -a")))
|
|
|
|
(setq
|
|
|
|
browse-url-generic-program "/mnt/c/Windows/System32/cmd.exe"
|
|
|
|
browse-url-generic-args '("/c" "start")
|
|
|
|
browse-url-browser-function #'browse-url-generic)
|
|
|
|
|
|
|
|
(defun +x/browse-url-of-dired-file ()
|
|
|
|
"In Dired, ask a WWW browser to display the file named on this line."
|
|
|
|
(interactive)
|
|
|
|
(let ((tem (dired-get-filename t t)))
|
|
|
|
(if tem
|
|
|
|
(browse-url-of-file (concat "file://///wsl$/"
|
|
|
|
(getenv "WSL_DISTRO_NAME")
|
|
|
|
(expand-file-name tem)))
|
|
|
|
(error "No file on this line"))))
|
|
|
|
|
|
|
|
(map! (:map dired-mode-map
|
|
|
|
"W" #'+x/browse-url-of-dired-file)))
|
|
|
|
|
2022-04-08 20:51:55 +02:00
|
|
|
;; -----------------------------------------------------------------------------
|
2022-04-10 19:38:45 +02:00
|
|
|
;; Global keybindings.
|
2022-04-08 20:51:55 +02:00
|
|
|
;; -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
(map!
|
2022-04-11 18:54:30 +02:00
|
|
|
"C-M-\\" #'+x/indent-region-or-buffer
|
2022-04-13 01:41:52 +02:00
|
|
|
"C-x k" #'+x/kill-buffer
|
2022-04-11 18:54:30 +02:00
|
|
|
"C-<" #'+x/scroll-down-one
|
|
|
|
"C->" #'+x/scroll-up-one
|
|
|
|
"M-Q" #'+x/unfill-paragraph
|
2022-08-13 22:38:19 +02:00
|
|
|
(:map org-mode-map
|
|
|
|
"C-c C-;" #'+x/org-insert-link-with-title)
|
2022-04-12 16:11:22 +02:00
|
|
|
;; Faster navigation with avy.
|
|
|
|
"M-g M-c" #'avy-goto-char
|
|
|
|
"M-g M-v" #'avy-goto-char-2
|
|
|
|
"M-g M-l" #'avy-goto-line
|
|
|
|
"M-g M-e" #'avy-goto-word-0
|
|
|
|
"M-g M-w" #'avy-goto-word-1
|
|
|
|
"M-g M-t" #'avy-goto-char-timer
|
|
|
|
"M-g M-j" #'avy-resume
|
|
|
|
(:map isearch-mode-map
|
|
|
|
"C-'" #'avy-isearch)
|
2022-04-08 20:51:55 +02:00
|
|
|
;; Create binding before dired is loaded.
|
|
|
|
"C-x C-j" #'dired-jump
|
|
|
|
;; More convenient window switching.
|
|
|
|
"M-o" #'other-window
|
2022-04-11 17:15:26 +02:00
|
|
|
"C-x o" #'other-popup)
|