Merge remote-tracking branch 'upstream/develop' into develop
merge upsteam
This commit is contained in:
commit
d5d241b36e
125 changed files with 1272 additions and 879 deletions
14
.github/workflows/lock.yml
vendored
Normal file
14
.github/workflows/lock.yml
vendored
Normal file
|
@ -0,0 +1,14 @@
|
|||
name: 'Lock Threads'
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 * * * *'
|
||||
|
||||
jobs:
|
||||
lock:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: dessant/lock-threads@v2
|
||||
with:
|
||||
github-token: ${{ github.token }}
|
||||
issue-lock-inactive-days: '180'
|
4
.github/workflows/test.yml
vendored
4
.github/workflows/test.yml
vendored
|
@ -3,20 +3,20 @@ name: CI
|
|||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- develop
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
- develop
|
||||
|
||||
jobs:
|
||||
build:
|
||||
if: false
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
emacs_version:
|
||||
- 26.3
|
||||
- 27.1
|
||||
include:
|
||||
- emacs_version: 26.3
|
||||
lint_ignore: 1
|
||||
|
|
2
LICENSE
2
LICENSE
|
@ -1,6 +1,6 @@
|
|||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2016-2020 Henrik Lissner.
|
||||
Copyright (c) 2016-2021 Henrik Lissner.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
|
|
4
bin/doom
4
bin/doom
|
@ -3,7 +3,7 @@
|
|||
:; case "$EMACS" in *term*) EMACS=emacs ;; *) EMACS="${EMACS:-emacs}" ;; esac
|
||||
:; $EMACS --version >/dev/null 2>&1 || { >&2 echo "Can't find emacs in your PATH"; exit 1; }
|
||||
:; $EMACS --no-site-file --script "$0" -- "$@" || __DOOMCODE=$?
|
||||
:; [ "${__DOOMCODE:-0}" -eq 128 ] && { "`$EMACS -Q --batch --eval '(princ temporary-file-directory)'`/doom.sh" "$0" "$@" && true; __DOOMCODE=$?; }
|
||||
:; [ "${__DOOMCODE:-0}" -eq 128 ] && { sh "`$EMACS -Q --batch --eval '(princ temporary-file-directory)'`/doom.sh" "$0" "$@" && true; __DOOMCODE=$?; }
|
||||
:; exit $__DOOMCODE
|
||||
|
||||
;; The garbage collector isn't as important during CLI ops. A higher threshold
|
||||
|
@ -125,7 +125,7 @@
|
|||
(shell-quote-argument (match-string 2 env)))))
|
||||
(format "PATH=\"%s%s$PATH\" \\\n" (concat doom-emacs-dir "bin/") path-separator)
|
||||
"_postscript $@\n"))
|
||||
(set-file-modes script #o700))
|
||||
(set-file-modes script #o600))
|
||||
;; Error code 128 is special: it means run the post-script after this
|
||||
;; session ends.
|
||||
128)
|
||||
|
|
|
@ -113,7 +113,7 @@ ready to be pasted in a bug report on github."
|
|||
(letf! ((defun sh (&rest args) (cdr (apply #'doom-call-process args)))
|
||||
(defun abbrev-path (path)
|
||||
(replace-regexp-in-string
|
||||
(regexp-quote (user-login-name)) "$USER"
|
||||
(concat "\\<" (regexp-quote (user-login-name)) "\\>") "$USER"
|
||||
(abbreviate-file-name path))))
|
||||
`((system
|
||||
(type . ,system-type)
|
||||
|
|
|
@ -351,13 +351,15 @@ module derived from a `featurep!' or `require!' call, c) the module that the
|
|||
current file is in, or d) the module associated with the current major mode (see
|
||||
`doom--help-major-mode-module-alist')."
|
||||
(interactive
|
||||
(nconc
|
||||
(mapcar #'intern
|
||||
(split-string
|
||||
(completing-read "Describe module: "
|
||||
(doom--help-modules-list)
|
||||
nil t nil nil
|
||||
(doom--help-current-module-str))
|
||||
" " t)))
|
||||
" " t))
|
||||
(list current-prefix-arg)))
|
||||
(cl-check-type category symbol)
|
||||
(cl-check-type module symbol)
|
||||
(cl-destructuring-bind (module-string path)
|
||||
|
@ -377,29 +379,58 @@ current file is in, or d) the module associated with the current major mode (see
|
|||
(doom-project-browse (file-name-directory path)))
|
||||
((user-error "Aborted module lookup")))))
|
||||
|
||||
;;;###autoload
|
||||
(defun doom/help-custom-variable (var)
|
||||
"Look up documentation for a custom variable.
|
||||
|
||||
Unlike `helpful-variable', which casts a wider net that includes internal
|
||||
variables, this only lists variables that exist to be customized (defined with
|
||||
`defcustom')."
|
||||
(interactive
|
||||
(list (helpful--read-symbol
|
||||
"Custom variable: "
|
||||
(helpful--variable-at-point)
|
||||
(lambda (sym)
|
||||
(and (helpful--variable-p sym)
|
||||
(custom-variable-p sym)
|
||||
;; Exclude minor mode state variables, which aren't meant to be
|
||||
;; modified directly, but through their associated function.
|
||||
(not (or (and (string-suffix-p "-mode" (symbol-name sym))
|
||||
(fboundp sym))
|
||||
(eq (get sym 'custom-set) 'custom-set-minor-mode))))))))
|
||||
(helpful-variable var))
|
||||
|
||||
|
||||
;;
|
||||
;;; `doom/help-packages'
|
||||
|
||||
(defun doom--help-package-insert-button (label path &optional regexp)
|
||||
(declare (indent defun))
|
||||
(defun doom--help-insert-button (label &optional path)
|
||||
(cl-destructuring-bind (uri . qs)
|
||||
(let ((parts (split-string label "::" t)))
|
||||
(cons (string-trim (car parts))
|
||||
(string-join (cdr parts) "::")))
|
||||
(let ((path (or path label)))
|
||||
(insert-text-button
|
||||
(string-trim label)
|
||||
uri
|
||||
'face 'link
|
||||
'follow-link t
|
||||
'action
|
||||
`(lambda (_)
|
||||
(unless (file-exists-p ,path)
|
||||
(user-error "Module doesn't exist"))
|
||||
(lambda (_)
|
||||
(when (window-dedicated-p)
|
||||
(other-window 1))
|
||||
(let ((buffer (find-file ,path)))
|
||||
(when ,(stringp regexp)
|
||||
(pcase (cond ((string-match-p "^https?://" qs) 'url)
|
||||
('file))
|
||||
((or `file `nil)
|
||||
(unless (file-exists-p path)
|
||||
(user-error "Path does not exist: %S" path))
|
||||
(let ((buffer (or (get-file-buffer path)
|
||||
(find-file path))))
|
||||
(when qs
|
||||
(with-current-buffer buffer
|
||||
(goto-char (point-min))
|
||||
(if (re-search-forward ,regexp nil t)
|
||||
(recenter)
|
||||
(message "Couldn't find the config block"))))))))
|
||||
(re-search-forward qs)
|
||||
(recenter)))))
|
||||
(`url (browse-url uri))))))))
|
||||
|
||||
(defun doom--help-package-configs (package)
|
||||
(let ((default-directory doom-emacs-dir))
|
||||
|
@ -413,6 +444,7 @@ current file is in, or d) the module associated with the current major mode (see
|
|||
":(exclude)*.org"))
|
||||
"\n" t)))
|
||||
|
||||
(defvar doom--help-packages-list nil)
|
||||
;;;###autoload
|
||||
(defun doom/help-packages (package)
|
||||
"Like `describe-package', but for packages installed by Doom modules.
|
||||
|
@ -427,12 +459,18 @@ If prefix arg is present, refresh the cache."
|
|||
(require 'finder-inf nil t)
|
||||
(require 'package)
|
||||
(require 'straight)
|
||||
(let ((packages (delete-dups
|
||||
(let ((packages
|
||||
(if (and doom--help-packages-list (null current-prefix-arg))
|
||||
doom--help-packages-list
|
||||
(message "Generating packages list for the first time...")
|
||||
(sit-for 0.1)
|
||||
(setq doom--help-packages-list
|
||||
(delete-dups
|
||||
(append (mapcar #'car package-alist)
|
||||
(mapcar #'car package--builtins)
|
||||
(mapcar #'intern (hash-table-keys straight--build-cache))
|
||||
(mapcar #'car (doom-package-list 'all))
|
||||
nil))))
|
||||
nil))))))
|
||||
(unless (memq guess packages)
|
||||
(setq guess nil))
|
||||
(list
|
||||
|
@ -440,9 +478,10 @@ If prefix arg is present, refresh the cache."
|
|||
(completing-read (if guess
|
||||
(format "Select Doom package to search for (default %s): "
|
||||
guess)
|
||||
"Describe Doom package: ")
|
||||
(format "Describe Doom package (%d): " (length packages)))
|
||||
packages nil t nil nil
|
||||
(if guess (symbol-name guess))))))))
|
||||
;; TODO Refactor me.
|
||||
(require 'core-packages)
|
||||
(doom-initialize-packages)
|
||||
(if (or (package-desc-p package)
|
||||
|
@ -477,20 +516,38 @@ If prefix arg is present, refresh the cache."
|
|||
"unpinned")
|
||||
"\n")
|
||||
(package--print-help-section "Build")
|
||||
(insert (let ((default-directory (straight--repos-dir (symbol-name package))))
|
||||
(cdr
|
||||
(doom-call-process "git" "log" "-1" "--format=%D %h %ci")))
|
||||
"\n")
|
||||
(let ((default-directory (straight--repos-dir (symbol-name package))))
|
||||
(insert (cdr (doom-call-process "git" "log" "-1" "--format=%D %h %ci"))
|
||||
"\n" indent))
|
||||
(package--print-help-section "Build location")
|
||||
(let ((build-dir (straight--build-dir (symbol-name package))))
|
||||
(if (file-exists-p build-dir)
|
||||
(doom--help-insert-button (abbreviate-file-name build-dir))
|
||||
(insert "n/a")))
|
||||
(insert "\n" indent)
|
||||
(package--print-help-section "Repo location")
|
||||
(let ((repo-dir (straight--repos-dir (symbol-name package))))
|
||||
(if (file-exists-p repo-dir)
|
||||
(doom--help-insert-button (abbreviate-file-name repo-dir))
|
||||
(insert "n/a"))
|
||||
(insert "\n"))
|
||||
(let ((recipe (doom-package-build-recipe package)))
|
||||
(insert (format! "%s\n"
|
||||
(indent 13
|
||||
(string-trim (pp-to-string recipe)))))
|
||||
|
||||
(package--print-help-section "Recipe")
|
||||
(insert (format "%s\n" (string-trim (pp-to-string recipe))))
|
||||
(package--print-help-section "Homepage")
|
||||
(insert (doom--package-url package))))
|
||||
(`elpa (insert "[M]ELPA " (doom--package-url package)))
|
||||
(`builtin (insert "Built-in"))
|
||||
(`other (insert
|
||||
(doom--help-insert-button (doom--package-url package))))
|
||||
(`elpa (insert "[M]ELPA ")
|
||||
(doom--help-insert-button (doom--package-url package))
|
||||
(package--print-help-section "Location")
|
||||
(doom--help-insert-button
|
||||
(abbreviate-file-name
|
||||
(file-name-directory (locate-library (symbol-name package))))))
|
||||
(`builtin (insert "Built-in\n")
|
||||
(package--print-help-section "Location")
|
||||
(doom--help-insert-button
|
||||
(abbreviate-file-name
|
||||
(file-name-directory (locate-library (symbol-name package))))))
|
||||
(`other (doom--help-insert-button
|
||||
(abbreviate-file-name
|
||||
(or (symbol-file package)
|
||||
(locate-library (symbol-name package))))))
|
||||
|
@ -506,14 +563,22 @@ If prefix arg is present, refresh the cache."
|
|||
(package--print-help-section "Modules")
|
||||
(insert "Declared by the following Doom modules:\n")
|
||||
(dolist (m modules)
|
||||
(insert indent)
|
||||
(doom--help-package-insert-button
|
||||
(format "%s %s" (car m) (or (cdr m) ""))
|
||||
(pcase (car m)
|
||||
(let* ((module-path (pcase (car m)
|
||||
(:core doom-core-dir)
|
||||
(:private doom-private-dir)
|
||||
(category (doom-module-path category (cdr m)))))
|
||||
(insert "\n")))
|
||||
(readme-path (expand-file-name "README.org" module-path)))
|
||||
(insert indent)
|
||||
(doom--help-insert-button
|
||||
(format "%s %s" (car m) (or (cdr m) ""))
|
||||
module-path)
|
||||
(insert " (")
|
||||
(if (file-exists-p readme-path)
|
||||
(doom--help-insert-button
|
||||
"readme"
|
||||
readme-path)
|
||||
(insert "no readme"))
|
||||
(insert ")\n"))))
|
||||
|
||||
(package--print-help-section "Configs")
|
||||
(insert "This package is configured in the following locations:")
|
||||
|
@ -582,7 +647,9 @@ If prefix arg is present, refresh the cache."
|
|||
(format "%s.el" package))))
|
||||
(_ (plist-get plist :url))))))
|
||||
((and (require 'package nil t)
|
||||
(or package-archive-contents (doom-refresh-packages-maybe))
|
||||
(or package-archive-contents
|
||||
(progn (package-refresh-contents)
|
||||
package-archive-contents))
|
||||
(pcase (package-desc-archive (cadr (assq package package-archive-contents)))
|
||||
("org" "https://orgmode.org")
|
||||
((or "melpa" "melpa-mirror")
|
||||
|
|
|
@ -13,18 +13,24 @@
|
|||
;;
|
||||
;;; Bump commands
|
||||
|
||||
(defun doom--package-full-recipe (package plist)
|
||||
(defun doom--package-merge-recipes (package plist)
|
||||
(require 'straight)
|
||||
(doom-plist-merge
|
||||
(plist-get plist :recipe)
|
||||
(or (cdr (straight-recipes-retrieve package))
|
||||
(plist-get (cdr (assq package doom-packages))
|
||||
:recipe))))
|
||||
(if-let (recipe (straight-recipes-retrieve package))
|
||||
(cdr (if (memq (car recipe) '(quote \`))
|
||||
(eval recipe t)
|
||||
recipe))
|
||||
(let ((recipe (plist-get (cdr (assq package doom-packages))
|
||||
:recipe)))
|
||||
(if (keywordp (car recipe))
|
||||
recipe
|
||||
(cdr recipe))))))
|
||||
|
||||
(defun doom--package-to-bump-string (package plist)
|
||||
"Return a PACKAGE and its PLIST in 'username/repo@commit' format."
|
||||
(format "%s@%s"
|
||||
(plist-get (doom--package-full-recipe package plist) :repo)
|
||||
(plist-get (doom--package-merge-recipes package plist) :repo)
|
||||
(substring-no-properties (plist-get plist :pin) 0 7)))
|
||||
|
||||
(defun doom--package-at-point (&optional point)
|
||||
|
@ -78,7 +84,7 @@ Grabs the latest commit id of the package using 'git'."
|
|||
(cl-destructuring-bind (&key package plist beg end)
|
||||
(or (doom--package-at-point)
|
||||
(user-error "Not on a `package!' call"))
|
||||
(let* ((recipe (doom--package-full-recipe package plist))
|
||||
(let* ((recipe (doom--package-merge-recipes package plist))
|
||||
(branch (plist-get recipe :branch))
|
||||
(oldid (or (plist-get plist :pin)
|
||||
(doom-package-get package :pin)))
|
||||
|
@ -177,8 +183,8 @@ each package."
|
|||
(defun doom/bump-package (package)
|
||||
"Bump PACKAGE in all modules that install it."
|
||||
(interactive
|
||||
(list (completing-read "Bump package: "
|
||||
(mapcar #'car (doom-package-list 'all)))))
|
||||
(list (intern (completing-read "Bump package: "
|
||||
(mapcar #'car (doom-package-list 'all))))))
|
||||
(let* ((packages (doom-package-list 'all))
|
||||
(modules (plist-get (alist-get package packages) :modules)))
|
||||
(unless modules
|
||||
|
|
|
@ -251,7 +251,7 @@ the value of `indent-tab-mode'.
|
|||
|
||||
If ARG (universal argument) is non-nil, retab the current buffer using the
|
||||
opposite indentation style."
|
||||
(interactive "Pr")
|
||||
(interactive "P\nr")
|
||||
(unless (and beg end)
|
||||
(setq beg (point-min)
|
||||
end (point-max)))
|
||||
|
|
|
@ -127,48 +127,16 @@ Activate again to undo this. If prefix ARG is non-nil, don't restore the last
|
|||
window configuration and re-maximize the current window. Alternatively, use
|
||||
`doom/window-enlargen'."
|
||||
(interactive "P")
|
||||
(let ((param 'doom--maximize-last-wconf))
|
||||
(cl-destructuring-bind (window . wconf)
|
||||
(or (frame-parameter nil param)
|
||||
(cons nil nil))
|
||||
(set-frame-parameter
|
||||
nil param
|
||||
(if (and (equal window (selected-window))
|
||||
(not arg)
|
||||
(null (cdr (cl-remove-if #'window-dedicated-p (window-list))))
|
||||
wconf)
|
||||
(ignore
|
||||
(let ((source-window (selected-window)))
|
||||
(set-window-configuration wconf)
|
||||
(when (window-live-p source-window)
|
||||
(select-window source-window))))
|
||||
(when (and (bound-and-true-p +popup-mode)
|
||||
(+popup-window-p))
|
||||
(user-error "Cannot maximize a popup, use `+popup/raise' first or use `doom/window-enlargen' instead"))
|
||||
(prog1 (cons (selected-window) (or wconf (current-window-configuration)))
|
||||
(delete-other-windows)
|
||||
(add-hook 'doom-switch-window-hook #'doom--enlargened-forget-last-wconf-h)))))))
|
||||
(+popup/raise (selected-window)))
|
||||
(delete-other-windows))
|
||||
|
||||
;;;###autoload
|
||||
(defun doom/window-enlargen (&optional arg)
|
||||
"Enlargen the current window to focus on this one. Does not close other
|
||||
windows (unlike `doom/window-maximize-buffer'). Activate again to undo."
|
||||
(interactive "P")
|
||||
(let ((param 'doom--enlargen-last-wconf))
|
||||
(cl-destructuring-bind (window . wconf)
|
||||
(or (frame-parameter nil param)
|
||||
(cons nil nil))
|
||||
(set-frame-parameter
|
||||
nil param
|
||||
(if (and (equal window (selected-window))
|
||||
(not arg)
|
||||
wconf)
|
||||
(ignore
|
||||
(let ((source-window (selected-window)))
|
||||
(set-window-configuration wconf)
|
||||
(when (window-live-p source-window)
|
||||
(select-window source-window))))
|
||||
(prog1 (cons (selected-window) (or wconf (current-window-configuration)))
|
||||
(let* ((window (selected-window))
|
||||
(dedicated-p (window-dedicated-p window))
|
||||
(preserved-p (window-parameter window 'window-preserved-size))
|
||||
|
@ -184,8 +152,7 @@ windows (unlike `doom/window-maximize-buffer'). Activate again to undo."
|
|||
(maximize-window window))
|
||||
(set-window-dedicated-p window dedicated-p)
|
||||
(when preserved-p
|
||||
(set-window-parameter window 'window-preserved-size preserved-p))
|
||||
(add-hook 'doom-switch-window-hook #'doom--enlargened-forget-last-wconf-h)))))))))
|
||||
(set-window-parameter window 'window-preserved-size preserved-p)))))
|
||||
|
||||
;;;###autoload
|
||||
(defun doom/window-maximize-horizontally ()
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
;;; core/cli/autoloads.el -*- lexical-binding: t; -*-
|
||||
|
||||
(defvar doom-autoloads-excluded-packages '("gh")
|
||||
"What packages whose autoloads file we won't index.
|
||||
(defvar doom-autoloads-excluded-packages ()
|
||||
"What packages whose autoloads files we won't index.
|
||||
|
||||
These packages have silly or destructive autoload files that try to load
|
||||
everyone in the universe and their dog, causing errors that make babies cry. No
|
||||
|
@ -10,7 +10,7 @@ one wants that.")
|
|||
(defvar doom-autoloads-cached-vars
|
||||
'(doom-modules
|
||||
doom-disabled-packages
|
||||
comp-deferred-compilation-black-list
|
||||
comp-deferred-compilation-deny-list
|
||||
load-path
|
||||
auto-mode-alist
|
||||
interpreter-mode-alist
|
||||
|
|
|
@ -48,9 +48,15 @@ in."
|
|||
|
||||
;; REVIEW Refactor me
|
||||
(print! (start "Checking your Emacs version..."))
|
||||
(when EMACS28+
|
||||
(warn! "Emacs %s detected. Doom doesn't support Emacs 28/HEAD. It is unstable and may cause errors."
|
||||
(cond
|
||||
(EMACS28+
|
||||
(warn! (concat "Emacs %s detected. Doom should support this version, but be prepared for "
|
||||
"Emacs updates causing breakages.")
|
||||
emacs-version))
|
||||
((= emacs-major-version 26)
|
||||
(warn! (concat "Emacs %s detected. Doom is dropping Emacs 26.x support very soon. Consider "
|
||||
"upgrading to Emacs 27.x.")
|
||||
emacs-version)))
|
||||
|
||||
(print! (start "Checking for Emacs config conflicts..."))
|
||||
(when (file-exists-p "~/.emacs")
|
||||
|
@ -86,6 +92,19 @@ in."
|
|||
(print! (start "Checking for stale elc files..."))
|
||||
(elc-check-dir user-emacs-directory)
|
||||
|
||||
(print! (start "Checking for problematic git global settings..."))
|
||||
(if (executable-find "git")
|
||||
(when (zerop (car (doom-call-process "git" "config" "--global" "--get-regexp" "^url\\.git://github\\.com")))
|
||||
(warn! "Detected insteadOf rules in your global gitconfig.")
|
||||
(explain! "Doom's package manager heavily relies on git. In particular, many of its packages "
|
||||
"are hosted on github. Rewrite rules like these will break it:\n\n"
|
||||
" [url \"git://github.com\"]\n"
|
||||
" insteadOf = https://github.com\n\n"
|
||||
"Please remove them from your gitconfig or use a conditional includeIf rule to "
|
||||
"only apply your rewrites to specific repositories. See "
|
||||
"'https://git-scm.com/docs/git-config#_includes' for more information."))
|
||||
(error! "Couldn't find the `git' binary; this a hard dependecy for Doom!"))
|
||||
|
||||
(print! (start "Checking Doom Emacs..."))
|
||||
(condition-case-unless-debug ex
|
||||
(print-group!
|
||||
|
|
|
@ -92,7 +92,7 @@ default, on Linux, this is '$SHELL -ic /usr/bin/env'. Variables in
|
|||
(process-environment doom--initial-process-environment))
|
||||
(when (or force-p (not (file-exists-p env-file)))
|
||||
(with-temp-file env-file
|
||||
(setq-local coding-system-for-write 'utf-8)
|
||||
(setq-local coding-system-for-write 'utf-8-unix)
|
||||
(print! (start "%s envvars file at %S")
|
||||
(if (file-exists-p env-file)
|
||||
"Regenerating"
|
||||
|
@ -104,7 +104,7 @@ default, on Linux, this is '$SHELL -ic /usr/bin/env'. Variables in
|
|||
(goto-char (point-min))
|
||||
(insert
|
||||
(concat
|
||||
"# -*- mode: sh -*-\n"
|
||||
"# -*- mode: sh; coding: utf-8-unix -*-\n"
|
||||
"# ---------------------------------------------------------------------------\n"
|
||||
"# This file was auto-generated by `doom env'. It contains a list of environment\n"
|
||||
"# variables scraped from your default shell (excluding variables blacklisted\n"
|
||||
|
|
|
@ -24,7 +24,8 @@ Emacs (as byte-code is generally not forward-compatible)."
|
|||
((nobuilds-p ["-b" "--no-builds"] "Don't purge unneeded (built) packages")
|
||||
(noelpa-p ["-p" "--no-elpa"] "Don't purge ELPA packages")
|
||||
(norepos-p ["-r" "--no-repos"] "Don't purge unused straight repos")
|
||||
(regraft-p ["-g" "--regraft"] "Regraft git repos (ie. compact them)"))
|
||||
(noeln-p ["-e" "--no-eln"] "Don't purge old ELN bytecode")
|
||||
(noregraft-p ["-g" "--no-regraft"] "Regraft git repos (ie. compact them)"))
|
||||
"Deletes orphaned packages & repos, and compacts them.
|
||||
|
||||
Purges all installed ELPA packages (as they are considered temporary). Purges
|
||||
|
@ -39,7 +40,8 @@ list remains lean."
|
|||
(not noelpa-p)
|
||||
(not norepos-p)
|
||||
(not nobuilds-p)
|
||||
regraft-p)
|
||||
(not noregraft-p)
|
||||
(not noeln-p))
|
||||
(doom-autoloads-reload))
|
||||
t)
|
||||
|
||||
|
@ -232,46 +234,11 @@ list remains lean."
|
|||
(doom-log "Compiling %s" file)
|
||||
(native-compile-async file))))
|
||||
|
||||
(defun doom--bootstrap-trampolines ()
|
||||
"Build the trampolines we need to prevent hanging."
|
||||
(when (featurep 'comp)
|
||||
;; HACK The following list was obtained by running 'doom build', waiting for
|
||||
;; it to hang, then checking the eln-cache for trampolines. We
|
||||
;; simulate running 'doom build' twice by compiling the trampolines
|
||||
;; then restarting.
|
||||
(let (restart)
|
||||
(dolist (f '(abort-recursive-edit
|
||||
describe-buffer-bindings
|
||||
execute-kbd-macro
|
||||
handle-switch-frame
|
||||
load
|
||||
make-indirect-buffer
|
||||
make-process
|
||||
message
|
||||
read-char
|
||||
read-key-sequence
|
||||
select-window
|
||||
set-window-buffer
|
||||
top-level
|
||||
use-global-map
|
||||
use-local-map
|
||||
write-region))
|
||||
(unless (doom--find-eln-file
|
||||
(concat comp-native-version-dir "/"
|
||||
(comp-trampoline-filename f)))
|
||||
(print! (info "Compiling trampoline for %s") f)
|
||||
(comp-trampoline-compile f)
|
||||
(setq restart t)))
|
||||
(when restart
|
||||
(throw 'exit :restart)))))
|
||||
|
||||
|
||||
(defun doom-cli-packages-install ()
|
||||
"Installs missing packages.
|
||||
|
||||
This function will install any primary package (i.e. a package with a `package!'
|
||||
declaration) or dependency thereof that hasn't already been."
|
||||
(doom--bootstrap-trampolines)
|
||||
(doom-initialize-packages)
|
||||
(print! (start "Installing packages..."))
|
||||
(let ((pinned (doom-package-pinned-list)))
|
||||
|
@ -311,7 +278,6 @@ declaration) or dependency thereof that hasn't already been."
|
|||
|
||||
(defun doom-cli-packages-build (&optional force-p)
|
||||
"(Re)build all packages."
|
||||
(doom--bootstrap-trampolines)
|
||||
(doom-initialize-packages)
|
||||
(print! (start "(Re)building %spackages...") (if force-p "all " ""))
|
||||
(print-group!
|
||||
|
@ -335,19 +301,31 @@ declaration) or dependency thereof that hasn't already been."
|
|||
(doom--with-package-recipes recipes (package local-repo recipe)
|
||||
(unless force-p
|
||||
;; Ensure packages with outdated files/bytecode are rebuilt
|
||||
(let ((build-dir (straight--build-dir package))
|
||||
(repo-dir (straight--repos-dir local-repo)))
|
||||
(and (not (plist-get recipe :no-build))
|
||||
(let* ((build-dir (straight--build-dir package))
|
||||
(repo-dir (straight--repos-dir local-repo))
|
||||
(build (if (plist-member recipe :build)
|
||||
(plist-get recipe :build)
|
||||
t))
|
||||
(want-byte-compile
|
||||
(or (eq build t)
|
||||
(memq 'compile build)))
|
||||
(want-native-compile
|
||||
(or (eq build t)
|
||||
(memq 'native-compile build))))
|
||||
(when (eq (car-safe build) :not)
|
||||
(setq want-byte-compile (not want-byte-compile)
|
||||
want-native-compile (not want-native-compile)))
|
||||
(unless (require 'comp nil t)
|
||||
(setq want-native-compile nil))
|
||||
(and (or want-byte-compile want-native-compile)
|
||||
(or (file-newer-than-file-p repo-dir build-dir)
|
||||
(file-exists-p (straight--modified-dir (or local-repo package)))
|
||||
(cl-loop with want-byte = (straight--byte-compile-package-p recipe)
|
||||
with want-native = (if (require 'comp nil t) (straight--native-compile-package-p recipe))
|
||||
with outdated = nil
|
||||
(cl-loop with outdated = nil
|
||||
for file in (doom-files-in build-dir :match "\\.el$" :full t)
|
||||
if (or (if want-byte (doom--elc-file-outdated-p file))
|
||||
(if want-native (doom--eln-file-outdated-p file)))
|
||||
if (or (if want-byte-compile (doom--elc-file-outdated-p file))
|
||||
(if want-native-compile (doom--eln-file-outdated-p file)))
|
||||
do (setq outdated t)
|
||||
(when want-native
|
||||
(when want-native-compile
|
||||
(push file doom--eln-output-expected))
|
||||
finally return outdated))
|
||||
(puthash package t straight--packages-to-rebuild))))
|
||||
|
@ -357,7 +335,7 @@ declaration) or dependency thereof that hasn't already been."
|
|||
(doom--wait-for-compile-jobs)
|
||||
(doom--write-missing-eln-errors)
|
||||
(print! (success "\033[KRebuilt %d package(s)") (length built)))
|
||||
(print! (success "No packages need rebuilding"))
|
||||
(print! (info "No packages need rebuilding"))
|
||||
nil))))
|
||||
|
||||
|
||||
|
@ -556,7 +534,23 @@ declaration) or dependency thereof that hasn't already been."
|
|||
(filename path)
|
||||
e)))))))
|
||||
|
||||
(defun doom-cli-packages-purge (&optional elpa-p builds-p repos-p regraft-repos-p)
|
||||
(defun doom--cli-packages-purge-eln ()
|
||||
(if-let (dirs
|
||||
(cl-delete (expand-file-name comp-native-version-dir doom--eln-output-path)
|
||||
(directory-files doom--eln-output-path t "^[^.]" t)
|
||||
:test #'file-equal-p))
|
||||
(progn
|
||||
(print! (start "Purging old native bytecode..."))
|
||||
(print-group!
|
||||
(dolist (dir dirs)
|
||||
(print! (info "Deleting %S") (relpath dir doom--eln-output-path))
|
||||
(delete-directory dir 'recursive))
|
||||
(print! (success "Purged %d directory(ies)" (length dirs))))
|
||||
(length dirs))
|
||||
(print! (info "No ELN directories to purge"))
|
||||
0))
|
||||
|
||||
(defun doom-cli-packages-purge (&optional elpa-p builds-p repos-p regraft-repos-p eln-p)
|
||||
"Auto-removes orphaned packages and repos.
|
||||
|
||||
An orphaned package is a package that isn't a primary package (i.e. doesn't have
|
||||
|
@ -598,4 +592,8 @@ If ELPA-P, include packages installed with package.el (M-x package-install)."
|
|||
(/= 0 (doom--cli-packages-purge-repos repos-to-purge)))
|
||||
(if (not regraft-repos-p)
|
||||
(ignore (print! (info "Skipping regrafting")))
|
||||
(doom--cli-packages-regraft-repos repos-to-regraft)))))))
|
||||
(doom--cli-packages-regraft-repos repos-to-regraft))
|
||||
(when (require 'comp nil t)
|
||||
(if (not eln-p)
|
||||
(ignore (print! (info "Skipping native bytecode")))
|
||||
(doom--cli-packages-purge-eln))))))))
|
||||
|
|
|
@ -31,7 +31,7 @@ stale."
|
|||
(doom-cli-packages-build)
|
||||
(when update-p
|
||||
(doom-cli-packages-update))
|
||||
(doom-cli-packages-purge purge-p 'builds-p purge-p purge-p)
|
||||
(doom-cli-packages-purge purge-p 'builds-p purge-p purge-p purge-p)
|
||||
(run-hooks 'doom-sync-post-hook)
|
||||
(when (doom-autoloads-reload)
|
||||
(print! (info "Restart Emacs or use 'M-x doom/reload' for changes to take effect")))
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
;; Don't generate superfluous files when writing temp buffers
|
||||
(setq make-backup-files nil)
|
||||
|
||||
;; Stop user configuration from interfering with Doom
|
||||
;; Stop user configuration from interfering with package management
|
||||
(setq enable-dir-local-variables nil)
|
||||
|
||||
|
||||
|
@ -260,8 +260,9 @@ BODY will be run when this dispatcher is called."
|
|||
(string-match-p (regexp-quote straight-process-buffer)
|
||||
data))
|
||||
(print! (error "There was an unexpected package error"))
|
||||
(when-let (output (straight--process-get-output))
|
||||
(print-group!
|
||||
(print! "%s" (string-trim-right (straight--process-get-output)))))
|
||||
(print! "%s" (string-trim-right output)))))
|
||||
((print! (error "There was an unexpected error"))
|
||||
(print-group!
|
||||
(print! "%s %s" (bold "Message:") (get type 'error-message))
|
||||
|
@ -424,6 +425,18 @@ everywhere we use it (and internally)."
|
|||
cause)
|
||||
interactive)))
|
||||
|
||||
(defadvice! doom--straight-inject-load-path-a (orig-fn &rest args)
|
||||
"Straight builds packages in an isolated Emacs child process, which means
|
||||
needed packages may not be accessible when a package is compiled."
|
||||
:override #'straight--build-compile
|
||||
(let* ((package (plist-get recipe :package))
|
||||
(dir (straight--build-dir package)))
|
||||
(call-process (concat invocation-directory invocation-name)
|
||||
nil straight-byte-compilation-buffer nil
|
||||
"-Q" "--batch"
|
||||
"--eval" (prin1-to-string `(setq load-path (cons ,dir ',load-path)))
|
||||
"--eval" (format "(byte-recompile-directory %S 0 'force)" dir))))
|
||||
|
||||
|
||||
;;
|
||||
;;; Entry point
|
||||
|
|
|
@ -9,7 +9,10 @@ detected.")
|
|||
indentation settings or not. This should be set by editorconfig if it
|
||||
successfully sets indent_style/indent_size.")
|
||||
|
||||
(defvar-local doom-large-file-p nil)
|
||||
(defvar doom-inhibit-large-file-detection nil
|
||||
"If non-nil, inhibit large/long file detection when opening files.")
|
||||
|
||||
(defvar doom-large-file-p nil)
|
||||
(put 'doom-large-file-p 'permanent-local t)
|
||||
|
||||
(defvar doom-large-file-size-alist '(("." . 1.0))
|
||||
|
@ -40,21 +43,25 @@ runtime costs (or disable themselves) to ensure the buffer is as fast as
|
|||
possible."
|
||||
:before #'abort-if-file-too-large
|
||||
(and (numberp size)
|
||||
(null doom-inhibit-large-file-detection)
|
||||
(ignore-errors
|
||||
(> size
|
||||
(* 1024 1024
|
||||
(assoc-default filename doom-large-file-size-alist
|
||||
#'string-match-p)))
|
||||
(setq doom-large-file-p size)))
|
||||
#'string-match-p))))
|
||||
(setq-local doom-large-file-p size)))
|
||||
|
||||
(defadvice! doom--optimize-for-large-files-a (&rest _)
|
||||
(add-hook! 'find-file-hook
|
||||
(defun doom-optimize-for-large-files-h ()
|
||||
"Trigger `so-long-minor-mode' if the file is large."
|
||||
:after #'after-find-file
|
||||
(when (and doom-large-file-p buffer-file-name)
|
||||
(if (memq major-mode doom-large-file-excluded-modes)
|
||||
(setq doom-large-file-p nil)
|
||||
(if (or doom-inhibit-large-file-detection
|
||||
(memq major-mode doom-large-file-excluded-modes))
|
||||
(kill-local-variable 'doom-large-file-p)
|
||||
(when (fboundp 'so-long-minor-mode) ; in case the user disabled it
|
||||
(so-long-minor-mode +1))
|
||||
(message "Large file detected! Cutting a few corners to improve performance..."))))
|
||||
(message "Large file detected! Cutting a few corners to improve performance...")))))
|
||||
|
||||
|
||||
;; Resolve symlinks when opening files, so that any operations are conducted
|
||||
;; from the file's true directory (like `find-file').
|
||||
|
@ -65,19 +72,6 @@ possible."
|
|||
;; warning as it will redirect you to the existing buffer anyway.
|
||||
(setq find-file-suppress-same-file-warnings t)
|
||||
|
||||
;; Create missing directories when we open a file that doesn't exist under a
|
||||
;; directory tree that may not exist.
|
||||
(add-hook! 'find-file-not-found-functions
|
||||
(defun doom-create-missing-directories-h ()
|
||||
"Automatically create missing directories when creating new files."
|
||||
(unless (file-remote-p buffer-file-name)
|
||||
(let ((parent-directory (file-name-directory buffer-file-name)))
|
||||
(and (not (file-directory-p parent-directory))
|
||||
(y-or-n-p (format "Directory `%s' does not exist! Create it?"
|
||||
parent-directory))
|
||||
(progn (make-directory parent-directory 'parents)
|
||||
t))))))
|
||||
|
||||
;; Don't generate backups or lockfiles. While auto-save maintains a copy so long
|
||||
;; as a buffer is unsaved, backups create copies once, when the file is first
|
||||
;; written, and never again until it is killed and reopened. This is better
|
||||
|
@ -101,7 +95,7 @@ possible."
|
|||
;; the purpose of a failsafe. This adds the risk of losing the data we
|
||||
;; just deleted, but I believe that's VCS's jurisdiction, not ours.
|
||||
auto-save-include-big-deletions t
|
||||
;; ...but have directories set up in case we use it.
|
||||
;; Keep it out of `doom-emacs-dir' or the local directory.
|
||||
auto-save-list-file-prefix (concat doom-cache-dir "autosave/")
|
||||
tramp-auto-save-directory (concat doom-cache-dir "tramp-autosave/")
|
||||
auto-save-file-name-transforms
|
||||
|
@ -112,7 +106,10 @@ possible."
|
|||
|
||||
(add-hook! 'after-save-hook
|
||||
(defun doom-guess-mode-h ()
|
||||
"Guess mode when saving a file in `fundamental-mode'."
|
||||
"Guess major mode when saving a file in `fundamental-mode'.
|
||||
|
||||
Likely, something has changed since the buffer was opened. e.g. A shebang line
|
||||
or file path may exist now."
|
||||
(when (eq major-mode 'fundamental-mode)
|
||||
(let ((buffer (or (buffer-base-buffer) (current-buffer))))
|
||||
(and (buffer-file-name buffer)
|
||||
|
@ -161,7 +158,7 @@ possible."
|
|||
;; The POSIX standard defines a line is "a sequence of zero or more non-newline
|
||||
;; characters followed by a terminating newline", so files should end in a
|
||||
;; newline. Windows doesn't respect this (because it's Windows), but we should,
|
||||
;; since programmers' tools tend to be POSIX compliant.
|
||||
;; since programmers' tools tend to be POSIX compliant (and no big deal if not).
|
||||
(setq require-final-newline t)
|
||||
|
||||
;; Default to soft line-wrapping in text modes. It is more sensibile for text
|
||||
|
@ -331,6 +328,7 @@ files, so we replace calls to `pp' with the much faster `prin1'."
|
|||
(when-let (name (getenv "EMACS_SERVER_NAME"))
|
||||
(setq server-name name))
|
||||
:config
|
||||
(setq server-auth-dir (concat doom-emacs-dir "server/"))
|
||||
(unless (server-running-p)
|
||||
(server-start)))
|
||||
|
||||
|
@ -486,7 +484,12 @@ files, so we replace calls to `pp' with the much faster `prin1'."
|
|||
;; correct this vile injustice.
|
||||
(setq sp-show-pair-from-inside t)
|
||||
;; ...and stay highlighted until we've truly escaped the pair!
|
||||
(setq sp-cancel-autoskip-on-backward-movement nil))
|
||||
(setq sp-cancel-autoskip-on-backward-movement nil)
|
||||
;; Smartparens conditional binds a key to C-g when sp overlays are active
|
||||
;; (even if they're invisible). This disruptively changes the behavior of
|
||||
;; C-g in insert mode, requiring two presses of the key to exit insert mode.
|
||||
;; I don't see the point of this keybind, so...
|
||||
(setq sp-pair-overlay-keymap (make-sparse-keymap)))
|
||||
|
||||
;; The default is 100, because smartparen's scans are relatively expensive
|
||||
;; (especially with large pair lists for some modes), we reduce it, as a
|
||||
|
@ -495,21 +498,25 @@ files, so we replace calls to `pp' with the much faster `prin1'."
|
|||
;; No pair has any business being longer than 4 characters; if they must, set
|
||||
;; it buffer-locally. It's less work for smartparens.
|
||||
(setq sp-max-pair-length 4)
|
||||
;; This isn't always smart enough to determine when we're in a string or not.
|
||||
;; See https://github.com/Fuco1/smartparens/issues/783.
|
||||
(setq sp-escape-quotes-after-insert nil)
|
||||
|
||||
;; Silence some harmless but annoying echo-area spam
|
||||
(dolist (key '(:unmatched-expression :no-matching-tag))
|
||||
(setf (alist-get key sp-message-alist) nil))
|
||||
|
||||
(add-hook! 'eval-expression-minibuffer-setup-hook
|
||||
(defun doom-init-smartparens-in-eval-expression-h ()
|
||||
"Enable `smartparens-mode' in the minibuffer for `eval-expression'.
|
||||
This includes everything that calls `read--expression', e.g.
|
||||
`edebug-eval-expression' Only enable it if
|
||||
`smartparens-global-mode' is on."
|
||||
(when smartparens-global-mode (smartparens-mode +1))))
|
||||
(add-hook! 'minibuffer-setup-hook
|
||||
(defun doom-init-smartparens-in-minibuffer-maybe-h ()
|
||||
"Enable `smartparens-mode' in the minibuffer, during `eval-expression',
|
||||
`pp-eval-expression' or `evil-ex'."
|
||||
(and (memq this-command '(eval-expression pp-eval-expression evil-ex))
|
||||
smartparens-global-mode
|
||||
(smartparens-mode))))
|
||||
"Enable `smartparens' for non-`eval-expression' commands.
|
||||
Only enable `smartparens-mode' if `smartparens-global-mode' is
|
||||
on."
|
||||
(when (and smartparens-global-mode (memq this-command '(evil-ex)))
|
||||
(smartparens-mode +1))))
|
||||
|
||||
;; You're likely writing lisp in the minibuffer, therefore, disable these
|
||||
;; quote pairs, which lisps doesn't use for strings:
|
||||
|
@ -545,8 +552,6 @@ files, so we replace calls to `pp' with the much faster `prin1'."
|
|||
(add-to-list 'so-long-variable-overrides '(font-lock-maximum-decoration . 1))
|
||||
;; ...and insist that save-place not operate in large/long files
|
||||
(add-to-list 'so-long-variable-overrides '(save-place-alist . nil))
|
||||
;; Text files could possibly be too long too
|
||||
(add-to-list 'so-long-target-modes 'text-mode)
|
||||
;; But disable everything else that may be unnecessary/expensive for large or
|
||||
;; wide buffers.
|
||||
(appendq! so-long-minor-modes
|
||||
|
@ -563,11 +568,11 @@ files, so we replace calls to `pp' with the much faster `prin1'."
|
|||
highlight-indent-guides-mode
|
||||
hl-fill-column-mode))
|
||||
(defun doom-buffer-has-long-lines-p ()
|
||||
;; HACK Fix #2183: `so-long-detected-long-line-p' tries to parse comment
|
||||
;; syntax, but in some buffers comment state isn't initialized, leading
|
||||
;; to a wrong-type-argument: stringp error.
|
||||
(unless (bound-and-true-p visual-line-mode)
|
||||
(let ((so-long-skip-leading-comments
|
||||
;; HACK Fix #2183: `so-long-detected-long-line-p' tries to parse
|
||||
;; comment syntax, but comment state may not be initialized,
|
||||
;; leading to a wrong-type-argument: stringp error.
|
||||
(bound-and-true-p comment-use-syntax)))
|
||||
(so-long-detected-long-line-p))))
|
||||
(setq so-long-predicate #'doom-buffer-has-long-lines-p))
|
||||
|
|
|
@ -39,6 +39,21 @@ and Emacs states, and for non-evil users.")
|
|||
(setq w32-lwindow-modifier 'super
|
||||
w32-rwindow-modifier 'super)))
|
||||
|
||||
;; HACK Fixes Emacs' disturbing inability to distinguish C-i from TAB.
|
||||
(define-key key-translation-map [?\C-i]
|
||||
(cmd! (if (let ((keys (this-single-command-raw-keys)))
|
||||
(and keys
|
||||
(not (cl-position 'tab keys))
|
||||
(not (cl-position 'kp-tab keys))
|
||||
(display-graphic-p)
|
||||
;; Fall back if no <C-i> keybind can be found, otherwise
|
||||
;; we've broken all pre-existing C-i keybinds.
|
||||
(let ((key
|
||||
(doom-lookup-key
|
||||
(vconcat (cl-subseq keys 0 -1) [C-i]))))
|
||||
(not (or (numberp key) (null key))))))
|
||||
[C-i] [?\C-i])))
|
||||
|
||||
|
||||
;;
|
||||
;;; Universal, non-nuclear escape
|
||||
|
@ -63,18 +78,22 @@ and Emacs states, and for non-evil users.")
|
|||
More specifically, when `doom/escape' is pressed. If any hook returns non-nil,
|
||||
all hooks after it are ignored.")
|
||||
|
||||
(defun doom/escape ()
|
||||
(defun doom/escape (&optional interactive)
|
||||
"Run `doom-escape-hook'."
|
||||
(interactive)
|
||||
(interactive (list 'interactive))
|
||||
(cond ((minibuffer-window-active-p (minibuffer-window))
|
||||
;; quit the minibuffer if open.
|
||||
(when interactive
|
||||
(setq this-command 'abort-recursive-edit))
|
||||
(abort-recursive-edit))
|
||||
;; Run all escape hooks. If any returns non-nil, then stop there.
|
||||
((run-hook-with-args-until-success 'doom-escape-hook))
|
||||
;; don't abort macros
|
||||
((or defining-kbd-macro executing-kbd-macro) nil)
|
||||
;; Back to the default
|
||||
((keyboard-quit))))
|
||||
((unwind-protect (keyboard-quit)
|
||||
(when interactive
|
||||
(setq this-command 'keyboard-quit))))))
|
||||
|
||||
(global-set-key [remap keyboard-quit] #'doom/escape)
|
||||
|
||||
|
|
180
core/core-lib.el
180
core/core-lib.el
|
@ -67,8 +67,8 @@ list is returned as-is."
|
|||
|
||||
(defmacro doom-log (format-string &rest args)
|
||||
"Log to *Messages* if `doom-debug-p' is on.
|
||||
Does not interrupt the minibuffer if it is in use, but still logs to *Messages*.
|
||||
Accepts the same arguments as `message'."
|
||||
Does not display text in echo area, but still logs to *Messages*. Accepts the
|
||||
same arguments as `message'."
|
||||
`(when doom-debug-p
|
||||
(let ((inhibit-message (active-minibuffer-window)))
|
||||
(message
|
||||
|
@ -85,7 +85,7 @@ Accepts the same arguments as `message'."
|
|||
(defalias 'doom-partial #'apply-partially)
|
||||
|
||||
(defun doom-rpartial (fn &rest args)
|
||||
"Return a function that is a partial application of FUN to right-hand ARGS.
|
||||
"Return a partial application of FUN to right-hand ARGS.
|
||||
|
||||
ARGS is a list of the last N arguments to pass to FUN. The result is a new
|
||||
function which does the same as FUN, except that the last N arguments are fixed
|
||||
|
@ -94,6 +94,24 @@ at the values with which this function was called."
|
|||
(lambda (&rest pre-args)
|
||||
(apply fn (append pre-args args))))
|
||||
|
||||
(defun doom-lookup-key (keys &optional keymap)
|
||||
"Like `lookup-key', but search active keymaps if KEYMAP is omitted."
|
||||
(if keymap
|
||||
(lookup-key keymap keys)
|
||||
(cl-loop for keymap
|
||||
in (append (cl-loop for alist in emulation-mode-map-alists
|
||||
append (mapcar #'cdr
|
||||
(if (symbolp alist)
|
||||
(if (boundp alist) (symbol-value alist))
|
||||
alist)))
|
||||
(list (current-local-map))
|
||||
(mapcar #'cdr minor-mode-overriding-map-alist)
|
||||
(mapcar #'cdr minor-mode-map-alist)
|
||||
(list (current-global-map)))
|
||||
if (keymapp keymap)
|
||||
if (lookup-key keymap keys)
|
||||
return it)))
|
||||
|
||||
|
||||
;;
|
||||
;;; Sugars
|
||||
|
@ -123,6 +141,7 @@ at the values with which this function was called."
|
|||
|
||||
(defmacro letf! (bindings &rest body)
|
||||
"Temporarily rebind function and macros in BODY.
|
||||
Intended as a simpler version of `cl-letf' and `cl-macrolet'.
|
||||
|
||||
BINDINGS is either a) a list of, or a single, `defun' or `defmacro'-ish form, or
|
||||
b) a list of (PLACE VALUE) bindings as `cl-letf*' would accept.
|
||||
|
@ -157,7 +176,8 @@ the same name, for use with `funcall' or `apply'. ARGLIST and BODY are as in
|
|||
"Run FORMS without generating any output.
|
||||
|
||||
This silences calls to `message', `load', `write-region' and anything that
|
||||
writes to `standard-output'."
|
||||
writes to `standard-output'. In interactive sessions this won't suppress writing
|
||||
to *Messages*, only inhibit output in the echo area."
|
||||
`(if doom-debug-p
|
||||
(progn ,@forms)
|
||||
,(if doom-interactive-p
|
||||
|
@ -193,21 +213,24 @@ See `eval-if!' for details on this macro's purpose."
|
|||
|
||||
;;; Closure factories
|
||||
(defmacro fn! (arglist &rest body)
|
||||
"Expands to (cl-function (lambda ARGLIST BODY...))"
|
||||
"Returns (cl-function (lambda ARGLIST BODY...))
|
||||
The closure is wrapped in `cl-function', meaning ARGLIST will accept anything
|
||||
`cl-defun' will. "
|
||||
(declare (indent defun) (doc-string 1) (pure t) (side-effect-free t))
|
||||
`(cl-function (lambda ,arglist ,@body)))
|
||||
|
||||
(defmacro cmd! (&rest body)
|
||||
"Expands to (lambda () (interactive) ,@body).
|
||||
"Returns (lambda () (interactive) ,@body)
|
||||
A factory for quickly producing interaction commands, particularly for keybinds
|
||||
or aliases."
|
||||
(declare (doc-string 1) (pure t) (side-effect-free t))
|
||||
`(lambda (&rest _) (interactive) ,@body))
|
||||
|
||||
(defmacro cmd!! (command &optional prefix-arg &rest args)
|
||||
"Expands to a closure that interactively calls COMMAND with ARGS.
|
||||
A factory for quickly producing interactive, prefixed commands for keybinds or
|
||||
aliases."
|
||||
"Returns a closure that interactively calls COMMAND with ARGS and PREFIX-ARG.
|
||||
Like `cmd!', but allows you to change `current-prefix-arg' or pass arguments to
|
||||
COMMAND. This macro is meant to be used as a target for keybinds (e.g. with
|
||||
`define-key' or `map!')."
|
||||
(declare (doc-string 1) (pure t) (side-effect-free t))
|
||||
`(lambda (arg &rest _) (interactive "P")
|
||||
(let ((current-prefix-arg (or ,prefix-arg arg)))
|
||||
|
@ -217,7 +240,20 @@ aliases."
|
|||
,command ,@args))))
|
||||
|
||||
(defmacro cmds! (&rest branches)
|
||||
"Expands to a `menu-item' dispatcher for keybinds."
|
||||
"Returns a dispatcher that runs the a command in BRANCHES.
|
||||
Meant to be used as a target for keybinds (e.g. with `define-key' or `map!').
|
||||
|
||||
BRANCHES is a flat list of CONDITION COMMAND pairs. CONDITION is a lisp form
|
||||
that is evaluated when (and each time) the dispatcher is invoked. If it returns
|
||||
non-nil, COMMAND is invoked, otherwise it falls through to the next pair.
|
||||
|
||||
The last element of BRANCHES can be a COMMANd with no CONDITION. This acts as
|
||||
the fallback if all other conditions fail.
|
||||
|
||||
Otherwise, Emacs will fall through the keybind and search the next keymap for a
|
||||
keybind (as if this keybind never existed).
|
||||
|
||||
See `general-key-dispatch' for what other arguments it accepts in BRANCHES."
|
||||
(declare (doc-string 1))
|
||||
(let ((docstring (if (stringp (car branches)) (pop branches) ""))
|
||||
fallback)
|
||||
|
@ -228,6 +264,8 @@ aliases."
|
|||
:docstring ,docstring
|
||||
,@branches)))
|
||||
|
||||
(defalias 'kbd! 'general-simulate-key)
|
||||
|
||||
;; For backwards compatibility
|
||||
(defalias 'λ! 'cmd!)
|
||||
(defalias 'λ!! 'cmd!!)
|
||||
|
@ -612,7 +650,7 @@ set earlier in the ‘setq-local’. The return value of the
|
|||
(macroexp-progn (nreverse expr)))))
|
||||
|
||||
(eval-when! (version< emacs-version "27.1")
|
||||
;; DEPRECATED Backported from Emacs 27; earlier verisons don't have REMOTE arg
|
||||
;; DEPRECATED Backported from Emacs 27. Remove when 26.x support is dropped.
|
||||
(defun executable-find (command &optional remote)
|
||||
"Search for COMMAND in `exec-path' and return the absolute file name.
|
||||
Return nil if COMMAND is not found anywhere in `exec-path'. If
|
||||
|
@ -633,5 +671,125 @@ REMOTE is non-nil, search on the remote host indicated by
|
|||
(file-name-quote default-directory))))
|
||||
(locate-file command exec-path exec-suffixes 1)))))
|
||||
|
||||
(eval-when! (not (fboundp 'exec-path))
|
||||
;; DEPRECATED Backported from Emacs 27.1. Remove when 26.x support is dropped.
|
||||
(defun exec-path ()
|
||||
"Return list of directories to search programs to run in remote subprocesses.
|
||||
The remote host is identified by `default-directory'. For remote
|
||||
hosts that do not support subprocesses, this returns `nil'.
|
||||
If `default-directory' is a local directory, this function returns
|
||||
the value of the variable `exec-path'."
|
||||
(let ((handler (find-file-name-handler default-directory 'exec-path)))
|
||||
(if handler
|
||||
(funcall handler 'exec-path)
|
||||
exec-path))))
|
||||
|
||||
;; DEPRECATED Remove once enough packages have adapted to these breaking changes.
|
||||
(eval-when! EMACS28+
|
||||
(defmacro define-obsolete-variable-alias (obsolete-name current-name &optional when docstring)
|
||||
"Make OBSOLETE-NAME a variable alias for CURRENT-NAME and mark it obsolete.
|
||||
|
||||
WHEN should be a string indicating when the variable was first
|
||||
made obsolete, for example a date or a release number.
|
||||
|
||||
This macro evaluates all its parameters, and both OBSOLETE-NAME
|
||||
and CURRENT-NAME should be symbols, so a typical usage would look like:
|
||||
|
||||
(define-obsolete-variable-alias 'foo-thing 'bar-thing \"27.1\")
|
||||
|
||||
This macro uses `defvaralias' and `make-obsolete-variable' (which see).
|
||||
See the Info node `(elisp)Variable Aliases' for more details.
|
||||
|
||||
If CURRENT-NAME is a defcustom or a defvar (more generally, any variable
|
||||
where OBSOLETE-NAME may be set, e.g. in an init file, before the
|
||||
alias is defined), then the define-obsolete-variable-alias
|
||||
statement should be evaluated before the defcustom, if user
|
||||
customizations are to be respected. The simplest way to achieve
|
||||
this is to place the alias statement before the defcustom (this
|
||||
is not necessary for aliases that are autoloaded, or in files
|
||||
dumped with Emacs). This is so that any user customizations are
|
||||
applied before the defcustom tries to initialize the
|
||||
variable (this is due to the way `defvaralias' works).
|
||||
|
||||
For the benefit of Customize, if OBSOLETE-NAME has
|
||||
any of the following properties, they are copied to
|
||||
CURRENT-NAME, if it does not already have them:
|
||||
`saved-value', `saved-variable-comment'."
|
||||
(declare (doc-string 4)
|
||||
(advertised-calling-convention
|
||||
(obsolete-name current-name when &optional docstring) "23.1"))
|
||||
`(progn
|
||||
(defvaralias ,obsolete-name ,current-name ,docstring)
|
||||
(dolist (prop '(saved-value saved-variable-comment))
|
||||
(and (get ,obsolete-name prop)
|
||||
(null (get ,current-name prop))
|
||||
(put ,current-name prop (get ,obsolete-name prop))))
|
||||
(make-obsolete-variable ,obsolete-name ,current-name ,when)))
|
||||
|
||||
(defmacro define-obsolete-face-alias (obsolete-face current-face &optional when)
|
||||
"Make OBSOLETE-FACE a face alias for CURRENT-FACE and mark it obsolete.
|
||||
WHEN should be a string indicating when the face was first made
|
||||
obsolete, for example a date or a release number."
|
||||
`(progn (put ,obsolete-face 'face-alias ,current-face)
|
||||
(put ,obsolete-face 'obsolete-face (or (purecopy ,when) t))))
|
||||
|
||||
(defmacro define-obsolete-function-alias (obsolete-name current-name &optional when docstring)
|
||||
"Set OBSOLETE-NAME's function definition to CURRENT-NAME and mark it obsolete.
|
||||
|
||||
\(define-obsolete-function-alias \\='old-fun \\='new-fun \"22.1\" \"old-fun's doc.\")
|
||||
|
||||
is equivalent to the following two lines of code:
|
||||
|
||||
\(defalias \\='old-fun \\='new-fun \"old-fun's doc.\")
|
||||
\(make-obsolete \\='old-fun \\='new-fun \"22.1\")
|
||||
|
||||
WHEN should be a string indicating when the function was first
|
||||
made obsolete, for example a date or a release number.
|
||||
|
||||
See the docstrings of `defalias' and `make-obsolete' for more details."
|
||||
(declare (doc-string 4))
|
||||
`(progn (defalias ,obsolete-name ,current-name ,docstring)
|
||||
(make-obsolete ,obsolete-name ,current-name ,when)))
|
||||
|
||||
(defadvice! doom--fix-wrong-number-of-args-during-byte-compile (recipe)
|
||||
:override #'straight--build-compile
|
||||
(let* ((package (plist-get recipe :package))
|
||||
(dir (straight--build-dir package))
|
||||
(program (concat invocation-directory invocation-name))
|
||||
(args
|
||||
`("-Q" "-L" ,dir
|
||||
,@(apply #'append
|
||||
(mapcar (lambda (d)
|
||||
(let ((d (straight--build-dir d)))
|
||||
(when (file-exists-p d) (list "-L" d))))
|
||||
(straight--get-dependencies package)))
|
||||
"--batch"
|
||||
"--eval"
|
||||
,(prin1-to-string
|
||||
'(progn
|
||||
(defmacro define-obsolete-face-alias (obsolete-face current-face &optional when)
|
||||
`(progn (put ,obsolete-face 'face-alias ,current-face)
|
||||
(put ,obsolete-face 'obsolete-face (or (purecopy ,when) t))))
|
||||
(defmacro define-obsolete-function-alias (obsolete-name current-name &optional when docstring)
|
||||
`(progn (defalias ,obsolete-name ,current-name ,docstring)
|
||||
(make-obsolete ,obsolete-name ,current-name ,when)))
|
||||
(defmacro define-obsolete-variable-alias (obsolete-name current-name &optional when docstring)
|
||||
`(progn (defvaralias ,obsolete-name ,current-name ,docstring)
|
||||
(dolist (prop '(saved-value saved-variable-comment))
|
||||
(and (get ,obsolete-name prop)
|
||||
(null (get ,current-name prop))
|
||||
(put ,current-name prop (get ,obsolete-name prop))))
|
||||
(make-obsolete-variable ,obsolete-name ,current-name ,when)))))
|
||||
"--eval"
|
||||
,(format "(byte-recompile-directory %S 0 'force)" dir))))
|
||||
(when straight-byte-compilation-buffer
|
||||
(with-current-buffer (get-buffer-create straight-byte-compilation-buffer)
|
||||
(insert "\n$ " (replace-regexp-in-string
|
||||
"\\(-L [^z-a]*? \\)"
|
||||
"\\1\\\\ \n "
|
||||
(string-join `(,program ,@args) " "))
|
||||
"\n")))
|
||||
(apply #'call-process program nil straight-byte-compilation-buffer nil args))))
|
||||
|
||||
(provide 'core-lib)
|
||||
;;; core-lib.el ends here
|
||||
|
|
|
@ -203,7 +203,7 @@ This doesn't require modules to be enabled. For enabled modules us
|
|||
for default-directory in doom-modules-dirs
|
||||
for path = (concat category "/" module "/" file)
|
||||
if (file-exists-p path)
|
||||
return (file-truename path)))
|
||||
return (expand-file-name path)))
|
||||
|
||||
(defun doom-module-from-path (&optional path enabled-only)
|
||||
"Returns a cons cell (CATEGORY . MODULE) derived from PATH (a file path).
|
||||
|
@ -218,7 +218,7 @@ If ENABLED-ONLY, return nil if the containing module isn't enabled."
|
|||
(ignore-errors
|
||||
(doom-module-from-path (file!))))
|
||||
(let* ((file-name-handler-alist nil)
|
||||
(path (file-truename (or path (file!)))))
|
||||
(path (expand-file-name (or path (file!)))))
|
||||
(save-match-data
|
||||
(cond ((string-match "/modules/\\([^/]+\\)/\\([^/]+\\)\\(?:/.*\\)?$" path)
|
||||
(when-let* ((category (doom-keyword-intern (match-string 1 path)))
|
||||
|
@ -226,9 +226,11 @@ If ENABLED-ONLY, return nil if the containing module isn't enabled."
|
|||
(and (or (null enabled-only)
|
||||
(doom-module-p category module))
|
||||
(cons category module))))
|
||||
((file-in-directory-p path doom-core-dir)
|
||||
((or (string-match-p (concat "^" (regexp-quote doom-core-dir)) path)
|
||||
(file-in-directory-p path doom-core-dir))
|
||||
(cons :core (intern (file-name-base path))))
|
||||
((file-in-directory-p path doom-private-dir)
|
||||
((or (string-match-p (concat "^" (regexp-quote doom-private-dir)) path)
|
||||
(file-in-directory-p path doom-private-dir))
|
||||
(cons :private (intern (file-name-base path)))))))))
|
||||
|
||||
(defun doom-module-load-path (&optional module-dirs)
|
||||
|
@ -277,7 +279,7 @@ those directories. The first returned path is always `doom-private-dir'."
|
|||
(:if (if (eval (cadr m) t)
|
||||
(push (caddr m) mplist)
|
||||
(prependq! mplist (cdddr m))))
|
||||
(test (if (or (eval (cadr m) t)
|
||||
(test (if (xor (eval (cadr m) t)
|
||||
(eq test :unless))
|
||||
(prependq! mplist (cddr m))))))
|
||||
((catch 'doom-modules
|
||||
|
@ -329,7 +331,7 @@ This value is cached. If REFRESH-P, then don't use the cached value."
|
|||
use-package-minimum-reported-time (if doom-debug-p 0 0.1)
|
||||
use-package-expand-minimally doom-interactive-p)
|
||||
|
||||
;; A common mistake for new users is that they inadvertantly install their
|
||||
;; A common mistake for new users is that they inadvertently install their
|
||||
;; packages with package.el, by copying over old `use-package' declarations with
|
||||
;; an :ensure t property. Doom doesn't use package.el, so this will throw an
|
||||
;; error that will confuse beginners, so we disable `:ensure'.
|
||||
|
|
|
@ -99,9 +99,7 @@ uses a straight or package.el command directly).")
|
|||
straight-vc-git-default-clone-depth 1
|
||||
;; Prefix declarations are unneeded bulk added to our autoloads file. Best
|
||||
;; we don't have to deal with them at all.
|
||||
autoload-compute-prefixes nil
|
||||
;; We handle it ourselves
|
||||
straight-fix-org nil)
|
||||
autoload-compute-prefixes nil)
|
||||
|
||||
(with-eval-after-load 'straight
|
||||
;; `let-alist' is built into Emacs 26 and onwards
|
||||
|
@ -187,17 +185,18 @@ processed."
|
|||
(error "Failed to initialize package.el")))
|
||||
(when (or force-p (null doom-packages))
|
||||
(doom-log "Initializing straight.el")
|
||||
(or (setq doom-disabled-packages nil
|
||||
(setq doom-disabled-packages nil
|
||||
doom-packages (doom-package-list))
|
||||
(error "Failed to read any packages"))
|
||||
(let (packages)
|
||||
(dolist (package doom-packages)
|
||||
(cl-destructuring-bind
|
||||
(name &key recipe disable ignore shadow &allow-other-keys) package
|
||||
(unless ignore
|
||||
(if ignore
|
||||
(straight-override-recipe (cons name '(:type built-in)))
|
||||
(if disable
|
||||
(cl-pushnew name doom-disabled-packages)
|
||||
(when shadow
|
||||
(straight-override-recipe (cons shadow '(:local-repo nil)))
|
||||
(straight-override-recipe (cons shadow `(:local-repo nil :package included :build nil :included-by ,name)))
|
||||
(let ((site-load-path (copy-sequence doom--initial-load-path))
|
||||
lib)
|
||||
(while (setq
|
||||
|
@ -208,7 +207,12 @@ processed."
|
|||
load-path (delete lib load-path))))))
|
||||
(when recipe
|
||||
(straight-override-recipe (cons name recipe)))
|
||||
(straight-register-package name)))))))
|
||||
(appendq! packages (cons name (straight--get-dependencies name)))))))
|
||||
(dolist (package (cl-delete-duplicates packages :test #'equal))
|
||||
(straight-register-package package)
|
||||
(let ((name (symbol-name package)))
|
||||
(add-to-list 'load-path (directory-file-name (straight--build-dir name)))
|
||||
(straight--load-package-autoloads name))))))
|
||||
|
||||
|
||||
;;
|
||||
|
@ -231,7 +235,12 @@ processed."
|
|||
|
||||
(defun doom-package-recipe (package &optional prop nil-value)
|
||||
"Returns the `straight' recipe PACKAGE was registered with."
|
||||
(let ((plist (gethash (symbol-name package) straight--recipe-cache)))
|
||||
(let* ((recipe (straight-recipes-retrieve package))
|
||||
(plist (doom-plist-merge
|
||||
(plist-get (alist-get package doom-packages) :recipe)
|
||||
(cdr (if (memq (car recipe) '(quote \`))
|
||||
(eval recipe t)
|
||||
recipe)))))
|
||||
(if prop
|
||||
(if (plist-member plist prop)
|
||||
(plist-get plist prop)
|
||||
|
@ -240,8 +249,14 @@ processed."
|
|||
|
||||
(defun doom-package-recipe-repo (package)
|
||||
"Resolve and return PACKAGE's (symbol) local-repo property."
|
||||
(if-let* ((recipe (cdr (straight-recipes-retrieve package)))
|
||||
(repo (straight-vc-local-repo-name recipe)))
|
||||
(if-let* ((recipe (copy-sequence (doom-package-recipe package)))
|
||||
(recipe (if (and (not (plist-member recipe :type))
|
||||
(memq (plist-get recipe :host) '(github gitlab bitbucket)))
|
||||
(plist-put recipe :type 'git)
|
||||
recipe))
|
||||
(repo (if-let (local-repo (plist-get recipe :local-repo))
|
||||
(file-name-nondirectory (directory-file-name local-repo))
|
||||
(ignore-errors (straight-vc-local-repo-name recipe)))))
|
||||
repo
|
||||
(symbol-name package)))
|
||||
|
||||
|
@ -263,12 +278,15 @@ processed."
|
|||
(copy-sequence deps))))
|
||||
|
||||
(defun doom-package-depending-on (package &optional noerror)
|
||||
"Return a list of packages that depend on the package named NAME."
|
||||
(cl-check-type name symbol)
|
||||
"Return a list of packages that depend on PACKAGE.
|
||||
|
||||
If PACKAGE (a symbol) isn't installed, throw an error, unless NOERROR is
|
||||
non-nil."
|
||||
(cl-check-type package symbol)
|
||||
;; can't get dependencies for built-in packages
|
||||
(unless (or (doom-package-build-recipe name)
|
||||
(unless (or (doom-package-build-recipe package)
|
||||
noerror)
|
||||
(error "Couldn't find %s, is it installed?" name))
|
||||
(error "Couldn't find %s, is it installed?" package))
|
||||
(cl-loop for pkg in (hash-table-keys straight--build-cache)
|
||||
for deps = (doom-package-dependencies pkg)
|
||||
if (memq package deps)
|
||||
|
@ -478,8 +496,8 @@ elsewhere."
|
|||
(when-let (recipe (plist-get plist :recipe))
|
||||
(cl-destructuring-bind
|
||||
(&key local-repo _files _flavor
|
||||
_no-build _build _post-build _no-byte-compile
|
||||
_no-native-compile _no-autoloads _type _repo _host _branch
|
||||
_build _pre-build _post-build _includes
|
||||
_type _repo _host _branch
|
||||
_remote _nonrecursive _fork _depth)
|
||||
recipe
|
||||
;; Expand :local-repo from current directory
|
||||
|
|
|
@ -145,10 +145,10 @@ c) are not valid projectile projects."
|
|||
projectile-project-root-files)
|
||||
projectile-project-root-files-bottom-up nil)))
|
||||
|
||||
;; Some utilities have issues with windows-style paths in MSYS, so emit
|
||||
;; unix-style paths instead.
|
||||
;; Some MSYS utilities auto expanded the `/' path separator, so we need to prevent it.
|
||||
(when IS-WINDOWS
|
||||
(setenv "MSYS_NO_PATHCONV" "1"))
|
||||
(setenv "MSYS_NO_PATHCONV" "1") ; Fix path in Git Bash
|
||||
(setenv "MSYS2_ARG_CONV_EXCL" "--path-separator")) ; Fix path in MSYS2
|
||||
|
||||
;; HACK Don't rely on VCS-specific commands to generate our file lists. That's
|
||||
;; 7 commands to maintain, versus the more generic, reliable and
|
||||
|
@ -179,13 +179,13 @@ And if it's a function, evaluate it."
|
|||
(cl-find-if (doom-rpartial #'executable-find t)
|
||||
(list "fdfind" "fd"))
|
||||
doom-projectile-fd-binary))
|
||||
(concat (format "%s . -0 -H --color=never --type file --type symlink --follow"
|
||||
(concat (format "%s . -0 -H --color=never --type file --type symlink --follow --exclude .git"
|
||||
bin)
|
||||
(if IS-WINDOWS " --path-separator=/"))))
|
||||
;; Otherwise, resort to ripgrep, which is also faster than find
|
||||
((executable-find "rg" t)
|
||||
(concat "rg -0 --files --follow --color=never --hidden -g!.git"
|
||||
(if IS-WINDOWS " --path-separator /")))
|
||||
(if IS-WINDOWS " --path-separator=/")))
|
||||
("find . -type f -print0"))))
|
||||
|
||||
(defadvice! doom--projectile-default-generic-command-a (orig-fn &rest args)
|
||||
|
|
|
@ -194,8 +194,8 @@ or if the current buffer is read-only or not file-visiting."
|
|||
;; for tall lines.
|
||||
auto-window-vscroll nil
|
||||
;; mouse
|
||||
mouse-wheel-scroll-amount '(5 ((shift) . 2))
|
||||
mouse-wheel-progressive-speed nil) ; don't accelerate scrolling
|
||||
mouse-wheel-scroll-amount '(2 ((shift) . hscroll))
|
||||
mouse-wheel-scroll-amount-horizontal 2)
|
||||
|
||||
;; Remove hscroll-margin in shells, otherwise it causes jumpiness
|
||||
(setq-hook! '(eshell-mode-hook term-mode-hook) hscroll-margin 0)
|
||||
|
@ -289,18 +289,16 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original
|
|||
;; where we resize windows too quickly.
|
||||
(setq window-resize-pixelwise nil)
|
||||
|
||||
(unless (assq 'menu-bar-lines default-frame-alist)
|
||||
;; We do this in early-init.el too, but in case the user is on Emacs 26 we do
|
||||
;; it here too: disable tool and scrollbars, as Doom encourages
|
||||
;; keyboard-centric workflows, so these are just clutter (the scrollbar also
|
||||
;; impacts performance).
|
||||
(add-to-list 'default-frame-alist '(menu-bar-lines . 0))
|
||||
(add-to-list 'default-frame-alist '(tool-bar-lines . 0))
|
||||
(add-to-list 'default-frame-alist '(vertical-scroll-bars)))
|
||||
;; Disable tool, menu, and scrollbars. Doom is designed to be keyboard-centric,
|
||||
;; so these are just clutter (the scrollbar also impacts performance). Whats
|
||||
;; more, the menu bar exposes functionality that Doom doesn't endorse.
|
||||
(push '(menu-bar-lines . 0) default-frame-alist)
|
||||
(push '(tool-bar-lines . 0) default-frame-alist)
|
||||
(push '(vertical-scroll-bars) default-frame-alist)
|
||||
|
||||
;; These are disabled directly through their frame parameters, to avoid the
|
||||
;; extra work their minor modes do, but we have to unset these variables
|
||||
;; ourselves, otherwise users will have to cycle them twice to re-enable them.
|
||||
;; These are disabled directly through their frame parameters to avoid the extra
|
||||
;; work their minor modes do, but their variables must be unset too, otherwise
|
||||
;; users will have to cycle them twice to re-enable them.
|
||||
(setq menu-bar-mode nil
|
||||
tool-bar-mode nil
|
||||
scroll-bar-mode nil)
|
||||
|
@ -344,9 +342,7 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original
|
|||
|
||||
;; Expand the minibuffer to fit multi-line text displayed in the echo-area. This
|
||||
;; doesn't look too great with direnv, however...
|
||||
(setq resize-mini-windows 'grow-only
|
||||
;; But don't let the minibuffer grow beyond this size
|
||||
max-mini-window-height 0.15)
|
||||
(setq resize-mini-windows 'grow-only)
|
||||
|
||||
;; Typing yes/no is obnoxious when y/n will do
|
||||
(fset #'yes-or-no-p #'y-or-n-p)
|
||||
|
@ -396,7 +392,9 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original
|
|||
;; Highlights the current line
|
||||
:hook (doom-first-buffer . global-hl-line-mode)
|
||||
:init
|
||||
(defvar global-hl-line-modes '(prog-mode text-mode conf-mode special-mode)
|
||||
(defvar global-hl-line-modes
|
||||
'(prog-mode text-mode conf-mode special-mode
|
||||
org-agenda-mode)
|
||||
"What modes to enable `hl-line-mode' in.")
|
||||
:config
|
||||
;; HACK I reimplement `global-hl-line-mode' so we can white/blacklist modes in
|
||||
|
@ -506,6 +504,8 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original
|
|||
all-the-icons-wicon all-the-icons-alltheicon)
|
||||
""))))
|
||||
|
||||
;; Hide the mode line in completion popups and MAN pages because they serve
|
||||
;; little purpose there, and is better hidden.
|
||||
;;;###package hide-mode-line-mode
|
||||
(add-hook! '(completion-list-mode-hook Man-mode-hook)
|
||||
#'hide-mode-line-mode)
|
||||
|
@ -520,17 +520,19 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original
|
|||
|
||||
;;;###package rainbow-delimiters
|
||||
;; Helps us distinguish stacked delimiter pairs, especially in parentheses-drunk
|
||||
;; languages like Lisp.
|
||||
;; languages like Lisp. I reduce it from it's default of 9 to reduce the
|
||||
;; complexity of the font-lock keyword and hopefully buy us a few ms of
|
||||
;; performance.
|
||||
(setq rainbow-delimiters-max-face-count 3)
|
||||
|
||||
|
||||
;;
|
||||
;;; Line numbers
|
||||
|
||||
;; Explicitly define a width to reduce computation
|
||||
;; Explicitly define a width to reduce the cost of on-the-fly computation
|
||||
(setq-default display-line-numbers-width 3)
|
||||
|
||||
;; Show absolute line numbers for narrowed regions makes it easier to tell the
|
||||
;; Show absolute line numbers for narrowed regions to make it easier to tell the
|
||||
;; buffer is narrowed, and where you are, exactly.
|
||||
(setq-default display-line-numbers-widen t)
|
||||
|
||||
|
@ -550,6 +552,14 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original
|
|||
;;
|
||||
;;; Theme & font
|
||||
|
||||
;; User themes should live in ~/.doom.d/themes, not ~/.emacs.d
|
||||
(setq custom-theme-directory (concat doom-private-dir "themes/"))
|
||||
|
||||
;; Always prioritize the user's themes above the built-in/packaged ones.
|
||||
(setq custom-theme-load-path
|
||||
(cons 'custom-theme-directory
|
||||
(remq 'custom-theme-directory custom-theme-load-path)))
|
||||
|
||||
;; Underline looks a bit better when drawn lower
|
||||
(setq x-underline-at-descent-line t)
|
||||
|
||||
|
@ -589,7 +599,7 @@ behavior). Do not set this directly, this is let-bound in `doom-init-theme-h'.")
|
|||
(when doom-variable-pitch-font
|
||||
(set-face-attribute 'variable-pitch nil :font doom-variable-pitch-font))
|
||||
(when (fboundp 'set-fontset-font)
|
||||
(dolist (font (append doom-unicode-extra-fonts (doom-enlist doom-unicode-font)))
|
||||
(dolist (font (cons doom-unicode-font doom-unicode-extra-fonts))
|
||||
(set-fontset-font t 'unicode font nil 'prepend)))
|
||||
(run-hooks 'after-setting-font-hook))
|
||||
((debug error)
|
||||
|
|
23
core/core.el
23
core/core.el
|
@ -158,11 +158,11 @@ users).")
|
|||
;; HACK Disable native-compilation for some troublesome packages
|
||||
(mapc (doom-partial #'add-to-list 'comp-deferred-compilation-deny-list)
|
||||
(let ((local-dir-re (concat "\\`" (regexp-quote doom-local-dir))))
|
||||
(list (concat local-dir-re ".*/evil-collection-vterm\\.el\\'")
|
||||
;; https://github.com/nnicandro/emacs-jupyter/issues/297
|
||||
(concat local-dir-re ".*/jupyter-channel\\.el\\'")
|
||||
(list (concat "\\`" (regexp-quote doom-autoloads-file) "\\'")
|
||||
(concat local-dir-re ".*/evil-collection-vterm\\.el\\'")
|
||||
(concat local-dir-re ".*/with-editor\\.el\\'")
|
||||
(concat "\\`" (regexp-quote doom-autoloads-file) "\\'"))))
|
||||
;; https://github.com/nnicandro/emacs-jupyter/issues/297
|
||||
(concat local-dir-re ".*/jupyter-channel\\.el\\'"))))
|
||||
;; Default to using all cores, rather than half of them, since we compile
|
||||
;; things ahead-of-time in a non-interactive session.
|
||||
(defadvice! doom--comp-use-all-cores-a ()
|
||||
|
@ -208,7 +208,8 @@ users).")
|
|||
inhibit-default-init t
|
||||
;; Shave seconds off startup time by starting the scratch buffer in
|
||||
;; `fundamental-mode', rather than, say, `org-mode' or `text-mode', which
|
||||
;; pull in a ton of packages.
|
||||
;; pull in a ton of packages. `doom/open-scratch-buffer' provides a better
|
||||
;; scratch buffer anyway.
|
||||
initial-major-mode 'fundamental-mode
|
||||
initial-scratch-message nil)
|
||||
|
||||
|
@ -219,7 +220,6 @@ users).")
|
|||
;; We avoid `no-littering' because it's a mote too opinionated for our needs.
|
||||
(setq async-byte-compile-log-file (concat doom-etc-dir "async-bytecomp.log")
|
||||
custom-file (concat doom-private-dir "custom.el")
|
||||
custom-theme-directory (concat doom-private-dir "themes/")
|
||||
desktop-dirname (concat doom-etc-dir "desktop")
|
||||
desktop-base-file-name "autosave"
|
||||
desktop-base-lock-name "autosave-lock"
|
||||
|
@ -247,8 +247,7 @@ config.el instead."
|
|||
;;; Optimizations
|
||||
|
||||
;; A second, case-insensitive pass over `auto-mode-alist' is time wasted, and
|
||||
;; indicates misconfiguration (or that the user needs to stop relying on case
|
||||
;; insensitivity).
|
||||
;; indicates misconfiguration (don't rely on case insensitivity for file names).
|
||||
(setq auto-mode-case-fold nil)
|
||||
|
||||
;; Disable bidirectional text rendering for a modest performance boost. I've set
|
||||
|
@ -296,6 +295,10 @@ config.el instead."
|
|||
;; usage, however!
|
||||
(setq inhibit-compacting-font-caches t)
|
||||
|
||||
;; Introduced in Emacs HEAD (b2f8c9f), this inhibits fontification while
|
||||
;; receiving input, which should help with performance while scrolling.
|
||||
(setq redisplay-skip-fontification-on-input t)
|
||||
|
||||
;; Performance on Windows is considerably worse than elsewhere. We'll need
|
||||
;; everything we can get.
|
||||
(when IS-WINDOWS
|
||||
|
@ -378,7 +381,7 @@ config.el instead."
|
|||
|
||||
(defvar doom-incremental-packages '(t)
|
||||
"A list of packages to load incrementally after startup. Any large packages
|
||||
here may cause noticable pauses, so it's recommended you break them up into
|
||||
here may cause noticeable pauses, so it's recommended you break them up into
|
||||
sub-packages. For example, `org' is comprised of many packages, and can be
|
||||
broken up into:
|
||||
|
||||
|
@ -612,7 +615,7 @@ to least)."
|
|||
(eval-after-load 'straight '(doom-initialize-packages))
|
||||
|
||||
;; Bootstrap our GC manager
|
||||
(add-hook 'doom-first-input-hook #'gcmh-mode)
|
||||
(add-hook 'doom-first-buffer-hook #'gcmh-mode)
|
||||
|
||||
;; Bootstrap the interactive session
|
||||
(add-hook 'after-change-major-mode-hook #'doom-run-local-var-hooks-h)
|
||||
|
|
|
@ -17,33 +17,28 @@
|
|||
:branch ,straight-repository-branch
|
||||
:local-repo "straight.el"
|
||||
:files ("straight*.el"))
|
||||
:pin "3277e1c9648b41dd5bfb239c067b8374ed2ec2bb")
|
||||
:pin "f2cb888f088a790bac8731b95eeec3df068cac5f")
|
||||
|
||||
;; core-modules.el
|
||||
(package! use-package
|
||||
:type 'core
|
||||
:pin "caa92f1d64fc25480551757d854b4b49981dfa6b")
|
||||
:pin "317137b07687f16ea97a2493b0a6768c9df381a0")
|
||||
|
||||
;; core-ui.el
|
||||
(package! all-the-icons :pin "6917b08f64dd8487e23769433d6cb9ba11f4152f")
|
||||
(package! all-the-icons :pin "5fa728399bd6233a82bbfd4f7cb203a1d7ede708")
|
||||
(package! hide-mode-line :pin "88888825b5b27b300683e662fa3be88d954b1cea")
|
||||
(package! highlight-numbers :pin "8b4744c7f46c72b1d3d599d4fb75ef8183dee307")
|
||||
(package! rainbow-delimiters :pin "f43d48a24602be3ec899345a3326ed0247b960c6")
|
||||
(package! restart-emacs :pin "e5707491d7ac20879465bb52e282ad1416748378")
|
||||
(package! restart-emacs :pin "1607da2bc657fe05ae01f7fdf26f716eafead02c")
|
||||
|
||||
;; core-editor.el
|
||||
(package! better-jumper :pin "fe548d22c9228b60d9c8a2a452a6c2e03dfdf238")
|
||||
(package! dtrt-indent :pin "a7ade6d244eeeda2ada9f7eca565491cea4b622a")
|
||||
(package! better-jumper :pin "411ecdf6e7a3e1b4ced7605070d2309e5fc46556")
|
||||
(package! dtrt-indent :pin "854b9a1ce93d9926018a0eb18e6e552769c5407d")
|
||||
(package! helpful :pin "584ecc887bb92133119f93a6716cdf7af0b51dca")
|
||||
(package! pcre2el :pin "0b5b2a2c173aab3fd14aac6cf5e90ad3bf58fa7d")
|
||||
(package! smartparens :pin "7f5825dd655942c3d56d14acabab1ffab1aa2ae2")
|
||||
(package! so-long
|
||||
:built-in 'prefer ; included in Emacs 27+
|
||||
;; REVIEW so-long is slated to be published to ELPA eventually, but until then
|
||||
;; I've created my own mirror for it because git.savannah.gnu.org runs
|
||||
;; on a potato.
|
||||
:recipe (:host github :repo "hlissner/emacs-so-long")
|
||||
:pin "ed666b0716f60e8988c455804de24b55919e71ca")
|
||||
(package! smartparens :pin "63695c64233d215a92bf08e762f643cdb595bdd9")
|
||||
;; DEPRECATED Built into Emacs 27+; remove when we drop 26 support
|
||||
(package! so-long :built-in 'prefer :pin "a5d445de4829b2327bd51dad2fb04291c7a0ec5f")
|
||||
(package! ws-butler
|
||||
;; Use my fork of ws-butler, which has a few choice improvements and
|
||||
;; optimizations (the original has been abandoned).
|
||||
|
@ -51,8 +46,8 @@
|
|||
:pin "2bb49d3ee7d2cba133bc7e9cdac416cd1c5e4fe0")
|
||||
|
||||
;; core-projects.el
|
||||
(package! projectile :pin "d1cfad008b1719a6bee17fbe9479db414c0dc5d9")
|
||||
(package! projectile :pin "fd5994762a90c2311e8aa40c37373f24e1743a55")
|
||||
|
||||
;; core-keybinds.el
|
||||
(package! general :pin "a0b17d207badf462311b2eef7c065b884462cb7c")
|
||||
(package! which-key :pin "ca268fd313d3fb2bd03a8b5e4bdcca675ce58ca7")
|
||||
(package! which-key :pin "c0608e812a8d1bc7aefeacdfaeb56a7272eabf44")
|
||||
|
|
|
@ -50,7 +50,7 @@ us know!
|
|||
- [[#installing-packages-from-external-sources][Installing packages from external sources]]
|
||||
- [[#pinning-packages-to-specific-commits][Pinning packages to specific commits]]
|
||||
- [[#disabling-packages][Disabling packages]]
|
||||
- [[#changing-a-recipe-for-a-included-package][Changing a recipe for a included package]]
|
||||
- [[#changing-a-recipe-for-an-included-package][Changing a recipe for an included package]]
|
||||
- [[#usingloading-local-packages][Using/loading local packages]]
|
||||
- [[#configuring-doom][Configuring Doom]]
|
||||
- [[#configuring-packages][Configuring packages]]
|
||||
|
@ -886,7 +886,7 @@ packages:
|
|||
ensure your changes take effect.
|
||||
#+end_quote
|
||||
|
||||
*** Changing a recipe for a included package
|
||||
*** Changing a recipe for an included package
|
||||
If a Doom module installs package X from one place, but you'd like to install it
|
||||
from another (say, a superior fork), add a ~package!~ declaration for it in your
|
||||
=DOOMDIR/packages.el=. Your private declarations always have precedence over
|
||||
|
@ -932,9 +932,9 @@ live testing. To do this specify a ~:local-repo~ in that package's recipe:
|
|||
;; you want:
|
||||
:files ("*.el" "src/lisp/*.el")
|
||||
|
||||
;; With ':no-byte-compile t' you can avoid having to run 'doom sync'
|
||||
;; every time you change the package.
|
||||
:no-byte-compile t))
|
||||
;; With this you can avoid having to run 'doom sync' every time you
|
||||
;; change the package.
|
||||
:build (:not compile)))
|
||||
#+END_SRC
|
||||
|
||||
Alternatively, add the package's location to Emacs' ~load-path~. Do this if you
|
||||
|
@ -1176,7 +1176,7 @@ Placing this on top of a lisp form will do one of two things:
|
|||
=~/.emacs.d/.local/autoloads.el=, which is read very early in the startup
|
||||
process).
|
||||
2. Or copy that lisp form to Doom's autoload file verbatim (usually the case for
|
||||
anything other then ~def*~ forms, like ~defun~ or ~defmacro~).
|
||||
anything other than ~def*~ forms, like ~defun~ or ~defmacro~).
|
||||
|
||||
Doom's autoload file is generated by scanning these files when you execute ~doom
|
||||
sync~.
|
||||
|
@ -1414,9 +1414,9 @@ org module documentation]] for details on how to add support for it.
|
|||
#+END_SRC
|
||||
|
||||
These two lines are a common sight in Emacs configs, but they are unnecessary
|
||||
for Doom Emacs. We already use the more sophisticated =wsbutler= to manage
|
||||
for Doom Emacs. We already use the more sophisticated =ws-butler= to manage
|
||||
extraneous whitespace. However, you might have the impression that it isn't
|
||||
working. That's because =wsbutler= works in two unusual ways, meant to be less
|
||||
working. That's because =ws-butler= works in two unusual ways, meant to be less
|
||||
imposing than its alternatives:
|
||||
|
||||
1. It only cleans up trailing whitespace /on lines that you've touched/ (but
|
||||
|
@ -1431,7 +1431,7 @@ imposing than its alternatives:
|
|||
However, if it's truly deliberate, ~M-x delete-trailing-whitespaces~ and ~M-x
|
||||
whitespace-cleanup~ are available to be called =deliberately=, instead.
|
||||
|
||||
2. =wsbutler= replaces trailing whitespace and newlines with *virtual*
|
||||
2. =ws-butler= replaces trailing whitespace and newlines with *virtual*
|
||||
whitespace. This is whitespace that only exists in the Emacs buffer, but
|
||||
isn't actually written to the file.
|
||||
|
||||
|
@ -1470,7 +1470,7 @@ provide tools to make this easier. Here are a few things you can try, first:
|
|||
issues that originate from upstream.
|
||||
|
||||
+ If you happen to know what module(s) are relevant to your issue, check their
|
||||
documentation (press =<leader> h m= to jump to a module's documentation). Your
|
||||
documentation (press =<leader> h d m= to jump to a module's documentation). Your
|
||||
issue may be documented.
|
||||
|
||||
+ If possible, see if the issue can be reproduced in vanilla Emacs (Emacs
|
||||
|
@ -1559,9 +1559,9 @@ and before the subcommand. This will be fixed eventually.
|
|||
Often, you may find it helpful for debugging to evaluate some Emacs Lisp. Here
|
||||
are couple things you can do:
|
||||
|
||||
+ Use =M-;= (bound to ~eval-expression~),
|
||||
+ Use =M-:= (bound to ~eval-expression~),
|
||||
+ =SPC x= will open a scratch buffer. ~M-x emacs-lisp-mode~ will change it to
|
||||
the appropriate major mode, then use ~+eval:region~ (=gr=) and ~+eval:buffer~
|
||||
the appropriate major mode, then use ~+eval:region~ (=gr=) and ~+eval/buffer~
|
||||
(=gR=) to evaluate code,
|
||||
|
||||
** How to determine the origin of a bug
|
||||
|
@ -1571,7 +1571,7 @@ in a fresh instance of Emacs with varying amounts of Doom loaded (none at all,
|
|||
all of it, or somewhere in between). This can be helpful for isolating bugs to
|
||||
determine who you should report a bug to.
|
||||
|
||||
If you can recreate a bug in vanilla Emacs than it should be reported to the
|
||||
If you can recreate a bug in vanilla Emacs then it should be reported to the
|
||||
developers of the relevant packages or, perhaps, the Emacs devs themselves.
|
||||
|
||||
Otherwise, it is best to bring it up on the Doom Emacs issue list, rather than
|
||||
|
|
|
@ -1,28 +1,43 @@
|
|||
;;; early-init.el -*- lexical-binding: t; -*-
|
||||
|
||||
;; Emacs HEAD (27+) introduces early-init.el, which is run before init.el,
|
||||
;; before package and UI initialization happens.
|
||||
;; Emacs 27.1 introduced early-init.el, which is run before init.el, before
|
||||
;; package and UI initialization happens, and before site files are loaded.
|
||||
|
||||
;; Defer garbage collection further back in the startup process
|
||||
;; A big contributor to startup times is garbage collection. We up the gc
|
||||
;; threshold to temporarily prevent it from running, then reset it later by
|
||||
;; enabling `gcmh-mode'. Not resetting it will cause stuttering/freezes.
|
||||
(setq gc-cons-threshold most-positive-fixnum)
|
||||
|
||||
;; In noninteractive sessions, prioritize non-byte-compiled source files to
|
||||
;; prevent the use of stale byte-code. Otherwise, it saves us a little IO time
|
||||
;; to skip the mtime checks on every *.elc file.
|
||||
(setq load-prefer-newer noninteractive)
|
||||
|
||||
;; In Emacs 27+, package initialization occurs before `user-init-file' is
|
||||
;; loaded, but after `early-init-file'. Doom handles package initialization, so
|
||||
;; we must prevent Emacs from doing it early!
|
||||
(setq package-enable-at-startup nil)
|
||||
(fset #'package--ensure-init-file #'ignore) ; DEPRECATED Removed in 28
|
||||
|
||||
;; Prevent the glimpse of un-styled Emacs by disabling these UI elements early.
|
||||
(push '(menu-bar-lines . 0) default-frame-alist)
|
||||
(push '(tool-bar-lines . 0) default-frame-alist)
|
||||
(push '(vertical-scroll-bars) default-frame-alist)
|
||||
;; `file-name-handler-alist' is consulted on every `require', `load' and various
|
||||
;; path/io functions. You get a minor speed up by nooping this. However, this
|
||||
;; may cause problems on builds of Emacs where its site lisp files aren't
|
||||
;; byte-compiled and we're forced to load the *.el.gz files (e.g. on Alpine)
|
||||
(unless (daemonp)
|
||||
(defvar doom--initial-file-name-handler-alist file-name-handler-alist)
|
||||
(setq file-name-handler-alist nil)
|
||||
;; Restore `file-name-handler-alist' later, because it is needed for handling
|
||||
;; encrypted or compressed files, among other things.
|
||||
(defun doom-reset-file-handler-alist-h ()
|
||||
;; Re-add rather than `setq', because changes to `file-name-handler-alist'
|
||||
;; since startup ought to be preserved.
|
||||
(dolist (handler file-name-handler-alist)
|
||||
(add-to-list 'doom--initial-file-name-handler-alist handler))
|
||||
(setq file-name-handler-alist doom--initial-file-name-handler-alist))
|
||||
(add-hook 'emacs-startup-hook #'doom-reset-file-handler-alist-h))
|
||||
|
||||
;; Resizing the Emacs frame can be a terribly expensive part of changing the
|
||||
;; font. By inhibiting this, we easily halve startup times with fonts that are
|
||||
;; larger than the system default.
|
||||
(setq frame-inhibit-implied-resize t)
|
||||
;; Ensure Doom is running out of this file's directory
|
||||
(setq user-emacs-directory (file-name-directory load-file-name))
|
||||
|
||||
;; Prevent unwanted runtime builds in gccemacs (native-comp); packages are
|
||||
;; compiled ahead-of-time when they are installed and site files are compiled
|
||||
;; when gccemacs is installed.
|
||||
(setq comp-deferred-compilation nil)
|
||||
;; Load the heart of Doom Emacs
|
||||
(load (concat user-emacs-directory "core/core") nil 'nomessage)
|
||||
|
|
42
init.el
42
init.el
|
@ -27,43 +27,11 @@
|
|||
;;
|
||||
;;; License: MIT
|
||||
|
||||
(when (< emacs-major-version 26)
|
||||
(error "Detected Emacs v%s. Doom only supports Emacs 26 and newer"
|
||||
emacs-version))
|
||||
|
||||
;; A big contributor to startup times is garbage collection. We up the gc
|
||||
;; threshold to temporarily prevent it from running, then reset it later by
|
||||
;; enabling `gcmh-mode'. Not resetting it will cause stuttering/freezes.
|
||||
(setq gc-cons-threshold most-positive-fixnum)
|
||||
|
||||
;; In noninteractive sessions, prioritize non-byte-compiled source files to
|
||||
;; prevent the use of stale byte-code. Otherwise, it saves us a little IO time
|
||||
;; to skip the mtime checks on every *.elc file.
|
||||
(setq load-prefer-newer noninteractive)
|
||||
|
||||
;; `file-name-handler-alist' is consulted on every `require', `load' and various
|
||||
;; path/io functions. You get a minor speed up by nooping this. However, this
|
||||
;; may cause problems on builds of Emacs where its site lisp files aren't
|
||||
;; byte-compiled and we're forced to load the *.el.gz files (e.g. on Alpine)
|
||||
(unless (daemonp)
|
||||
(defvar doom--initial-file-name-handler-alist file-name-handler-alist)
|
||||
(setq file-name-handler-alist nil)
|
||||
;; Restore `file-name-handler-alist' later, because it is needed for handling
|
||||
;; encrypted or compressed files, among other things.
|
||||
(defun doom-reset-file-handler-alist-h ()
|
||||
;; Re-add rather than `setq', because changes to `file-name-handler-alist'
|
||||
;; since startup ought to be preserved.
|
||||
(dolist (handler file-name-handler-alist)
|
||||
(add-to-list 'doom--initial-file-name-handler-alist handler))
|
||||
(setq file-name-handler-alist doom--initial-file-name-handler-alist))
|
||||
(add-hook 'emacs-startup-hook #'doom-reset-file-handler-alist-h))
|
||||
|
||||
;; Ensure Doom is running out of this file's directory
|
||||
(setq user-emacs-directory (file-name-directory load-file-name))
|
||||
|
||||
;; Load the heart of Doom Emacs
|
||||
(load (concat user-emacs-directory "core/core")
|
||||
nil 'nomessage)
|
||||
;; In the strange case that early-init.el wasn't loaded (e.g. you're using
|
||||
;; Chemacs 1? Or you're loading this file directly?), we do it explicitly:
|
||||
(unless (boundp 'doom-version)
|
||||
(load (concat (file-name-directory load-file-name) "early-init")
|
||||
nil t))
|
||||
|
||||
;; And let 'er rip!
|
||||
(doom-initialize)
|
||||
|
|
|
@ -65,6 +65,7 @@ with anything other than =aspell= yet.
|
|||
|
||||
** Aspell
|
||||
+ Ubuntu: ~apt-get install aspell aspell-en~
|
||||
+ macOS: ~brew install aspell~
|
||||
+ Arch Linux: ~pacman -S aspell aspell-en~
|
||||
+ NixOS:
|
||||
#+BEGIN_SRC nix
|
||||
|
@ -75,10 +76,22 @@ with anything other than =aspell= yet.
|
|||
}
|
||||
#+END_SRC
|
||||
|
||||
** TODO Hunspell
|
||||
** Hunspell
|
||||
+ Ubuntu: ~apt-get install hunspell~
|
||||
+ macOS: ~brew install hunspell~
|
||||
+ Arch Linux: ~pacman -S hunspell~
|
||||
+ NixOS:
|
||||
#+BEGIN_SRC nix
|
||||
{
|
||||
environment.systemPackages = with pkgs; [
|
||||
hunspell
|
||||
];
|
||||
}
|
||||
#+END_SRC
|
||||
|
||||
** Enchant
|
||||
+ Ubuntu: ~apt-get install enchant-2~
|
||||
+ macOS: ~brew install enchant~
|
||||
+ Arch Linux: ~pacman -S enchant~
|
||||
+ NixOS:
|
||||
#+BEGIN_SRC nix
|
||||
|
|
|
@ -65,7 +65,8 @@
|
|||
(featurep! :completion helm)))
|
||||
(call-interactively #'ispell-word)
|
||||
(cl-destructuring-bind (start . end)
|
||||
(bounds-of-thing-at-point 'word)
|
||||
(or (bounds-of-thing-at-point 'word)
|
||||
(user-error "No word at point"))
|
||||
(let ((word (thing-at-point 'word t))
|
||||
(orig-pt (point))
|
||||
poss ispell-filter)
|
||||
|
|
|
@ -32,8 +32,6 @@
|
|||
ispell-extra-args '("--sug-mode=ultra"
|
||||
"--run-together"))
|
||||
|
||||
(unless ispell-dictionary
|
||||
(setq ispell-dictionary "english"))
|
||||
(unless ispell-aspell-dict-dir
|
||||
(setq ispell-aspell-dict-dir
|
||||
(ispell-get-aspell-config-value "dict-dir")))
|
||||
|
@ -147,7 +145,7 @@
|
|||
(add-hook! 'spell-fu-mode-hook
|
||||
(defun +spell-init-excluded-faces-h ()
|
||||
"Set `spell-fu-faces-exclude' according to `+spell-excluded-faces-alist'."
|
||||
(when-let (excluded (alist-get major-mode +spell-excluded-faces-alist))
|
||||
(when-let (excluded (cdr (cl-find-if #'derived-mode-p +spell-excluded-faces-alist :key #'car)))
|
||||
(setq-local spell-fu-faces-exclude excluded))))
|
||||
|
||||
;; TODO custom `spell-fu-check-range' function to reduce false positives
|
||||
|
@ -199,7 +197,10 @@ e.g. proselint and langtool."
|
|||
(add-hook 'flyspell-mode-hook #'+spell-init-flyspell-predicate-h)
|
||||
|
||||
(let ((flyspell-correct
|
||||
(cmds! (and (not (or mark-active (ignore-errors (evil-insert-state-p))))
|
||||
(cmds! (and (not mark-active)
|
||||
(not (and (bound-and-true-p evil-local-mode)
|
||||
(or (evil-insert-state-p)
|
||||
(evil-emacs-state-p))))
|
||||
(memq 'flyspell-incorrect (face-at-point nil t)))
|
||||
#'flyspell-correct-at-point)))
|
||||
(map! :map flyspell-mouse-map
|
||||
|
|
|
@ -9,10 +9,10 @@
|
|||
:config
|
||||
(setq flycheck-emacs-lisp-load-path 'inherit)
|
||||
|
||||
;; 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 idle-buffer-switch))
|
||||
;; Rerunning checks on every newline is a mote excessive.
|
||||
(delq 'new-line flycheck-check-syntax-automatically)
|
||||
;; And don't recheck on idle as often
|
||||
(setq flycheck-idle-change-delay 1.0)
|
||||
|
||||
;; For the above functionality, check syntax in a buffer that you switched to
|
||||
;; only briefly. This allows "refreshing" the syntax check state for several
|
||||
|
@ -24,7 +24,9 @@
|
|||
|
||||
;; Don't commandeer input focus if the error message pops up (happens when
|
||||
;; tooltips and childframes are disabled).
|
||||
(set-popup-rule! "^\\*Flycheck error messages\\*" :select nil)
|
||||
(set-popup-rules!
|
||||
'(("^\\*Flycheck error messages\\*" :select nil)
|
||||
("^\\*Flycheck errors\\*" :size 0.25)))
|
||||
|
||||
(add-hook! 'doom-escape-hook :append
|
||||
(defun +syntax-check-buffer-h ()
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
;;;###autoload
|
||||
(defvar +company-backend-alist
|
||||
'((text-mode company-dabbrev company-yasnippet company-ispell)
|
||||
'((text-mode (:separate company-dabbrev company-yasnippet company-ispell))
|
||||
(prog-mode company-capf company-yasnippet)
|
||||
(conf-mode company-capf company-dabbrev-code company-yasnippet))
|
||||
"An alist matching modes to company backends. The backends for any mode is
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
(when (featurep! +fuzzy)
|
||||
(package! helm-flx :pin "6640fac5cb16bee73c95b8ed1248a4e5e113690e"))
|
||||
(when (featurep! +childframe)
|
||||
(package! posframe :pin "e1552c82dffaadc5e7de09a44880a498197ffbee"))
|
||||
(package! posframe :pin "efd7ea490defc53a5b78e7469a3a35d225b766cc"))
|
||||
(when (featurep! :lang org)
|
||||
(package! helm-org :pin "b7a18dfc17e8b933956d61d68c435eee03a96c24"))
|
||||
(package! helm-descbinds :pin "b72515982396b6e336ad7beb6767e95a80fca192")
|
||||
|
|
|
@ -59,6 +59,8 @@ results buffer.")
|
|||
(setq ivy-height 17
|
||||
ivy-wrap t
|
||||
ivy-fixed-height-minibuffer t
|
||||
ivy-read-action-function #'ivy-hydra-read-action
|
||||
ivy-read-action-format-function #'ivy-read-action-format-columns
|
||||
projectile-completion-system 'ivy
|
||||
;; don't show recent files in switch-buffer
|
||||
ivy-use-virtual-buffers nil
|
||||
|
@ -83,22 +85,22 @@ results buffer.")
|
|||
|
||||
(add-hook! 'minibuffer-exit-hook
|
||||
(defun +ivy--set-jump-point-maybe-h ()
|
||||
(and (markerp (bound-and-true-p +ivy--origin))
|
||||
(not (equal (ignore-errors (with-ivy-window (point-marker)))
|
||||
+ivy--origin))
|
||||
(when (markerp (bound-and-true-p +ivy--origin))
|
||||
(unless (equal (ignore-errors (with-ivy-window (point-marker)))
|
||||
+ivy--origin)
|
||||
(with-current-buffer (marker-buffer +ivy--origin)
|
||||
(better-jumper-set-jump +ivy--origin)))
|
||||
(set-marker +ivy--origin nil))
|
||||
(setq +ivy--origin nil)))
|
||||
|
||||
(after! yasnippet
|
||||
(add-hook 'yas-prompt-functions #'+ivy-yas-prompt-fn))
|
||||
|
||||
(defadvice! +ivy--inhibit-completion-in-region-a (orig-fn &rest args)
|
||||
"`ivy-completion-in-region' struggles with completing certain
|
||||
evil-ex-specific constructs, so we disable it solely in evil-ex."
|
||||
:around #'evil-ex
|
||||
(let ((completion-in-region-function #'completion--in-region))
|
||||
(apply orig-fn args)))
|
||||
(after! ivy-hydra
|
||||
;; Ensure `ivy-dispatching-done' and `hydra-ivy/body' hydras can be
|
||||
;; exited / toggled by the same key binding they were opened
|
||||
(add-to-list 'ivy-dispatching-done-hydra-exit-keys '("C-o" nil))
|
||||
(defhydra+ hydra-ivy () ("M-o" nil)))
|
||||
|
||||
(define-key! ivy-minibuffer-map
|
||||
[remap doom/delete-backward-word] #'ivy-backward-kill-word
|
||||
|
@ -182,6 +184,7 @@ evil-ex-specific constructs, so we disable it solely in evil-ex."
|
|||
[remap describe-face] #'counsel-faces
|
||||
[remap describe-function] #'counsel-describe-function
|
||||
[remap describe-variable] #'counsel-describe-variable
|
||||
[remap describe-symbol] #'counsel-describe-symbol
|
||||
[remap evil-ex-registers] #'counsel-evil-registers
|
||||
[remap evil-show-marks] #'counsel-mark-ring
|
||||
[remap execute-extended-command] #'counsel-M-x
|
||||
|
@ -220,19 +223,14 @@ evil-ex-specific constructs, so we disable it solely in evil-ex."
|
|||
(when (stringp counsel-rg-base-command)
|
||||
(setq counsel-rg-base-command (split-string counsel-rg-base-command)))
|
||||
|
||||
;; REVIEW Fix #3215: prevents mingw on Windows throwing an error trying to
|
||||
;; expand / to an absolute path. Remove this when it is fixed upstream
|
||||
;; in counsel.
|
||||
(when (and (memq system-type '(windows-nt ms-dos))
|
||||
(listp counsel-rg-base-command)
|
||||
(member "--path-separator" counsel-rg-base-command))
|
||||
(setf (cadr (member "--path-separator" counsel-rg-base-command))
|
||||
"/"))
|
||||
|
||||
;; Integrate with `helpful'
|
||||
(setq counsel-describe-function-function #'helpful-callable
|
||||
counsel-describe-variable-function #'helpful-variable)
|
||||
|
||||
;; Decorate `doom/help-custom-variable' results the same way as
|
||||
;; `counsel-describe-variable' (adds value and docstring columns).
|
||||
(ivy-configure 'doom/help-custom-variable :parent 'counsel-describe-variable)
|
||||
|
||||
;; Record in jumplist when opening files via counsel-{ag,rg,pt,git-grep}
|
||||
(add-hook 'counsel-grep-post-action-hook #'better-jumper-set-jump)
|
||||
(add-hook 'counsel-grep-post-action-hook #'recenter)
|
||||
|
@ -285,15 +283,15 @@ evil-ex-specific constructs, so we disable it solely in evil-ex."
|
|||
"Change `counsel-file-jump' to use fd or ripgrep, if they are available."
|
||||
:override #'counsel--find-return-list
|
||||
(cl-destructuring-bind (find-program . args)
|
||||
(cond ((when-let (fd (executable-find (or doom-projectile-fd-binary "fd")))
|
||||
(cond ((when-let (fd (executable-find (or doom-projectile-fd-binary "fd") t))
|
||||
(append (list fd "-H" "--color=never" "--type" "file" "--type" "symlink" "--follow")
|
||||
(if IS-WINDOWS '("--path-separator=/")))))
|
||||
((executable-find "rg")
|
||||
((executable-find "rg" t)
|
||||
(append (list "rg" "--files" "--follow" "--color=never" "--hidden" "-g!.git" "--no-messages")
|
||||
(cl-loop for dir in projectile-globally-ignored-directories
|
||||
collect "--glob"
|
||||
collect (concat "!" dir))
|
||||
(if IS-WINDOWS (list "--path-separator" "/"))))
|
||||
(if IS-WINDOWS '("--path-separator=/"))))
|
||||
((cons find-program args)))
|
||||
(unless (listp args)
|
||||
(user-error "`counsel-file-jump-args' is a list now, please customize accordingly."))
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
;; -*- no-byte-compile: t; -*-
|
||||
;;; completion/ivy/packages.el
|
||||
|
||||
(package! swiper :pin "778d8bffa33ae0bf432aa23370bb2a535d2132ce")
|
||||
(package! swiper :pin "d2891aab7b816aebf21ebd01ce33933a6ac6244f")
|
||||
(package! ivy)
|
||||
(package! ivy-hydra)
|
||||
(package! ivy-avy)
|
||||
|
@ -9,16 +9,16 @@
|
|||
|
||||
(package! amx :pin "ccfc92c600df681df5e8b5fecec328c462ceb71e")
|
||||
(package! counsel-projectile :pin "06b03c1080d3ccc3fa9b9c41b1ccbcf13f058e4b")
|
||||
(package! ivy-rich :pin "c0a164ce42920df0629c87dad5ea1bddc79ceac3")
|
||||
(package! ivy-rich :pin "f8a1f5c90d2a113b597ef5903634c089fce3365b")
|
||||
(package! wgrep :pin "f0ef9bfa44db503cdb2f83fcfbd2fa4e2382ef1f")
|
||||
|
||||
(if (featurep! +prescient)
|
||||
(package! ivy-prescient :pin "5d139e5b1fe03ccaddff8c250ab8e9d795071b95")
|
||||
(package! ivy-prescient :pin "42adc802d3ba6c747bed7ea1f6e3ffbbdfc7192d")
|
||||
(when (featurep! +fuzzy)
|
||||
(package! flx :pin "647cb2f92f9936c62e277d7a74ad54a80502d255")))
|
||||
|
||||
(when (featurep! +childframe)
|
||||
(package! ivy-posframe :pin "08a00b81747c6b623dd1adc7491a1e2a4c3a3d2a"))
|
||||
(package! ivy-posframe :pin "83047d440ff132d5a45acde5955f71853edeefb9"))
|
||||
|
||||
(when (featurep! +icons)
|
||||
(package! all-the-icons-ivy :pin "a70cbfa1effe36efc946a823a580cec686d5e88d"))
|
||||
|
|
|
@ -72,7 +72,7 @@
|
|||
:desc "Find file from here" "F" #'+default/find-file-under-here
|
||||
:desc "Locate file" "l" #'locate
|
||||
:desc "Rename/move this file" "m" #'doom/move-this-file
|
||||
:desc "Find file in private config" "p" #'doom/open-private-config
|
||||
:desc "Find file in private config" "p" #'doom/find-file-in-private-config
|
||||
:desc "Browse private config" "P" #'doom/open-private-config
|
||||
:desc "Recent files" "r" #'recentf-open-files
|
||||
:desc "Recent project files" "R" #'projectile-recentf
|
||||
|
@ -307,6 +307,7 @@
|
|||
:desc "Jump to previous hunk" "p" #'git-gutter:previous-hunk)
|
||||
(:when (featurep! :tools magit)
|
||||
:desc "Magit dispatch" "/" #'magit-dispatch
|
||||
:desc "Magit file dispatch" "." #'magit-file-dispatch
|
||||
:desc "Forge dispatch" "'" #'forge-dispatch
|
||||
:desc "Magit status" "g" #'magit-status
|
||||
:desc "Magit status here" "G" #'magit-status-here
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
(use-package! expand-region
|
||||
:commands (er/contract-region er/mark-symbol er/mark-word)
|
||||
:config
|
||||
(defadvice! doom--quit-expand-region-a ()
|
||||
(defadvice! doom--quit-expand-region-a (&rest _)
|
||||
"Properly abort an expand-region region."
|
||||
:before '(evil-escape doom/escape)
|
||||
(when (memq last-command '(er/expand-region er/contract-region))
|
||||
|
|
|
@ -411,6 +411,7 @@
|
|||
:desc "Jump to previous hunk" "[" #'git-gutter:previous-hunk)
|
||||
(:when (featurep! :tools magit)
|
||||
:desc "Magit dispatch" "/" #'magit-dispatch
|
||||
:desc "Magit file dispatch" "." #'magit-file-dispatch
|
||||
:desc "Forge dispatch" "'" #'forge-dispatch
|
||||
:desc "Magit switch branch" "b" #'magit-branch-checkout
|
||||
:desc "Magit status" "g" #'magit-status
|
||||
|
|
|
@ -45,9 +45,16 @@ If prefix ARG is non-nil, prompt for the search path."
|
|||
(interactive "P")
|
||||
(if arg
|
||||
(call-interactively #'projectile-discover-projects-in-directory)
|
||||
(if projectile-project-search-path
|
||||
(mapc #'projectile-discover-projects-in-directory projectile-project-search-path)
|
||||
(user-error "`projectile-project-search-path' is empty; don't know where to search"))))
|
||||
(if (not projectile-project-search-path)
|
||||
(user-error "`projectile-project-search-path' is empty; don't know where to search")
|
||||
(letf! (defun projectile-add-known-project (project-root)
|
||||
(unless (projectile-ignored-project-p project-root)
|
||||
(funcall projectile-add-known-project project-root)
|
||||
(message "Added %S to known project roots" project-root)))
|
||||
(dolist (dir projectile-project-search-path)
|
||||
(if (not (file-accessible-directory-p dir))
|
||||
(message "%S was inaccessible and couldn't searched" dir)
|
||||
(projectile-discover-projects-in-directory dir)))))))
|
||||
|
||||
;;;###autoload
|
||||
(defun +default/dired (arg)
|
||||
|
|
|
@ -310,7 +310,7 @@ Continues comments if executed from a commented line. Consults
|
|||
"M" #'doom/describe-active-minor-mode
|
||||
"O" #'+lookup/online
|
||||
"T" #'doom/toggle-profiler
|
||||
"V" #'set-variable
|
||||
"V" #'doom/help-custom-variable
|
||||
"W" #'+default/man-or-woman
|
||||
"C-k" #'describe-key-briefly
|
||||
"C-l" #'describe-language-environment
|
||||
|
|
|
@ -106,7 +106,7 @@ more information on modifiers."
|
|||
(cond ((sp-point-in-comment pos)
|
||||
(setq evil-auto-indent nil)
|
||||
(if comment-line-break-function
|
||||
(funcall comment-line-break-function)
|
||||
(funcall comment-line-break-function nil)
|
||||
(comment-indent-new-line)))
|
||||
;; TODO Find a better way to do this
|
||||
((and (eq major-mode 'haskell-mode)
|
||||
|
@ -121,7 +121,8 @@ more information on modifiers."
|
|||
(defun +evil--insert-newline-below-and-respect-comments-a (orig-fn count)
|
||||
(if (or (not +evil-want-o/O-to-continue-comments)
|
||||
(not (eq this-command 'evil-open-below))
|
||||
(evil-insert-state-p))
|
||||
(evil-insert-state-p)
|
||||
(evil-emacs-state-p))
|
||||
(funcall orig-fn count)
|
||||
(letf! (defun evil-insert-newline-below () (+evil--insert-newline))
|
||||
(let ((evil-auto-indent evil-auto-indent))
|
||||
|
@ -131,7 +132,8 @@ more information on modifiers."
|
|||
(defun +evil--insert-newline-above-and-respect-comments-a (orig-fn count)
|
||||
(if (or (not +evil-want-o/O-to-continue-comments)
|
||||
(not (eq this-command 'evil-open-above))
|
||||
(evil-insert-state-p))
|
||||
(evil-insert-state-p)
|
||||
(evil-emacs-state-p))
|
||||
(funcall orig-fn count)
|
||||
(letf! (defun evil-insert-newline-above () (+evil--insert-newline 'above))
|
||||
(let ((evil-auto-indent evil-auto-indent))
|
||||
|
@ -188,6 +190,7 @@ From https://github.com/emacs-evil/evil/issues/606"
|
|||
(let* ((count (count-lines beg end))
|
||||
(count (if (> count 1) (1- count) count))
|
||||
(fixup-mark (make-marker)))
|
||||
(unwind-protect
|
||||
(dotimes (var count)
|
||||
(if (and (bolp) (eolp))
|
||||
(join-line 1)
|
||||
|
@ -197,7 +200,7 @@ From https://github.com/emacs-evil/evil/issues/606"
|
|||
(fill-region-as-paragraph beg end nil t)
|
||||
(goto-char fixup-mark)
|
||||
(fixup-whitespace))))
|
||||
(set-marker fixup-mark nil)))
|
||||
(set-marker fixup-mark nil))))
|
||||
|
||||
;;;###autoload
|
||||
(defun +evil--fix-dabbrev-in-minibuffer-h ()
|
||||
|
|
|
@ -15,18 +15,18 @@
|
|||
;;; Interactive commands
|
||||
|
||||
;;;###autoload
|
||||
(defun +evil/visual-indent ()
|
||||
(defun +evil/shift-right ()
|
||||
"vnoremap < <gv"
|
||||
(interactive)
|
||||
(evil-shift-right (region-beginning) (region-end))
|
||||
(call-interactively #'evil-shift-right)
|
||||
(evil-normal-state)
|
||||
(evil-visual-restore))
|
||||
|
||||
;;;###autoload
|
||||
(defun +evil/visual-dedent ()
|
||||
(defun +evil/shift-left ()
|
||||
"vnoremap > >gv"
|
||||
(interactive)
|
||||
(evil-shift-left (region-beginning) (region-end))
|
||||
(call-interactively #'evil-shift-left)
|
||||
(evil-normal-state)
|
||||
(evil-visual-restore))
|
||||
|
||||
|
@ -123,7 +123,7 @@ the only window, use evil-window-move-* (e.g. `evil-window-move-far-left')."
|
|||
"Wrapper around `doom/retab'."
|
||||
:motion nil :move-point nil :type line
|
||||
(interactive "<r>")
|
||||
(doom/retab beg end))
|
||||
(doom/retab nil beg end))
|
||||
|
||||
;;;###autoload (autoload '+evil:narrow-buffer "editor/evil/autoload/evil" nil t)
|
||||
(evil-define-operator +evil:narrow-buffer (beg end &optional bang)
|
||||
|
|
|
@ -20,7 +20,7 @@ directives. By default, this only recognizes C directives.")
|
|||
;; Set these defaults before `evil'; use `defvar' so they can be changed prior
|
||||
;; to loading.
|
||||
(defvar evil-want-C-g-bindings t)
|
||||
(defvar evil-want-C-i-jump (or (daemonp) (display-graphic-p)))
|
||||
(defvar evil-want-C-i-jump nil) ; we do this ourselves
|
||||
(defvar evil-want-C-u-scroll t) ; moved the universal arg to <leader> u
|
||||
(defvar evil-want-C-u-delete t)
|
||||
(defvar evil-want-C-w-scroll t)
|
||||
|
@ -66,7 +66,7 @@ directives. By default, this only recognizes C directives.")
|
|||
(put 'evil-define-key* 'lisp-indent-function 'defun)
|
||||
|
||||
;; stop copying each visual state move to the clipboard:
|
||||
;; https://bitbucket.org/lyro/evil/issue/336/osx-visual-state-copies-the-region-on
|
||||
;; https://github.com/emacs-evil/evil/issues/336
|
||||
;; grokked from:
|
||||
;; http://stackoverflow.com/questions/15873346/elisp-rename-macro
|
||||
(advice-add #'evil-visual-update-x-selection :override #'ignore)
|
||||
|
@ -419,6 +419,8 @@ directives. By default, this only recognizes C directives.")
|
|||
;; zu{q,w} - undo last marking
|
||||
|
||||
(map! :v "@" #'+evil:apply-macro
|
||||
:m [C-i] #'evil-jump-forward
|
||||
:m [tab] #'evil-jump-item
|
||||
|
||||
;; implement dictionary keybinds
|
||||
;; evil already defines 'z=' to `ispell-word' = correct word at point
|
||||
|
@ -516,8 +518,8 @@ directives. By default, this only recognizes C directives.")
|
|||
:n "zx" #'kill-current-buffer
|
||||
:n "ZX" #'doom/save-and-kill-buffer
|
||||
;; don't leave visual mode after shifting
|
||||
:v "<" #'+evil/visual-dedent ; vnoremap < <gv
|
||||
:v ">" #'+evil/visual-indent ; vnoremap > >gv
|
||||
:v "<" #'+evil/shift-left ; vnoremap < <gv
|
||||
:v ">" #'+evil/shift-right ; vnoremap > >gv
|
||||
|
||||
;; window management (prefix "C-w")
|
||||
(:map evil-window-map
|
||||
|
|
|
@ -37,7 +37,6 @@
|
|||
elisp-mode
|
||||
ert
|
||||
free-keys
|
||||
help
|
||||
helm
|
||||
indent
|
||||
image
|
||||
|
@ -95,6 +94,7 @@ variable for an explanation of the defaults (in comments). See
|
|||
comint
|
||||
company
|
||||
compile
|
||||
consult
|
||||
(custom cus-edit)
|
||||
cus-theme
|
||||
daemons
|
||||
|
@ -102,6 +102,7 @@ variable for an explanation of the defaults (in comments). See
|
|||
deadgrep
|
||||
debbugs
|
||||
debug
|
||||
dictionary
|
||||
diff-mode
|
||||
dired
|
||||
dired-sidebar
|
||||
|
@ -187,10 +188,12 @@ variable for an explanation of the defaults (in comments). See
|
|||
python
|
||||
quickrun
|
||||
racer
|
||||
racket-describe
|
||||
realgud
|
||||
reftex
|
||||
restclient
|
||||
rg
|
||||
ripgrep
|
||||
rjsx-mode
|
||||
robe
|
||||
rtags
|
||||
|
@ -263,10 +266,15 @@ and complains if a module is loaded too early (during startup)."
|
|||
"q" #'kill-current-buffer
|
||||
"d" #'process-menu-delete-process)
|
||||
|
||||
(mapc #'+evil-collection-init '(comint custom help)))
|
||||
(mapc #'+evil-collection-init '(comint custom)))
|
||||
|
||||
;; ...or on first invokation of their associated major/minor modes.
|
||||
(after! evil
|
||||
;; Emacs loads these two packages immediately, at startup, which needlessly
|
||||
;; convolutes load order for evil-collection-help.
|
||||
(defer-feature! help help-mode)
|
||||
(defer-feature! help-mode help-mode)
|
||||
|
||||
(add-transient-hook! 'Buffer-menu-mode
|
||||
(+evil-collection-init '(buff-menu "buff-menu")))
|
||||
(add-transient-hook! 'image-mode
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
;; -*- no-byte-compile: t; -*-
|
||||
;;; editor/evil/packages.el
|
||||
|
||||
(package! evil :pin "d6cf6680ec52733ea78dc530ed75fadc5171c758")
|
||||
(package! evil :pin "cc9d6886b418389752a0591b9fcb270e83234cf9")
|
||||
(package! evil-args :pin "758ad5ae54ad34202064fec192c88151c08cb387")
|
||||
(package! evil-easymotion :pin "f96c2ed38ddc07908db7c3c11bcd6285a3e8c2e9")
|
||||
(package! evil-embrace :pin "4379adea032b25e359d01a36301b4a5afdd0d1b7")
|
||||
|
@ -18,7 +18,7 @@
|
|||
(package! evil-snipe :pin "6dcac7f2516c6137a2de532fc2c052f242559ee3")
|
||||
(package! evil-surround :pin "346d4d85fcf1f9517e9c4991c1efe68b4130f93a")
|
||||
(package! evil-textobj-anyblock :pin "ff00980f0634f95bf2ad9956b615a155ea8743be")
|
||||
(package! evil-traces :pin "bc25cae9fa5ab0ba1507827f0944f52ce0ca7462")
|
||||
(package! evil-traces :pin "290b5323542c46af364ec485c8ec9000040acf90")
|
||||
(package! evil-visualstar :pin "06c053d8f7381f91c53311b1234872ca96ced752")
|
||||
(package! exato :pin "aee7af7b7a0e7551478f453d1de7d5b9cb2e06c4")
|
||||
(package! evil-quick-diff
|
||||
|
@ -33,4 +33,4 @@
|
|||
(package! neotree)
|
||||
(autoload 'neotree-make-executor "neotree" nil nil 'macro))
|
||||
|
||||
(package! evil-collection :pin "ab5bb7c39199518d98035ef201096704a21a97ea"))
|
||||
(package! evil-collection :pin "e6824e2ad2f2ee7ddccf6f54db655a4cd37a13dc"))
|
||||
|
|
|
@ -1,15 +1,15 @@
|
|||
;;; `(file-name-nondirectory buffer-file-name)`${1: --- ${2:description}} -*- lexical-binding: t; -*-
|
||||
;;; `(file-name-nondirectory buffer-file-name)`${1: --- ${2:Description}} -*- lexical-binding: t; -*-
|
||||
;;
|
||||
;; Copyright (C) `(format-time-string "%Y")` `user-full-name`
|
||||
;;
|
||||
;; Author: `user-full-name` <http://github/`user-login-name`>
|
||||
;; Author: `user-full-name` <https://github.com/`(cl-find-if-not #'string-empty-p (list (cdr (doom-call-process "git" "config" "github.user")) user-login-name))`>
|
||||
;; Maintainer: `user-full-name` <`user-mail-address`>
|
||||
;; Created: `(format-time-string "%B %d, %Y")`
|
||||
;; Modified: `(format-time-string "%B %d, %Y")`
|
||||
;; Version: 0.0.1
|
||||
;; Keywords:
|
||||
;; Keywords: `(mapconcat #'symbol-name (mapcar #'car finder-known-keywords) " ")`
|
||||
;; Homepage: https://github.com/`user-login-name`/`(file-name-base buffer-file-name)`
|
||||
;; Package-Requires: ((emacs `emacs-version`) (cl-lib "0.5"))
|
||||
;; Package-Requires: ((emacs "24.3"))
|
||||
;;
|
||||
;; This file is not part of GNU Emacs.
|
||||
;;
|
||||
|
|
|
@ -225,9 +225,9 @@ If nil, BEG and/or END will default to the boundaries of the src block at point.
|
|||
(defun +format/buffer ()
|
||||
"Reformat the current buffer using LSP or `format-all-buffer'."
|
||||
(interactive)
|
||||
(if (and (eq major-mode 'org-mode)
|
||||
(org-in-src-block-p t))
|
||||
(+format--org-region nil nil)
|
||||
(if (eq major-mode 'org-mode)
|
||||
(when (org-in-src-block-p t)
|
||||
(+format--org-region nil nil))
|
||||
(call-interactively
|
||||
(cond ((and +format-with-lsp
|
||||
(bound-and-true-p lsp-mode)
|
||||
|
|
|
@ -168,7 +168,7 @@
|
|||
(defun +multiple-cursors-compat-back-to-previous-state-h ()
|
||||
(when +mc--compat-evil-prev-state
|
||||
(unwind-protect
|
||||
(case +mc--compat-evil-prev-state
|
||||
(cl-case +mc--compat-evil-prev-state
|
||||
((normal visual) (evil-force-normal-state))
|
||||
(t (message "Don't know how to handle previous state: %S"
|
||||
+mc--compat-evil-prev-state)))
|
||||
|
|
|
@ -33,6 +33,15 @@ ignored. This makes it easy to override built-in snippets with private ones."
|
|||
(make-directory dir t)
|
||||
(error "%S doesn't exist" (abbreviate-file-name dir)))))
|
||||
|
||||
(defun +snippet--get-template-by-uuid (uuid &optional mode)
|
||||
"Look up the template by uuid in child-most to parent-most mode order.
|
||||
Finds correctly active snippets from parent modes (based on Yas' logic)."
|
||||
(cl-loop with mode = (or mode major-mode)
|
||||
for active-mode in (yas--modes-to-activate mode)
|
||||
if (gethash active-mode yas--tables)
|
||||
if (gethash uuid (yas--table-uuidhash it))
|
||||
return it))
|
||||
|
||||
(defun +snippet--completing-read-uuid (prompt all-snippets &rest args)
|
||||
(plist-get
|
||||
(text-properties-at
|
||||
|
@ -169,7 +178,7 @@ buggy behavior when <delete> is pressed in an empty field."
|
|||
(interactive
|
||||
(list
|
||||
(+snippet--completing-read-uuid "Visit snippet: " current-prefix-arg)))
|
||||
(if-let* ((template (yas--get-template-by-uuid major-mode template-uuid))
|
||||
(if-let* ((template (+snippet--get-template-by-uuid template-uuid major-mode))
|
||||
(template-path (yas--template-load-file template)))
|
||||
(progn
|
||||
(unless (file-readable-p template-path)
|
||||
|
@ -242,7 +251,7 @@ shadow the default snippet)."
|
|||
(if-let* ((major-mode (if (eq major-mode 'snippet-mode)
|
||||
(intern (file-name-base (directory-file-name default-directory)))
|
||||
major-mode))
|
||||
(template (yas--get-template-by-uuid major-mode template-uuid))
|
||||
(template (+snippet--get-template-by-uuid template-uuid major-mode))
|
||||
(template-path (yas--template-load-file template)))
|
||||
(if (file-in-directory-p template-path +snippets-dir)
|
||||
(find-file template-path)
|
||||
|
@ -312,5 +321,7 @@ is."
|
|||
(defun region-end () evil-visual-end))
|
||||
(funcall orig-fn no-condition)))
|
||||
(when (and (bound-and-true-p evil-local-mode)
|
||||
(not (or (evil-emacs-state-p)
|
||||
(evil-insert-state-p)))
|
||||
(yas-active-snippets))
|
||||
(evil-insert-state +1)))
|
||||
|
|
|
@ -93,6 +93,7 @@ info in the `header-line-format' is a more visible indicator."
|
|||
"Start git-commit-mode in insert state if in a blank commit message,
|
||||
otherwise in default state."
|
||||
(when (and (bound-and-true-p evil-mode)
|
||||
(not (evil-emacs-state-p))
|
||||
(bobp) (eolp))
|
||||
(evil-insert-state)))))
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
(package! smerge-mode :built-in t)
|
||||
|
||||
(package! browse-at-remote :pin "fadf99d6d8e891f3b112e36c772e0eea0b9bc7f2")
|
||||
(package! git-commit :pin "2fb3bf782ccf5652b98f8de989f014749473eacf")
|
||||
(package! git-commit :pin "acfe22ab60a56c61aae3ca6d4f2b7b826fe3b071")
|
||||
(package! git-timemachine :pin "8d675750e921a047707fcdc36d84f8439b19a907")
|
||||
(package! gitconfig-mode :pin "55468314a5f6b77d2c96be62c7005ac94545e217")
|
||||
(package! gitignore-mode :pin "55468314a5f6b77d2c96be62c7005ac94545e217")
|
||||
|
|
|
@ -86,6 +86,11 @@ This module requires:
|
|||
| =<localleader> n N= | =cider-browse-ns-all= |
|
||||
| =<localleader> n n= | =cider-browse-ns= |
|
||||
| =<localleader> n r= | =cider-ns-refresh= |
|
||||
| =<localleader> p d= | =cider-pprint-eval-defun-at-point= |
|
||||
| =<localleader> p D= | =cider-pprint-eval-defun-to-comment= |
|
||||
| =<localleader> p p= | =cider-pprint-eval-last-sexp= |
|
||||
| =<localleader> p P= | =cider-pprint-eval-last-sexp-to-comment= |
|
||||
| =<localleader> p r= | =cider-pprint-eval-last-sexp-to-repl= |
|
||||
| =<localleader> r B= | =+clojure/cider-switch-to-repl-buffer-and-switch-ns= |
|
||||
| =<localleader> r L= | =cider-load-buffer-and-switch-to-repl-buffer= |
|
||||
| =<localleader> r R= | =cider-restart= |
|
||||
|
|
|
@ -126,6 +126,12 @@
|
|||
"n" #'cider-browse-ns
|
||||
"N" #'cider-browse-ns-all
|
||||
"r" #'cider-ns-refresh)
|
||||
(:prefix ("p" . "print")
|
||||
"p" #'cider-pprint-eval-last-sexp
|
||||
"P" #'cider-pprint-eval-last-sexp-to-comment
|
||||
"d" #'cider-pprint-eval-defun-at-point
|
||||
"D" #'cider-pprint-eval-defun-to-comment
|
||||
"r" #'cider-pprint-eval-last-sexp-to-repl)
|
||||
(:prefix ("r" . "repl")
|
||||
"n" #'cider-repl-set-ns
|
||||
"q" #'cider-quit
|
||||
|
|
|
@ -2,8 +2,8 @@
|
|||
;;; lang/clojure/packages.el
|
||||
|
||||
(package! clojure-mode :pin "53ef8ac076ae7811627fbdd408e519ab7fca9a0b")
|
||||
(package! cider :pin "ef47c1de151c212b8d2ddeb9af6c8b0dfc0e300f")
|
||||
(package! clj-refactor :pin "6db85b37b57497b56d97d5e5512160e5db85f798")
|
||||
(package! cider :pin "1a34f893e1fe81982fb5099192122a72ee8e94ea")
|
||||
(package! clj-refactor :pin "9dcc50da7ce6f3c10276c87f09022e80c03e8bef")
|
||||
|
||||
(when (featurep! :checkers syntax)
|
||||
(package! flycheck-clj-kondo :pin "a558bda44c4cb65b69fa53df233e8941ebd195c5"))
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
;;; lang/common-lisp/doctor.el -*- lexical-binding: t; -*-
|
||||
|
||||
(when (require 'sly nil t)
|
||||
(unless (executable-find inferior-lisp-program)
|
||||
(let ((prog-name (car (split-string inferior-lisp-program))))
|
||||
(unless (executable-find prog-name)
|
||||
(warn! "Couldn't find your `inferior-lisp-program' (%s). Is it installed?"
|
||||
inferior-lisp-program)))
|
||||
inferior-lisp-program))))
|
||||
|
|
|
@ -7,6 +7,26 @@
|
|||
(set-rotate-patterns! 'csharp-mode
|
||||
:symbols '(("public" "protected" "private")
|
||||
("class" "struct")))
|
||||
(set-ligatures! 'csharp-mode
|
||||
;; Functional
|
||||
:lambda "() =>"
|
||||
;; Types
|
||||
:null "null"
|
||||
:true "true"
|
||||
:false "false"
|
||||
:int "int"
|
||||
:float "float"
|
||||
:str "string"
|
||||
:bool "bool"
|
||||
:list "List"
|
||||
;; Flow
|
||||
:not "!"
|
||||
:in "in"
|
||||
:and "&&"
|
||||
:or "||"
|
||||
:for "for"
|
||||
:return "return"
|
||||
:yield "yield")
|
||||
|
||||
(sp-local-pair 'csharp-mode "<" ">"
|
||||
:when '(+csharp-sp-point-in-type-p)
|
||||
|
|
|
@ -61,7 +61,9 @@ to a pop up buffer."
|
|||
(defun +emacs-lisp-lookup-definition (_thing)
|
||||
"Lookup definition of THING."
|
||||
(if-let (module (+emacs-lisp--module-at-point))
|
||||
(doom/help-modules (car module) (cadr module) 'visit-dir)
|
||||
;; FIXME: this is probably a bug in `counsel'. See
|
||||
;; https://github.com/abo-abo/swiper/pull/2752.
|
||||
(progn (doom/help-modules (car module) (cadr module) 'visit-dir) 'deferred)
|
||||
(call-interactively #'elisp-def)))
|
||||
|
||||
;;;###autoload
|
||||
|
|
|
@ -99,6 +99,7 @@ employed so that flycheck still does *some* helpful linting.")
|
|||
"Display variable value next to documentation in eldoc."
|
||||
:around #'elisp-get-var-docstring
|
||||
(when-let (ret (funcall orig-fn sym))
|
||||
(if (fboundp sym)
|
||||
(concat ret " "
|
||||
(let* ((truncated " [...]")
|
||||
(print-escape-newlines t)
|
||||
|
@ -107,7 +108,8 @@ employed so that flycheck still does *some* helpful linting.")
|
|||
(limit (- (frame-width) (length ret) (length truncated) 1)))
|
||||
(format (format "%%0.%ds%%s" (max limit 0))
|
||||
(propertize str 'face 'warning)
|
||||
(if (< (length str) limit) "" truncated))))))
|
||||
(if (< (length str) limit) "" truncated))))
|
||||
ret)))
|
||||
|
||||
(map! :localleader
|
||||
:map emacs-lisp-mode-map
|
||||
|
@ -181,12 +183,12 @@ employed so that flycheck still does *some* helpful linting.")
|
|||
"Add Doom's own demos to help buffers."
|
||||
:around #'elisp-demos--search
|
||||
(or (funcall orig-fn symbol)
|
||||
(when-let (demos-file (doom-glob doom-docs-dir "api.org"))
|
||||
(when-let (demos-file (doom-module-locate-path :lang 'emacs-lisp "demos.org"))
|
||||
(with-temp-buffer
|
||||
(insert-file-contents demos-file)
|
||||
(goto-char (point-min))
|
||||
(when (re-search-forward
|
||||
(format "^\\*\\*\\* %s$" (regexp-quote (symbol-name symbol)))
|
||||
(format "^\\*\\* %s$" (regexp-quote (symbol-name symbol)))
|
||||
nil t)
|
||||
(let (beg end)
|
||||
(forward-line 1)
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
#+TITLE: API Demos
|
||||
#+PROPERTY: header-args:elisp :results pp
|
||||
|
||||
This appendix serves as a reference on how to use Doom Emacs' standard library.
|
||||
It is integrated into Helpful, in Doom.
|
||||
This file contains demos of Doom's public API; its core library, macros, and
|
||||
autodefs. It is used by the =elisp-demos= package to display examples of their
|
||||
usage from their documentation (e.g. =SPC h f add-hook\!=).
|
||||
|
||||
* Table of Contents :TOC_3:
|
||||
- [[#examples-for-dooms-library][Examples for Doom's library]]
|
||||
- [[#core-lib][core-lib]]
|
||||
- [[#add-hook][add-hook!]]
|
||||
- [[#add-transient-hook][add-transient-hook!]]
|
||||
|
@ -20,6 +20,8 @@ It is integrated into Helpful, in Doom.
|
|||
- [[#file-exists-p][file-exists-p!]]
|
||||
- [[#cmd][cmd!]]
|
||||
- [[#cmd-1][cmd!!]]
|
||||
- [[#cmds][cmds!]]
|
||||
- [[#kbd][kbd!]]
|
||||
- [[#letenv][letenv!]]
|
||||
- [[#load][load!]]
|
||||
- [[#map][map!]]
|
||||
|
@ -32,15 +34,9 @@ It is integrated into Helpful, in Doom.
|
|||
- [[#setq-hook][setq-hook!]]
|
||||
- [[#unsetq-hook][unsetq-hook!]]
|
||||
- [[#use-package][use-package!]]
|
||||
- [[#interesting-snippets][Interesting snippets]]
|
||||
- [[#center-emacs-initial-frame-with-a-fixed-size][Center Emacs' initial frame with a fixed size]]
|
||||
- [[#persist-emacs-initial-frame-position-dimensions-andor-full-screen-state-across-sessions][Persist Emacs' initial frame position, dimensions and/or full-screen state across sessions]]
|
||||
- [[#update-cursor-shape-under-terminal-emacs][Update cursor shape under terminal Emacs]]
|
||||
- [[#create-a-paste-transient-state-to-cycle-through-kill-ring-on-paste][Create a paste-transient-state to cycle through kill ring on paste]]
|
||||
|
||||
* Examples for Doom's library
|
||||
** core-lib
|
||||
*** add-hook!
|
||||
* core-lib
|
||||
** add-hook!
|
||||
#+BEGIN_SRC elisp :eval no
|
||||
;; With only one hook and one function, this is identical to `add-hook'. In that
|
||||
;; case, use that instead.
|
||||
|
@ -68,8 +64,8 @@ It is integrated into Helpful, in Doom.
|
|||
...))
|
||||
#+END_SRC
|
||||
|
||||
*** TODO add-transient-hook!
|
||||
*** after!
|
||||
** TODO add-transient-hook!
|
||||
** after!
|
||||
#+BEGIN_SRC elisp :eval no
|
||||
;;; `after!' will take:
|
||||
|
||||
|
@ -95,7 +91,7 @@ It is integrated into Helpful, in Doom.
|
|||
(after! rustic ...)
|
||||
(after! python ...)
|
||||
#+END_SRC
|
||||
*** appendq!
|
||||
** appendq!
|
||||
#+BEGIN_SRC elisp
|
||||
(let ((x '(a b c)))
|
||||
(appendq! x '(c d e))
|
||||
|
@ -116,7 +112,7 @@ It is integrated into Helpful, in Doom.
|
|||
#+RESULTS:
|
||||
: (a b c c d e f g h)
|
||||
|
||||
*** custom-set-faces!
|
||||
** custom-set-faces!
|
||||
#+BEGIN_SRC elisp :eval no
|
||||
(custom-set-faces!
|
||||
'(outline-1 :weight normal)
|
||||
|
@ -150,7 +146,7 @@ It is integrated into Helpful, in Doom.
|
|||
`(outline-2 :background ,(doom-color 'blue)))
|
||||
#+END_SRC
|
||||
|
||||
*** custom-theme-set-faces!
|
||||
** custom-theme-set-faces!
|
||||
#+BEGIN_SRC elisp :eval no
|
||||
(custom-theme-set-faces! 'doom-one
|
||||
'(outline-1 :weight normal)
|
||||
|
@ -184,15 +180,15 @@ It is integrated into Helpful, in Doom.
|
|||
`(outline-2 :background ,(doom-color 'blue)))
|
||||
#+END_SRC
|
||||
|
||||
*** TODO defer-feature!
|
||||
*** TODO defer-until!
|
||||
*** disable-packages!
|
||||
** TODO defer-feature!
|
||||
** TODO defer-until!
|
||||
** disable-packages!
|
||||
#+BEGIN_SRC elisp :eval no
|
||||
;; Disable packages enabled by DOOM
|
||||
(disable-packages! some-package second-package)
|
||||
#+END_SRC
|
||||
|
||||
*** doom!
|
||||
** doom!
|
||||
#+BEGIN_SRC elisp :eval no
|
||||
(doom! :completion
|
||||
company
|
||||
|
@ -222,7 +218,7 @@ It is integrated into Helpful, in Doom.
|
|||
(default +bindings +smartparens))
|
||||
#+END_SRC
|
||||
|
||||
*** file-exists-p!
|
||||
** file-exists-p!
|
||||
#+BEGIN_SRC elisp
|
||||
(file-exists-p! "init.el" doom-emacs-dir)
|
||||
#+END_SRC
|
||||
|
@ -239,12 +235,12 @@ It is integrated into Helpful, in Doom.
|
|||
#+RESULTS:
|
||||
: /home/hlissner/.emacs.d/LICENSE
|
||||
|
||||
*** cmd!
|
||||
** cmd!
|
||||
#+BEGIN_SRC elisp :eval no
|
||||
(map! "C-j" (cmd! (newline) (indent-according-to-mode)))
|
||||
#+END_SRC
|
||||
|
||||
*** cmd!!
|
||||
** cmd!!
|
||||
When ~newline~ is passed a numerical prefix argument (=C-u 5 M-x newline=), it
|
||||
inserts N newlines. We can use ~cmd!!~ to easily create a keybinds that bakes in
|
||||
the prefix arg into the command call:
|
||||
|
@ -263,7 +259,33 @@ Or to create aliases for functions that behave differently:
|
|||
(fset 'org-reset-global-visibility (cmd!! #'org-global-cycle '(4))
|
||||
#+END_SRC
|
||||
|
||||
*** letenv!
|
||||
** cmds!
|
||||
#+BEGIN_SRC elisp :eval no
|
||||
(map! :i [tab] (cmds! (and (featurep! :editor snippets)
|
||||
(bound-and-true-p yas-minor-mode)
|
||||
(yas-maybe-expand-abbrev-key-filter 'yas-expand))
|
||||
#'yas-expand
|
||||
(featurep! :completion company +tng)
|
||||
#'company-indent-or-complete-common)
|
||||
:m [tab] (cmds! (and (bound-and-true-p yas-minor-mode)
|
||||
(evil-visual-state-p)
|
||||
(or (eq evil-visual-selection 'line)
|
||||
(not (memq (char-after) (list ?\( ?\[ ?\{ ?\} ?\] ?\))))))
|
||||
#'yas-insert-snippet
|
||||
(and (featurep! :editor fold)
|
||||
(save-excursion (end-of-line) (invisible-p (point))))
|
||||
#'+fold/toggle
|
||||
(fboundp 'evil-jump-item)
|
||||
#'evil-jump-item))
|
||||
#+END_SRC
|
||||
|
||||
** kbd!
|
||||
#+BEGIN_SRC elisp :eval no
|
||||
(map! "," (kbd! "SPC")
|
||||
";" (kbd! ":"))
|
||||
#+END_SRC
|
||||
|
||||
** letenv!
|
||||
#+BEGIN_SRC elisp
|
||||
(letenv! (("SHELL" "/bin/sh"))
|
||||
(shell-command-to-string "echo $SHELL"))
|
||||
|
@ -272,7 +294,7 @@ Or to create aliases for functions that behave differently:
|
|||
#+RESULTS:
|
||||
: "/bin/sh\n"
|
||||
|
||||
*** load!
|
||||
** load!
|
||||
#+BEGIN_SRC elisp :eval no
|
||||
;;; Lets say we're in ~/.doom.d/config.el
|
||||
(load! "lisp/module") ; loads ~/.doom.d/lisp/module.el
|
||||
|
@ -283,7 +305,7 @@ Or to create aliases for functions that behave differently:
|
|||
(load! "~/.maynotexist" nil t)
|
||||
#+END_SRC
|
||||
|
||||
*** map!
|
||||
** map!
|
||||
#+BEGIN_SRC elisp :eval no
|
||||
(map! :map magit-mode-map
|
||||
:m "C-r" 'do-something ; C-r in motion state
|
||||
|
@ -378,7 +400,7 @@ These are side-by-side comparisons, showing how to bind keys with and without
|
|||
(:map go-lisp-mode :n "C-x x" #'do-something-else))
|
||||
#+END_SRC
|
||||
|
||||
*** package!
|
||||
** package!
|
||||
#+BEGIN_SRC elisp :eval no
|
||||
;; To install a package that can be found on ELPA or any of the sources
|
||||
;; specified in `straight-recipe-repositories':
|
||||
|
@ -410,7 +432,7 @@ These are side-by-side comparisons, showing how to bind keys with and without
|
|||
(package! evil :ignore (not (equal system-name "my-desktop")))
|
||||
#+END_SRC
|
||||
|
||||
*** pushnew!
|
||||
** pushnew!
|
||||
#+BEGIN_SRC elisp
|
||||
(let ((list '(a b c)))
|
||||
(pushnew! list 'c 'd 'e)
|
||||
|
@ -420,7 +442,7 @@ These are side-by-side comparisons, showing how to bind keys with and without
|
|||
#+RESULTS:
|
||||
: (e d a b c)
|
||||
|
||||
*** prependq!
|
||||
** prependq!
|
||||
#+BEGIN_SRC elisp
|
||||
(let ((x '(a b c)))
|
||||
(prependq! x '(c d e))
|
||||
|
@ -441,12 +463,12 @@ These are side-by-side comparisons, showing how to bind keys with and without
|
|||
#+RESULTS:
|
||||
: (c d e f g h a b c)
|
||||
|
||||
*** quiet!
|
||||
** quiet!
|
||||
#+BEGIN_SRC elisp :eval no
|
||||
;; Enters recentf-mode without extra output
|
||||
(quiet! (recentf-mode +1))
|
||||
#+END_SRC
|
||||
*** remove-hook!
|
||||
** remove-hook!
|
||||
#+BEGIN_SRC elisp :eval no
|
||||
;; With only one hook and one function, this is identical to `remove-hook'. In
|
||||
;; that case, use that instead.
|
||||
|
@ -464,7 +486,7 @@ These are side-by-side comparisons, showing how to bind keys with and without
|
|||
;; Removing arbitrary forms (must be exactly the same as the definition)
|
||||
(remove-hook! (one-mode second-mode) (setq v 5) (setq a 2))
|
||||
#+END_SRC
|
||||
*** setq!
|
||||
** setq!
|
||||
#+BEGIN_SRC elisp
|
||||
;; Each of these have a setter associated with them, which must be triggered in
|
||||
;; order for their new values to have an effect.
|
||||
|
@ -472,7 +494,7 @@ These are side-by-side comparisons, showing how to bind keys with and without
|
|||
evil-want-C-u-scroll nil
|
||||
evil-want-C-d-scroll nil)
|
||||
#+END_SRC
|
||||
*** setq-hook!
|
||||
** setq-hook!
|
||||
#+BEGIN_SRC elisp :eval no
|
||||
;; Set multiple variables after a hook
|
||||
(setq-hook! 'markdown-mode-hook
|
||||
|
@ -484,7 +506,7 @@ These are side-by-side comparisons, showing how to bind keys with and without
|
|||
hscroll-margin 0)
|
||||
#+END_SRC
|
||||
|
||||
*** unsetq-hook!
|
||||
** unsetq-hook!
|
||||
#+BEGIN_SRC elisp :eval no
|
||||
(unsetq-hook! 'markdown-mode-hook line-spacing)
|
||||
|
||||
|
@ -498,7 +520,7 @@ These are side-by-side comparisons, showing how to bind keys with and without
|
|||
(unsetq-hook! (one-mode second-mode) enable-something)
|
||||
#+END_SRC
|
||||
|
||||
*** use-package!
|
||||
** use-package!
|
||||
#+BEGIN_SRC elisp :eval no
|
||||
;; Use after-call to load package before hook
|
||||
(use-package! projectile
|
||||
|
@ -513,79 +535,3 @@ These are side-by-side comparisons, showing how to bind keys with and without
|
|||
(use-package! abc
|
||||
:defer-incrementally t)
|
||||
#+END_SRC
|
||||
* Interesting snippets
|
||||
** Center Emacs' initial frame with a fixed size
|
||||
#+BEGIN_SRC elisp
|
||||
(let ((width 500)
|
||||
(height 250)
|
||||
(display-height (display-pixel-height))
|
||||
(display-width (display-pixel-width)))
|
||||
(pushnew! initial-frame-alist
|
||||
`(left . ,(- (/ display-width 2) (/ width 2)))
|
||||
`(top . ,(- (/ display-height 2) (/ height 2)))
|
||||
`(width text-pixels ,width)
|
||||
`(height text-pixels ,height)))
|
||||
#+END_SRC
|
||||
|
||||
** Persist Emacs' initial frame position, dimensions and/or full-screen state across sessions
|
||||
#+BEGIN_SRC elisp
|
||||
;; add to ~/.doom.d/config.el
|
||||
(when-let (dims (doom-store-get 'last-frame-size))
|
||||
(cl-destructuring-bind ((left . top) width height fullscreen) dims
|
||||
(setq initial-frame-alist
|
||||
(append initial-frame-alist
|
||||
`((left . ,left)
|
||||
(top . ,top)
|
||||
(width . ,width)
|
||||
(height . ,height)
|
||||
(fullscreen . ,fullscreen))))))
|
||||
|
||||
(defun save-frame-dimensions ()
|
||||
(doom-store-put 'last-frame-size
|
||||
(list (frame-position)
|
||||
(frame-width)
|
||||
(frame-height)
|
||||
(frame-parameter nil 'fullscreen))))
|
||||
|
||||
(add-hook 'kill-emacs-hook #'save-frame-dimensions)
|
||||
#+END_SRC
|
||||
|
||||
** Update cursor shape under terminal Emacs
|
||||
Install [[https://github.com/7696122/evil-terminal-cursor-changer][evil-terminal-cursor-changer]]. The package isn't included in Doom because
|
||||
it is not maintained, unreasonably buggy, and lacks support for a number of
|
||||
terminals. Where it fails, it inserts unexpected characters into the buffer. To
|
||||
uphold the principle of least surprise, an unchanging cursor is less surprising
|
||||
than unwarranted characters.
|
||||
|
||||
#+BEGIN_SRC elisp
|
||||
;; ~/.doom.d/packages.el
|
||||
(package! evil-terminal-cursor-changer)
|
||||
|
||||
;; ~/.doom.d/config.el
|
||||
(use-package! evil-terminal-cursor-changer
|
||||
:hook (tty-setup . evil-terminal-cursor-changer-activate))
|
||||
#+END_SRC
|
||||
|
||||
Alternatively, an updated version exists at
|
||||
[[https://github.com/amosbird/evil-terminal-cursor-changer][amosbird/evil-terminal-cursor-changer]], with support for urxvt and tmux.
|
||||
|
||||
** Create a paste-transient-state to cycle through kill ring on paste
|
||||
Replaces the default evil-paste binding to paste then let you cycle through entries in your kill ring. Gives you more flexibility when copying to your clipboard, making edits, then deciding to paste after.
|
||||
|
||||
You will need to enable the `hydra` module first.
|
||||
|
||||
#+BEGIN_SRC elisp
|
||||
(defhydra hydra-paste (:color red
|
||||
:hint nil)
|
||||
"\n[%s(length kill-ring-yank-pointer)/%s(length kill-ring)] \
|
||||
[_C-j_/_C-k_] cycles through yanked text, [_p_/_P_] pastes the same text \
|
||||
above or below. Anything else exits."
|
||||
("C-j" evil-paste-pop)
|
||||
("C-k" evil-paste-pop-next)
|
||||
("p" evil-paste-after)
|
||||
("P" evil-paste-before))
|
||||
|
||||
(map! :nv "p" #'hydra-paste/evil-paste-after
|
||||
:nv "P" #'hydra-paste/evil-paste-before)
|
||||
#+END_SRC
|
||||
|
|
@ -31,9 +31,9 @@ This module adds [[https://fsharp.org/][F#]] support.
|
|||
** Module Flags
|
||||
+ =+lsp= Enables lsp-fsharp (this requires ~:tools lsp~ to be enabled).
|
||||
** Plugins
|
||||
+ [[https://github.com/fsharp/emacs-fsharp-mod+e][fsharp-mode]]
|
||||
+ [[https://github.com/fsharp/emacs-fsharp-mode][fsharp-mode]]
|
||||
+ =+lsp=
|
||||
+ [[https://github.com/emacs-lsp/lsp-mode/blob/master/lsp-fsharp.el][lsp-fsharp]]
|
||||
+ [[https://github.com/emacs-lsp/lsp-mode/blob/master/clients/lsp-fsharp.el][lsp-fsharp]]
|
||||
** Hacks
|
||||
None so far.
|
||||
|
||||
|
@ -47,7 +47,7 @@ Do *NOT* install mono via brew. See this [[https://github.com/fsharp/FsAutoCompl
|
|||
sudo pacman -S mono
|
||||
#+END_SRC
|
||||
** LSP
|
||||
The language server is automatically installed by [[https://github.com/emacs-lsp/lsp-mode/blob/master/lsp-fsharp.el][lsp-fsharp]].
|
||||
The language server is automatically installed by [[https://github.com/emacs-lsp/lsp-mode/blob/master/clients/lsp-fsharp.el][lsp-fsharp]].
|
||||
* Features
|
||||
An in-depth list of features, how to use them, and their dependencies.
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
;; Major modes
|
||||
(package! coffee-mode :pin "35a41c7d8233eac0b267d9593e67fb8b6235e134")
|
||||
(package! js2-mode :pin "ffb70990c1a4d4616034cb810b4ce36953aecb47")
|
||||
(package! js2-mode :pin "f7816bdd3e8e84ed1d64b6a13c9ba488363b7e91")
|
||||
(package! rjsx-mode :pin "b697fe4d92cc84fa99a7bcb476f815935ea0d919")
|
||||
(package! typescript-mode :pin "54f14c482701c4f937bf51469f70812624e07f87")
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
(set-repl-handler! 'julia-mode #'+julia/open-repl)
|
||||
|
||||
;; Borrow matlab.el's fontification of math operators. From
|
||||
;; <https://ogbe.net/emacsconfig.html>
|
||||
;; <https://web.archive.org/web/20170326183805/https://ogbe.net/emacsconfig.html>
|
||||
(dolist (mode '(julia-mode ess-julia-mode))
|
||||
(font-lock-add-keywords
|
||||
mode
|
||||
|
|
|
@ -39,19 +39,28 @@ This module has no dedicated maintainers.
|
|||
|
||||
* Prerequisites
|
||||
** Language Server Protocol servers
|
||||
Currently the servers supported depend on the =:tools lsp= flavor you are using
|
||||
LSP server support depends on which flavor of the =:tools lsp= module you have
|
||||
installed (Eglot or LSP-mode).
|
||||
|
||||
*** LSP-mode
|
||||
This server is built in Java, so a ~java~ environment will be necessary
|
||||
+ [[https://github.com/EmmyLua/EmmyLua-LanguageServer][EmmyLua-LanguageServer]] must be installed and configured to use the
|
||||
configuration provided by emacs-lsp.
|
||||
Three servers are supported, ordered from highest to lowest priority:
|
||||
|
||||
+ [[https://github.com/EmmyLua/EmmyLua-LanguageServer][EmmyLua-LanguageServer]] :: Must be in =~/.emacs.d/.local/etc/lsp/EmmyLua-LS-all.jar=. See ~lsp-clients-emmy-lua-jar-path~ variable to change this.
|
||||
+ [[https://github.com/sumneko/lua-language-server][Sumneko language server]] (lua-language-server) :: Must be in
|
||||
=~/.config/emacs/.local/etc/lsp/lua-language-server/=. See
|
||||
~lsp-clients-lua-language-server-bin~ variable to change this.
|
||||
+ [[https://github.com/Alloyed/lua-lsp][lua-lsp]] :: Must be available in =~/.luarocks/bin/lua-lsp=. See
|
||||
~lsp-clients-lua-lsp-server-install-dir~ variable to change this.
|
||||
|
||||
[[https://emacs-lsp.github.io/lsp-mode/page/lsp-emmy-lua/][LSP-mode documentation]] has more information about setting up the server and the
|
||||
configuration variables correctly (use a bare ~(setq
|
||||
lsp-clients-emmy-lua-java-path value)~ in your =config.el=)
|
||||
configuration variables correctly.
|
||||
|
||||
*** Eglot
|
||||
This server is built in Lua, so a =lua= environment will be necessary
|
||||
+ [[https://github.com/sumneko/lua-language-server][lua-language-server]] must be installed and built locally, with =+lua-lsp-dir=
|
||||
variable pointing to the root of the repository
|
||||
Eglot currently only supports one of the above servers out of the box:
|
||||
|
||||
+ [[https://github.com/sumneko/lua-language-server][Sumneko language server]] (lua-language-server) :: Must be in
|
||||
=~/.config/emacs/.local/etc/lsp/lua-language-server/=. See
|
||||
~+lua-lsp-dir~ variable to change this.
|
||||
|
||||
* TODO Features
|
||||
# An in-depth list of features, how to use them, and their dependencies.
|
||||
|
|
|
@ -1,11 +1,5 @@
|
|||
;;; lang/lua/config.el -*- lexical-binding: t; -*-
|
||||
|
||||
(defvar +lua-lsp-dir (concat doom-etc-dir "lsp/lua-language-server/")
|
||||
"Absolute path to the directory of sumneko's lua-language-server.
|
||||
|
||||
This directory MUST contain the 'main.lua' file and be the in-source build of
|
||||
lua-language-server.")
|
||||
|
||||
;; sp's default rules are obnoxious, so disable them
|
||||
(provide 'smartparens-lua)
|
||||
|
||||
|
@ -25,27 +19,29 @@ lua-language-server.")
|
|||
(set-company-backend! 'lua-mode '(company-lua company-yasnippet))
|
||||
|
||||
(when (featurep! +lsp)
|
||||
(add-hook 'lua-mode-local-vars-hook #'lsp!)
|
||||
|
||||
(when (featurep! :tools lsp +eglot)
|
||||
(defvar +lua-lsp-dir (concat doom-etc-dir "lsp/lua-language-server/")
|
||||
"Absolute path to the directory of sumneko's lua-language-server.
|
||||
|
||||
This directory MUST contain the 'main.lua' file and be the in-source build of
|
||||
lua-language-server.")
|
||||
|
||||
(defun +lua-generate-lsp-server-command ()
|
||||
;; The absolute path to lua-language-server binary is necessary because
|
||||
;; the bundled dependencies aren't found otherwise. The only reason this
|
||||
;; is a function is to dynamically change when/if `+lua-lsp-dir' does
|
||||
(list (doom-path +lua-lsp-dir
|
||||
(list (or (executable-find "lua-language-server")
|
||||
(doom-path +lua-lsp-dir
|
||||
(cond (IS-MAC "bin/macOS")
|
||||
(IS-LINUX "bin/Linux")
|
||||
(IS-WINDOWS "bin/Windows"))
|
||||
"lua-language-server")
|
||||
"lua-language-server"))
|
||||
"-E" "-e" "LANG=en"
|
||||
(doom-path +lua-lsp-dir "main.lua")))
|
||||
|
||||
(if (featurep! :tools lsp +eglot)
|
||||
(set-eglot-client! 'lua-mode (+lua-generate-lsp-server-command))
|
||||
(after! lsp-mode
|
||||
(lsp-register-client
|
||||
(make-lsp-client :new-connection (lsp-stdio-connection '+lua-generate-lsp-server-command)
|
||||
:major-modes '(lua-mode)
|
||||
:priority -1
|
||||
:server-id 'lua-langserver))))
|
||||
(add-hook 'lua-mode-local-vars-hook #'lsp!)))
|
||||
(set-eglot-client! 'lua-mode (+lua-generate-lsp-server-command)))))
|
||||
|
||||
|
||||
(use-package! moonscript
|
||||
|
|
|
@ -2,31 +2,37 @@
|
|||
|
||||
;;;###autoload
|
||||
(defun +markdown-flyspell-word-p ()
|
||||
"Return t if `flyspell' should check work before point.
|
||||
"Return t if `flyspell' should check word before point.
|
||||
|
||||
Used for `flyspell-generic-check-word-predicate'. Augments
|
||||
`markdown-flyspell-check-word-p' to:
|
||||
Used for `flyspell-generic-check-word-predicate'. Like
|
||||
`markdown-flyspell-check-word-p', but also:
|
||||
|
||||
a) Do spell check in code comments and
|
||||
b) Inhibit spell check in html markup"
|
||||
(and (markdown-flyspell-check-word-p)
|
||||
a) Performs spell check in code comments and
|
||||
b) Inhibits spell check in html markup"
|
||||
(save-excursion
|
||||
(goto-char (1- (point)))
|
||||
(if (or
|
||||
;; Spell check in code comments
|
||||
(not (and (markdown-code-block-at-point-p)
|
||||
(markdown--face-p (point) '(font-lock-comment-face))))
|
||||
;; Don't spell check in html markup
|
||||
(markdown--face-p (point) '(markdown-html-attr-name-face
|
||||
(if (or (and (markdown-code-block-at-point-p)
|
||||
(not (or (markdown-text-property-at-point 'markdown-yaml-metadata-section)
|
||||
(markdown--face-p (point) '(font-lock-comment-face)))))
|
||||
(markdown-inline-code-at-point-p)
|
||||
(markdown-in-comment-p)
|
||||
(markdown--face-p (point) '(markdown-reference-face
|
||||
markdown-markup-face
|
||||
markdown-plain-url-face
|
||||
markdown-inline-code-face
|
||||
markdown-url-face
|
||||
markdown-html-attr-name-face
|
||||
markdown-html-attr-value-face
|
||||
markdown-html-tag-name-face)))
|
||||
(prog1 nil
|
||||
;; If flyspell overlay is put, then remove it
|
||||
(when-let (bounds (bounds-of-thing-at-point 'word))
|
||||
(let ((bounds (bounds-of-thing-at-point 'word)))
|
||||
(when bounds
|
||||
(cl-loop for ov in (overlays-in (car bounds) (cdr bounds))
|
||||
when (overlay-get ov 'flyspell-overlay)
|
||||
do (delete-overlay ov))))
|
||||
t))))
|
||||
do
|
||||
(delete-overlay ov)))))
|
||||
t)))
|
||||
|
||||
|
||||
;;
|
||||
|
|
|
@ -88,10 +88,33 @@ capture, the end position, and the output buffer.")
|
|||
(:when (featurep! +grip)
|
||||
"p" #'grip-mode)
|
||||
(:prefix ("i" . "insert")
|
||||
"t" #'markdown-toc-generate-toc
|
||||
"i" #'markdown-insert-image
|
||||
"l" #'markdown-insert-link)))
|
||||
|
||||
:desc "Table Of Content" "T" #'markdown-toc-generate-toc
|
||||
:desc "Image" "i" #'markdown-insert-image
|
||||
:desc "Link" "l" #'markdown-insert-link
|
||||
:desc "<hr>" "-" #'markdown-insert-hr
|
||||
:desc "Heading 1" "1" #'markdown-insert-header-atx-1
|
||||
:desc "Heading 2" "2" #'markdown-insert-header-atx-2
|
||||
:desc "Heading 3" "3" #'markdown-insert-header-atx-3
|
||||
:desc "Heading 4" "4" #'markdown-insert-header-atx-4
|
||||
:desc "Heading 5" "5" #'markdown-insert-header-atx-5
|
||||
:desc "Heading 6" "6" #'markdown-insert-header-atx-6
|
||||
:desc "Code block" "C" #'markdown-insert-gfm-code-block
|
||||
:desc "Pre region" "P" #'markdown-pre-region
|
||||
:desc "Blockquote region" "Q" #'markdown-blockquote-region
|
||||
:desc "Checkbox" "[" #'markdown-insert-gfm-checkbox
|
||||
:desc "Bold" "b" #'markdown-insert-bold
|
||||
:desc "Inline code" "c" #'markdown-insert-code
|
||||
:desc "Italic" "e" #'markdown-insert-italic
|
||||
:desc "Footnote" "f" #'markdown-insert-footnote
|
||||
:desc "Header dwim" "h" #'markdown-insert-header-dwim
|
||||
:desc "Italic" "i" #'markdown-insert-italic
|
||||
:desc "Kbd" "k" #'markdown-insert-kbd
|
||||
:desc "Link" "l" #'markdown-insert-link
|
||||
:desc "Pre" "p" #'markdown-insert-pre
|
||||
:desc "New blockquote" "q" #'markdown-insert-blockquote
|
||||
:desc "Strike through" "s" #'markdown-insert-strike-through
|
||||
:desc "Table" "t" #'markdown-insert-table
|
||||
:desc "Wiki link" "w" #'markdown-insert-wiki-link)))
|
||||
|
||||
(use-package! evil-markdown
|
||||
:when (featurep! :editor evil +everywhere)
|
||||
|
|
|
@ -53,7 +53,8 @@
|
|||
(save-excursion
|
||||
(goto-char (point-min))
|
||||
(save-match-data
|
||||
(if (not (re-search-forward "#! *\\(?:cached-\\)?nix-shell +-i +\\([^ \n]+\\)" 256 t))
|
||||
(if (not (and (re-search-forward "\\_<nix-shell " (line-end-position 2) t)
|
||||
(re-search-forward "-i +\"?\\([^ \"\n]+\\)" (line-end-position) t)))
|
||||
(message "Couldn't determine mode for this script")
|
||||
(let* ((interp (match-string 1))
|
||||
(mode
|
||||
|
@ -67,4 +68,8 @@
|
|||
(when mode
|
||||
(prog1 (set-auto-mode-0 mode)
|
||||
(when (eq major-mode 'sh-mode)
|
||||
(sh-set-shell interp)))))))))
|
||||
(sh-set-shell interp))
|
||||
;; HACK Without this, quickrun tries to evaluate code directly
|
||||
;; with (cached)?nix-shell.
|
||||
;; TODO Use the nix-shell/cached-nix-shell-given interpreter
|
||||
(setq-local quickrun-option-shebang nil))))))))
|
||||
|
|
|
@ -10,6 +10,14 @@
|
|||
(use-package! nix-mode
|
||||
:interpreter ("\\(?:cached-\\)?nix-shell" . +nix-shell-init-mode)
|
||||
:mode "\\.nix\\'"
|
||||
:init
|
||||
;; Treat flake.lock files as json. Fall back to js-mode because it's faster
|
||||
;; than js2-mode, and its extra features aren't needed there.
|
||||
(add-to-list 'auto-mode-alist
|
||||
(cons "/flake\\.lock\\'"
|
||||
(if (featurep! :lang json)
|
||||
'json-mode
|
||||
'js-mode)))
|
||||
:config
|
||||
(set-repl-handler! 'nix-mode #'+nix/open-repl)
|
||||
(set-company-backend! 'nix-mode 'company-nixos-options)
|
||||
|
|
|
@ -75,13 +75,13 @@ tools.
|
|||
* Appendix
|
||||
** Commands
|
||||
| Command | Key | Description |
|
||||
|------------------------------+-----------+-----------------------------------------------------------|
|
||||
| =merlin-type-enclosing= | =SPC m t= | display type under point |
|
||||
| =tuareg-find-alternate-file= | =SPC m a= | switch between =.ml= and =.mli= |
|
||||
|------------------------------+-------------------+-----------------------------------------------------------|
|
||||
| =merlin-type-enclosing= | =<localleader> t= | display type under point |
|
||||
| =tuareg-find-alternate-file= | =<localleader> a= | switch between =.ml= and =.mli= |
|
||||
| =merlin-locate= | =g d= | lookup definition |
|
||||
| =merlin-occurences= | =SPC c D= | lookup references |
|
||||
| =merlin-document= | =K= | lookup documentation |
|
||||
| =merlin-imenu= | =SPC / i= | symbol lookup in file |
|
||||
| =merlin-imenu= | =SPC s i= | symbol lookup in file |
|
||||
| =merlin-iedit-occurrences= | =v R= | visual refactor identifier under point (multiple cursors) |
|
||||
| =utop= | =SPC o r= | open =utop= as REPL |
|
||||
| =utop-eval-region= | =SPC c e= | evaluate selected region in =utop= |
|
||||
|
|
|
@ -173,6 +173,8 @@ esoteric features:
|
|||
+ To execute babel code blocks, you need whatever dependencies those languages
|
||||
need. It is recommended you enable the associated =:lang= module and ensure
|
||||
its dependencies are met, e.g. install the =ruby= executable for ruby support.
|
||||
To use ~jupyter kernels~ you need the =+jupyter= flag, the associated kernel as
|
||||
well as the ~jupyter~ program.
|
||||
+ =org-roam= (with the =+roam= flag) requires =sqlite3= to be installed.
|
||||
|
||||
** MacOS
|
||||
|
@ -185,6 +187,7 @@ brew install gnuplot
|
|||
#+BEGIN_SRC sh
|
||||
pacman -S texlive-core texlive-bin texlive-science
|
||||
pacman -S gnuplot
|
||||
pacman -S jupyter # required by +jupyter
|
||||
#+END_SRC
|
||||
|
||||
** NixOS
|
||||
|
@ -192,6 +195,8 @@ pacman -S gnuplot
|
|||
environment.systemPackages = with pkgs; [
|
||||
# any less than medium isn't guaranteed to work
|
||||
texlive.combined.scheme-medium
|
||||
# required by +jupyter
|
||||
(python38.withPackages(ps: with ps; [jupyter]))
|
||||
];
|
||||
#+END_SRC
|
||||
|
||||
|
|
|
@ -387,7 +387,8 @@ another level of headings on each invocation."
|
|||
Made for `org-tab-first-hook' in evil-mode."
|
||||
(interactive)
|
||||
(cond ((not (and (bound-and-true-p evil-local-mode)
|
||||
(evil-insert-state-p)))
|
||||
(or (evil-insert-state-p)
|
||||
(evil-emacs-state-p))))
|
||||
nil)
|
||||
((org-at-item-p)
|
||||
(if (eq this-command 'org-shifttab)
|
||||
|
@ -424,7 +425,8 @@ Made for `org-tab-first-hook'."
|
|||
;; in the few cases where it does.
|
||||
(yas-indent-line 'fixed))
|
||||
(cond ((and (or (not (bound-and-true-p evil-local-mode))
|
||||
(evil-insert-state-p))
|
||||
(evil-insert-state-p)
|
||||
(evil-emacs-state-p))
|
||||
(yas--templates-for-key-at-point))
|
||||
(yas-expand)
|
||||
t)
|
||||
|
|
|
@ -541,12 +541,6 @@ the exported output (i.e. formatters)."
|
|||
:before-while #'org-fix-tags-on-the-fly
|
||||
org-auto-align-tags)
|
||||
|
||||
;; HACK Org is known to use a lot of unicode symbols (and large org files tend
|
||||
;; to be especially memory hungry). Compounded with
|
||||
;; `inhibit-compacting-font-caches' being non-nil, org needs more memory
|
||||
;; to be performant.
|
||||
(setq-hook! 'org-mode-hook gcmh-high-cons-threshold (* 2 gcmh-high-cons-threshold))
|
||||
|
||||
(defadvice! +org--recenter-after-follow-link-a (&rest _args)
|
||||
"Recenter after following a link, but only internal or file links."
|
||||
:after '(org-footnote-action
|
||||
|
@ -556,20 +550,14 @@ the exported output (i.e. formatters)."
|
|||
(when (get-buffer-window)
|
||||
(recenter)))
|
||||
|
||||
(defadvice! +org--strip-properties-from-outline-a (orig-fn path &optional width prefix separator)
|
||||
"Remove link syntax and fix variable height text (e.g. org headings) in the
|
||||
eldoc string."
|
||||
(defadvice! +org--strip-properties-from-outline-a (orig-fn &rest args)
|
||||
"Fix variable height faces in eldoc breadcrumbs."
|
||||
:around #'org-format-outline-path
|
||||
(funcall orig-fn
|
||||
(cl-loop for part in path
|
||||
;; Remove full link syntax
|
||||
for fixedpart = (replace-regexp-in-string org-link-any-re "\\4" (or part ""))
|
||||
for n from 0
|
||||
for face = (nth (% n org-n-level-faces) org-level-faces)
|
||||
collect
|
||||
(org-add-props fixedpart
|
||||
nil 'face `(:foreground ,(face-foreground face nil t) :weight bold)))
|
||||
width prefix separator))
|
||||
(let ((org-level-faces
|
||||
(cl-loop for face in org-level-faces
|
||||
collect `(:foreground ,(face-foreground face nil t)
|
||||
:weight bold))))
|
||||
(apply orig-fn args)))
|
||||
|
||||
(after! org-eldoc
|
||||
;; HACK Fix #2972: infinite recursion when eldoc kicks in in 'org' or
|
||||
|
@ -588,8 +576,7 @@ eldoc string."
|
|||
|
||||
(add-hook! 'org-agenda-finalize-hook
|
||||
(defun +org-exclude-agenda-buffers-from-workspace-h ()
|
||||
"Prevent temporary agenda buffers being associated with current
|
||||
workspace."
|
||||
"Don't associate temporary agenda buffers with current workspace."
|
||||
(when (and org-agenda-new-buffers
|
||||
(bound-and-true-p persp-mode)
|
||||
(not org-agenda-sticky))
|
||||
|
@ -598,11 +585,12 @@ workspace."
|
|||
(get-current-persp)
|
||||
nil))))
|
||||
(defun +org-defer-mode-in-agenda-buffers-h ()
|
||||
"Org agenda opens temporary agenda incomplete org-mode buffers.
|
||||
These are great for extracting agenda information from, but what if the user
|
||||
tries to visit one of these buffers? Then we remove it from the to-be-cleaned
|
||||
queue and restart `org-mode' so they can grow up to be full-fledged org-mode
|
||||
buffers."
|
||||
"`org-agenda' opens temporary, incomplete org-mode buffers.
|
||||
I've disabled a lot of org-mode's startup processes for these invisible buffers
|
||||
to speed them up (in `+org--exclude-agenda-buffers-from-recentf-a'). However, if
|
||||
the user tries to visit one of these buffers they'll see a gimped, half-broken
|
||||
org buffer. To avoid that, restart `org-mode' when they're switched to so they
|
||||
can grow up to be fully-fledged org-mode buffers."
|
||||
(dolist (buffer org-agenda-new-buffers)
|
||||
(with-current-buffer buffer
|
||||
(add-hook 'doom-switch-buffer-hook #'+org--restart-mode-h
|
||||
|
@ -612,7 +600,7 @@ buffers."
|
|||
"Prevent temporarily opened agenda buffers from polluting recentf."
|
||||
:around #'org-get-agenda-file-buffer
|
||||
(let ((recentf-exclude (list (lambda (_file) t)))
|
||||
(doom-large-file-p t)
|
||||
(doom-inhibit-large-file-detection t)
|
||||
find-file-hook
|
||||
org-mode-hook)
|
||||
(funcall orig-fn file)))
|
||||
|
@ -1128,7 +1116,9 @@ compelling reason, so..."
|
|||
(run-hooks 'org-load-hook))
|
||||
|
||||
:config
|
||||
(set-company-backend! 'org-mode 'company-capf 'company-dabbrev)
|
||||
(add-to-list 'doom-debug-variables 'org-export-async-debug)
|
||||
|
||||
(set-company-backend! 'org-mode 'company-capf)
|
||||
(set-eval-handler! 'org-mode #'+org-eval-handler)
|
||||
(set-lookup-handlers! 'org-mode
|
||||
:definition #'+org-lookup-definition-handler
|
||||
|
|
|
@ -45,6 +45,8 @@
|
|||
|
||||
(set-popup-rule! "^\\*Org-journal search" :select t :quit t)
|
||||
|
||||
(set-company-backend! 'org-journal-mode 'company-capf 'company-dabbrev)
|
||||
|
||||
(map! (:map org-journal-mode-map
|
||||
:n "]f" #'org-journal-next-entry
|
||||
:n "[f" #'org-journal-previous-entry
|
||||
|
|
|
@ -21,4 +21,5 @@
|
|||
|
||||
(use-package! org-fancy-priorities ; priority icons
|
||||
:hook (org-mode . org-fancy-priorities-mode)
|
||||
:hook (org-agenda-mode . org-fancy-priorities-mode)
|
||||
:config (setq org-fancy-priorities-list '("⚑" "⬆" "■")))
|
||||
|
|
|
@ -9,4 +9,20 @@
|
|||
(unless (executable-find "sqlite3")
|
||||
(warn! "Couldn't find the sqlite3 executable. org-roam will not work."))
|
||||
(unless (executable-find "dot")
|
||||
(warn! "Couldn't find the dot executable (from graphviz). org-roam will not be able to generate graph visuallizations.")))
|
||||
(warn! "Couldn't find the dot executable (from graphviz). org-roam will not be able to generate graph visualizations.")))
|
||||
|
||||
(when (featurep! +dragndrop)
|
||||
(when IS-MAC
|
||||
(unless (executable-find "pngpaste")
|
||||
(warn! "Couldn't find the pngpaste executable. org-download-clipboard will not work.")))
|
||||
(when IS-LINUX
|
||||
(unless (or (executable-find "maim") (executable-find "scrot") (executable-find "gnome-screenshot"))
|
||||
(warn! "Couldn't find the maim, scrot or gnome-screenshot executable. org-download-clipboard will not work."))
|
||||
(if (string= "wayland" (getenv "XDG_SESSION_TYPE"))
|
||||
(unless (executable-find "wl-paste")
|
||||
(warn! "Couldn't find the wl-paste executable (from wl-clipboard). org-download-clipboard will not work."))
|
||||
(unless (executable-find "xclip")
|
||||
(warn! "Couldn't find the xclip executable. org-download-clipboard will not work."))))
|
||||
(when IS-WINDOWS
|
||||
(unless (executable-find "convert")
|
||||
(warn! "Couldn't find the convert program (from ImageMagick). org-download-clipboard will not work."))))
|
||||
|
|
|
@ -14,11 +14,12 @@
|
|||
;; root. Of course, this command won't work in a sparse clone,
|
||||
;; and more than that, initiating these compilation step is a
|
||||
;; hassle, so...
|
||||
:build (with-temp-file (expand-file-name "org-version.el" (straight--repos-dir "org-mode"))
|
||||
:pre-build
|
||||
(with-temp-file (doom-path (straight--repos-dir "org-mode") "org-version.el")
|
||||
(insert "(fset 'org-release (lambda () \"9.5\"))\n"
|
||||
"(fset 'org-git-version #'ignore)\n"
|
||||
"(provide 'org-version)\n")))
|
||||
:pin "7c8dce72bd5d86157dd1dda2ba0a21ac86084426"
|
||||
:pin "6b83c6e4eaec4af47a90d05c3410d4637d8cb8da"
|
||||
;; Prevents built-in Org from sneaking into the byte-compilation of
|
||||
;; `org-plus-contrib', and inform other packages that `org-mode' satisfies the
|
||||
;; `org' dependency: https://github.com/raxod502/straight.el/issues/352
|
||||
|
@ -38,22 +39,22 @@
|
|||
:recipe (:host github :repo "hlissner/evil-org-mode")
|
||||
:pin "a9706da260c45b98601bcd72b1d2c0a24a017700"))
|
||||
(when (featurep! :tools pdf)
|
||||
(package! org-pdftools :pin "3c2b9a413eb841c781cfb49d8c343bf07aa0ad1f"))
|
||||
(package! org-pdftools :pin "bcf0084883ede36e91c72be73c0fbd7098439c99"))
|
||||
(when (featurep! :tools magit)
|
||||
(package! orgit :pin "ac9b1a42863a864fde9d225890ef5464bffdc646"))
|
||||
(when (featurep! +brain)
|
||||
(package! org-brain :pin "1ae4fd46165fc56f34f36ce38cb2ae816b07e207"))
|
||||
(package! org-brain :pin "f7939ef5071895930eebccf490ea7cb25cc54b2c"))
|
||||
(when (featurep! +dragndrop)
|
||||
(package! org-download :pin "42ac361ef5502017e6fc1bceb00333eba90402f4"))
|
||||
(package! org-download :pin "97bec7412e1a4d6e9031c7a0568d0f065cd9fd00"))
|
||||
(when (featurep! +gnuplot)
|
||||
(package! gnuplot :pin "f0001c30010b2899e36d7d89046322467e923088")
|
||||
(package! gnuplot :pin "116cad8e09024223f97e81b0a4503cef20de9bf5")
|
||||
(package! gnuplot-mode :pin "601f6392986f0cba332c87678d31ae0d0a496ce7"))
|
||||
(when (featurep! +ipython) ; DEPRECATED
|
||||
(package! ob-ipython :pin "7147455230841744fb5b95dcbe03320313a77124"))
|
||||
(when (featurep! +jupyter)
|
||||
(package! jupyter :pin "360cae2c70ab28c7a7848c0c56473d984f0243e5"))
|
||||
(when (featurep! +journal)
|
||||
(package! org-journal :pin "14ce0119fe2d89f2f2207788be2edce0b9372822"))
|
||||
(package! org-journal :pin "c0836483ae43e525bf7547b7a789d171eda84c84"))
|
||||
(when (featurep! +noter)
|
||||
(package! org-noter :pin "9ead81d42dd4dd5074782d239b2efddf9b8b7b3d"))
|
||||
(when (featurep! +pomodoro)
|
||||
|
@ -65,14 +66,14 @@
|
|||
(package! centered-window
|
||||
:recipe (:host github :repo "anler/centered-window-mode")
|
||||
:pin "f50859941ab5c7cbeaee410f2d38716252b552ac")
|
||||
(package! org-tree-slide :pin "18034c476038adcc1c4697168b8068f4d0ce62fe")
|
||||
(package! org-re-reveal :pin "0062756e9a5b6ec96c7de5ca94372cc6495296a1")
|
||||
(package! org-tree-slide :pin "d6e8e91433dfe4968f1343b483f2680f45a77d52")
|
||||
(package! org-re-reveal :pin "47339ef6772c79849a9764716df8361649ea7bdc")
|
||||
(package! revealjs
|
||||
:recipe (:host github :repo "hakimel/reveal.js"
|
||||
:files ("css" "dist" "js" "plugin"))
|
||||
:pin "0582f57517c97a4c7bfeb58762138c78883f94c5"))
|
||||
(when (featurep! +roam)
|
||||
(package! org-roam :pin "be95b42d32d9707309ab373f1d8182c84db41c5c"))
|
||||
(package! org-roam :pin "15d864a500d90c9dc2e16d888e93343528ec3941"))
|
||||
|
||||
;;; Babel
|
||||
(package! ob-async :pin "de1cd6c93242a4cb8773bbe115b7be3d4dd6b97e")
|
||||
|
@ -89,7 +90,7 @@
|
|||
:recipe (:host github :repo "DEADB17/ob-racket")
|
||||
:pin "d8fd51bddb019b0eb68755255f88fc800cfe03cb"))
|
||||
(when (featurep! :lang rest)
|
||||
(package! ob-restclient :pin "f7449b2068498fe9d8ab9589e0a638148861533f"))
|
||||
(package! ob-restclient :pin "0ebfc7c5ebf96d2fe1a476439831363a5a43b9b6"))
|
||||
(when (featurep! :lang scala)
|
||||
(package! ob-ammonite :pin "39937dff395e70aff76a4224fa49cf2ec6c57cca"))
|
||||
|
||||
|
@ -99,6 +100,6 @@
|
|||
(when (featurep! +hugo)
|
||||
(package! ox-hugo
|
||||
:recipe (:host github :repo "kaushalmodi/ox-hugo" :nonrecursive t)
|
||||
:pin "f24c9bd522ae22bee2327c2b53858d0a5066707d"))
|
||||
:pin "6bc8ee08023695fa167ac0ddf1fc61e1975fa1ce"))
|
||||
(when (featurep! :lang rst)
|
||||
(package! ox-rst :pin "99fa790da55b57a3f2e9aa187493ba434a64250e"))
|
||||
|
|
|
@ -100,29 +100,41 @@ sudo zypper install nodejs npm
|
|||
#+END_SRC
|
||||
|
||||
** Dependencies
|
||||
The features in this module optionally depend on the following php packages:
|
||||
This module has no required dependencies, but it has a couple optional ones.
|
||||
|
||||
+ ~boris~ (REPL)
|
||||
+ ~phpctags~ (better code completion)
|
||||
+ ~phpunit~ (unit test commands)
|
||||
+ ~php-cs-fixer~ (for code formatting)
|
||||
+ ~php-cs-fixer~ and ~@prettier/plugin-php~ (for code formatting)
|
||||
|
||||
#+BEGIN_SRC sh
|
||||
composer global require \
|
||||
d11wtq/boris \
|
||||
phpunit/phpunit \
|
||||
techlivezheng/phpctags
|
||||
techlivezheng/phpctags \
|
||||
friendsofphp/php-cs-fixer
|
||||
|
||||
# Needed by php-cs-fixer, otherwise you'll get "Couldn't resolve parser
|
||||
# 'php'" errors
|
||||
npm install -g @prettier/plugin-php
|
||||
#+END_SRC
|
||||
|
||||
Ensure that ~\~/.composer/vendor/bin~ is in ~PATH~:
|
||||
You must ensure that ~\~/.composer/vendor/bin~ is in ~PATH~, so these
|
||||
executables are visible to Emacs:
|
||||
|
||||
#+BEGIN_SRC sh
|
||||
# place this in your profile file, like ~/.bash_profile or ~/.zshenv
|
||||
export PATH="~/.composer/vendor/bin:$PATH"
|
||||
#+END_SRC
|
||||
|
||||
By the way, if you use intelephense, running =M-x lsp-install-server= and
|
||||
choose ~iph~ to install lsp-intelephense.
|
||||
You may also need to regenerate your envvar file by running ~doom env~ on the
|
||||
command line.
|
||||
|
||||
#+begin_quote
|
||||
To use intelephense instead of , run =M-x lsp-install-server= and choose ~iph~ to
|
||||
install lsp-intelephense.
|
||||
#+end_quote
|
||||
|
||||
* TODO Features
|
||||
# An in-depth list of features, how to use them, and their dependencies.
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@ Adds Python support to Doom Emacs.
|
|||
+ [[https://github.com/pythonic-emacs/anaconda-mode][anaconda-mode]]*
|
||||
+ [[https://github.com/Wilfred/pyimport][pyimport]]*
|
||||
+ [[https://github.com/paetzke/py-isort.el][py-isort]]*
|
||||
+ [[https://melpa.org/#/nose][nose]]*
|
||||
+ [[https://github.com/emacsattic/nose/][nose]]*
|
||||
+ [[https://github.com/wbolster/emacs-python-pytest][python-pytest]]*
|
||||
+ [[https://github.com/Wilfred/pip-requirements.el][pip-requirements]]*
|
||||
+ [[https://github.com/pwalsh/pipenv.el][pipenv]]*
|
||||
|
|
|
@ -102,7 +102,7 @@
|
|||
(unless (or (bound-and-true-p lsp-mode)
|
||||
(bound-and-true-p eglot--managed-mode)
|
||||
(bound-and-true-p lsp--buffer-deferred)
|
||||
(not (executable-find python-shell-interpreter)))
|
||||
(not (executable-find python-shell-interpreter t)))
|
||||
(anaconda-mode +1))))
|
||||
:config
|
||||
(set-company-backend! 'anaconda-mode '(company-anaconda))
|
||||
|
@ -207,7 +207,7 @@
|
|||
(set-eval-handler! 'python-mode
|
||||
'((:command . (lambda () python-shell-interpreter))
|
||||
(:exec (lambda ()
|
||||
(if-let* ((bin (executable-find "pipenv"))
|
||||
(if-let* ((bin (executable-find "pipenv" t))
|
||||
(_ (pipenv-project-p)))
|
||||
(format "PIPENV_MAX_DEPTH=9999 %s run %%c %%o %%s %%a" bin)
|
||||
"%c %o %s %a")))
|
||||
|
|
|
@ -4,10 +4,12 @@
|
|||
(featurep! :tools lsp))
|
||||
"This module requires (:tools lsp)")
|
||||
|
||||
(if (not (executable-find "python"))
|
||||
(if (not (or (executable-find "python")
|
||||
(executable-find "python3")))
|
||||
(error! "Couldn't find python in your PATH")
|
||||
(unless (featurep! +lsp)
|
||||
(unless (zerop (shell-command "python -c 'import setuptools'"))
|
||||
(unless (or (zerop (shell-command "python -c 'import setuptools'"))
|
||||
(zerop (shell-command "python3 -c 'import setuptools'")))
|
||||
(warn! "setuptools wasn't detected, which anaconda-mode requires"))))
|
||||
|
||||
(when (featurep! +pyenv)
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
;; Major modes
|
||||
(package! pip-requirements :pin "216cd1690f80cc965d4ae47b8753fc185f778ff6")
|
||||
(when (featurep! +cython)
|
||||
(package! cython-mode :pin "21b4e533747507c4dad5e6908df1f157dff4de89")
|
||||
(package! cython-mode :pin "17e03b8658a07b6d6da49300b39b57ed9c59ddb1")
|
||||
(when (featurep! :checkers syntax)
|
||||
(package! flycheck-cython :pin "ecc4454d35ab5317ab66a04406f36f0c1dbc0b76")))
|
||||
|
||||
|
@ -12,21 +12,21 @@
|
|||
(when (featurep! +lsp)
|
||||
(unless (featurep! :tools lsp +eglot)
|
||||
(if (featurep! +pyright)
|
||||
(package! lsp-pyright :pin "d9e7d3cf1bdc8ee0395c8df4408b05ee3ba9c22a")
|
||||
(package! lsp-python-ms :pin "c4ebc7a11398733055a1dc07f9cffacd04d1c2dc"))))
|
||||
(package! lsp-pyright :pin "71ff088ac4c93b0edd012f305a3dfd1602c5d21e")
|
||||
(package! lsp-python-ms :pin "5470ada6cde6e68fe6ce13ff1146c89c3bae0cc8"))))
|
||||
|
||||
;; Programming environment
|
||||
(package! anaconda-mode :pin "39b1cf88c8c459901630d248d6135d8644075648")
|
||||
(package! anaconda-mode :pin "b1875a5d0ec9885c1c42558c126b93ee6bcedaa6")
|
||||
(when (featurep! :completion company)
|
||||
(package! company-anaconda :pin "da1566db41a68809ef7f91ebf2de28118067c89b"))
|
||||
|
||||
;; Environment management
|
||||
(package! pipenv :pin "b730bb509e8b60af9f5ab1f1e6c3458d1d95d789")
|
||||
(package! pyvenv :pin "0bf4b87068e9040fc99afa85af1992247dd7aacd")
|
||||
(package! pipenv :pin "f516a1a8677a6a1ce9683056e9f77b1e785e8431")
|
||||
(package! pyvenv :pin "9b3678bc29192d2dba64df90fbdb17393ef8d877")
|
||||
(when (featurep! +pyenv)
|
||||
(package! pyenv-mode :pin "b818901b8eac0e260ced66a6a5acabdbf6f5ba99"))
|
||||
(when (featurep! +conda)
|
||||
(package! conda :pin "9f7eea16e9ad3eb34fe3d1cbd9d6162b8046c2f8"))
|
||||
(package! conda :pin "dce431b25f5a13af58cc7cacfa7968b5a888609c"))
|
||||
(when (featurep! +poetry)
|
||||
(package! poetry :pin "d5163fe065239bb7b46ed8b3ff3b85b1f3229af3"))
|
||||
|
||||
|
@ -35,7 +35,7 @@
|
|||
;; REVIEW Remove this when emacsmirror/epkgs updates its emacsattic index
|
||||
:recipe (:host github :repo "emacsattic/nose")
|
||||
:pin "f8528297519eba911696c4e68fa88892de9a7b72")
|
||||
(package! python-pytest :pin "4a1c4c8915c12e540d41aae1d4e326a2362da541")
|
||||
(package! python-pytest :pin "3fadf1f8bc363d57c54eedd1bf98e6d9db9f0a62")
|
||||
|
||||
;; Import managements
|
||||
(package! pyimport :pin "a6f63cf7ed93f0c0f7c207e6595813966f8852b9")
|
||||
|
|
|
@ -97,7 +97,7 @@ selected by default. Modify ~rustic-lsp-server~ to change the default:
|
|||
(setq rustic-lsp-server 'rls))
|
||||
#+END_SRC
|
||||
|
||||
** Enabling elgot support for Rust
|
||||
** Enabling eglot support for Rust
|
||||
Doom's =:tools lsp= module has an =+eglot= flag. Enable it and this module will
|
||||
use eglot instead.
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
;; -*- no-byte-compile: t; -*-
|
||||
;;; lang/rust/packages.el
|
||||
|
||||
(package! rustic :pin "91ad5db27b86bb2ba6f3019b764d0f45ec93f484")
|
||||
(package! rustic :pin "f7d5ac0c930ae435421f3f5bc827e8c61ce73662")
|
||||
(unless (featurep! +lsp)
|
||||
(package! racer :pin "a0bdf778f01e8c4b8a92591447257422ac0b455b"))
|
||||
|
|
|
@ -11,7 +11,9 @@
|
|||
(setq geiser-active-implementations '(guile chicken mit chibi chez)
|
||||
geiser-autodoc-identifier-format "%s → %s"
|
||||
geiser-repl-current-project-function 'doom-project-root)
|
||||
(unless (featurep! :lang racket)
|
||||
(if (featurep! :lang racket)
|
||||
(setq auto-mode-alist
|
||||
(remove '("\\.rkt\\'" . scheme-mode) auto-mode-alist))
|
||||
(push 'racket geiser-active-implementations))
|
||||
(after! scheme ; built-in
|
||||
(set-repl-handler! 'scheme-mode #'+scheme/open-repl)
|
||||
|
|
|
@ -65,12 +65,9 @@
|
|||
|
||||
(add-to-list 'web-mode-engines-alist '("elixir" . "\\.eex\\'"))
|
||||
|
||||
(let ((types '("javascript" "jsx")))
|
||||
(setq web-mode-comment-formats
|
||||
(cl-remove-if (lambda (item) (member (car item) types))
|
||||
web-mode-comment-formats))
|
||||
(dolist (type types)
|
||||
(push (cons type "//") web-mode-comment-formats)))
|
||||
;; Use // instead of /* as the default comment delimited in JS
|
||||
(setf (alist-get "javascript" web-mode-comment-formats nil nil #'equal)
|
||||
"//")
|
||||
|
||||
(add-hook! 'web-mode-hook
|
||||
(defun +web--fix-js-comments-h ()
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
;; wl-copy, termux-clipboard-get, or getclip (cygwin); depending on what
|
||||
;; is available.
|
||||
(and (require 'xclip nil t)
|
||||
(xclip-mode +1)))))
|
||||
(with-demoted-errors "%s" (xclip-mode +1))))))
|
||||
|
||||
(when (featurep! :editor evil)
|
||||
;; Fix cursor shape-changing in the terminal. Only supported in XTerm, Gnome
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
(switch-to-buffer (doom-fallback-buffer)))
|
||||
(when +eshell-enable-new-shell-on-split
|
||||
(let ((default-directory directory))
|
||||
(when-let (win (get-buffer-window (+eshell/here t)))
|
||||
(when-let (win (get-buffer-window (+eshell/here)))
|
||||
(set-window-dedicated-p win dedicated-p))))))
|
||||
|
||||
(defun +eshell--setup-window (window &optional flag)
|
||||
|
|
|
@ -103,6 +103,10 @@ You should use `set-eshell-alias!' to change this.")
|
|||
;; or configure `+eshell-aliases' via elisp.
|
||||
(advice-add #'eshell-write-aliases-list :override #'ignore)
|
||||
|
||||
;; REVIEW In Emacs 27 and newer, waiting for esh-module is unnecessary.
|
||||
(after! esh-module
|
||||
(add-to-list 'eshell-modules-list 'eshell-tramp))
|
||||
|
||||
;; Visual commands require a proper terminal. Eshell can't handle that, so
|
||||
;; it delegates these commands to a term buffer.
|
||||
(after! em-term
|
||||
|
|
|
@ -75,18 +75,3 @@ method to prepare vterm at the corresponding remote directory."
|
|||
(vterm-send-string
|
||||
(concat "cd " path-localname))
|
||||
(vterm-send-return)))))
|
||||
|
||||
|
||||
(defvar +vterm--insert-point nil)
|
||||
|
||||
;;;###autoload
|
||||
(defun +vterm-remember-insert-point-h ()
|
||||
"Remember point when leaving insert mode."
|
||||
(setq-local +vterm--insert-point (point)))
|
||||
|
||||
;;;###autoload
|
||||
(defun +vterm-goto-insert-point-h ()
|
||||
"Go to the point we were at when we left insert mode."
|
||||
(when +vterm--insert-point
|
||||
(goto-char +vterm--insert-point)
|
||||
(setq-local +vterm--insert-point nil)))
|
||||
|
|
|
@ -19,11 +19,4 @@
|
|||
;; Don't prompt about dying processes when killing vterm
|
||||
confirm-kill-processes nil
|
||||
;; Prevent premature horizontal scrolling
|
||||
hscroll-margin 0)
|
||||
|
||||
;; 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)))))
|
||||
hscroll-margin 0))
|
||||
|
|
|
@ -3,4 +3,4 @@
|
|||
|
||||
(package! vterm
|
||||
:built-in 'prefer
|
||||
:pin "101ff86d4d1c7ff8ca954ba59f666fd36f789aae")
|
||||
:pin "fb12d7f49e2da121d9b17ed583d269166e0da087")
|
||||
|
|
|
@ -7,6 +7,8 @@
|
|||
:config
|
||||
(setq ansible-section-face 'font-lock-variable-name-face
|
||||
ansible-task-label-face 'font-lock-doc-face)
|
||||
(when (featurep! :completion company)
|
||||
(set-company-backend! 'ansible 'company-ansible))
|
||||
(map! :map ansible-key-map
|
||||
:localleader
|
||||
:desc "Decrypt buffer" "d" #'ansible-decrypt-buffer
|
||||
|
|
5
modules/tools/ansible/doctor.el
Normal file
5
modules/tools/ansible/doctor.el
Normal file
|
@ -0,0 +1,5 @@
|
|||
;; -*- lexical-binding: t; no-byte-compile: t; -*-
|
||||
;;; tools/ansible/doctor.el
|
||||
|
||||
(unless (executable-find "ansible")
|
||||
(warn! "Couldn't find ansible executable. Some features of the ansible module won't work"))
|
|
@ -1,7 +1,7 @@
|
|||
;; -*- no-byte-compile: t; -*-
|
||||
;;; tools/ansible/packages.el
|
||||
|
||||
(package! ansible :recipe (:nonrecursive t) :pin "cf6b8f06c2628357fc2a72ea9817a2c2d0ebf690")
|
||||
(package! ansible :recipe (:nonrecursive t) :pin "40af0d2bbb6c5bbcf7aa9269ac9a07e22622d263")
|
||||
(package! ansible-doc :pin "86083a7bb2ed0468ca64e52076b06441a2f8e9e0")
|
||||
(package! jinja2-mode :pin "ecd19a40b7832bb00f0a2244e3b0713d0bf3850d")
|
||||
(package! yaml-mode :pin "fc5e1c58f94472944c4aa838f00f6adcac6fa992")
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
;; -*- no-byte-compile: t; -*-
|
||||
;;; tools/biblio/packages.el
|
||||
|
||||
(package! bibtex-completion :pin "8d84d8beb3bfafaa060d7e956fcc569ecf010d9c")
|
||||
(package! bibtex-completion :pin "1bb81d77e08296a50de7ebfe5cf5b0c715b7f3d6")
|
||||
(when (featurep! :completion ivy)
|
||||
(package! ivy-bibtex :pin "8d84d8beb3bfafaa060d7e956fcc569ecf010d9c"))
|
||||
(package! ivy-bibtex :pin "1bb81d77e08296a50de7ebfe5cf5b0c715b7f3d6"))
|
||||
(when (featurep! :completion helm)
|
||||
(package! helm-bibtex :pin "8d84d8beb3bfafaa060d7e956fcc569ecf010d9c"))
|
||||
(package! helm-bibtex :pin "1bb81d77e08296a50de7ebfe5cf5b0c715b7f3d6"))
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
;; -*- no-byte-compile: t; -*-
|
||||
;;; tools/debugger/packages.el
|
||||
|
||||
(when (package! realgud :pin "ff660011c82c6af504915833e2d981a547b7ad58")
|
||||
(when (package! realgud :pin "f73c039a340579a98e6716c901fd4e80e7eaa2eb")
|
||||
(when (featurep! :lang javascript)
|
||||
(package! realgud-trepan-ni :pin "6e38cf838c7b47b5f1353d00901b939ffa36d707")))
|
||||
|
||||
(when (featurep! +lsp)
|
||||
(package! dap-mode :pin "e582ff90c104703ed65c1f3174d4c4690e9cf1fd")
|
||||
(package! posframe :pin "e1552c82dffaadc5e7de09a44880a498197ffbee"))
|
||||
(package! dap-mode :pin "612388d0b85e77972a9c28391bac6224a63408c7")
|
||||
(package! posframe :pin "efd7ea490defc53a5b78e7469a3a35d225b766cc"))
|
||||
|
|
|
@ -3,4 +3,4 @@
|
|||
|
||||
(package! docker :pin "3773112eea3fc99704b5ca50c1e9a3db2cb8e4f3")
|
||||
(package! docker-tramp :pin "8e2b671eff7a81af43b76d9dfcf94ddaa8333a23")
|
||||
(package! dockerfile-mode :pin "d31f7685ebc5832d957e25070a930aa42984327d")
|
||||
(package! dockerfile-mode :pin "6a56c1cc1713b501040b08fdbf0c4159a4fe95f9")
|
||||
|
|
|
@ -3,4 +3,4 @@
|
|||
|
||||
(package! editorconfig
|
||||
:recipe (:nonrecursive t)
|
||||
:pin "da844718bfe1ca51919c63fdffedaba5d0cc1bba")
|
||||
:pin "d73333c224de783e42acd225a20330a667fe5191")
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
;; -*- no-byte-compile: t; -*-
|
||||
;;; tools/ein/packages.el
|
||||
|
||||
(package! ein :pin "a019ee3994585e4ed4700d2591d693fda3232616")
|
||||
(package! ein :pin "917f2a0b6ca76ed9e966985ca6f19d8b57690d40")
|
||||
|
|
|
@ -163,6 +163,7 @@ This can be passed nil as its second argument to unset handlers for MODES. e.g.
|
|||
(+lookup--run-handlers handler identifier origin)
|
||||
(user-error "No lookup handler selected"))
|
||||
(run-hook-wrapped handlers #'+lookup--run-handlers identifier origin))))
|
||||
(unwind-protect
|
||||
(when (cond ((null result)
|
||||
(message "No lookup handler could find %S" identifier)
|
||||
nil)
|
||||
|
@ -174,7 +175,8 @@ This can be passed nil as its second argument to unset handlers for MODES. e.g.
|
|||
(result))
|
||||
(with-current-buffer (marker-buffer origin)
|
||||
(better-jumper-set-jump (marker-position origin)))
|
||||
result)))
|
||||
result)
|
||||
(set-marker origin nil))))
|
||||
|
||||
|
||||
;;
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue