Merge branch 'develop' into eshell-improvements
This commit is contained in:
commit
73de701073
112 changed files with 1431 additions and 978 deletions
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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 ()
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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)))
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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))
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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))
|
||||
|
||||
|
||||
;;
|
||||
|
|
|
@ -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"))
|
||||
|
||||
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
;;; lang/assembly/autoload.el -*- lexical-binding: t; -*-
|
||||
|
||||
;;;###autoload
|
||||
(add-to-list 'auto-mode-alist '("\\.hax\\'" . haxor-mode))
|
|
@ -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")
|
|
@ -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
|
||||
|
|
|
@ -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"))
|
||||
|
|
|
@ -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"))
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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"))
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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"))
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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]]
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"))
|
||||
|
|
|
@ -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")
|
||||
|
|
40
modules/lang/json/README.org
Normal file
40
modules/lang/json/README.org
Normal 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.
|
14
modules/lang/json/config.el
Normal file
14
modules/lang/json/config.el
Normal 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))
|
5
modules/lang/json/packages.el
Normal file
5
modules/lang/json/packages.el
Normal file
|
@ -0,0 +1,5 @@
|
|||
;; -*- no-byte-compile: t; -*-
|
||||
;;; lang/json/packages.el
|
||||
|
||||
(package! json-mode :pin "0e819e519a")
|
||||
(package! json-snatcher :pin "c4cecc0a50")
|
|
@ -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))
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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))))))
|
||||
|
|
|
@ -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)))))
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)))))))
|
||||
|
|
|
@ -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))))
|
||||
|
|
14
modules/lang/org/contrib/noter.el
Normal file
14
modules/lang/org/contrib/noter.el
Normal 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)))
|
|
@ -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
|
||||
|
|
|
@ -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"))
|
||||
|
|
|
@ -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]]
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.")))
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
;; -*- no-byte-compile: t; -*-
|
||||
;;; lang/racket/packages.el
|
||||
|
||||
(package! racket-mode :pin "bd4c8cf3ce")
|
||||
(package! racket-mode :pin "202cc1b784")
|
||||
|
|
|
@ -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."
|
||||
|
|
|
@ -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)))
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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))
|
||||
|
||||
|
||||
;;
|
||||
|
|
38
modules/lang/yaml/README.org
Normal file
38
modules/lang/yaml/README.org
Normal 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.
|
9
modules/lang/yaml/config.el
Normal file
9
modules/lang/yaml/config.el
Normal 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))
|
4
modules/lang/yaml/packages.el
Normal file
4
modules/lang/yaml/packages.el
Normal file
|
@ -0,0 +1,4 @@
|
|||
;; -*- no-byte-compile: t; -*-
|
||||
;;; lang/yaml/packages.el
|
||||
|
||||
(package! yaml-mode :pin "cecf4b106b")
|
|
@ -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))
|
||||
|
|
|
@ -48,7 +48,7 @@ You should use `set-eshell-alias!' to change this.")
|
|||
|
||||
|
||||
;;
|
||||
;; Packages
|
||||
;;; Packages
|
||||
|
||||
(after! eshell ; built-in
|
||||
(setq eshell-banner-message
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)))))
|
||||
|
|
|
@ -3,4 +3,4 @@
|
|||
|
||||
(package! vterm
|
||||
:built-in 'prefer
|
||||
:pin "996c535b9c")
|
||||
:pin "aa512b8351")
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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"))
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
;; -*- no-byte-compile: t; -*-
|
||||
;;; tools/ein/packages.el
|
||||
|
||||
(package! ein :pin "c0147f63c7")
|
||||
(package! ein :pin "1322d8c7f8")
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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))))
|
||||
|
||||
|
||||
;;
|
||||
|
|
|
@ -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"))))
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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"))
|
||||
|
|
60
modules/tools/magit/README.org
Normal file
60
modules/tools/magit/README.org
Normal 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.
|
|
@ -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"
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 ";")))
|
||||
|
|
|
@ -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)))
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
;;; ui/doom/packages.el
|
||||
|
||||
(package! doom-themes :pin "8d5ddbbb72")
|
||||
(package! solaire-mode :pin "4ac324ccb0")
|
||||
(package! solaire-mode :pin "adc8c0c60d")
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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"))
|
||||
|
|
|
@ -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)))
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -48,6 +48,7 @@
|
|||
'org-todo-keyword-kill
|
||||
'org-todo-keyword-outd
|
||||
'org-todo
|
||||
'org-done
|
||||
'org-indent
|
||||
'font-lock-comment-face
|
||||
'line-number
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue