Merge branch 'develop' into eshell-improvements

This commit is contained in:
Steven vanZyl 2020-04-28 09:33:56 -04:00
commit 73de701073
112 changed files with 1431 additions and 978 deletions

View file

@ -12,7 +12,12 @@
;; Check only when saving or opening files. Newline & idle checks are a mote
;; excessive and can catch code in an incomplete state, producing false
;; positives, so we removed them.
(setq flycheck-check-syntax-automatically '(save mode-enabled))
(setq flycheck-check-syntax-automatically '(save mode-enabled 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 a little quicker (default is 0.9s)
(setq flycheck-display-errors-delay 0.25)

View file

@ -101,14 +101,7 @@ be negative.")
:config
(set-popup-rule! "^\\*helm" :vslot -100 :size 0.22 :ttl nil)
;; HACK Doom doesn't support these commands, which invite the user to install
;; the package via ELPA. Force them to use +helm/* instead, because they work
;; out of the box.
(advice-add #'helm-projectile-rg :override #'+helm/project-search)
(advice-add #'helm-projectile-ag :override #'+helm/project-search)
(advice-add #'helm-projectile-grep :override #'+helm/project-search)
;; Hide the modeline
;; Hide the modeline in helm windows as it serves little purpose.
(defun +helm--hide-mode-line (&rest _)
(with-current-buffer (helm-buffer-get)
(unless helm-mode-line-string

View file

@ -136,7 +136,7 @@ These keybindings are available while a search is active:
| =C-c C-o= | Open a buffer with your search results |
| =C-c C-e= | Open a writable buffer of your search results |
| =C-SPC= | Preview the current candidate |
| =M-RET= | Open the selected candidate in other-window |
| =C-RET= | Open the selected candidate in other-window |
Changes to the resulting wgrep buffer (opened by =C-c C-e=) can be committed
with =C-c C-c= and aborted with =C-c C-k= (alternatively =ZZ= and =ZQ=, for evil

View file

@ -262,7 +262,10 @@ evil-ex-specific constructs, so we disable it solely in evil-ex."
(cond ((executable-find doom-projectile-fd-binary)
(cons doom-projectile-fd-binary (list "-t" "f" "-E" ".git")))
((executable-find "rg")
(split-string (format counsel-rg-base-command "--files --no-messages") " " t))
(append (list "rg" "--files" "--color=never" "--hidden" "--no-messages")
(cl-loop for dir in projectile-globally-ignored-directories
collect "--glob" and collect (concat "!" dir))
(if IS-WINDOWS (list "--path-separator" "/"))))
((cons find-program args)))
(unless (listp args)
(user-error "`counsel-file-jump-args' is a list now, please customize accordingly."))
@ -328,7 +331,9 @@ evil-ex-specific constructs, so we disable it solely in evil-ex."
;; posframe.
(dolist (fn '(swiper counsel-rg counsel-grep counsel-git-grep))
(setf (alist-get fn ivy-posframe-display-functions-alist)
#'ivy-display-function-fallback)))
#'ivy-display-function-fallback))
(add-hook 'doom-reload-hook #'posframe-delete-all))
(use-package! flx

View file

@ -129,6 +129,12 @@
(cond ((featurep! :completion ivy) #'ivy-bibtex)
((featurep! :completion helm) #'helm-bibtex)))
:desc "Toggle org-clock" "c" #'+org/toggle-clock
:desc "Cancel org-clock" "C" #'org-clock-cancel
:desc "Open deft" "d" #'deft
(:when (featurep! :lang org +noter)
:desc "Org noter" "e" #'org-noter)
:desc "Find file in notes" "f" #'+default/find-in-notes
:desc "Browse notes" "F" #'+default/browse-notes
:desc "Org store link" "l" #'org-store-link
@ -151,14 +157,14 @@
:desc "Switch to buffer" "b" #'org-roam-switch-to-buffer
:desc "Org Roam Capture" "c" #'org-roam-capture
:desc "Find file" "f" #'org-roam-find-file
:desc "Show graph" "g" #'org-roam-graph-show
:desc "Show graph" "g" #'org-roam-graph
:desc "Insert" "i" #'org-roam-insert
:desc "Org Roam" "r" #'org-roam
(:prefix ("d" . "by date")
:desc "Arbitrary date" "d" #'org-roam-date
:desc "Today" "t" #'org-roam-today
:desc "Tomorrow" "m" #'org-roam-tomorrow
:desc "Yesterday" "y" #'org-roam-yesterday))))
:desc "Arbitrary date" "d" #'org-roam-dailies-date
:desc "Today" "t" #'org-roam-dailies-today
:desc "Tomorrow" "m" #'org-roam-dailies-tomorrow
:desc "Yesterday" "y" #'org-roam-dailies-yesterday))))
;;; <leader> o --- open
"o" nil ; we need to unbind it first as Org claims this prefix
@ -535,14 +541,4 @@
;;; treemacs
(:when (featurep! :ui treemacs)
"<f9>" #'+treemacs/toggle
"<C-f9>" #'+treemacs/find-file)
;;; yasnippet
(:after yasnippet
:map yas-keymap ; keymap while editing an inserted snippet
"C-e" #'+snippets/goto-end-of-field
"C-a" #'+snippets/goto-start-of-field
"<S-tab>" #'yas-prev-field
"<M-backspace>" #'+snippets/delete-to-start-of-field
[backspace] #'+snippets/delete-backward-char
[delete] #'+snippets/delete-forward-char-or-field))
"<C-f9>" #'+treemacs/find-file))

View file

@ -4,9 +4,12 @@
;; NOTE SPC u replaces C-u as the universal argument.
;; Minibuffer
(define-key! evil-ex-completion-map
(define-key! :keymaps '(evil-ex-completion-map evil-ex-search-keymap)
"C-a" #'evil-beginning-of-line
"C-b" #'evil-backward-char)
"C-b" #'evil-backward-char
"C-f" #'evil-forward-char
"C-j" #'next-complete-history-element
"C-k" #'previous-complete-history-element)
(define-key! :keymaps +default-minibuffer-maps
[escape] #'abort-recursive-edit
@ -15,16 +18,17 @@
"C-u" #'evil-delete-back-to-indentation
"C-v" #'yank
"C-w" #'doom/delete-backward-word
"C-z" (λ! (ignore-errors (call-interactively #'undo)))
;; Scrolling lines
"C-j" #'next-line
"C-k" #'previous-line
"C-S-j" #'scroll-up-command
"C-S-k" #'scroll-down-command)
"C-z" (λ! (ignore-errors (call-interactively #'undo))))
(define-key! read-expression-map
"C-j" #'next-line-or-history-element
"C-k" #'previous-line-or-history-element))
(when (featurep! :editor evil +everywhere)
(define-key! :keymaps +default-minibuffer-maps
"C-j" #'next-line
"C-k" #'previous-line
"C-S-j" #'scroll-up-command
"C-S-k" #'scroll-down-command)
(define-key! read-expression-map
"C-j" #'next-line-or-history-element
"C-k" #'previous-line-or-history-element)))
;;
@ -186,9 +190,9 @@
;;; :ui
(map! (:when (featurep! :ui popup)
:n "C-`" #'+popup/toggle
:n "C-~" #'+popup/raise
:g "C-x p" #'+popup/other)
"C-`" #'+popup/toggle
"C-~" #'+popup/raise
"C-x p" #'+popup/other)
(:when (featurep! :ui workspaces)
:n "C-t" #'+workspace/new
@ -464,11 +468,15 @@
:desc "Toggle org-clock" "c" #'+org/toggle-clock
:desc "Cancel org-clock" "C" #'org-clock-cancel
:desc "Open deft" "d" #'deft
(:when (featurep! :lang org +noter)
:desc "Org noter" "e" #'org-noter)
:desc "Find file in notes" "f" #'+default/find-in-notes
:desc "Browse notes" "F" #'+default/browse-notes
:desc "Org store link" "l" #'org-store-link
:desc "Tags search" "m" #'org-tags-view
:desc "Org capture" "n" #'org-capture
:desc "Goto capture" "N" #'org-capture-goto-target
:desc "Active org-clock" "o" #'org-clock-goto
:desc "Todo list" "t" #'org-todo-list
:desc "Search notes" "s" #'+default/org-notes-search
@ -482,14 +490,14 @@
:desc "Switch to buffer" "b" #'org-roam-switch-to-buffer
:desc "Org Roam Capture" "c" #'org-roam-capture
:desc "Find file" "f" #'org-roam-find-file
:desc "Show graph" "g" #'org-roam-graph-show
:desc "Show graph" "g" #'org-roam-graph
:desc "Insert" "i" #'org-roam-insert
:desc "Org Roam" "r" #'org-roam
(:prefix ("d" . "by date")
:desc "Arbitrary date" "d" #'org-roam-date
:desc "Today" "t" #'org-roam-today
:desc "Tomorrow" "m" #'org-roam-tomorrow
:desc "Yesterday" "y" #'org-roam-yesterday)))
:desc "Arbitrary date" "d" #'org-roam-dailies-date
:desc "Today" "t" #'org-roam-dailies-today
:desc "Tomorrow" "m" #'org-roam-dailies-tomorrow
:desc "Yesterday" "y" #'org-roam-dailies-yesterday)))
(:when (featurep! :lang org +journal)
(:prefix ("j" . "journal")

View file

@ -27,11 +27,15 @@
;;;###autoload
(defun +default/browse-notes ()
"Browse files from `org-directory'."
(interactive) (doom-project-browse org-directory))
(interactive)
(require 'org)
(doom-project-browse org-directory))
;;;###autoload
(defun +default/find-in-notes ()
"Find a file under `org-directory', recursively."
(interactive) (doom-project-find-file org-directory))
(interactive)
(require 'org)
(doom-project-find-file org-directory))
;;;###autoload
(defun +default/find-file-under-here ()

View file

@ -31,7 +31,10 @@
(after! epa
;; With GPG 2.1+, this forces gpg-agent to use the Emacs minibuffer to prompt
;; for the key passphrase.
(setq epa-pinentry-mode 'loopback)
(set (if EMACS27+
'epg-pinentry-mode
'epa-pinentry-mode) ; DEPRECATED `epa-pinentry-mode'
'loopback)
;; Default to the first secret key available in your keyring.
(setq-default
epa-file-encrypt-to

View file

@ -47,9 +47,9 @@
(evil-ex-define-cmd "k[ill]m" #'+evil:kill-matching-buffers)
(evil-ex-define-cmd "k[ill]o" #'doom/kill-other-buffers)
(evil-ex-define-cmd "k[ill]b" #'doom/kill-buried-buffers)
(evil-ex-define-cmd "l[ast]" #'doom/popup-restore)
(evil-ex-define-cmd "l[ast]" #'+popup/restore)
(evil-ex-define-cmd "messages" #'view-echo-area-messages)
(evil-ex-define-cmd "pop[up]" #'doom/popup-this-buffer)
(evil-ex-define-cmd "pop[up]" #'+popup/buffer)
;;; Project navigation
(evil-ex-define-cmd "a" #'projectile-find-other-file)
@ -98,4 +98,8 @@
(evil-ex-define-cmd "tabsave" #'+workspace:save)
;;; Org-mode
(evil-ex-define-cmd "cap" #'org-capture)
(evil-ex-define-cmd "cap[ture]" #'org-capture)
;;; ibuffer
(when (featurep! :emacs ibuffer)
(evil-ex-define-cmd "buffers" #'ibuffer))

View file

@ -71,6 +71,7 @@ The following vim plugins have been ported to evil:
| vim-lion | evil-lion | omap =gl= / =gL= |
| vim-seek or vim-sneak | evil-snipe | mmap =s= / =S=, omap =z= / =Z= & =x= / =X= |
| vim-surround | evil-embrace and evil-surround | vmap =S=, omap =ys= |
| vim-unimpaired | (provided by Doom) | [[https://github.com/hlissner/doom-emacs/blob/develop/modules/editor/evil/config.el#L413-L460][see the list]] |
This module has also ported vim-unimpaired keybinds to Emacs.

View file

@ -7,7 +7,7 @@
(call-interactively #'doom/escape)))
;;;###autoload
(defun +evil-resolve-vim-path-a (file-name)
(defun +evil-replace-filename-modifiers-a (file-name)
"Take a path and resolve any vim-like filename modifiers in it. This adds
support for most vim file modifiers, as well as:
@ -15,66 +15,65 @@ support for most vim file modifiers, as well as:
See http://vimdoc.sourceforge.net/htmldoc/cmdline.html#filename-modifiers for
more information on modifiers."
(let (case-fold-search)
(let ((origin-buffer (current-buffer))
case-fold-search)
(with-temp-buffer
(save-excursion (insert file-name))
(while (re-search-forward "\\(^\\|[^\\\\]\\)\\(\\([%#]\\)\\(:\\([PphtreS~.]\\|g?s\\)\\)*\\)" nil t)
(catch 'continue
(unless buffer-file-name
(replace-match (match-string 1) t t nil 2)
(throw 'continue t))
(let ((beg (match-beginning 2))
(end (match-end 3))
(path (pcase (match-string 3)
("%" (file-relative-name buffer-file-name))
("#" (and (other-buffer)
(buffer-file-name (other-buffer)))))))
(save-match-data
(goto-char beg)
(while (re-search-forward ":\\([PphtreS~.]\\|g?s\\)" (+ (point) 3) t)
(let* ((modifier (match-string 1))
(global (string-prefix-p "gs" modifier)))
(when global
(setq modifier (substring modifier 1)))
(setq end (match-end 1)
path
(or (when path
(pcase (substring modifier 0 1)
("p" (expand-file-name path))
("~" (concat "~/" (file-relative-name path "~")))
("." (file-relative-name path default-directory))
("t" (file-name-nondirectory (directory-file-name path)))
("r" (file-name-sans-extension path))
("e" (file-name-extension path))
("S" (shell-quote-argument path))
("h"
(let ((parent (file-name-directory (expand-file-name path))))
(unless (file-equal-p path parent)
(if (file-name-absolute-p path)
(directory-file-name parent)
(file-relative-name parent)))))
("s"
(if (featurep 'evil)
(when-let (args (evil-delimited-arguments (substring modifier 1) 2))
(let ((pattern (evil-transform-vim-style-regexp (car args)))
(replace (cadr args)))
(replace-regexp-in-string
(if global pattern (concat "\\(" pattern "\\).*\\'"))
(evil-transform-vim-style-regexp replace) path t t
(unless global 1))))
path))
("P"
(let ((project-root (doom-project-root (file-name-directory (expand-file-name path)))))
(unless project-root
(user-error "Not in a project"))
(abbreviate-file-name project-root)))))
""))
;; strip trailing slash, if applicable
(or (string-empty-p path)
(not (equal (substring path -1) "/"))
(setq path (substring path 0 -1))))))
(replace-match path t t nil 2))))
(replace-regexp-in-string "\\\\\\([#%]\\)" "\\1" (buffer-string) t))))
(let ((buffer-file-name (buffer-file-name origin-buffer)))
(save-excursion (insert file-name))
(while (re-search-forward "\\(^\\|[^\\\\]\\)\\(\\([%#]\\)\\(:\\([PphtreS~.]\\|g?s\\)\\)*\\)" nil t)
(if (null buffer-file-name)
(replace-match (match-string 1) t t nil 2)
(let ((beg (match-beginning 2))
(end (match-end 3))
(path (pcase (match-string 3)
("%" (file-relative-name buffer-file-name default-directory))
("#" (and (other-buffer origin-buffer)
(buffer-file-name (other-buffer origin-buffer)))))))
(save-match-data
(goto-char beg)
(while (re-search-forward ":\\([PphtreS~.]\\|g?s\\)" (+ (point) 3) t)
(let* ((modifier (match-string 1))
(global (string-prefix-p "gs" modifier)))
(when global
(setq modifier (substring modifier 1)))
(setq end (match-end 1)
path
(pcase (and path (substring modifier 0 1))
(`nil "")
("p" (expand-file-name path))
("~" (concat "~/" (file-relative-name path "~")))
("." (file-relative-name path))
("t" (file-name-nondirectory (directory-file-name path)))
("r" (file-name-sans-extension path))
("e" (file-name-extension path))
("S" (shell-quote-argument path))
("h"
(let ((parent (file-name-directory (expand-file-name path))))
(unless (file-equal-p path parent)
(if (file-name-absolute-p path)
(directory-file-name parent)
(file-relative-name parent)))))
("s"
(if (featurep 'evil)
(when-let (args (evil-delimited-arguments (substring modifier 1) 2))
(let ((pattern (evil-transform-vim-style-regexp (car args)))
(replace (cadr args)))
(replace-regexp-in-string
(if global pattern (concat "\\(" pattern "\\).*\\'"))
(evil-transform-vim-style-regexp replace) path t t
(unless global 1))))
path))
("P"
(let ((project-root (doom-project-root (file-name-directory (expand-file-name path)))))
(unless project-root
(user-error "Not in a project"))
(abbreviate-file-name project-root)))))
;; strip trailing slash, if applicable
(or (string-empty-p path)
(not (equal (substring path -1) "/"))
(setq path (substring path 0 -1))))))
(replace-match path t t nil 2))))
(replace-regexp-in-string "\\\\\\([#%]\\)" "\\1" (buffer-string) t)))))
(defun +evil--insert-newline (&optional above _noextranewline)
(let ((pos (save-excursion (beginning-of-line-text) (point)))

View file

@ -108,7 +108,7 @@ g Repeat alignment on all matches in each line"
If BANG is non-nil, open compilation output in a comint buffer.
If BANG, then run ARGUMENTS as a full command. This command understands vim file
modifiers (like %:p:h). See `+evil-resolve-vim-path-a' for details."
modifiers (like %:p:h). See `+evil-replace-filename-modifiers-a' for details."
(interactive "<sh><!>")
(let ((compile-command "make"))
(+evil:compile (if (stringp arguments)
@ -122,7 +122,7 @@ modifiers (like %:p:h). See `+evil-resolve-vim-path-a' for details."
If BANG is non-nil, open compilation output in a comint buffer.
This command understands vim file modifiers (like %:p:h). See
`+evil-resolve-vim-path-a' for details."
`+evil-replace-filename-modifiers-a' for details."
(interactive "<sh><!>")
(compile (evil-ex-replace-special-filenames
(format "%s %s"

View file

@ -6,8 +6,7 @@
kills the buffer. If FORCE-P, force the deletion (don't ask for confirmation)."
:repeat nil
(interactive "<f><!>")
(doom/delete-this-file (or filename (file-truename buffer-file-name))
force-p))
(doom/delete-this-file filename force-p))
;;;###autoload (autoload '+evil:move-this-file "editor/evil/autoload/files" nil t)
(evil-define-command +evil:move-this-file (new-path &optional force-p)
@ -30,4 +29,3 @@ overwrite the destination file if it exists, without confirmation."
(when (or (not new-path) (string-empty-p new-path))
(user-error "No new path was specified"))
(doom/copy-this-file new-path force-p))

View file

@ -144,13 +144,22 @@ directives. By default, this only recognizes C directives.")
(when (eq major-mode 'fundamental-mode)
(hack-local-variables)))
;; HACK Invoking helpful from evil-ex throws a "No recursive edit is in
;; progress" error because, between evil-ex and helpful,
;; `abort-recursive-edit' gets called one time too many.
(defadvice! +evil--fix-helpful-key-in-evil-ex-a (key-sequence)
:before #'helpful-key
(when (evil-ex-p)
(run-at-time 0.1 nil #'helpful-key key-sequence)
(abort-recursive-edit)))
;; Make ESC (from normal mode) the universal escaper. See `doom-escape-hook'.
(advice-add #'evil-force-normal-state :after #'+evil-escape-a)
;; monkey patch `evil-ex-replace-special-filenames' to improve support for
;; file modifiers like %:p:h. This adds support for most of vim's modifiers,
;; and one custom one: %:P (expand to the project root).
(advice-add #'evil-ex-replace-special-filenames :override #'+evil-resolve-vim-path-a)
(advice-add #'evil-ex-replace-special-filenames :override #'+evil-replace-filename-modifiers-a)
;; make `try-expand-dabbrev' (from `hippie-expand') work in minibuffer
(add-hook 'minibuffer-inactive-mode-hook #'+evil--fix-dabbrev-in-minibuffer-h)

View file

@ -258,6 +258,9 @@ and complains if a module is loaded too early (during startup)."
(+evil-collection-init 'elisp-mode))
(add-transient-hook! 'occur-mode
(+evil-collection-init '(occur replace)))
(add-transient-hook! 'minibuffer-setup-hook
(when evil-collection-setup-minibuffer
(+evil-collection-init 'minibuffer)))
;; HACK Do this ourselves because evil-collection break's `eval-after-load'
;; load order by loading their target plugin before applying keys. This

View file

@ -9,10 +9,10 @@
(load! "../autoload/evil")
(before-each
(fset 'resv #'+evil-resolve-vim-path-a)
(fset 'resv #'+evil-replace-filename-modifiers-a)
(spy-on 'doom-project-root :and-call-fake (lambda () project-root)))
;; `evil-ex-replace-special-filenames' / `+evil-resolve-vim-path-a'
;; `evil-ex-replace-special-filenames' / `+evil-replace-filename-modifiers-a'
(describe "file modifiers"
(it "supports basic vim file modifiers"
(let ((buffer-file-name "~/.emacs.d/test/modules/feature/test-evil.el")

View file

@ -7,7 +7,7 @@
(match-string 2 buffer-file-name))
"")`}
#+DATE: `(format (format-time-string "%B %%s, %Y") (string-to-number (format-time-string "%d")))`
#+SINCE: ${2:{replace with next tagged release version}}
#+SINCE: ${2:<replace with next tagged release version>}
#+STARTUP: inlineimages nofold
* Table of Contents :TOC_3:noexport:

View file

@ -5,7 +5,7 @@
;;
;; Packages
;;; Packages
(use-package! yasnippet
:defer-incrementally eldoc easymenu help-mode
@ -20,9 +20,11 @@
;; Remove default ~/.emacs.d/snippets
(defvar yas-snippet-dirs nil)
;; Ensure `yas-reload-all' is called as late as possible. Other modules could
;; have additional configuration for yasnippet. For example, file-templates.
(add-transient-hook! 'yas-minor-mode-hook (yas-reload-all))
(unless (daemonp)
;; Ensure `yas-reload-all' is called as late as possible. Other modules
;; could have additional configuration for yasnippet. For example,
;; file-templates.
(add-transient-hook! 'yas-minor-mode-hook (yas-reload-all)))
(add-hook! '(text-mode-hook
prog-mode-hook
@ -31,24 +33,28 @@
#'yas-minor-mode-on)
:config
(setq yas-verbosity (if doom-debug-mode 3 0)
yas-also-auto-indent-first-line t)
(add-to-list 'load-path +snippets-dir)
;; default snippets library, if available
(require 'doom-snippets nil t)
;; Allow private snippets in DOOMDIR/snippets
(add-to-list 'yas-snippet-dirs '+snippets-dir)
;; In case `+snippets-dir' and `doom-snippets-dir' are the same
;; Reduce verbosity. 3 is too chatty about initializing yasnippet. 2 is just
;; right (only shows errors).
(setq yas-verbosity (if doom-debug-mode 3 0))
;; Ensure the snippet is properly indented
(setq yas-also-auto-indent-first-line t)
;; default snippets library, if available
(add-to-list 'load-path +snippets-dir)
(require 'doom-snippets nil t)
;; HACK In case `+snippets-dir' and `doom-snippets-dir' are the same, or
;; duplicates exist in `yas-snippet-dirs'.
(advice-add #'yas-snippet-dirs :filter-return #'delete-dups)
;; Remove GUI dropdown prompt (prefer ivy/helm)
(delq! 'yas-dropdown-prompt yas-prompt-functions)
;; Prioritize private snippets in `+snippets-dir' over built-in ones if there
;; are multiple choices.
(add-to-list 'yas-prompt-functions #'+snippets-prompt-private nil #'eq)
(add-to-list 'yas-prompt-functions #'+snippets-prompt-private)
;; Register `def-project-mode!' modes with yasnippet. This enables project
;; specific snippet libraries (e.g. for Laravel, React or Jekyll projects).
@ -61,22 +67,14 @@
;; tell smartparens overlays not to interfere with yasnippet keybinds
(advice-add #'yas-expand :before #'sp-remove-active-pair-overlay))
;; Enable `read-only-mode' for built-in snippets (in `doom-local-dir')
(add-hook 'snippet-mode-hook #'+snippets-read-only-maybe-h)
;; (Evil only) fix off-by-one issue with line-wise visual selections in
;; `yas-insert-snippet', and switches to insert mode afterwards.
(advice-add #'yas-insert-snippet :around #'+snippets-expand-on-region-a)
(define-key! snippet-mode-map
"C-c C-k" #'+snippet--abort
"C-c C-e" #'+snippet--edit)
;; Show keybind hints in snippet header-line
(add-hook 'snippet-mode-hook #'+snippets-show-hints-in-header-line-h)
;; Replace commands with superior alternatives
(define-key! yas-minor-mode-map
[remap yas-new-snippet] #'+snippets/new
[remap yas-visit-snippet-file] #'+snippets/edit)
;; Enable `read-only-mode' for built-in snippets (in `doom-local-dir')
(add-hook 'snippet-mode-hook #'+snippets-read-only-maybe-h)
(map! :map yas-keymap
"C-e" #'+snippets/goto-end-of-field
@ -85,7 +83,14 @@
[M-left] #'+snippets/goto-start-of-field
[M-backspace] #'+snippets/delete-to-start-of-field
[backspace] #'+snippets/delete-backward-char
[delete] #'+snippets/delete-forward-char-or-field))
[delete] #'+snippets/delete-forward-char-or-field
;; Replace commands with superior alternatives
:map yas-minor-mode-map
[remap yas-new-snippet] #'+snippets/new
[remap yas-visit-snippet-file] #'+snippets/edit)
;; If in a daemon session, front-load this expensive work:
(if (daemonp) (yas-reload-all)))
(use-package! auto-yasnippet

View file

@ -1,10 +1,10 @@
;; -*- no-byte-compile: t; -*-
;;; editor/snippets/packages.el
(package! yasnippet :pin "ac03c2f192")
(package! yasnippet :pin "5b1217ab08")
(package! auto-yasnippet :pin "db9e0dd433")
(package! doom-snippets
:recipe (:host github
:repo "hlissner/doom-snippets"
:files ("*.el" "*"))
:pin "2a0c3cf901")
:pin "feaedeb550")

View file

@ -12,13 +12,15 @@
- [[#arch-linux][Arch Linux]]
- [[#nixos][NixOS]]
- [[#opensuse][openSUSE]]
- [[Debian/Ubuntu]]
- [[#debianubuntu][Debian/Ubuntu]]
- [[#features][Features]]
- [[#configuration][Configuration]]
- [[#offlineimap][offlineimap]]
- [[#mbsync][mbsync]]
- [[#mu-and-mu4e][mu and mu4e]]
- [[#troubleshooting][Troubleshooting]]
- [[#no-such-file-or-directory-mu4e][=No such file or directory, mu4e=]]
- [[#void-function-org-time-add-error-on-gentoo][~(void-function org-time-add)~ error on Gentoo]]
* Description
This module makes Emacs an email client, using ~mu4e~.
@ -36,13 +38,13 @@ via IMAP) and ~mu~ (to index my mail into a format ~mu4e~ can understand).
+ ~+gmail~ Enables gmail-specific configuration.
** Plugins
+ [[https://github.com/agpchil/mu4e-maildirs-extension][mu4e-maildirs-extension]]
This module install no plugins.
* Prerequisites
This module requires:
+ Either ~mbsync~ (default) or ~offlineimap~ (to sync mail with)
+ ~mu~ (to index your downloaded messages)
+ ~mu~, to index your downloaded messages and to provide the ~mu4e~ package.
** MacOS
#+BEGIN_SRC sh
@ -104,20 +106,53 @@ sudo apt-get install maildir-utils # mu
* Configuration
** offlineimap
This module uses =mbsync= by default. To change this, change ~+mu4e-backend~:
This module uses =mbsync= by default. To use =offlineimap=, change ~+mu4e-backend~:
#+BEGIN_SRC emacs-lisp
(setq +mu4e-backend 'offlineimap)
#+END_SRC
Then you must set up offlineimap and index your mail:
Next, you need to write a configuration file for =offlineimap=. Mine can be found
[[https://github.com/hlissner/dotfiles/tree/master/shell/mu][in my dotfiles repository]]. It is configured to download mail to ~\~/.mail~. I
use [[https://www.passwordstore.org/][unix pass]] to securely store my login credentials. You can find a *very*
detailed configuration [[https://github.com/OfflineIMAP/offlineimap/blob/master/offlineimap.conf][here]].
1. Write a ~\~/.offlineimaprc~. Mine can be found [[https://github.com/hlissner/dotfiles/tree/master/shell/mu][in my dotfiles repository]]. It
is configured to download mail to ~\~/.mail~. I use [[https://www.passwordstore.org/][unix pass]] to securely
store my login credentials. You can find a *very* detailed configuration
[[https://github.com/OfflineIMAP/offlineimap/blob/master/offlineimap.conf][here]].
2. Download your email: ~offlineimap -o~ (may take a while)
3. Index it with mu: ~mu index --maildir ~/.mail~
Next you can download your email with ~offlineimap -o~. This may take a while,
especially if you have thousands of mails.
You can now proceed with the [[*mu and mu4e][mu and mu4e]] section.
** mbsync
The steps needed to set up =mu4e= with =mbsync= are very similar to the ones for
[[*offlineimap][offlineimap]].
Start with writing a ~\~/.mbsyncrc~. An example for GMAIL can be found on
[[http://pragmaticemacs.com/emacs/migrating-from-offlineimap-to-mbsync-for-mu4e/][pragmaticemacs.com]]. A non-GMAIL example is available as a gist [[https://gist.github.com/agraul/60977cc497c3aec44e10591f94f49ef0][here]]. The [[http://isync.sourceforge.net/mbsync.html][manual
page]] contains all needed information to set up your own.
Next you can download your email with ~mbsync --all~. This may take a while, but
should be quicker than =offlineimap= ;).
You can now proceed with the [[*mu and mu4e][mu and mu4e]] section.
** mu and mu4e
You should have your email downloaded already. If you have not, you need to set
=offlineimap= or =mbsync= up before you proceed.
Before you can use =mu4e= or the cli program =mu=, you need to index your email
initially. How to do that differs a little depending on the version of =mu= you
use. You can check your version with ~mu --version~.
For =mu= *>=1.4* you need to run two commands:
#+BEGIN_SRC sh
mu init --maildir ~/.mail --my-address email@example.com
mu index
#+END_SRC
=mu= *<1.4* only requires one command:
#+BEGIN_SRC sh
mu index --maildir ~/.mail
#+END_SRC
Then configure Emacs to use your email address:
@ -129,13 +164,20 @@ Then configure Emacs to use your email address:
(mu4e-trash-folder . "/Lissner.net/Trash")
(mu4e-refile-folder . "/Lissner.net/All Mail")
(smtpmail-smtp-user . "henrik@lissner.net")
(user-mail-address . "henrik@lissner.net")
(user-mail-address . "henrik@lissner.net") ;; only needed for mu < 1.4
(mu4e-compose-signature . "---\nHenrik Lissner"))
t)
#+END_SRC
** TODO mbsync
* Troubleshooting
** =No such file or directory, mu4e=
You will get =No such file or directory, mu4e= errors if you don't run ~doom
sync~ after installing =mu= through your package manager.
** ~(void-function org-time-add)~ error on Gentoo
Gentoo users will see this error because [[https://gitweb.gentoo.org/repo/gentoo.git/tree/net-mail/mu/files/70mu-gentoo.el#n2][the =net-mail/mu= package eagerly loads
=mu4e= (which pulls in =org=) much too early]]; before Emacs reads =~/.emacs.d=.
So early, that it loads the built-in version of org-mode, rather than the newer
version that Doom installs.
Later versions of the =net-mail/mu= package have [[https://gitweb.gentoo.org/repo/gentoo.git/commit/net-mail/mu?id=770e1fccb119fbce8ba6d16021a3598123f212ff][fixed this issue]], but you may
need to switch to the unstable build of =net-mail/mu= to see it.

View file

@ -6,7 +6,7 @@
list of cons cells (VARIABLE . VALUE) -- you may want to modify:
+ `user-full-name' (this or the global `user-full-name' is required)
+ `user-mail-address' (required)
+ `user-mail-address' (required in mu4e < 1.4)
+ `smtpmail-smtp-user' (required for sending mail from Emacs)
OPTIONAL:
@ -19,8 +19,9 @@ OPTIONAL:
DEFAULT-P is a boolean. If non-nil, it marks that email account as the
default/fallback account."
(after! mu4e
(when-let (address (cdr (assq 'user-mail-address letvars)))
(add-to-list 'mu4e-user-mail-address-list address))
(when (version< mu4e-mu-version "1.4")
(when-let (address (cdr (assq 'user-mail-address letvars)))
(add-to-list 'mu4e-user-mail-address-list address)))
(setq mu4e-contexts
(cl-loop for context in mu4e-contexts
unless (string= (mu4e-context-name context) label)

View file

@ -14,9 +14,11 @@
:commands mu4e mu4e-compose-new
:init
(provide 'html2text) ; disable obsolete package
(setq mu4e-maildir "~/.mail"
mu4e-attachment-dir "~/.mail/.attachments"
mu4e-user-mail-address-list nil)
(when (or (not (require 'mu4e-meta nil t))
(version< mu4e-mu-version "1.4"))
(setq mu4e-maildir "~/.mail"
mu4e-user-mail-address-list nil))
(setq mu4e-attachment-dir "~/.mail/.attachments")
:config
(pcase +mu4e-backend
(`mbsync
@ -104,13 +106,13 @@
(use-package! org-mu4e
:hook (mu4e-compose-mode . org-mu4e-compose-org-mode)
:config
(setq org-mu4e-link-query-in-headers-mode nil
org-mu4e-convert-to-html t)
(setq org-mu4e-convert-to-html t)
(when (version< mu4e-mu-version "1.4")
(setq org-mu4e-link-query-in-headers-mode nil))
;; Only render to html once. If the first send fails for whatever reason,
;; org-mu4e would do so each time you try again.
(add-hook! 'message-send-hook
(setq-local org-mu4e-convert-to-html nil)))
(setq-hook! 'message-send-hook org-mu4e-convert-to-html nil))
;;

View file

@ -2,9 +2,10 @@
(use-package! pyim
:after-call after-find-file pre-command-hook
:init
(setq pyim-dcache-directory (concat doom-cache-dir "pyim/"))
:config
(setq pyim-dcache-directory (concat doom-cache-dir "pyim/")
pyim-page-tooltip t
(setq pyim-page-tooltip t
default-input-method "pyim"))

View file

@ -1,4 +0,0 @@
;;; lang/assembly/autoload.el -*- lexical-binding: t; -*-
;;;###autoload
(add-to-list 'auto-mode-alist '("\\.hax\\'" . haxor-mode))

View file

@ -1,6 +0,0 @@
;; -*- no-byte-compile: t; -*-
;;; lang/assembly/packages.el
(package! mips-mode :pin "75152fc78b")
(package! haxor-mode :pin "6fa25a8e6b")
(package! nasm-mode :pin "65ca6546fc")

View file

@ -11,21 +11,22 @@
;;
;;; Packages
;;;###package clojure-mode
(add-hook 'clojure-mode-hook #'rainbow-delimiters-mode)
(when (featurep! +lsp)
(add-hook! '(clojure-mode-local-vars-hook
clojurec-mode-local-vars-hook
clojurescript-mode-local-vars-hook)
(defun +clojure-disable-lsp-indentation-h ()
(setq-local lsp-enable-indentation nil))
#'lsp!)
(after! lsp-clojure
(dolist (m '(clojure-mode
clojurec-mode
clojurescript-mode
clojurex-mode))
(add-to-list 'lsp-language-id-configuration (cons m "clojure")))))
(use-package! clojure-mode
:hook (clojure-mode . rainbow-delimiters-mode)
:config
(when (featurep! +lsp)
(add-hook! '(clojure-mode-local-vars-hook
clojurec-mode-local-vars-hook
clojurescript-mode-local-vars-hook)
(defun +clojure-disable-lsp-indentation-h ()
(setq-local lsp-enable-indentation nil))
#'lsp!)
(after! lsp-clojure
(dolist (m '(clojure-mode
clojurec-mode
clojurescript-mode
clojurex-mode))
(add-to-list 'lsp-language-id-configuration (cons m "clojure"))))))
(use-package! cider
@ -58,13 +59,18 @@
cider-repl-history-quit-action 'delete-and-restore
cider-repl-history-highlight-inserted-item t
cider-repl-history-size 1000
cider-repl-pop-to-buffer-on-connect 'display-only
cider-repl-result-prefix ";; => "
cider-repl-print-length 100
cider-repl-use-clojure-font-lock t
cider-repl-use-pretty-printing t
cider-repl-wrap-history nil
cider-stacktrace-default-filters '(tooling dup))
cider-stacktrace-default-filters '(tooling dup)
;; Don't focus the CIDER REPL when it starts. Since it can take so long
;; to start up, you either wait for a minute doing nothing or be
;; prepared for your cursor to suddenly change buffers without warning.
;; See https://github.com/clojure-emacs/cider/issues/1872
cider-repl-pop-to-buffer-on-connect 'display-only)
;; Error messages emitted from CIDER is silently funneled into *nrepl-server*
;; rather than the *cider-repl* buffer. How silly. We might want to see that
@ -90,6 +96,8 @@
"\"" #'cider-jack-in-cljs
"c" #'cider-connect-clj
"C" #'cider-connect-cljs
"m" #'cider-macroexpand-1
"M" #'cider-macroexpand-all
(:prefix ("e" . "eval")
"b" #'cider-eval-buffer
"d" #'cider-eval-defun-at-point
@ -114,9 +122,6 @@
"e" #'cider-enlighten-mode
"i" #'cider-inspect
"r" #'cider-inspect-last-result)
(:prefix ("m" . "macro")
"e" #'cider-macroexpand-1
"E" #'cider-macroexpand-all)
(:prefix ("n" . "namespace")
"n" #'cider-browse-ns
"N" #'cider-browse-ns-all

View file

@ -4,8 +4,8 @@
(package! dart-mode :pin "04fcd649f1")
(when (featurep! +lsp)
(package! lsp-dart :pin "064d47bad3"))
(package! lsp-dart :pin "4cd73b77f4"))
(when (featurep! +flutter)
(package! flutter :pin "ec92a4df84")
(package! flutter :pin "293b7225b9")
(package! hover :pin "6f9ed1a651"))

View file

@ -1,9 +1,5 @@
;;; lang/data/config.el -*- lexical-binding: t; -*-
;; Built in plugins
(add-to-list 'auto-mode-alist '("/sxhkdrc\\'" . conf-mode))
(add-to-list 'auto-mode-alist '("\\.\\(?:hex\\|nes\\)\\'" . hexl-mode))
(use-package! nxml-mode
:mode "\\.p\\(?:list\\|om\\)\\'" ; plist, pom
:mode "\\.xs\\(?:d\\|lt\\)\\'" ; xslt, xsd
@ -16,9 +12,6 @@
(setq-hook! 'nxml-mode-hook tab-width nxml-child-indent))
;;
;;; Third-party plugins
;;;###package csv-mode
(map! :after csv-mode
:localleader
@ -29,25 +22,3 @@
"S" #'csv-sort-numeric-fields
"k" #'csv-kill-fields
"t" #'csv-transpose)
(use-package! graphql-mode
:mode "\\.gql\\'"
:config (setq-hook! 'graphql-mode-hook tab-width graphql-indent-level))
(use-package! json-mode
:mode "\\.js\\(?:on\\|[hl]int\\(?:rc\\)?\\)\\'"
:config
(set-electric! 'json-mode :chars '(?\n ?: ?{ ?})))
(after! jsonnet-mode
(set-electric! 'jsonnet-mode :chars '(?\n ?: ?{ ?})))
(after! yaml-mode
(setq-hook! 'yaml-mode-hook tab-width yaml-indent-offset))
;;
;;; Frameworks
(def-project-mode! +data-vagrant-mode
:files ("Vagrantfile"))

View file

@ -1,12 +1,4 @@
;; -*- no-byte-compile: t; -*-
;;; lang/data/packages.el
(package! graphql-mode :pin "7c37aee28b")
(package! json-mode :pin "0e819e519a")
(package! jsonnet-mode :pin "d8b486c837")
(package! yaml-mode :pin "cecf4b106b")
(package! csv-mode :pin "635337407c")
(package! dhall-mode :pin "ef4d33debe")
(package! protobuf-mode
:recipe (:host github :repo "emacsmirror/protobuf-mode" :files (:defaults "*"))
:pin "94b7bd7e8b")

View file

@ -1,12 +1,10 @@
;;; lang/elm/config.el -*- lexical-binding: t; -*-
(after! elm-mode
(add-hook 'elm-mode-hook #'rainbow-delimiters-mode)
(when (featurep! +lsp)
(add-hook 'elm-mode-local-vars-hook #'lsp!))
(set-company-backend! 'elm-mode 'company-elm)
(if (featurep! +lsp)
(add-hook 'elm-mode-local-vars-hook #'lsp!)
(set-company-backend! 'elm-mode 'company-elm))
(set-repl-handler! 'elm-mode #'run-elm-interactive)
(set-pretty-symbols! 'elm-mode
:null "null"
@ -22,4 +20,4 @@
(use-package! flycheck-elm
:when (featurep! :checkers syntax)
:after elm-mode
:config (add-to-list 'flycheck-checkers 'elm nil #'eq))
:config (add-to-list 'flycheck-checkers 'elm))

View file

@ -1,6 +1,6 @@
;; -*- no-byte-compile: t; -*-
;;; lang/elm/packages.el
(package! elm-mode :pin "dd868e55ff")
(package! elm-mode :pin "7782be0814")
(when (featurep! :checkers syntax)
(package! flycheck-elm :pin "debd0af563"))
(package! flycheck-elm :pin "1b60050efd"))

View file

@ -4,12 +4,14 @@
(package! elisp-mode :built-in t)
(package! highlight-quoted :pin "2410347815")
;; Tools
(package! macrostep :pin "424e3734a1")
(package! overseer :pin "02d49f582e")
(package! elisp-def :pin "368b04da68")
(package! elisp-demos :pin "0d74766f0c")
(package! elisp-demos :pin "57dd4ae3e4")
(when (featurep! :checkers syntax)
(package! flycheck-cask :pin "3457ae553c"))
(package! buttercup :pin "b360e35017")
;; Libraries
(package! buttercup :pin "a91f282025")

View file

@ -15,7 +15,8 @@
- [[#troubleshooting][Troubleshooting]]
* Description
This module adds [[https://golang.org][Go]] support.
This module adds [[https://golang.org][Go]] support, with optional (but recommended) LSP support via
[[https://github.com/golang/tools/blob/master/gopls/README.md][gopls]].
+ Code completion (~gocode~)
+ Documentation lookup (~godoc~)
@ -30,7 +31,8 @@ This module adds [[https://golang.org][Go]] support.
+ Code checking (~flycheck-golangci-lint~)
** Module Flags
+ =+lsp= Enables integration for the gopls LSP server.
+ =+lsp= Enables integration for the gopls LSP server. It is highly recommended
you use this, as the non-LSP experience is deprecated (and poor).
** Plugins
+ [[https://github.com/dominikh/go-mode.el][go-mode]]
@ -38,7 +40,7 @@ This module adds [[https://golang.org][Go]] support.
+ [[https://github.com/dominikh/go-mode.el][go-guru]]
+ [[https://github.com/manute/gorepl-mode][gorepl-mode]]
+ [[https://github.com/brantou/emacs-go-tag][go-tag]]
+ [[https://github.com/mdempsky/gocode][company-go]]*
+ [[https://github.com/mdempsky/gocode][company-go]]* =DEPRECATED=
+ [[https://github.com/s-kostyaev/go-gen-test][go-gen-test]]
+ [[https://github.com/weijiangan/flycheck-golangci-lint][flycheck-golangci-lint]] (if =:checkers syntax= is enabled)

View file

@ -2,14 +2,14 @@
;;; lang/go/packages.el
(package! go-eldoc :pin "cbbd2ea1e9")
(package! go-guru :pin "85a20dac6c")
(package! go-mode :pin "85a20dac6c")
(package! go-guru :pin "10d6ab43d9")
(package! go-mode :pin "10d6ab43d9")
(package! gorepl-mode :pin "6a73bf352e")
(package! go-tag :pin "59b243f2fa")
(package! go-gen-test :pin "44c202ac97")
(when (featurep! :completion company)
(package! company-go :pin "939b4a677f"))
(package! company-go :pin "4acdcbdea7"))
(when (featurep! :checkers syntax)
(package! flycheck-golangci-lint :pin "8e446c6831"))

View file

@ -22,7 +22,7 @@ If the depth is 2, the first two directories are removed: net.lissner.game.")
;;
;; java-mode
;;; java-mode
(add-hook 'java-mode-hook #'rainbow-delimiters-mode)
@ -31,7 +31,7 @@ If the depth is 2, the first two directories are removed: net.lissner.game.")
;;
;; Common packages
;;; Common packages
(use-package! android-mode
:commands android-mode

View file

@ -37,7 +37,6 @@ This module adds JavaScript and TypeScript support.
+ [[https://github.com/mooz/js2-mode][js2-mode]]
+ [[https://github.com/felipeochoa/rjsx-mode][rjsx-mode]]
+ [[https://github.com/emacs-typescript/typescript.el][typescript-mode]]
+ [[https://github.com/aaronjensen/eslintd-fix][eslintd-fix]]
+ [[https://github.com/magnars/js2-refactor.el][js2-refactor]]
+ [[https://github.com/mojochao/npm-mode][npm-mode]]
+ [[https://github.com/abicky/nodejs-repl.el][nodejs-repl]]

View file

@ -83,18 +83,6 @@ Run this for any buffer you want to skewer."
;;
;; Hooks
;;;###autoload
(defun +javascript-add-node-modules-path-h ()
"Add current project's `node_modules/.bin` to `exec-path', so js tools
prioritize project-local packages over global ones."
(make-local-variable 'exec-path)
(cl-pushnew (expand-file-name "node_modules/.bin/"
(or (locate-dominating-file
(or (buffer-file-name) default-directory)
"node_modules")
(doom-project-root)))
exec-path :test #'string=))
;;;###autoload
(defun +javascript-cleanup-tide-processes-h ()
"Clean up dangling tsserver processes if there are no more buffers with

View file

@ -133,7 +133,9 @@
;;
;;; Tools
(add-hook! '(js-mode-hook typescript-mode-hook web-mode-hook)
(add-hook! '(js2-mode-local-vars-hook
typescript-mode-local-vars-hook
web-mode-local-vars-hook)
(defun +javascript-init-lsp-or-tide-maybe-h ()
"Start `lsp' or `tide' in the current buffer.
@ -177,9 +179,11 @@ to tide."
(setq-default company-backends (delq 'company-tide (default-value 'company-backends))))
(set-company-backend! 'tide-mode 'company-tide)
;; navigation
(set-lookup-handlers! 'tide-mode
:definition '(tide-jump-to-definition :async t)
:references '(tide-references :async t))
(set-lookup-handlers! 'tide-mode :async t
:definition #'tide-jump-to-definition
:references #'tide-references
:documentation #'tide-documentation-at-point)
(set-popup-rule! "^\\*tide-documentation" :quit t)
;; resolve to `doom-project-root' if `tide-project-root' fails
(advice-add #'tide-project-root :override #'+javascript-tide-project-root-a)
;; cleanup tsserver when no tide buffers are left
@ -192,8 +196,6 @@ to tide."
;; `tide-mode-hook' is too early, so...
(advice-add #'tide-setup :after #'eldoc-mode)
(define-key tide-mode-map [remap +lookup/documentation] #'tide-documentation-at-point)
(map! :localleader
:map tide-mode-map
"R" #'tide-restart-server
@ -239,13 +241,6 @@ to tide."
(js2r-add-keybindings-with-prefix (format "%s r" doom-localleader-key)))))
(use-package! eslintd-fix
:commands eslintd-fix
:config
(setq-hook! 'eslintd-fix-mode-hook
flycheck-javascript-eslint-executable eslintd-fix-executable))
;;;###package skewer-mode
(map! :localleader
(:after js2-mode
@ -292,10 +287,11 @@ to tide."
web-mode
markdown-mode
js-mode
json-mode
typescript-mode
solidity-mode)
:when (locate-dominating-file default-directory "package.json")
:add-hooks '(+javascript-add-node-modules-path-h npm-mode))
:add-hooks '(add-node-modules-path npm-mode))
(def-project-mode! +javascript-gulp-mode
:when (locate-dominating-file default-directory "gulpfile.js"))

View file

@ -8,9 +8,9 @@
(package! typescript-mode :pin "102587e458")
;; Tools
(package! eslintd-fix :pin "0c431141be")
(package! js2-refactor :pin "d4c40b5fc8")
(package! npm-mode :pin "3ee7c0bad5")
(package! add-node-modules-path :pin "f31e69ccb6")
;; Eval
(package! nodejs-repl :pin "6fad7d764f")

View file

@ -0,0 +1,40 @@
#+TITLE: lang/json
#+DATE: April 23, 2020
#+SINCE: v3.0.0
#+STARTUP: inlineimages nofold
* Table of Contents :TOC_3:noexport:
- [[#description][Description]]
- [[#maintainers][Maintainers]]
- [[#module-flags][Module Flags]]
- [[#plugins][Plugins]]
- [[#prerequisites][Prerequisites]]
- [[#features][Features]]
- [[#configuration][Configuration]]
- [[#troubleshooting][Troubleshooting]]
* Description
This module provides JSON support.
** Maintainers
This module has no dedicated maintainers.
** Module Flags
+ =+lsp= Enable integration with LSP servers, if one is available. Requires the
=:tools lsp= module to be enabled.
** Plugins
+ [[https://github.com/joshwnj/json-mode][json-mode]]
+ [[https://github.com/Sterlingg/json-snatcher][json-snatcher]]
* Prerequisites
This module has no prereqisites.
* TODO Features
# An in-depth list of features, how to use them, and their dependencies.
* TODO Configuration
# How to configure this module, including common problems and how to address them.
* TODO Troubleshooting
# Common issues and their solution, or places to look for help.

View file

@ -0,0 +1,14 @@
;;; lang/json/config.el -*- lexical-binding: t; -*-
(use-package! json-mode
:mode "\\.js\\(?:on\\|[hl]int\\(?:rc\\)?\\)\\'"
:init
(when (featurep! +lsp)
(add-hook 'json-mode-local-vars-hook #'lsp!))
:config
(set-electric! 'json-mode :chars '(?\n ?: ?{ ?}))
(map! :after json-mode
:map json-mode-map
:localleader
"s" #'jsons-print-path))

View file

@ -0,0 +1,5 @@
;; -*- no-byte-compile: t; -*-
;;; lang/json/packages.el
(package! json-mode :pin "0e819e519a")
(package! json-snatcher :pin "c4cecc0a50")

View file

@ -10,7 +10,8 @@
"Run an inferior instance of `julia' inside Emacs."
(interactive)
(if (require 'julia-repl nil t)
(julia-repl)
(prog1 (julia-repl)
(julia-repl-use-emacsclient))
(let ((buffer (get-buffer-create "*Julia*")))
(unless (comint-check-proc "*Julia*")
(apply #'make-comint-in-buffer "Julia" "*Julia*" julia-program julia-arguments))

View file

@ -33,6 +33,8 @@ Provide a helping hand when working with LaTeX documents.
** Module Flags
+ =+latexmk= Use LatexMk instead of LaTeX to compile documents.
+ =+cdlatex= Enable [[https://github.com/cdominik/cdlatex][cdlatex]] for fast math insertion.
+ =+lsp= Start LSP automatically in `tex-mode-hook`. This requires the =:tools
lsp= module. Supported servers are `digestif` and `TexLab`.
+ =+fold= Use TeX-fold (from auctex) to fold LaTeX macros to unicode, and make
folding hook-based and less manual.

View file

@ -70,7 +70,12 @@ If no viewers are found, `latex-preview-pane' is used.")
(sp-local-pair modes open nil :actions :rem))
;; And tweak these so that users can decide whether they want use latex
;; quotes or not, via `+latex-enable-plain-double-quotes'
(sp-local-pair modes "``" nil :unless '(:add sp-in-math-p)))))
(sp-local-pair modes "``" nil :unless '(:add sp-in-math-p))))
;; Hook lsp if enabled
(when (featurep! +lsp)
(add-hook! '(tex-mode-local-vars-hook
latex-mode-local-vars-hook)
#'lsp!)))
(use-package! tex-fold
@ -209,6 +214,7 @@ is mostly for \\section etc."
(add-to-list '+latex--company-backends #'company-auctex-environments nil #'eq)
(add-to-list '+latex--company-backends #'company-auctex-macros nil #'eq))
(use-package! company-math
:when (featurep! :completion company)
:defer t

View file

@ -70,6 +70,7 @@ capture, the end position, and the output buffer.")
(map! :map markdown-mode-map
:localleader
"'" #'markdown-edit-code-block
"o" #'markdown-open
"p" #'markdown-preview
"e" #'markdown-export

View file

@ -18,6 +18,7 @@
- [[#built-in-custom-link-types][Built-in custom link types]]
- [[#configuration][Configuration]]
- [[#changing-org-directory][Changing ~org-directory~]]
- [[#changing-org-noter-notes-search-path][Changing ~org-noter-notes-search-path~]]
* Description
This module adds org-mode support to Doom Emacs, along with a number of
@ -63,6 +64,8 @@ https://www.mfoot.com/blog/2015/11/22/literate-emacs-configuration-with-org-mode
+ =+ipython= (**DEPRECATED**) Enables ipython integration for babel.
+ =+journal= Enables [[https://github.com/bastibe/org-journal][org-journal]] integration.
+ =+jupyter= Enables Jupyter integration for babel.
+ =+noter= Enables org-noter integration. Keeps notes in sync with a document.
Requires [[https://github.com/politza/pdf-tools][pdf-tools]] (=:tools pdf=) or [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Document-View.html][DocView]] or [[https://github.com/wasamasa/nov.el][nov.el]] to be enabled.
+ =+pandoc= Enables pandoc integration into the Org exporter.
+ =+pomodoro= Enables a pomodoro timer for clocking time on tasks.
+ =+present= Enables integration with reveal.js, beamer and org-tree-slide, so
@ -121,6 +124,9 @@ https://www.mfoot.com/blog/2015/11/22/literate-emacs-configuration-with-org-mode
+ =+roam=
+ [[https://github.com/jethrokuan/org-roam][org-roam]]
+ [[https://github.com/jethrokuan/company-org-roam][company-org-roam]]
+ =+noter=
+ [[https://github.com/weirdNox/org-noter][org-noter]]
** Hacks
+ The window is recentered when following links.
@ -223,3 +229,10 @@ To modify ~org-directory~ it must be set /before/ =org= has loaded:
;; ~/.doom.d/config.el
(setq org-directory "~/new/org/location/")
#+END_SRC
** Changing ~org-noter-notes-search-path~
To modify ~org-noter-notes-search-path~ set:
#+BEGIN_SRC emacs-lisp
;; ~/.doom.d/config.el
(setq org-noter-notes-search-path '("~/notes/path/"))
#+END_SRC

View file

@ -10,13 +10,3 @@
(rassq-delete-all '+org-dragndrop-download-dnd-fn
(copy-alist dnd-protocol-alist))))
(dnd-handle-one-url nil action uri))))
;;;###autoload
(defun +org-dragndrop-image-fn (protocol link _description)
"Return the image associated with the current attachment."
(let ((file (expand-file-name link org-attach-id-dir)))
(when (and (file-exists-p file) (image-type-from-file-name file))
(with-temp-buffer
(insert-file-contents file)
(goto-char (point-min))
(buffer-substring-no-properties (point) (point-max))))))

View file

@ -42,7 +42,7 @@ PATH (a string) can be an url, a local file path, or a base64 encoded datauri."
(unless (eq major-mode 'org-mode)
(user-error "Not in an org buffer"))
(require 'org-download)
(condition-case ex
(condition-case-unless-debug e
(let ((raw-uri (url-unhex-string path)))
(cond ((string-match-p "^data:image/png;base64," path)
(org-download-dnd-base64 path nil))
@ -56,4 +56,4 @@ PATH (a string) can be an url, a local file path, or a base64 encoded datauri."
;; insert the link
(org-download-insert-link raw-uri new-path)))))
(error
(user-error "Failed to attach file: %s" (error-message-string ex)))))
(user-error "Failed to attach file: %s" (error-message-string e)))))

View file

@ -1,43 +1,72 @@
;;; lang/org/autoload/org-link.el -*- lexical-binding: t; -*-
(defun +org--relpath (path root)
(defun +org--relative-path (path root)
(if (and buffer-file-name (file-in-directory-p buffer-file-name root))
(file-relative-name path)
path))
;;;###autoload
(defun +org-def-link (key dir)
(org-link-set-parameters
key
:complete (lambda () (+org--relpath (+org-link-read-file key dir) dir))
:follow (lambda (link) (find-file (expand-file-name link dir)))
:face (lambda (link)
(if (file-exists-p (expand-file-name link dir))
'org-link
'error))))
(defun +org--read-link-path (key dir &optional fn)
(let ((file (funcall (or fn #'read-file-name) (format "%s: " (capitalize key)) dir)))
(format "%s:%s" key (file-relative-name file dir))))
;;;###autoload
(defun +org-link-read-file (key dir)
(let ((file (read-file-name (format "%s: " (capitalize key)) dir)))
(format "%s:%s"
key
(file-relative-name file dir))))
(defun +org-define-basic-link (key dir-var &rest plist)
"Define a link with some basic completion & fontification.
KEY is the name of the link type. DIR-VAR is the directory variable to resolve
links relative to. PLIST is passed to `org-link-set-parameters' verbatim.
Links defined with this will be rendered in the `error' face if the file doesn't
exist, and `org-link' otherwise."
(declare (indent 2))
(let ((requires (plist-get plist :requires))
(dir-fn (if (functionp dir-var)
dir-var
(lambda () (symbol-value dir-var)))))
(apply #'org-link-set-parameters
key
:complete (lambda ()
(if requires (mapc #'require (doom-enlist requires)))
(+org--relative-path (+org--read-link-path key (funcall dir-fn))
(funcall dir-fn)))
:follow (lambda (link)
(org-link-open-as-file (expand-file-name link (funcall dir-fn)) nil))
:face (lambda (link)
(if (file-exists-p (expand-file-name link (funcall dir-fn)))
'org-link
'error))
(doom-plist-delete plist :requires))))
;;
;;; Image data functions (for custom inline images)
;;;###autoload
(defun +org-link-read-directory (key dir)
(let ((file (read-directory-name (format "%s: " (capitalize key)) dir)))
(format "%s:%s"
key
(file-relative-name file dir))))
(defun +org-image-file-data-fn (protocol link _description)
"Intepret LINK as an image file path and return its data."
(setq
link (expand-file-name
link
(pcase protocol
("download" (or org-download-image-dir org-attach-id-dir default-directory))
("attachment" org-attach-id-dir)
(_ default-directory))))
(when (and (file-exists-p link)
(image-type-from-file-name link))
(with-temp-buffer
(set-buffer-multibyte nil)
(setq buffer-file-coding-system 'binary)
(insert-file-contents-literally link)
(buffer-substring-no-properties (point-min) (point-max)))))
;;;###autoload
(defun +org-inline-data-image (_protocol link _description)
(defun +org-inline-image-data-fn (_protocol link _description)
"Interpret LINK as base64-encoded image data."
(base64-decode-string link))
;;;###autoload
(defun +org-image-link (protocol link _description)
"Interpret LINK as base64-encoded image data."
(defun +org-http-image-data-fn (protocol link _description)
"Interpret LINK as an URL to an image file."
(when (image-type-from-file-name link)
(if-let* ((buf (url-retrieve-synchronously (concat protocol ":" link))))
(with-current-buffer buf

View file

@ -65,6 +65,12 @@ Is relative to `org-directory', unless it is absolute. Is used in Doom's default
;;
;;; `org-load' hooks
(defun +org-init-org-directory-h ()
(unless org-directory
(setq org-directory "~/org"))
(setq org-id-locations-file (expand-file-name ".orgids" org-directory)))
(defun +org-init-agenda-h ()
(unless org-agenda-files
(setq org-agenda-files (list org-directory)))
@ -141,9 +147,10 @@ This forces it to read the background before rendering."
(setq org-todo-keywords
'((sequence
"TODO(t)" ; A task that needs doing & is ready to do
"PROJ(p)" ; An ongoing project that cannot be completed in one step
"PROJ(p)" ; A project, which usually contains other tasks
"STRT(s)" ; A task that is in progress
"WAIT(w)" ; Something is holding up this task; or it is paused
"WAIT(w)" ; Something external is holding up this task
"HOLD(h)" ; This task is paused/on hold because of me
"|"
"DONE(d)" ; Task successfully completed
"KILL(k)") ; Task was cancelled, aborted or is no longer applicable
@ -158,14 +165,20 @@ This forces it to read the background before rendering."
("STRT" . +org-todo-active)
("[?]" . +org-todo-onhold)
("WAIT" . +org-todo-onhold)
("HOLD" . +org-todo-onhold)
("PROJ" . +org-todo-project)))
(defadvice! +org-display-link-in-eldoc-a (orig-fn &rest args)
(after! org-eldoc
;; HACK Fix #2972: infinite recursion when eldoc kicks in in an 'org' src
;; block.
;; TODO Should be reported upstream!
(puthash "org" "ignore" org-eldoc-local-functions-cache))
(defadvice! +org-display-link-in-eldoc-a (&rest args)
"Display full link in minibuffer when cursor/mouse is over it."
:around #'org-eldoc-documentation-function
(or (when-let (link (org-element-property :raw-link (org-element-context)))
(format "Link: %s" link))
(apply orig-fn args)))
:before-until #'org-eldoc-documentation-function
(when-let (link (org-element-property :raw-link (org-element-context)))
(format "Link: %s" link)))
;; Automatic indent detection in org files is meaningless
(add-to-list 'doom-detect-indentation-excluded-modes 'org-mode)
@ -338,7 +351,7 @@ relative to `org-directory', unless it is an absolute path."
(defadvice! +org--prevent-save-prompts-when-refiling-a (&rest _)
"Fix #462: when refiling from org-capture, Emacs prompts to kill the
underlying, modified buffer. This fixes that."
:after 'org-refile
:after #'org-refile
(when (bound-and-true-p org-capture-is-refiling)
(org-save-all-org-buffers)))
@ -364,14 +377,15 @@ underlying, modified buffer. This fixes that."
(defun +org-init-attachments-h ()
"Sets up org's attachment system."
(setq org-attach-store-link-p t ; store link after attaching files
org-attach-use-inheritance t) ; inherit properties from parent nodes
;; Centralized attachments directory
(setq org-attach-id-dir (doom-path org-directory org-attach-id-dir)
;; Store a link to attachments when they are attached
org-attach-store-link-p t
;; Inherit attachment properties from parent nodes
org-attach-use-inheritance t)
(after! projectile
(add-to-list 'projectile-globally-ignored-directories org-attach-id-dir)))
(after! org-attach
(unless org-attach-id-dir
(setq org-attach-id-dir (expand-file-name ".attach/" org-directory)))
(after! projectile
(add-to-list 'projectile-globally-ignored-directories org-attach-id-dir))))
(defun +org-init-custom-links-h ()
@ -395,15 +409,15 @@ underlying, modified buffer. This fixes that."
'("wolfram" . "https://wolframalpha.com/input/?i=%s")
'("doom-repo" . "https://github.com/hlissner/doom-emacs/%s"))
(+org-def-link "org" org-directory)
(+org-def-link "doom" doom-emacs-dir)
(+org-def-link "doom-docs" doom-docs-dir)
(+org-def-link "doom-modules" doom-modules-dir)
(+org-define-basic-link "org" 'org-directory)
(+org-define-basic-link "doom" 'doom-emacs-dir)
(+org-define-basic-link "doom-docs" 'doom-docs-dir)
(+org-define-basic-link "doom-modules" 'doom-modules-dir)
;; Allow inline image previews of http(s)? urls or data uris
(org-link-set-parameters "http" :image-data-fun #'+org-image-link)
(org-link-set-parameters "https" :image-data-fun #'+org-image-link)
(org-link-set-parameters "img" :image-data-fun #'+org-inline-data-image)
(org-link-set-parameters "http" :image-data-fun #'+org-http-image-data-fn)
(org-link-set-parameters "https" :image-data-fun #'+org-http-image-data-fn)
(org-link-set-parameters "img" :image-data-fun #'+org-inline-image-data-fn)
;; Add support for youtube links + previews
(require 'org-yt nil t))
@ -456,9 +470,9 @@ underlying, modified buffer. This fixes that."
(defun +org-init-hacks-h ()
"Getting org to behave."
;; Don't open separate windows
;; Open file links in current window, rather than new ones
(setf (alist-get 'file org-link-frame-setup) #'find-file)
;; Open directory links in Emacs
;; Open directory links in dired
(add-to-list 'org-file-apps '(directory . emacs))
;; When you create a sparse tree and `org-indent-mode' is enabled, the
@ -566,6 +580,9 @@ between the two."
"C-c C-S-l" #'+org/remove-link
"C-c C-i" #'org-toggle-inline-images
;; textmate-esque newline insertion
"C-RET" #'+org/insert-item-below
"C-S-RET" #'+org/insert-item-above
"C-M-RET" #'org-insert-subheading
[C-return] #'+org/insert-item-below
[C-S-return] #'+org/insert-item-above
[C-M-return] #'org-insert-subheading
@ -578,7 +595,10 @@ between the two."
[remap doom/forward-to-last-non-comment-or-eol] #'org-end-of-line
:localleader
"#" #'org-update-statistics-cookies
"'" #'org-edit-special
"*" #'org-ctrl-c-star
"+" #'org-ctrl-c-minus
"," #'org-switchb
"." #'org-goto
(:when (featurep! :completion ivy)
@ -588,7 +608,6 @@ between the two."
"." #'helm-org-in-buffer-headings
"/" #'helm-org-agenda-files-headings)
"A" #'org-archive-subtree
"d" #'org-deadline
"e" #'org-export-dispatch
"f" #'org-footnote-new
"h" #'org-toggle-heading
@ -598,7 +617,6 @@ between the two."
"o" #'org-set-property
"p" #'org-priority
"q" #'org-set-tags-command
"s" #'org-schedule
"t" #'org-todo
"T" #'org-todo-list
(:prefix ("a" . "attachments")
@ -621,24 +639,38 @@ between the two."
(:prefix ("b" . "tables")
"-" #'org-table-insert-hline
"a" #'org-table-align
"b" #'org-table-blank-field
"c" #'org-table-create-or-convert-from-region
"dc" #'org-table-delete-column
"dr" #'org-table-kill-row
"e" #'org-table-edit-field
"f" #'org-table-edit-formulas
"h" #'org-table-field-info
"s" #'org-table-sort-lines
"r" #'org-table-recalculate
"R" #'org-table-recalculate-buffer-tables
(:when (featurep! +gnuplot)
"p" #'org-plot/gnuplot))
(:prefix ("c" . "clock")
"c" #'org-clock-in
"C" #'org-clock-out
"c" #'org-clock-cancel
"d" #'org-clock-mark-default-task
"e" #'org-clock-modify-effort-estimate
"E" #'org-set-effort
"l" #'org-clock-in-last
"g" #'org-clock-goto
"G" (λ! (org-clock-goto 'select))
"r" #'org-clock-report
"x" #'org-clock-cancel
"i" #'org-clock-in
"I" #'org-clock-in-last
"o" #'org-clock-out
"r" #'org-resolve-clocks
"R" #'org-clock-report
"t" #'org-evaluate-time-range
"=" #'org-clock-timestamps-up
"-" #'org-clock-timestamps-down)
(:prefix ("d" . "date/deadline")
"d" #'org-deadline
"s" #'org-schedule
"t" #'org-time-stamp
"T" #'org-time-stamp-inactive)
(:prefix ("g" . "goto")
"g" #'org-goto
(:when (featurep! :completion ivy)
@ -655,12 +687,13 @@ between the two."
"x" #'org-capture-goto-last-stored)
(:prefix ("l" . "links")
"c" #'org-cliplink
"d" #'+org/remove-link
"i" #'org-id-store-link
"l" #'org-insert-link
"L" #'org-insert-all-links
"s" #'org-store-link
"S" #'org-insert-last-stored-link
"i" #'org-id-store-link
"d" #'+org/remove-link)
"t" #'org-toggle-link-display)
(:prefix ("r" . "refile")
"." #'+org/refile-to-current-file
"c" #'+org/refile-to-running-clock
@ -778,7 +811,7 @@ compelling reason, so..."
(use-package! org-crypt ; built-in
:commands org-encrypt-entries
:commands org-encrypt-entries org-encrypt-entry org-decrypt-entries org-decrypt-entry
:hook (org-reveal-start . org-decrypt-entry)
:config
(add-hook! 'org-mode-hook
@ -811,40 +844,18 @@ compelling reason, so..."
:commands org-pdftools-export
:init
(after! org
(add-hook 'org-store-link-functions #'org-pdftools-store-link)
;; HACK `org-pdftools' hard-codes "pdftools:" for its links. We want to use
;; a generic link so that the backend doesn't matter. These hacks are
;; in place so that the old pdf(view|tools) links still work, but that
;; org-pdftools will only generate pdf: links.
(org-link-set-parameters "pdf"
(org-link-set-parameters (or (bound-and-true-p org-pdftools-link-prefix) "pdf")
:follow #'org-pdftools-open
:complete #'org-pdftools-complete-link
:store #'org-pdftools-store-link
:export #'org-pdftools-export)
(add-hook! 'org-open-link-functions
(defun +org-open-old-pdf-links-fn (link)
(defun +org-open-legacy-pdf-links-fn (link)
"Open pdftools:* and pdfviews:* links as if they were pdf:* links."
(let ((regexp "^pdf\\(?:tools\\|view\\):"))
(when (string-match-p regexp link)
(org-pdftools-open (replace-regexp-in-string regexp "" link))
t))))
;; TODO Perhaps PR a variable for changing the link upstream?
(defadvice! +org--use-generic-link-a (link)
:filter-return '(org-pdftools-complete-link
org-pdftools-get-link)
(replace-regexp-in-string "^pdftools:" "pdf:" link))
(defadvice! +org--store-generic-link-a (orig-fn &rest args)
:around #'org-pdftools-store-link
(cl-letf* ((old-store-props (symbol-function #'org-link-store-props))
((symbol-function #'org-link-store-props)
(lambda (&rest plist)
(plist-put! plist :type "pdf")
(plist-put! plist :link (+org--use-generic-link-a (plist-get plist :link)))
(apply old-store-props plist))))
(apply orig-fn args)))))
t))))))
(use-package! evil-org
@ -935,10 +946,12 @@ compelling reason, so..."
org-list org-pcomplete org-src org-footnote org-macro ob org org-agenda
org-capture
:preface
;; Change org defaults (should be set before org loads)
(setq org-directory "~/org/"
org-attach-id-dir ".attach/"
org-publish-timestamp-directory (concat doom-cache-dir "org-timestamps/")
;; Set these to nil now so we can detect user changes to them later (and fall
;; back on defaults otherwise)
(defvar org-directory nil)
(defvar org-attach-id-dir nil)
(setq org-publish-timestamp-directory (concat doom-cache-dir "org-timestamps/")
org-preview-latex-image-directory (concat doom-cache-dir "org-latex/"))
;; Make most of the default modules opt-in, because I sincerely doubt most
@ -965,6 +978,7 @@ compelling reason, so..."
(if (featurep! +pomodoro) (load! "contrib/pomodoro"))
(if (featurep! +present) (load! "contrib/present"))
(if (featurep! +roam) (load! "contrib/roam"))
(if (featurep! +noter) (load! "contrib/noter"))
;; Add our general hooks after the submodules, so that any hooks the
;; submodules add run after them, and can overwrite any defaults if necessary.
@ -979,6 +993,7 @@ compelling reason, so..."
#'+org-unfold-to-2nd-level-or-point-h)
(add-hook! 'org-load-hook
#'+org-init-org-directory-h
#'+org-init-appearance-h
#'+org-init-agenda-h
#'+org-init-attachments-h
@ -1012,7 +1027,6 @@ compelling reason, so..."
;; Global ID state means we can have ID links anywhere. This is required for
;; `org-brain', however.
(setq org-id-track-globally t
org-id-locations-file (expand-file-name ".orgids" org-directory)
org-id-locations-file-relative t)
;; HACK `org-id' doesn't check if `org-id-locations-file' exists or is

View file

@ -16,61 +16,52 @@
(after! org
;; A shorter link to attachments
(+org-def-link "download" org-attach-id-dir)
(org-link-set-parameters "download" :image-data-fun #'+org-dragndrop-image-fn))
(+org-define-basic-link "download" (lambda () (or org-download-image-dir org-attach-id-dir "."))
:image-data-fun #'+org-image-file-data-fn
:requires 'org-download))
:config
(setq org-download-image-dir org-attach-id-dir
org-download-link-format "[[download:%s]]\n"
org-download-method 'attach
org-download-heading-lvl nil
(unless org-download-image-dir
(setq org-download-image-dir org-attach-id-dir))
(setq org-download-method 'attach
org-download-timestamp "_%Y%m%d_%H%M%S"
org-download-screenshot-method
(cond (IS-MAC "screencapture -i %s")
(IS-LINUX
(cond ((executable-find "maim") "maim -s %s")
((executable-find "scrot") "scrot -s %s")
((executable-find "gnome-screenshot") "gnome-screenshot -a -f %s")))))
((executable-find "gnome-screenshot") "gnome-screenshot -a -f %s"))))
;; Handle non-image files a little differently. Images should be inserted
;; as-is, as image previews. Other files, like pdfs or zips, should be linked
;; to, with an icon indicating the type of file.
(defadvice! +org--dragndrop-insert-link-a (_link filename)
"Produces and inserts a link to FILENAME into the document.
org-download-heading-lvl nil
org-download-link-format "[[download:%s]]\n"
org-download-annotate-function (lambda (_link) "")
org-download-link-format-function
(lambda (filename)
(if (eq org-download-method 'attach)
(format "[[attachment:%s]]\n"
(org-link-escape
(file-relative-name filename (org-attach-dir))))
;; Handle non-image files a little differently. Images should be
;; inserted as normal with previews. Other files, like pdfs or zips,
;; should be linked to, with an icon indicating the type of file.
(format (concat (unless (image-type-from-file-name filename)
(concat (+org-attach-icon-for filename)
" "))
org-download-link-format)
(org-link-escape
(funcall org-download-abbreviate-filename-function filename)))))
org-download-abbreviate-filename-function
(lambda (path)
(if (file-in-directory-p path org-download-image-dir)
(file-relative-name path org-download-image-dir)
path)))
If FILENAME is an image, produce an attach:%s path, otherwise use file:%s (with
an file icon produced by `+org-attach-icon-for')."
:override #'org-download-insert-link
(if (looking-back "^[ \t]+" (line-beginning-position))
(delete-region (match-beginning 0) (match-end 0))
(newline))
(cond ((image-type-from-file-name filename)
(insert
(concat
(if (= org-download-image-html-width 0) ""
(format "#+attr_html: :width %dpx\n" org-download-image-html-width))
(if (= org-download-image-latex-width 0) ""
(format "#+attr_latex: :width %dcm\n" org-download-image-latex-width))
(if (= org-download-image-org-width 0) ""
(format "#+attr_org: :width %dpx\n" org-download-image-org-width))
(format org-download-link-format
(cond ((file-in-directory-p filename org-attach-id-dir)
(file-relative-name filename org-attach-id-dir))
((file-in-directory-p filename org-directory)
(file-relative-name filename org-directory))
(filename)))))
(org-display-inline-images))
((insert
(format "%s [[./%s][%s]] "
(+org-attach-icon-for filename)
(file-relative-name filename (file-name-directory buffer-file-name))
(file-name-nondirectory (directory-file-name filename)))))))
(advice-add #'org-download--dir-2 :override #'ignore)
(defadvice! +org--dragndrop-download-fullname-a (path)
"Write PATH relative to current file."
:filter-return #'org-download--fullname
(let ((dir (or (if buffer-file-name (file-name-directory buffer-file-name))
default-directory)))
(if (file-in-directory-p dir org-directory)
(file-relative-name path dir)
path))))
(defadvice! +org--dragndrop-then-display-inline-images-a (_link filename)
:after #'org-download-insert-link
(when (image-type-from-file-name filename)
(save-excursion
(org-display-inline-images
t t
(progn (org-back-to-heading t) (point))
(progn (org-end-of-subtree t t)
(when (and (org-at-heading-p) (not (eobp))) (backward-char 1))
(point)))))))

View file

@ -29,6 +29,8 @@
(defun +org-journal-mode-maybe ()
"Activate `org-journal-mode', maybe."
(and (eq major-mode 'org-mode)
(stringp buffer-file-name)
(stringp org-journal-file-pattern)
(string-match-p org-journal-file-pattern buffer-file-name)
(let ((org-mode-hook (remq '+org-journal-mode-maybe org-mode-hook)))
(org-journal-mode))))

View file

@ -0,0 +1,14 @@
;;; lang/org/contrib/noter.el -*- lexical-binding: t; -*-
;;;###if (featurep! +noter)
(use-package! org-noter
:defer t
:preface
;; Allow the user to preempt this and set the document search path
;; If not set then use `org-directory'
(defvar org-noter-notes-search-path nil)
:config
(setq org-noter-auto-save-last-location t
org-noter-separate-notes-from-heading t)
(unless org-noter-notes-search-path
(setq org-noter-notes-search-path org-directory)))

View file

@ -1,18 +1,25 @@
;;; lang/org/contrib/roam.el -*- lexical-binding: t; -*-
;;;###if (featurep! +roam)
(defvar +org-roam-open-buffer-on-find-file t
"If non-nil, open the org-roam buffer when opening an org roam file.")
;;
;;; Packages
(use-package! org-roam
:hook (org-load . org-roam-mode)
:hook (org-roam-backlinks-mode . turn-on-visual-line-mode)
:commands (org-roam-buffer-toggle-display
org-roam-date
org-roam-find-file
org-roam-graph-show
org-roam-graph
org-roam-insert
org-roam-switch-to-buffer
org-roam-today
org-roam-tomorrow
org-roam-yesterday)
org-roam-dailies-date
org-roam-dailies-today
org-roam-dailies-tomorrow
org-roam-dailies-yesterday)
:preface
;; Set this to nil so we can later detect whether the user has set a custom
;; directory for it, and default to `org-directory' if they haven't.
@ -24,30 +31,54 @@
:prefix ("m" . "org-roam")
"b" #'org-roam-switch-to-buffer
"f" #'org-roam-find-file
"g" #'org-roam-graph-show
"g" #'org-roam-graph
"i" #'org-roam-insert
"m" #'org-roam
(:prefix ("d" . "by date")
:desc "Arbitrary date" "d" #'org-roam-date
:desc "Today" "t" #'org-roam-today
:desc "Tomorrow" "m" #'org-roam-tomorrow
:desc "Yesterday" "y" #'org-roam-yesterday))
:desc "Arbitrary date" "d" #'org-roam-dailies-date
:desc "Today" "t" #'org-roam-dailies-today
:desc "Tomorrow" "m" #'org-roam-dailies-tomorrow
:desc "Yesterday" "y" #'org-roam-dailies-yesterday))
:config
(setq org-roam-directory (expand-file-name (or org-roam-directory "")
(setq org-roam-directory (expand-file-name (or org-roam-directory "roam")
org-directory)
org-roam-verbose nil ; https://youtu.be/fn4jIlFwuLU
org-roam-buffer-no-delete-other-windows t ; make org-roam buffer sticky
org-roam-completion-system
(cond ((featurep! :completion helm) 'helm)
((featurep! :completion ivy) 'ivy)
((featurep! :completion ido) 'ido)
('default)))
('default))
org-roam-completion-fuzzy-match
(or (featurep! :completion helm +fuzzy)
(featurep! :completion ivy +fuzzy)))
;; HACK Hide the mode line in the org-roam buffer, since it serves no purpose.
;; This makes it easier to distinguish among other org buffers.
(defadvice! +org--hide-mode-line-a (&rest _)
:after #'org-roam-buffer--get-create
(with-current-buffer org-roam-buffer
(hide-mode-line-mode +1))))
;; HACK On first invocation, `org-roam-db-build-cache' builds the cache with a
;; list of unresolved file paths. If those are symlinks, you will later
;; end up with duplicate entries in your roam DB (e.g. after
;; `org-roam-capture'ing to an existing file).
;; REVIEW When jethrokuan/org-roam#518 is merged
(defadvice! +org-roam-resolve-symlinks-a (args)
:filter-args #'org-roam--list-files
(setcar args (file-truename (car args)))
args)
;; Normally, the org-roam buffer doesn't open until you explicitly call
;; `org-roam'. If `+org-roam-open-buffer-on-find-file' is non-nil, the
;; org-roam buffer will be opened for you when you use `org-roam-find-file'
;; (but not `find-file', to limit the scope of this behavior).
(add-hook! 'find-file-hook
(defun +org-roam-open-buffer-maybe-h ()
(and +org-roam-open-buffer-on-find-file
(memq 'org-roam-buffer--update-maybe post-command-hook)
(not (window-parameter nil 'window-side)) ; don't proc for popups
(not (eq 'visible (org-roam-buffer--visibility)))
(with-current-buffer (window-buffer)
(org-roam-buffer--get-create)))))
;; Hide the mode line in the org-roam buffer, since it serves no purpose. This
;; makes it easier to distinguish among other org buffers.
(add-hook 'org-roam-buffer-prepare-hook #'hide-mode-line-mode))
;; Since the org module lazy loads org-protocol (waits until an org URL is

View file

@ -27,14 +27,14 @@
:recipe (:host github
:repo "emacs-straight/org-mode"
:files ("*.el" "lisp/*.el" "contrib/lisp/*.el"))
:pin "9994e8ee89")
:pin "31068373dc")
;; ...And prevent other packages from pulling org; org-plus-contrib satisfies
;; the dependency already: https://github.com/raxod502/straight.el/issues/352
(package! org :recipe (:local-repo nil))
(package! avy)
(package! htmlize :pin "86f22f211e")
(package! org-superstar :pin "4897c333a8")
(package! org-superstar :pin "09ddc28383")
(package! org-yt
:recipe (:host github :repo "TobiasZawada/org-yt")
:pin "40cc1ac76d")
@ -45,13 +45,13 @@
(when (featurep! :editor evil +everywhere)
(package! evil-org
:recipe (:host github :repo "hlissner/evil-org-mode")
:pin "4d44e9bbdc"))
:pin "9cf661af8f"))
(when (featurep! :tools pdf)
(package! org-pdftools :pin "4156b677fc"))
(package! org-pdftools :pin "8cc15bb801"))
(when (featurep! :tools magit)
(package! orgit :pin "0242088fb2"))
(package! orgit :pin "e147f05577"))
(when (featurep! +brain)
(package! org-brain :pin "3630eb88a3"))
(package! org-brain :pin "7ffbf6816a"))
(when (featurep! +dragndrop)
(package! org-download :pin "46417e2bd3"))
(when (featurep! +gnuplot)
@ -60,9 +60,11 @@
(when (featurep! +ipython) ; DEPRECATED
(package! ob-ipython :pin "7147455230"))
(when (featurep! +jupyter)
(package! jupyter :pin "62ad054001"))
(package! jupyter :pin "785edbbff6"))
(when (featurep! +journal)
(package! org-journal :pin "3fdb5b3036"))
(package! org-journal :pin "8bf06b28d6"))
(when (featurep! +noter)
(package! org-noter :pin "9ead81d42d"))
(when (featurep! +pomodoro)
(package! org-pomodoro :pin "aa07c11318"))
(when (featurep! +present)
@ -72,7 +74,7 @@
(package! org-tree-slide :pin "7bf09a02bd")
(package! org-re-reveal :pin "61549f4c00"))
(when (featurep! +roam)
(package! org-roam :pin "e33c144298")
(package! org-roam :pin "963692f353")
(when (featurep! :completion company)
(package! company-org-roam :pin "0913d86f16")))
@ -103,6 +105,6 @@
(when (featurep! +hugo)
(package! ox-hugo
:recipe (:host github :repo "kaushalmodi/ox-hugo" :nonrecursive t)
:pin "b6f4142de2"))
:pin "5106b430a1"))
(when (featurep! :lang rst)
(package! ox-rst :pin "9158bfd180"))

View file

@ -25,6 +25,8 @@ Adds Python support to Doom Emacs.
+ ~+lsp~ Language Server Protocol support
+ ~+pyenv~ Python virtual environment support via [[https://github.com/pyenv/pyenv][pyenv]]
+ ~+conda~ Python virtual environment support via [[https://conda.io/en/latest/][Conda]]
+ ~+poetry~ Python packaging, dependency management, and virtual environment
support via [[https://python-poetry.org/][Poetry]]
+ ~+cython~ Cython files support via [[https://github.com/cython/cython/blob/master/Tools/cython-mode.el][Cython-mode]]
** Plugins
@ -41,6 +43,8 @@ Adds Python support to Doom Emacs.
+ [[https://github.com/necaris/conda.el][conda]]*
+ ~+pyenv~
+ [[https://github.com/pythonic-emacs/pyenv-mode][pyenv]]*
+ ~+poetry~
+ [[https://github.com/galaunay/poetry.el][poetry]]*
+ ~+lsp~ and ~:tools lsp~
+ [[https://github.com/emacs-lsp/lsp-mode][lsp]]
+ [[https://github.com/emacs-lsp/lsp-python-ms][lsp-python-ms]]*
@ -67,6 +71,7 @@ This module has no direct prerequisites. Here are some of its soft dependencies.
+ Python virtual environments install instructions at:
+ [[https://github.com/pyenv/pyenv][pyenv]]
+ [[https://conda.io/en/latest/][Conda]]
+ [[https://python-poetry.org/][Poetry]]
+ ~pipenv~ requires [[https://pipenv.readthedocs.io/en/latest/][pipenv]]

View file

@ -280,6 +280,11 @@ called.")
'append))
(use-package! poetry
:when (featurep! +poetry)
:after python)
(use-package! lsp-python-ms
:when (featurep! +lsp)
:after lsp-clients

View file

@ -20,6 +20,10 @@
(unless (executable-find "conda")
(warn! "Couldn't find conda in your PATH")))
(when (featurep! +poetry)
(if (not (executable-find "poetry"))
(warn! "Couldn't find poetry in your PATH")))
(when (featurep! +cython)
(unless (executable-find "cython")
(warn! "Couldn't find cython. cython-mode will not work.")))

View file

@ -24,6 +24,8 @@
(package! pyenv-mode :pin "aec6f2aa28"))
(when (featurep! +conda)
(package! conda :pin "335474e409"))
(when (featurep! +poetry)
(package! poetry :pin "6dcc9d22ca"))
;; Testing frameworks
(package! nose :pin "f852829751")

View file

@ -13,8 +13,8 @@
:config
(set-repl-handler! 'racket-mode #'+racket/open-repl)
(set-lookup-handlers! 'racket-mode
:definition #'racket-visit-definition
:documentation #'racket-describe)
:definition #'racket-xp-visit-definition
:documentation #'racket-xp-describe)
(set-docsets! 'racket-mode "Racket")
(set-pretty-symbols! 'racket-mode
:lambda "lambda"

View file

@ -1,4 +1,4 @@
;; -*- no-byte-compile: t; -*-
;;; lang/racket/packages.el
(package! racket-mode :pin "bd4c8cf3ce")
(package! racket-mode :pin "202cc1b784")

View file

@ -1,5 +1,50 @@
;;; lang/scheme/autoload.el -*- lexical-binding: t; -*-
(defvar calculate-lisp-indent-last-sexp)
;; Adapted from https://github.com/alezost/emacs-config/blob/master/utils/al-scheme.el#L76-L123
;;;###autoload
(defun +scheme-scheme-indent-function-a (indent-point state)
"Advice to replace `scheme-indent-function'.
This function is the same as `scheme-indent-function' except it indents property
lists properly and names starting with 'default'."
(let ((normal-indent (current-column)))
(goto-char (1+ (elt state 1)))
(parse-partial-sexp (point) calculate-lisp-indent-last-sexp 0 t)
(if (and (elt state 2)
;; NOTE looking-at -> looking-at-p
(not (looking-at-p "\\sw\\|\\s_")))
(unless (> (save-excursion (forward-line 1) (point))
calculate-lisp-indent-last-sexp)
(goto-char calculate-lisp-indent-last-sexp)
(beginning-of-line)
(parse-partial-sexp (point) calculate-lisp-indent-last-sexp 0 t))
(backward-prefix-chars)
(current-column)
(let* ((function (buffer-substring
(point) (progn (forward-sexp 1) (point))))
(method (or (get (intern-soft function) 'scheme-indent-function)
(get (intern-soft function) 'scheme-indent-hook))))
(cond ((or (eq method 'defun)
(and (null method)
(> (length function) 3)
;; NOTE string-match -> string-match-p
;; NOTE The original regexp is "\\`def" but it will mess
;; indentation with such names as 'default-...'.
(string-match-p "\\`define" function)))
(lisp-indent-defform state indent-point))
;; NOTE Added this clause to handle alignment of keyword symbols
((and (null method)
(> (length function) 1)
(string-match-p "\\`:" function))
(let ((lisp-body-indent 1))
(lisp-indent-defform state indent-point)))
((integerp method)
(lisp-indent-specform method state indent-point normal-indent))
(method
(funcall method state indent-point normal-indent)))))))
;;;###autoload
(defun +scheme/open-repl (&optional arg)
"Open the Scheme REPL."

View file

@ -1,17 +1,20 @@
;;; lang/scheme/config.el -*- lexical-binding: t; -*-
;;;###package scheme
(add-hook 'scheme-mode-hook #'rainbow-delimiters-mode)
(use-package! scheme
:hook (scheme-mode . rainbow-delimiters-mode)
:config (advice-add #'scheme-indent-function :override #'+scheme-scheme-indent-function-a))
(use-package! geiser
:defer t
:hook (scheme-mode . geiser-mode)
:init
(setq geiser-active-implementations '(guile chicken mit chibi chez))
(setq geiser-active-implementations '(guile chicken mit chibi chez)
geiser-mode-start-repl-p t
geiser-smart-tab-p t)
(unless (featurep! :lang racket)
(push 'racket geiser-active-implementations))
(after! scheme ; built-in
(set-repl-handler! 'scheme-mode '+scheme/open-repl)
(after! scheme ; built-in
(set-repl-handler! 'scheme-mode #'+scheme/open-repl)
(set-eval-handler! 'scheme-mode #'geiser-eval-region)
(set-lookup-handlers! 'scheme-mode
:definition #'geiser-edit-symbol-at-point
@ -22,24 +25,32 @@
( "\\* [A-Za-z0-9_-]+ REPL \\*" :quit nil)))
(map! :localleader
:map scheme-mode-map
"'" #'geiser-mode-switch-to-repl
"s" #'geiser-set-scheme
"'" #'geiser-mode-switch-to-repl
"\"" #'geiser-connect
"[" #'geiser-squarify
"\\" #'geiser-insert-lambda
"s" #'geiser-set-scheme
(:prefix ("e" . "eval")
"b" #'geiser-eval-buffer
"B" #'geiser-eval-buffer-and-go
"e" #'geiser-eval-definition
"E" #'geiser-eval-definition-and-go
"e" #'geiser-eval-last-sexp
"d" #'geiser-eval-definition
"D" #'geiser-eval-definition-and-go
"r" #'geiser-eval-region
"R" #'geiser-eval-region-and-go)
(:prefix ("h" . "help")
"d" 'geiser-autodoc)
;; TODO add more help keybindings
"d" #'geiser-autodoc
"<" #'geiser-xref-callers
">" #'geiser-xref-callees
"i" #'geiser-doc-look-up-manual)
(:prefix ("m" . "macro")
"r" #'geiser-expand-region
"d" #'geiser-expand-definition
"e" #'geiser-expand-last-sexp)
(:prefix ("r" . "repl")
"b" #'geiser-switch-to-repl
"q" #'geiser-repl-exit
"l" #'geiser-load-current-buffer
"r" #'geiser-restart-repl
"R" #'geiser-reload
"c" #'geiser-repl-clear-buffer)))

View file

@ -12,7 +12,7 @@
:mode "\\.svelte\\'"
:mode "\\.vue\\'"
:mode "\\.twig\\'"
:mode "\\.jinja\\'"
:mode "\\.jinja2?\\'"
:mode "wp-content/themes/.+/.+\\.php\\'"
:mode "templates/.+\\.php\\'"
;; REVIEW We associate TSX files with `web-mode' because `typescript-mode'

View file

@ -14,8 +14,8 @@
(setq-hook! 'rjsx-mode-hook emmet-expand-jsx-className? t)
(map! :map emmet-mode-keymap
:v [tab] #'emmet-wrap-with-markup
:i [tab] #'+web/indent-or-yas-or-emmet-expand
:i "M-E" #'emmet-expand-line))
[tab] #'+web/indent-or-yas-or-emmet-expand
"M-E" #'emmet-expand-line))
;;

View file

@ -0,0 +1,38 @@
#+TITLE: lang/yaml
#+DATE: April 23, 2020
#+SINCE: v3.0.0
#+STARTUP: inlineimages nofold
* Table of Contents :TOC_3:noexport:
- [[#description][Description]]
- [[#maintainers][Maintainers]]
- [[#module-flags][Module Flags]]
- [[#plugins][Plugins]]
- [[#prerequisites][Prerequisites]]
- [[#features][Features]]
- [[#configuration][Configuration]]
- [[#troubleshooting][Troubleshooting]]
* Description
This module provides support for the [[https://yaml.org/][YAML file format]].
** Maintainers
This module has no dedicated maintainers.
** Module Flags
+ =+lsp= Enables integration with LSP servers. Requires the =:tools lsp= module to be enabled.
** Plugins
+ [[https://github.com/yoshiki/yaml-mode][yaml-mode]]
* Prerequisites
This module has no prereqisites.
* TODO Features
# An in-depth list of features, how to use them, and their dependencies.
* TODO Configuration
# How to configure this module, including common problems and how to address them.
* TODO Troubleshooting
# Common issues and their solution, or places to look for help.

View file

@ -0,0 +1,9 @@
;;; lang/yaml/config.el -*- lexical-binding: t; -*-
(use-package! yaml-mode
:mode "Procfile\\'"
:init
(when (featurep! +lsp)
(add-hook 'yaml-mode-local-vars-hook #'lsp!))
:config
(setq-hook! 'yaml-mode-hook tab-width yaml-indent-offset))

View file

@ -0,0 +1,4 @@
;; -*- no-byte-compile: t; -*-
;;; lang/yaml/packages.el
(package! yaml-mode :pin "cecf4b106b")

View file

@ -6,7 +6,7 @@
"TODO"
(interactive "<fsh><!>")
(let ((buffer (+eshell-last-buffer))
(command (+evil-resolve-vim-path-a command)))
(command (+evil-replace-filename-modifiers-a command)))
(cond (buffer
(select-window (get-buffer-window buffer))
(+eshell-run-command command buffer))

View file

@ -48,7 +48,7 @@ You should use `set-eshell-alias!' to change this.")
;;
;; Packages
;;; Packages
(after! eshell ; built-in
(setq eshell-banner-message

View file

@ -88,6 +88,13 @@ There are several ways to manually install the module:
1. You can use =M-x vterm-module-compile= to let emacs automatically compile and
install the module.
Modify ~vterm-module-cmake-args~ to pass arguments to the cmake build script.
e.g. To use a local build of libvterm instead of the included one.
#+BEGIN_SRC elisp
(setq vterm-module-cmake-args "-DUSE_SYSTEM_LIBVTERM=yes")
#+END_SRC
*WARNING*: Emacs will hang during the compilation. It may take a while.
2. You can compile and install the module yourself. Go to the vterm installation

View file

@ -2,25 +2,26 @@
(use-package! vterm
:when (bound-and-true-p module-file-suffix)
:commands (vterm vterm-mode)
:preface (setq vterm-install t)
:commands vterm vterm-mode
:preface (setq vterm-install t) ; compile the package when you load vterm
:hook (vterm-mode . doom-mark-buffer-as-real-h)
:hook (vterm-mode . hide-mode-line-mode) ; modeline serves no purpose in vterm
:config
(set-popup-rule! "^vterm" :size 0.25 :vslot -4 :select t :quit nil :ttl 0)
;; Once vterm is dead, the vterm buffer is useless. Why keep it around? We can
;; spawn another if want one.
(setq vterm-kill-buffer-on-exit t)
(setq-hook! 'vterm-mode-hook
;; Don't prompt about processes when killing vterm
;; Don't prompt about dying processes when killing vterm
confirm-kill-processes nil
;; Prevent premature horizontal scrolling
hscroll-margin 0)
(setq vterm-kill-buffer-on-exit t)
;; Restore the point's location when leaving and re-entering insert mode.
(when (featurep! :editor evil)
(add-hook! 'vterm-mode-hook
(defun +vterm-init-remember-point-h ()
(add-hook 'evil-insert-state-exit-hook #'+vterm-remember-insert-point-h nil t)
(add-hook 'evil-insert-state-entry-hook #'+vterm-goto-insert-point-h nil t))))
(add-hook 'vterm-mode-hook #'doom-mark-buffer-as-real-h)
;; Modeline serves no purpose in vterm
(add-hook 'vterm-mode-hook #'hide-mode-line-mode))
(add-hook 'evil-insert-state-entry-hook #'+vterm-goto-insert-point-h nil t)))))

View file

@ -3,4 +3,4 @@
(package! vterm
:built-in 'prefer
:pin "996c535b9c")
:pin "aa512b8351")

View file

@ -25,36 +25,6 @@
gdb-many-windows t)
(use-package! dap-mode
:when (featurep! :tools lsp)
:after lsp-mode
:preface
(add-hook 'dap-mode-hook #'dap-ui-mode) ; use a hook so users can remove it
(setq dap-breakpoints-file (concat doom-etc-dir "dap-breakpoints")
dap-utils-extension-path (concat doom-etc-dir "dap-extension/"))
:config
(dap-mode 1)
(dolist (module '(((:lang . cc) ccls dap-lldb dap-gdb-lldb)
((:lang . elixir) elixir-mode dap-elixir)
((:lang . go) go-mode dap-go)
((:lang . java) lsp-java dap-java)
((:lang . php) php-mode dap-php)
((:lang . python) python dap-python)
((:lang . ruby) ruby-mode dap-ruby)
((:lang . rust) rust-mode dap-lldb)))
(when (doom-module-p (caar module) (cdar module) '+lsp)
(with-eval-after-load (nth 1 module)
(mapc #'require (cddr module)))))
(when (featurep! :lang javascript +lsp)
(with-eval-after-load 'js2-mode
(require 'dap-node)
(require 'dap-chrome)
(require 'dap-firefox)
(when IS-WINDOWS
(require 'dap-edge)))))
(use-package! realgud
:defer t
:init
@ -116,3 +86,41 @@
(if cmd-buf (switch-to-buffer cmd-buf))
(message "Error running command: %s" (mapconcat #'identity cmd-args " "))))
cmd-buf)))
(use-package! dap-mode
:when (featurep! +lsp)
:hook (dap-mode . dap-tooltip-mode)
:after lsp-mode
:demand t
:preface
(setq dap-breakpoints-file (concat doom-etc-dir "dap-breakpoints")
dap-utils-extension-path (concat doom-etc-dir "dap-extension/"))
:config
(dolist (module '(((:lang . cc) ccls dap-lldb dap-gdb-lldb)
((:lang . elixir) elixir-mode dap-elixir)
((:lang . go) go-mode dap-go)
((:lang . java) lsp-java dap-java)
((:lang . php) php-mode dap-php)
((:lang . python) python dap-python)
((:lang . ruby) ruby-mode dap-ruby)
((:lang . rust) rust-mode dap-lldb)))
(when (doom-module-p (caar module) (cdar module) '+lsp)
(with-eval-after-load (nth 1 module)
(mapc #'require (cddr module)))))
(when (featurep! :lang javascript +lsp)
(with-eval-after-load 'js2-mode
(require 'dap-node)
(require 'dap-chrome)
(require 'dap-firefox)
(when IS-WINDOWS
(require 'dap-edge))))
(dap-mode 1))
(use-package! dap-ui-mode
:when (featurep! +lsp)
:hook (dap-mode . dap-ui-mode)
:hook (dap-ui-mode . dap-ui-controls-mode))

View file

@ -1,9 +1,10 @@
;; -*- no-byte-compile: t; -*-
;;; tools/debugger/packages.el
(when (package! realgud :pin "94f2835933")
(when (package! realgud :pin "b854e040e0")
(when (featurep! :lang javascript)
(package! realgud-trepan-ni :pin "6e9cac5e80")))
(when (featurep! :tools lsp)
(package! dap-mode :pin "e2086fc9fb"))
(when (featurep! +lsp)
(package! dap-mode :pin "0b9c8f28ad")
(package! posframe :pin "e62e584268"))

View file

@ -1,4 +1,4 @@
;; -*- no-byte-compile: t; -*-
;;; tools/ein/packages.el
(package! ein :pin "c0147f63c7")
(package! ein :pin "1322d8c7f8")

View file

@ -25,13 +25,14 @@
- [[#commands][Commands]]
* Description
Integrates with code navigation and documentation tools to help you quickly look
up definitions, references and documentation.
This module adds code navigation and documentation lookup tools to help you
quickly look up definitions, references, documentation, dictionary definitions
or synonyms.
+ Jump-to-definition and find-references implementations that just work.
+ Powerful xref integration for languages that support it.
+ Documentation lookup for a variety of online sources (like devdocs.io,
stackoverflow or youtube).
+ Search online providers like devdocs.io, stackoverflow, google, duckduckgo or
youtube (duckduckgo and google have live suggestions).
+ Integration with Dash.app docsets.
+ Support for online (and offline) dictionaries and thesauruses.
@ -43,14 +44,27 @@ up definitions, references and documentation.
** Plugins
+ [[https://github.com/jacktasia/dumb-jump][dumb-jump]]
+ [[https://github.com/alexmurray/ivy-xref][ivy-xref]] or [[https://github.com/brotzeit/helm-xref][helm-xref]]
+ [[https://github.com/nathankot/counsel-dash][counsel-dash]] or [[https://github.com/areina/helm-dash][helm-dash]]
+ [[https://github.com/tkf/emacs-request][request]]
+ =+docsets=
+ [[https://github.com/dash-docs-el/dash-docs][dash-docs]]
+ [[https://github.com/nathankot/counsel-dash][counsel-dash]] or [[https://github.com/areina/helm-dash][helm-dash]]
+ =+dictionary=
+ if macOS
+ [[https://github.com/xuchunyang/osx-dictionary.el][osx-dictionary]]* (on macOS)
+ else
+ [[https://github.com/abo-abo/define-word][define-word]]
+ [[https://github.com/maxchaos/emacs-powerthesaurus][powerthesaurus]]
+ =+offline=
+ [[https://github.com/gromnitsky/wordnut][wordnut]]
+ [[https://github.com/hpdeifel/synosaurus][synosaurus]]
* Prerequisites
This module has several soft dependencies:
+ ~ripgrep~ as a last-resort fallback for jump-to-definition/find-references.
+ ~sqlite3~ for Dash docset support.
+ ~wordnet~ for offline dictionary and thesaurus support.
+ ~sqlite3~ for Dash docset support (if you have =+docsets= enabled)
+ ~wordnet~ for offline dictionary and thesaurus support (if you have
=+dictionary +offline= enabled).
** MacOS
#+BEGIN_SRC sh

View file

@ -104,6 +104,7 @@ Dictionary.app behind the scenes to get definitions.")
:commands dumb-jump-result-follow
:config
(setq dumb-jump-default-project doom-emacs-dir
dumb-jump-prefer-searcher 'rg
dumb-jump-aggressive nil
dumb-jump-selector
(cond ((featurep! :completion ivy) 'ivy)
@ -136,12 +137,17 @@ Dictionary.app behind the scenes to get definitions.")
(use-package! ivy-xref
:when (featurep! :completion ivy)
:config
(setq xref-show-xrefs-function #'ivy-xref-show-xrefs)
(set-popup-rule! "^\\*xref\\*$" :ignore t))
(set-popup-rule! "^\\*xref\\*$" :ignore t)
;; xref initialization is different in Emacs 27 - there are two different
;; variables which can be set rather than just one
(when EMACS27+
(setq xref-show-definitions-function #'ivy-xref-show-defs))
;; Necessary in Emacs <27. In Emacs 27 it will affect all xref-based
;; commands other than xref-find-definitions too (eg project-find-regexp)
(setq xref-show-xrefs-function #'ivy-xref-show-xrefs))
(use-package! helm-xref
:when (featurep! :completion helm)
:config (setq xref-show-xrefs-function (if EMACS27+ #'helm-xref-show-xrefs-27 #'helm-xref-show-xrefs))))
:when (featurep! :completion helm)))
;;
@ -172,11 +178,10 @@ See https://github.com/magit/ghub/issues/81"
(let ((gnutls-algorithm-priority "NORMAL:-VERS-TLS1.3"))
(funcall orig-fn url)))
(use-package! helm-dash
:when (featurep! :completion helm))
(use-package! counsel-dash
:when (featurep! :completion ivy)))
(cond ((featurep! :completion helm)
(require 'helm-dash nil t))
((featurep! :completion ivy)
(require 'counsel-dash nil t))))
;;

View file

@ -8,7 +8,7 @@
(package! helm))
;;
(package! dumb-jump :pin "e8e9b0c2d1")
(package! dumb-jump :pin "d760aa880f")
(when (featurep! :completion ivy)
(package! ivy-xref :pin "3d4c35fe2b"))
(when (featurep! :completion helm)
@ -27,8 +27,13 @@
(when (featurep! +dictionary)
(if IS-MAC
(package! osx-dictionary :pin "1b79ff64c7")
(package! define-word :pin "d8c76d503b")
(package! powerthesaurus :pin "81a262ec0c")
(package! define-word :pin "08c71b1ff4")
;; HACK Fix #2945: the main package is broken (see
;; SavchenkoValeriy/emacs-powerthesaurus). We use this fork until it is
;; merged.
(package! powerthesaurus
:recipe (:host github :repo "maxchaos/emacs-powerthesaurus" :branch "pt-api-change")
:pin "81a262ec0c")
(when (featurep! +offline)
(package! wordnut :pin "feac531404")
(package! synosaurus :pin "14d34fc92a"))))

View file

@ -213,6 +213,39 @@ auto-killed (which is a potentially expensive process)."
:references 'lsp-ui-peek-find-references)))
(use-package! company-lsp
:defer t
:config
(setq company-lsp-cache-candidates 'auto)
;; HACK Fix tigersoldier/company-lsp#128 causing company-lsp results to
;; display candidates that are unrelated to the prefix. Source:
;; emacs-lsp/lsp-python-ms#79
(add-to-list 'company-lsp-filter-candidates '(mspyls . t))
(defadvice! +company---fix-lsp-caching-on-competion-a (response prefix)
:override #'company-lsp--on-completion
(let* ((incomplete (and (hash-table-p response) (gethash "isIncomplete" response)))
(items (cond ((hash-table-p response) (gethash "items" response))
((sequencep response) response)))
(candidates (mapcar (lambda (item)
(company-lsp--make-candidate item prefix))
(lsp--sort-completions items)))
(server-id (lsp--client-server-id (lsp--workspace-client lsp--cur-workspace)))
(should-filter (or
;; CHANGE BEGIN
(eq company-lsp-cache-candidates t)
;; CHANGE END
(and (null company-lsp-cache-candidates)
(company-lsp--get-config company-lsp-filter-candidates server-id)))))
(when (null company-lsp--completion-cache)
(add-hook 'company-completion-cancelled-hook #'company-lsp--cleanup-cache nil t)
(add-hook 'company-completion-finished-hook #'company-lsp--cleanup-cache nil t))
(when (eq company-lsp-cache-candidates 'auto)
(company-lsp--cache-put prefix (company-lsp--cache-item-new candidates incomplete)))
(if should-filter
(company-lsp--filter-candidates candidates prefix)
candidates))))
(use-package! helm-lsp
:when (featurep! :completion helm)
:commands helm-lsp-workspace-symbol helm-lsp-global-workspace-symbol)

View file

@ -1,11 +1,11 @@
;; -*- no-byte-compile: t; -*-
;;; tools/lsp/packages.el
(package! lsp-mode :pin "6671128422")
(package! lsp-mode :pin "4898d35ace")
(package! lsp-ui :pin "242dfe859c")
(when (featurep! :completion company)
(package! company-lsp :pin "f921ffa0cd"))
(when (featurep! :completion ivy)
(package! lsp-ivy :pin "a6b7841e08"))
(package! lsp-ivy :pin "81e81ced99"))
(when (featurep! :completion helm)
(package! helm-lsp :pin "46a72f5af1"))
(package! helm-lsp :pin "db243993ea"))

View file

@ -0,0 +1,60 @@
#+TITLE: tools/magit
#+DATE: March 14, 2018
#+SINCE: v2.0.0
#+STARTUP: inlineimages nofold
* Table of Contents :TOC_3:noexport:
- [[#description][Description]]
- [[#maintainers][Maintainers]]
- [[#module-flags][Module Flags]]
- [[#plugins][Plugins]]
- [[#hacks][Hacks]]
- [[#prerequisites][Prerequisites]]
- [[#features][Features]]
- [[#configuration][Configuration]]
- [[#troubleshooting][Troubleshooting]]
* Description
This module provides Magit, an interface to the Git version control system.
If you are new to Magit, see the [[https://github.com/magit/magit#getting-started][Getting Started]] section of its project readme.
** Maintainers
This module has no dedicated maintainers.
** Module Flags
+ =+forge= Enable Forge; a porcelain for managing issues and PRs from within
Emacs. Will take a while on first run to build emacsql-sqlite.
** Plugins
+ [[https://github.com/magit/magit][magit]]
+ [[https://github.com/magit/forge][forge]]* (=+forge=)
+ [[https://github.com/jtatarik/magit-gitflow][magit-gitflow]]
+ [[https://github.com/alphapapa/magit-todos][magit-todos]]
+ [[https://github.com/charignon/github-review][github-review]]
+ [[https://github.com/emacs-evil/evil-magit][evil-magit]]* (=:editor evil +everywhere=)
** Hacks
+ =forge= was modified to defer compilation of emacsql-sqlite until you try to
use forge, rather than when magit first loads (which could be as soon as
startup).
+ =magit= has been modified to recognize
=$XDG_CACHE_HOME/git/credential/socket=.
+ =magit= has been modified to invalidate the projectile cache when you check
out a new branch or commit.
+ =magit= has been modified to revert repo buffers (e.g. after changing
branches) when you later switch to them, rather than all at once.
* Prerequisites
This module requires ~git~.
Forge will require [[https://magit.vc/manual/forge/Token-Creation.html#Token-Creation][a Github API token]] the first time you run =forge-pull=.
* TODO Features
# An in-depth list of features, how to use them, and their dependencies.
* TODO Configuration
# How to configure this module, including common problems and how to address them.
* TODO Troubleshooting
# Common issues and their solution, or places to look for help.

View file

@ -1,8 +1,5 @@
;;; tools/magit/config.el -*- lexical-binding: t; -*-
;;
;;; Packages
(use-package! magit
:commands magit-file-delete
:defer-incrementally (dash f s with-editor git-commit package eieio lv transient)
@ -92,11 +89,12 @@
(use-package! forge
:when (featurep! +forge)
;; We defer loading even further because forge's dependencies will try to
;; compile emacsql, which is a slow and blocking operation.
:after-call magit-status
:commands forge-create-pullreq forge-create-issue
:init
:preface
(setq forge-database-file (concat doom-etc-dir "forge/forge-database.sqlite"))
:config
;; All forge list modes are derived from `forge-topic-list-mode'
@ -123,8 +121,8 @@ ensure it is built when we actually use Forge."
(message (concat "Failed to build emacsql; forge may not work correctly.\n"
"See *Compile-Log* buffer for details"))
;; HACK Due to changes upstream, forge doesn't initialize completely if
;; it doesn't find `emacsql-sqlite-executable', so we have to do it
;; manually after installing it.
;; it doesn't find `emacsql-sqlite-executable', so we have to do it
;; manually after installing it.
(setq forge--sqlite-available-p t)
(magit-add-section-hook 'magit-status-sections-hook 'forge-insert-pullreqs nil t)
(magit-add-section-hook 'magit-status-sections-hook 'forge-insert-issues nil t)
@ -164,7 +162,7 @@ ensure it is built when we actually use Forge."
(setq evil-magit-state 'normal
evil-magit-use-z-for-folds t)
:config
(unmap! magit-mode-map
(undefine-key! magit-mode-map
;; Replaced by z1, z2, z3, etc
"M-1" "M-2" "M-3" "M-4"
"1" "2" "3" "4"

View file

@ -1,8 +1,9 @@
;; -*- no-byte-compile: t; -*-
;;; tools/magit/packages.el
(when (package! magit :pin "0f1234e785")
(package! forge :pin "2e2d26cf42")
(when (package! magit :pin "8de6ecf5c5")
(when (featurep! +forge)
(package! forge :pin "e2da80660a"))
(package! magit-gitflow :pin "cc41b561ec")
(package! magit-todos :pin "a0e5d1f3c7")
(package! github-review :pin "50c6bcc7cf")

View file

@ -1,6 +1,6 @@
;;; tools/pdf/config.el -*- lexical-binding: t; -*-
(use-package! pdf-tools
(use-package! pdf-view
:mode ("\\.[pP][dD][fF]\\'" . pdf-view-mode)
:magic ("%PDF" . pdf-view-mode)
:init
@ -20,9 +20,10 @@
:config
(map! :map pdf-view-mode-map :gn "q" #'kill-current-buffer)
(setq-default pdf-view-display-size 'fit-page
pdf-view-use-scaling t
pdf-view-use-imagemagick nil)
(setq-default pdf-view-display-size 'fit-page)
;; Enable hiDPI support, but at the cost of memory! See politza/pdf-tools#51
(setq pdf-view-use-scaling t
pdf-view-use-imagemagick nil)
;; Add retina support for MacOS users
(when IS-MAC
@ -52,6 +53,7 @@
(setq-hook! 'pdf-view-mode-hook evil-normal-state-cursor (list nil))
;; Install epdfinfo binary if needed, blocking until it is finished
(require 'pdf-tools)
(unless (file-executable-p pdf-info-epdfinfo-program)
(let ((wconf (current-window-configuration)))
(pdf-tools-install)

View file

@ -104,7 +104,7 @@ but do not execute them."
(if-let* ((lines
(+tmux (format "list-windows %s -F '#{window_id};#{session_id};#{window_active};#{window_name};#{window_activity_flag}'"
(if session
(concat "-t " (car session))
(concat "-t " (shell-quote-argument (car session)))
"-a")))))
(cl-loop for line in (split-string lines "\n" t)
collect (let ((window (split-string line ";")))
@ -122,7 +122,7 @@ but do not execute them."
(if sess-or-win
(concat (if (string-prefix-p "$" (car sess-or-win)) "-s ")
"-t "
(car sess-or-win))
(shell-quote-argument (car sess-or-win)))
"-a")))))
(cl-loop for line in (split-string lines "\n" t)
collect (let ((pane (split-string line ";")))

View file

@ -24,27 +24,31 @@
(use-package! solaire-mode
:when (or (daemonp) (display-graphic-p))
:defer t
:init
(add-hook! 'doom-load-theme-hook :append
(defun +doom-solaire-mode-swap-bg-maybe-h ()
(when (string-prefix-p "doom-" (symbol-name doom-theme))
(require 'solaire-mode)
(solaire-mode-swap-bg))))
:hook (doom-load-theme . solaire-global-mode)
:config
;; fringe can become unstyled when deleting or focusing frames
(add-hook 'focus-in-hook #'solaire-mode-reset)
;; Prevent color glitches when reloading either DOOM or loading a new theme
(add-hook! '(doom-load-theme-hook doom-reload-hook) :append
#'solaire-mode-reset)
(when (daemonp)
(add-hook! 'doom-switch-frame-hook
(defun +doom-disable-solaire-mode-maybe-h ()
(if (display-graphic-p)
(unless solaire-global-mode
(solaire-global-mode +1))
(when solaire-global-mode
(solaire-global-mode -1))))))
(add-hook! 'solaire-global-mode-hook
(defun +doom-solaire-swap-bg-faces-maybe-h ()
(and solaire-global-mode
(string-prefix-p "doom-" (symbol-name doom-theme))
(solaire-mode-swap-bg))))
;; org-capture takes an org buffer and narrows it. The result is erroneously
;; considered an unreal buffer, so solaire-mode must be restored.
(add-hook 'org-capture-mode-hook #'turn-on-solaire-mode)
;; On Emacs 26+, when point is on the last line and solaire-mode is remapping
;; the hl-line face, hl-line's highlight bleeds into the rest of the window
;; after eob. On Emacs 27 this no longer happens.
(unless EMACS27+
;; On Emacs <=26, when point is on the last line and solaire-mode is
;; remapping the hl-line face, hl-line's highlight bleeds into the rest of
;; the window after eob. On Emacs 27 this no longer happens.
(defun +doom--line-range-fn ()
(let ((bol (line-beginning-position))
(eol (line-end-position))
@ -57,21 +61,27 @@
(= eol pmax))
eol)
((line-beginning-position 2))))))
(setq hl-line-range-function #'+doom--line-range-fn))
(setq hl-line-range-function #'+doom--line-range-fn)
;; Because fringes can't be given a buffer-local face, they can look odd, so
;; we remove them in the minibuffer and which-key popups (they serve no
;; purpose there anyway).
(add-hook! 'solaire-mode-hook
(defun +doom-disable-fringes-in-minibuffer-h (&rest _)
(set-window-fringes (minibuffer-window) 0 0 nil)))
;; HACK The fringe cannot have a buffer-local remapping on Emacs <= 26, so
;; we jump through hoops to reset it (globally) whenever it is likely
;; that the fringe will have lost its background color.
;; Prevent color glitches when reloading either DOOM or loading a new theme
(add-hook! '(doom-load-theme-hook doom-reload-hook) :append
#'solaire-mode-reset)
(defadvice! +doom--no-fringes-in-which-key-buffer-a (&rest _)
:after 'which-key--show-buffer-side-window
(+doom-disable-fringes-in-minibuffer-h)
(set-window-fringes (get-buffer-window which-key--buffer) 0 0 nil))
;; fringe can become unstyled when deleting or focusing frames
(add-hook 'focus-in-hook #'solaire-mode-reset)
(add-hook! '(minibuffer-setup-hook window-configuration-change-hook)
#'+doom-disable-fringes-in-minibuffer-h)
(solaire-global-mode +1))
;; A global fringe color means the minibuffer (with its fringes) will always
;; stand out, so we remove them (in which-key popups too).
(add-hook! 'solaire-mode-hook
(defun +doom-disable-fringes-in-minibuffer-h (&rest _)
(set-window-fringes (minibuffer-window) 0 0 nil)))
(defadvice! +doom--no-fringes-in-which-key-buffer-a (&rest _)
:after 'which-key--show-buffer-side-window
(+doom-disable-fringes-in-minibuffer-h)
(set-window-fringes (get-buffer-window which-key--buffer) 0 0 nil))
(add-hook! '(minibuffer-setup-hook window-configuration-change-hook)
#'+doom-disable-fringes-in-minibuffer-h)))

View file

@ -2,4 +2,4 @@
;;; ui/doom/packages.el
(package! doom-themes :pin "8d5ddbbb72")
(package! solaire-mode :pin "4ac324ccb0")
(package! solaire-mode :pin "adc8c0c60d")

View file

@ -1,4 +1,4 @@
;; -*- no-byte-compile: t; -*-
;;; ui/fill-column/packages.el
(package! hl-fill-column :pin "612441e697")
(package! hl-fill-column :pin "43cb3c35a9")

View file

@ -1,4 +1,4 @@
;; -*- no-byte-compile: t; -*-
;;; ui/indent-guides/packages.el
(package! highlight-indent-guides :pin "0b10f38c54")
(package! highlight-indent-guides :pin "1b12c7b440")

View file

@ -1,15 +1,5 @@
;;; ui/modeline/autoload/modeline.el -*- lexical-binding: t; -*-
;;;###autodef
(defalias 'def-modeline-format! #'doom-modeline-def-modeline)
;;;###autodef
(defalias 'def-modeline-segment! #'doom-modeline-def-segment)
;;;###autodef
(defalias 'set-modeline! #'doom-modeline-set-modeline)
(defvar +modeline--old-bar-height nil)
;;;###autoload
(defun +modeline-resize-for-font-h ()
@ -31,14 +21,16 @@ Meant for `doom-change-font-size-hook'."
"Update version strings in all buffers."
(dolist (window (window-list))
(with-selected-window window
(doom-modeline-update-env)
(when (fboundp 'doom-modeline-update-env)
(doom-modeline-update-env))
(force-mode-line-update))))
;;;###autoload
(defun +modeline-clear-env-in-all-windows-h (&rest _)
"Blank out version strings in all buffers."
(dolist (buffer (buffer-list))
(with-current-buffer buffer
(setq doom-modeline-env--version
(bound-and-true-p doom-modeline-load-string))))
(unless (featurep! +light)
(dolist (buffer (buffer-list))
(with-current-buffer buffer
(setq doom-modeline-env--version
(bound-and-true-p doom-modeline-load-string)))))
(force-mode-line-update t))

View file

@ -2,7 +2,7 @@
;;; ui/modeline/packages.el
(unless (featurep! +light)
(package! doom-modeline :pin "b44955841a"))
(package! doom-modeline :pin "c177959bbf"))
(package! anzu :pin "3e34fb3df5")
(when (featurep! :editor evil)
(package! evil-anzu :pin "9bca6ca14d"))

View file

@ -5,6 +5,10 @@
org-find-file org-find-file-at-mouse)
"A list of commands that should not trigger nav-flash.")
;;
;;; Packages
(use-package! nav-flash
:defer t
:init
@ -30,4 +34,8 @@
(advice-add #'evil-window-bottom :after #'+nav-flash-blink-cursor-a)
;; Bound to `ga' for evil users
(advice-add #'what-cursor-position :after #'+nav-flash-blink-cursor-a))
(advice-add #'what-cursor-position :after #'+nav-flash-blink-cursor-a)
:config
(when (fboundp 'set-face-extend)
(set-face-extend 'nav-flash-face t)))

View file

@ -1,7 +1,8 @@
;; -*- no-byte-compile: t; -*-
;;; ui/treemacs/packages.el
(package! treemacs :pin "1b82dacc57")
(package! treemacs :pin "ee1b523b28")
;; These packages have no :pin because they're in the same repo
(when (featurep! :editor evil +everywhere)
(package! treemacs-evil))
(package! treemacs-projectile)

View file

@ -48,6 +48,7 @@
'org-todo-keyword-kill
'org-todo-keyword-outd
'org-todo
'org-done
'org-indent
'font-lock-comment-face
'line-number