Doom: All the updates...

This commit is contained in:
hedy 2023-09-05 11:43:59 +08:00
parent a58854bae0
commit a4d7456048
Signed by: hedy
GPG Key ID: B51B5A8D1B176372
3 changed files with 423 additions and 162 deletions

View File

@ -1,176 +1,421 @@
;;; $DOOMDIR/config.el -*- lexical-binding: t; -*-
;; No need to run doom sync after modifying this file
(setq user-full-name "hedy" (setq user-full-name "hedy"
user-mail-address "hedy@tilde.cafe") user-mail-address "hedy@tilde.cafe")
;; Doom exposes five (optional) variables for controlling fonts in Doom. Here
;; are the three important ones: (setq diplay-line-numbers-type t)
;;
;; + `doom-font' (setq confirm-kill-emacs nil)
;; + `doom-variable-pitch-font'
;; + `doom-big-font' -- used for `doom-big-font-mode'; use this for (setq scroll-margin 6)
;; presentations or streaming.
;; (global-visual-line-mode t)
;; They all accept either a font-spec, font string ("Input Mono-12"), or xlfd
;; font string. You generally only need these two: (setq evil-shift-width 2)
;; (setq doom-font (font-spec :family "monospace" :size 12 :weight 'semi-light) (setq tab-width 4)
;; doom-variable-pitch-font (font-spec :family "sans" :size 13))
(defun set-exec-path-from-shell-PATH ()
"Set up Emacs' `exec-path' and PATH environment variable to match that used by the user's shell.
This is particularly useful under Mac OS X and macOS, where GUI apps are not started from a shell."
(interactive)
(let ((path-from-shell
(replace-regexp-in-string "[ \t\n]*$" ""
(shell-command-to-string ;;SHELL = fish
"$SHELL --login -c 'string join : $PATH'"))))
(setenv "PATH" path-from-shell)
(setq exec-path (split-string path-from-shell path-separator))))
(set-exec-path-from-shell-PATH)
;; https://www.emacswiki.org/emacs/ToggleWindowSplit
(defun toggle-window-split ()
(interactive)
(if (= (count-windows) 2)
(let* ((this-win-buffer (window-buffer))
(next-win-buffer (window-buffer (next-window)))
(this-win-edges (window-edges (selected-window)))
(next-win-edges (window-edges (next-window)))
(this-win-2nd (not (and (<= (car this-win-edges)
(car next-win-edges))
(<= (cadr this-win-edges)
(cadr next-win-edges)))))
(splitter
(if (= (car this-win-edges)
(car (window-edges (next-window))))
'split-window-horizontally
'split-window-vertically)))
(delete-other-windows)
(let ((first-win (selected-window)))
(funcall splitter)
(if this-win-2nd (other-window 1))
(set-window-buffer (selected-window) this-win-buffer)
(set-window-buffer (next-window) next-win-buffer)
(select-window first-win)
(if this-win-2nd (other-window 1))))))
(define-key ctl-x-4-map "t" 'toggle-window-split)
(setq doom-font (font-spec :family "Fira Code" :size 16 :weight 'normal) (setq doom-font (font-spec :family "Fira Code" :size 16 :weight 'normal)
doom-variable-pitch-font (font-spec :family "Open Sans" :size 18 :weight 'light)) doom-variable-pitch-font (font-spec :family "Open Sans" :size 18 :weight 'light))
;; Elfeed: Use sans for articles
(add-hook 'elfeed-show-mode-hook
(lambda () (buffer-face-set 'variable-pitch)))
;; There are two ways to load a theme. Both assume the theme is installed and
;; available. You can either set `doom-theme' or manually load a theme with the
;; `load-theme' function. This is the default:
(setq doom-theme 'doom-vibrant) ;; Doom's dracula is a bit funny (setq doom-theme 'doom-vibrant) ;; Doom's dracula is a bit funny
;; If you use `org' and don't want your org files in the default location below,
;; change `org-directory'. It must be set before org loads!
(setq org-directory "~/org/")
;; Can set to relative or nil
(setq display-line-numbers-type t)
;; Here are some additional functions/macros that could help you configure Doom:
;;
;; - `load!' for loading external *.el files relative to this one
;; - `use-package!' for configuring packages
;; - `after!' for running code after a package has loaded
;; - `add-load-path!' for adding directories to the `load-path', relative to
;; this file. Emacs searches the `load-path' when you load packages with
;; `require' or `use-package'.
;; - `map!' for binding new keys
(setq evil-split-window-below t (setq evil-split-window-below t
evil-vsplit-window-right t) evil-vsplit-window-right t)
;; FIXING EVIL DON"T USE CLIPBOARD::
;;(fset 'evil-visual-update-x-selection 'ignore)
;; FIXME DOES NOT WORK!
(setq evil-visual-update-x-selection-p nil)
;;(setq evil-kill-on-visual-paste nil)
;;
;; XXX: Workaround from: https://discourse.doomemacs.org/t/how-to-set-up-clipboard/3742
;; don't put deleted strings to X11 clipboard ;; don't put deleted strings to X11 clipboard
(setq select-enable-clipboard nil) (setq select-enable-clipboard nil)
;; copying and pasting selected blocks in visual mode to and from X11 clipboard ;; copying and pasting selected blocks in visual mode to and from X11 clipboard
(map! "S-C-c" #'clipboard-kill-ring-save) (map! "S-C-c" #'clipboard-kill-ring-save)
(map! "S-C-v" #'clipboard-yank) (map! "S-C-v" #'clipboard-yank)
;; How to use yank/paste and system clipboard:
;; - Anything copied outside of emacs, paste in emacs with S-C-v
;; - Yank within emacs, will not override clipboard outside emacs
;; - To paste yanks within emacs, use default paste bind or use p
;; - Copy sth to clipboard from emacs: Use S-C-c, paste outside with normal
;; system bind
;; Seriously? I just want to quit. Damn. Why confirm lol (setq org-directory "~/org/")
(setq confirm-kill-emacs nil)
(org-babel-do-load-languages
'org-babel-load-languages
'((emacs-lisp . t)
(python . t))) ;; Why jupyter when you have this JK
(add-hook 'org-mode-hook (lambda () (org-bullets-mode 1)))
(after! treemacs (after! treemacs
(setq treemacs-width 20 (setq treemacs-width 20
treemacs-project-follow-cleanup t) treemacs-project-follow-cleanup t)
(treemacs-load-theme "Default")) (treemacs-load-theme "Default"))
(after! magit ;; Elfeed: Use sans for articles
(custom-set-faces (add-hook 'elfeed-show-mode-hook
'(magit-diff-added-highlight ((((type tty)) (:background nil)))) (lambda () (buffer-face-set 'variable-pitch)))
'(magit-diff-context-highlight ((((type tty)) (:background nil))))
'(magit-diff-file-heading ((((type tty)) nil)))
'(magit-diff-removed ((((type tty)) (:foreground "red"))))
'(magit-diff-removed-highlight ((((type tty)) (:background nil))))
'(magit-section-highlight ((((type tty)) nil)))
'(magit-diff-highlight-hunk-body ((((type tty)) (:background nil))))
'(magit-diff-base-highlight ((((type tty)) (:background nil))))
))
;; Scroll margin like scrolloff in vim (add-hook! 'vterm-mode-hook 'evil-insert)
(setq scroll-margin 6)
;;(setq doom-themes-treemacs-variable-pitch-face nil)
;; Horizontal scrolling is pain (after! company
(global-visual-line-mode t) (setq company-idle-delay nil))
;; Give it the IDE vibes (require 'math-symbol-lists)
; (run-with-timer 1 nil (lambda () (save-selected-window (treemacs)))) ;; This is actually for C-\, then select input "math",
;; then the Ω will show in the status bar.
(quail-define-package "math" "UTF-8" "Ω" t)
;; (quail-define-rules ; add whatever extra rules you want to define here...
;; ("\\from" #X2190)
;; ("\\to" #X2192)
;; ("\\lhd" #X22B2)
;; ("\\rhd" #X22B3)
;; ("\\unlhd" #X22B4)
;; ("\\unrhd" #X22B5))
(mapc (lambda (x)
(if (cddr x)
(quail-defrule (cadr x) (car (cddr x)))))
(append math-symbol-list-basic math-symbol-list-extended))
;;org-todo (add-to-list 'company-backends 'company-math-symbols-unicode)
(setq org-todo-keyword-faces
'(("NOW" . "labelColor") ("CANCELED" . "systemRedColor") ("DONE" . "selectedControlColor") ("FINISH" . "selectedControlColor") ("PAST" . "controlTextColor")
("RECUR" . "systemYellowColor") ("MARK" . "systemOrangeColor") ("PLAN" . "systemBrownColor")
("OVERDUE". "systemRedColor") ("DUE" . "systemYellowColor") ("STARTED" . "labelColor")))
(setq diary-file "~/Documents/diary/diary")
(org-babel-do-load-languages ;; Emoji completion
'org-babel-load-languages (defun --set-emoji-font (frame)
'((emacs-lisp . t) "Adjust the font settings of FRAME so Emacs can display emoji properly."
(python . t) (if (eq system-type 'darwin)
(jupyter . t))) ;; For NS/Cocoa
(set-fontset-font t 'symbol (font-spec :family "Apple Color Emoji") frame 'prepend)
;; For Linux
(set-fontset-font t 'symbol (font-spec :family "Symbola") frame 'prepend)))
;; centaur tabs ;; For when Emacs is started in GUI mode:
(defun centaur-tabs-buffer-groups () (--set-emoji-font nil)
"`centaur-tabs-buffer-groups' control buffers' group rules. ;; Hook for when a frame is created with emacsclient
;; see https://www.gnu.org/software/emacs/manual/html_node/elisp/Creating-Frames.html
(add-hook 'after-make-frame-functions '--set-emoji-font)
(require 'company-emoji)
(add-to-list 'company-backends 'company-emoji)
Group centaur-tabs with mode if buffer is derived from `eshell-mode' (use-package! wrap-region
`emacs-lisp-mode' `dired-mode' `org-mode' `magit-mode'. All buffer name start :config
with * will group to \"Emacs\". Other buffer group by (wrap-region-add-wrappers
`centaur-tabs-get-group-name' with project name." '(("/* " " */" "#" (java-mode javascript-mode css-mode))
(list ("`" "`" nil (markdown-mode org-mode))
(cond ("=" "=" nil (org-mode))
;; ((not (eq (file-remote-p (buffer-file-name)) nil)) ("~" "~" nil (org-mode))
;; "Remote") ("*" "*" nil (markdown-mode org-mode)))))
;; Put org mode first since some of these begin with "*"
;; elisp seems to short-circuit "or"
((memq major-mode '(org-mode
org-agenda-clockreport-mode
org-src-mode
org-agenda-mode
org-beamer-mode
org-indent-mode
org-bullets-mode
org-cdlatex-mode
org-agenda-log-mode
diary-mode))
"OrgMode") ;; Org Agenda next to org files is useful
((derived-mode-p 'vterm-mode)
"VTerm")
((or (derived-mode-p 'prog-mode) ;; Put magit along with program files
(memq major-mode '(magit-process-mode
magit-status-mode
magit-diff-mode
magit-log-mode
magit-file-mode
magit-blob-mode
magit-blame-mode))
(derived-mode-p 'dired-mode))
"Dev")
((memq major-mode '(helpful-mode
help-mode))
"Help")
((or (string-equal "elfeed" (substring (buffer-name) 1 7))
(string-equal "eww" (substring (buffer-name) 1 4))
(string-equal "elpher" (substring (buffer-name) 1 7)))
"E-apps")
((string-equal "*" (substring (buffer-name) 0 1))
"Emacs") ;; This should be at the very end to match ones where none of the
;; previous mode matches failed
(t
(centaur-tabs-get-group-name (current-buffer))))))
(defun set-exec-path-from-shell-PATH () (add-hook! ('org-mode 'markdown-mode) 'wrap-region-mode)
"Set up Emacs' `exec-path' and PATH environment variable to match
that used by the user's shell.
This is particularly useful under Mac OS X and macOS, where GUI (use-package! org-roam
apps are not started from a shell." :ensure t
:custom
(org-roam-directory (file-truename "~/org/orgroam"))
:bind (("C-c n l" . org-roam-buffer-toggle)
("C-c n f" . org-roam-node-find)
("C-c n g" . org-roam-graph)
("C-c n i" . org-roam-node-insert)
("C-c n c" . org-roam-capture)
;; Dailies
("C-c n j" . org-roam-dailies-capture-today))
:config
;; If you're using a vertical completion framework, you might want a more informative completion interface
(setq org-roam-node-display-template (concat "${title:*} " (propertize "${tags:10}" 'face 'org-tag)))
(org-roam-db-autosync-mode)
;; If using org-roam-protocol
(require 'org-roam-protocol))
(use-package! websocket
:after org-roam)
(use-package! org-roam-ui
:after org-roam ;; or :after org
;; normally we'd recommend hooking orui after org-roam, but since org-roam does not have
;; a hookable mode anymore, you're advised to pick something yourself
;; if you don't care about startup time, use
;; :hook (after-init . org-roam-ui-mode)
:config
(setq org-roam-ui-sync-theme t
org-roam-ui-follow t
org-roam-ui-update-on-save t
org-roam-ui-open-on-start nil))
(customize-set-variable 'org-anki-default-deck "Doom")
(defun my/org-anki-sync-fix-refs ()
"Fix 'Unable to resolve link: XXX'"
(interactive) (interactive)
(let ((path-from-shell (replace-regexp-in-string (org-id-update-id-locations
"[ \t\n]*$" "" (shell-command-to-string ;;SHELL = fish (directory-files-recursively org-roam-directory "\\.org$")))
"$SHELL --login -c 'string join : $PATH'"
))))
(setenv "PATH" path-from-shell)
(setq exec-path (split-string path-from-shell path-separator))))
(set-exec-path-from-shell-PATH) (customize-set-variable 'org-anki-field-templates
'(("Basic"
("Front" . (lambda (it) ;; strip text-properties
(let ((breadcrumb (substring-no-properties
;; arguments:
;; - prepend file name?
;; - incl current heading?
;; - SEPARATOR
;; - return as string?
(org-display-outline-path nil nil " > " t)))
(path (buffer-file-name)))
;; "File Title: Heading > SubHeading > Sub-subheading"
(setq breadcrumb (concat (org-get-title) ": " breadcrumb))
(concat
(format
(concat "<div id=\"meta\">"
"<p id=\"breadcrumb\">%s</p>"
"<p id=\"open-file\">"
"<a href='emacs:///%s'>Open file</a>"
"</p>"
"</div>"
"<h3>%s</h3>")
breadcrumb path it (org-get-heading)))))))))
(add-hook 'vterm-mode-hook (setq org-latex-create-formula-image-program 'dvisvgm)
(lambda () (visual-line-mode) (centaur-tabs-local-mode) (turn-off-evil-mode))) (plist-put org-format-latex-options :scale 4.0)
(plist-put org-format-latex-options :background nil)
(defun my/scale-current-overlay ()
(interactive)
(pcase major-mode
('latex-mode
(dolist (ov (overlays-in (point-min) (point-max)))
(if (eq (overlay-get ov 'category)
'preview-overlay)
(my/text-scale--resize-fragment ov))))
('org-mode
(dolist (ov (overlays-in (- (point) 10) (+ (point) 5) ))
(if (eq (overlay-get ov 'org-overlay-type)
'org-latex-overlay)
(my/text-scale--resize-fragment ov))))))
(defun my/text-scale--resize-fragment (ov)
(overlay-put
ov 'display
(cons 'image
(plist-put
(cdr (overlay-get ov 'display))
'margin 'right-margin)))
(overlay-put
ov 'display
(cons 'image
(plist-put
(cdr (overlay-get ov 'display))
:scale 7.0))))
(defun list-overlays-at (&optional pos)
"Describe overlays at POS or point."
(interactive)
(setq pos (or pos (point)))
(let ((overlays (overlays-at pos))
(obuf (current-buffer))
(buf (get-buffer-create "*Overlays*"))
(props '(priority window category face mouse-face display
help-echo modification-hooks insert-in-front-hooks
insert-behind-hooks invisible intangible
isearch-open-invisible isearch-open-invisible-temporary
before-string after-string evaporate local-map keymap
field))
start end text)
(if (not overlays)
(message "None.")
(set-buffer buf)
(erase-buffer)
(dolist (o overlays)
(setq start (overlay-start o)
end (overlay-end o)
text (with-current-buffer obuf
(buffer-substring start end)))
(when (> (- end start) 13)
(setq text (concat (substring text 1 10) "...")))
(insert (format "From %d to %d: \"%s\":\n" start end text))
(dolist (p props)
(when (overlay-get o p)
(insert (format " %15S: %S\n" p (overlay-get o p))))))
(pop-to-buffer buf))))
(defun eshell-fn-on-files (fun1 fun2 args)
"Call FUN1 on the first element in list, ARGS.
Call FUN2 on all the rest of the elements in ARGS."
(unless (null args)
(let ((filenames (flatten-list args)))
(funcall fun1 (car filenames))
(when (cdr filenames)
(mapcar fun2 (cdr filenames))))
;; Return an empty string, as the return value from `fun1'
;; probably isn't helpful to display in the `eshell' window.
""))
(defun eshell/ff (&rest files)
"find-file on first arg, find-file-other-window on rest"
(eshell-fn-on-files 'find-file 'find-file-other-window files))
(defun eshell/f (&rest files)
"Edit one or more files in another window."
(eshell-fn-on-files 'find-file-other-window 'find-file-other-window files))
(defalias 'eshell/emacs 'eshell/ff)
(defalias 'eshell/vi 'eshell/ff)
(defalias 'eshell/vim 'eshell/ff)
(defalias 'eshell/nv 'eshell/ff)
(defalias 'eshell/nvim 'eshell/ff)
(defun eshell/less (&rest files)
"view-file-other-window"
(view-file-other-window files))
(defalias 'eshell/more 'eshell/less)
(defun my/eshell-exit-with-window ()
(when (not (one-window-p))
(delete-window)))
(advice-add 'eshell-life-is-too-much :after 'my/eshell-exit-with-window)
(defun eshell/do (&rest args)
"Execute a command sequence over a collection of file elements.
Separate the sequence and the elements with a `::' string.
For instance:
do chown _ angela :: *.org(u'oscar')
The function substitutes the `_' sequence to a single filename
element, and if not specified, it appends the file name to the
command. So the following works as expected:
do chmod a+x :: *.org"
(seq-let (forms elements) (-split-on "::" args)
(dolist (element (-flatten (-concat elements)))
(message "Working on %s ... %s" element forms)
(let* ((form (if (-contains? forms "_")
(-replace "_" element forms)
(-snoc forms element)))
(cmd (car form))
(args (cdr form)))
(eshell-named-command cmd args)))))
(defun eshell--buffer-from-dir (dir)
"Return buffer name of an Eshell based on DIR."
(format "*eshell: %s*"
(thread-first dir
(split-string "/" t)
(last)
(car))))
(defun eshell-there (parent)
"Open an eshell session in a PARENT directory.
The window is smaller and named after this directory.
If an Eshell is already present that has been named
after PARENT, pop to that buffer instead."
(if-let* ((term-name (eshell--buffer-from-dir parent))
(buf-name (seq-contains (buffer-list) term-name
(lambda (a b) (string-equal (buffer-name b) a)))))
(pop-to-buffer buf-name)
(let* ((default-directory parent)
(height (/ (window-total-height) 3)))
(split-window-vertically (- height))
(other-window 1)
(setq eshell-buffer-name term-name)
(eshell))))
(defun eshell-here ()
"Opens a new shell in the directory of the current buffer.
Renames the eshell buffer to match that directory to allow more
than one eshell window."
(interactive)
(eshell-there (if (buffer-file-name)
(file-name-directory (buffer-file-name))
default-directory)))
(bind-key "C-`" 'eshell-here)
(defun ha-eshell-send (command &optional dir)
"Send COMMAND to the Eshell buffer named with DIR.
The Eshell may have moved away from the directory originally
opened with DIR, but it should have the name of the buffer.
See `eshell--buffer-from-dir'."
(interactive "sCommand to Send: ")
(unless dir
(setq dir (projectile-project-root)))
(save-window-excursion
(eshell-there dir)
(goto-char (point-max))
(insert command)
(eshell-send-input)))
(defun execute-command-on-file-buffer (cmd)
"Executes a shell command, CMD, on the current buffer's file.
Appends the filename to the command if not specified, so:
chmod a+x
Works as expected. We replace the special variable `$$' with the
filename of the buffer. Note that `eshell-command' executes this
command, so eshell modifiers are available, for instance:
mv $$ $$(:r).txt
Will rename the current file to now have a .txt extension.
See `eshell-display-modifier-help' for details on that."
(interactive "sExecute command on File Buffer: ")
(let* ((file-name (buffer-file-name))
(full-cmd (cond ((string-match (rx "$$") cmd)
(replace-regexp-in-string (rx "$$") file-name cmd))
((and file-name (string-match (rx (literal file-name)) cmd))
cmd)
(t
(concat cmd " " file-name)))))
(message "Executing: %s" full-cmd)
(eshell-command full-cmd)))
(use-package! eshell
;;:type built-in
;;:custom (eshell-banner-message '(ha-eshell-banner))
:init
(setq eshell-error-if-no-glob t
;; This jumps back to the prompt:
eshell-scroll-to-bottom-on-input 'all
eshell-hist-ignoredups t
eshell-save-history-on-exit t
;; Since eshell starts fast, let's dismiss it on exit:
eshell-kill-on-exit t
eshell-destroy-buffer-when-process-dies t
;; Can you remember the parameter differences between the
;; executables `chmod' and `find' and their Emacs counterpart?
;; Me neither, so this makes it act a bit more shell-like:
eshell-prefer-lisp-functions nil))

View File

@ -25,15 +25,15 @@
;;helm ; the *other* search engine for love and life ;;helm ; the *other* search engine for love and life
;;ido ; the other *other* search engine... ;;ido ; the other *other* search engine...
;;ivy ; a search engine for love and life ;;ivy ; a search engine for love and life
vertico ; the search engine of the future (vertico +icons) ; the search engine of the future
:ui :ui
;;deft ; notational velocity for Emacs ;;deft ; notational velocity for Emacs
doom ; what makes DOOM look the way it does doom ; what makes DOOM look the way it does
;;doom-dashboard ; a nifty splash screen for Emacs ;;doom-dashboard ; a nifty splash screen for Emacs
;;doom-quit ; DOOM quit-message prompts when you quit Emacs ;;doom-quit ; DOOM quit-message prompts when you quit Emacs
;;(emoji +unicode) ; 🙂 (emoji +unicode) ; 🙂
hl-todo ; highlight TODO/FIXME/NOTE/DEPRECATED/HACK/REVIEW ;;hl-todo ; highlight TODO/FIXME/NOTE/DEPRECATED/HACK/REVIEW
;;hydra ;;hydra
indent-guides ; highlighted indent columns indent-guides ; highlighted indent columns
;;ligatures ; ligatures and symbols to make your code pretty again ;;ligatures ; ligatures and symbols to make your code pretty again
@ -43,27 +43,27 @@
;;neotree ; a project drawer, like NERDTree for vim ;;neotree ; a project drawer, like NERDTree for vim
ophints ; highlight the region an operation acts on ophints ; highlight the region an operation acts on
(popup +defaults) ; tame sudden yet inevitable temporary windows (popup +defaults) ; tame sudden yet inevitable temporary windows
tabs ; a tab bar for Emacs ;;tabs ; a tab bar for Emacs
treemacs ; a project drawer, like neotree but cooler treemacs ; a project drawer, like neotree but cooler
;;unicode ; extended unicode support for various languages ;;unicode ; extended unicode support for various languages
(vc-gutter +pretty) ; vcs diff in the fringe (vc-gutter +pretty) ; vcs diff in the fringe
vi-tilde-fringe ; fringe tildes to mark beyond EOB vi-tilde-fringe ; fringe tildes to mark beyond EOB
window-select ; visually switch windows window-select ; visually switch windows
;;workspaces ; tab emulation, persistence & separate workspaces ;;workspaces ; tab emulation, persistence & separate workspaces
;;zen ; distraction-free coding or writing zen ; distraction-free coding or writing
:editor :editor
;; (evil +everywhere) ;; (evil +everywhere) ; come to the dark side, we have cookies
(evil); come to the dark side, we have cookies evil
file-templates ; auto-snippets for empty files file-templates ; auto-snippets for empty files
fold ; (nigh) universal code folding fold ; (nigh) universal code folding
;;(format +onsave) ; automated prettiness ;;(format +onsave) ; automated prettiness
format ; automated prettiness format
;;god ; run Emacs commands without modifier keys ;;god ; run Emacs commands without modifier keys
;;lispy ; vim for lisp, for people who don't like vim ;;lispy ; vim for lisp, for people who don't like vim
;;multiple-cursors ; editing in many places at once ;;multiple-cursors ; editing in many places at once
;;objed ; text object editing for the innocent ;;objed ; text object editing for the innocent
;;parinfer ; turn lisp into python, sort of parinfer ; turn lisp into python, sort of
;;rotate-text ; cycle region at point between text candidates ;;rotate-text ; cycle region at point between text candidates
snippets ; my elves. They type so I don't have to snippets ; my elves. They type so I don't have to
word-wrap ; soft wrapping with language-aware indent word-wrap ; soft wrapping with language-aware indent
@ -83,23 +83,24 @@
:checkers :checkers
syntax ; tasing you for every semicolon you forget syntax ; tasing you for every semicolon you forget
(spell +flyspell) ; tasing you for misspelling mispelling ;; (spell +flyspell) ; tasing you for misspelling mispelling
spell ; tasing you for misspelling mispelling
;;grammar ; tasing grammar mistake every you make ;;grammar ; tasing grammar mistake every you make
:tools :tools
;;ansible ;;ansible
;;biblio ; Writes a PhD for you (citation needed) ;;biblio ; Writes a PhD for you (citation needed)
;;debugger ; FIXME stepping through code, to help you add bugs ;;(debugger +lsp) ; FIXME stepping through code, to help you add bugs
direnv direnv
;;docker ;;docker
;;editorconfig ; let someone else argue about tabs vs spaces editorconfig ; let someone else argue about tabs vs spaces
ein ; tame Jupyter notebooks with emacs ;;ein ; tame Jupyter notebooks with emacs
;;(eval +overlay) ; run code, run (also, repls) ;;(eval +overlay) ; run code, run (also, repls)
;;gist ; interacting with github gists ;;gist ; interacting with github gists
(lookup +dictionary +offline) ; navigate your code and its documentation (lookup +dictionary +offline) ; navigate your code and its documentation
lsp ; M-x vscode lsp ; M-x vscode
magit ; a git porcelain for Emacs magit ; a git porcelain for Emacs
;;make ; run make tasks from Emacs make ; run make tasks from Emacs
;;pass ; password manager for nerds ;;pass ; password manager for nerds
;;pdf ; pdf enhancements ;;pdf ; pdf enhancements
;;prodigy ; FIXME managing external services & code builders ;;prodigy ; FIXME managing external services & code builders
@ -147,7 +148,7 @@
;;javascript ; all(hope(abandon(ye(who(enter(here)))))) ;;javascript ; all(hope(abandon(ye(who(enter(here))))))
;;julia ; a better, faster MATLAB ;;julia ; a better, faster MATLAB
;;kotlin ; a better, slicker Java(Script) ;;kotlin ; a better, slicker Java(Script)
;;latex ; writing papers in Emacs has never been so fun latex ; writing papers in Emacs has never been so fun
;;lean ; for folks with too much to prove ;;lean ; for folks with too much to prove
;;ledger ; be audit you can be ;;ledger ; be audit you can be
;;lua ; one-based indices? one-based indices ;;lua ; one-based indices? one-based indices
@ -174,7 +175,7 @@
;;solidity ; do you need a blockchain? No. ;;solidity ; do you need a blockchain? No.
;;swift ; who asked for emoji variables? ;;swift ; who asked for emoji variables?
;;terra ; Earth and Moon in alignment for performance. ;;terra ; Earth and Moon in alignment for performance.
;;web ; the tubes (web +lsp) ; the tubes
yaml ; JSON, but readable yaml ; JSON, but readable
;;zig ; C, but simpler ;;zig ; C, but simpler
@ -184,13 +185,13 @@
;;(wanderlust +gmail) ;;(wanderlust +gmail)
:app :app
;;calendar calendar
;;emms ;;emms
;;everywhere ; *leave* Emacs!? You must be joking ;;everywhere ; *leave* Emacs!? You must be joking
irc ; how neckbeards socialize ;;irc ; how neckbeards socialize
(rss +org) ; emacs as an RSS reader ;;(rss +org) ; emacs as an RSS reader
;;twitter ; twitter client https://twitter.com/vnought ;;twitter ; twitter client https://twitter.com/vnought
:config :config
;;literate literate
(default +bindings +smartparens)) (default +bindings +smartparens))

View File

@ -37,3 +37,18 @@
(package! elpher) (package! elpher)
(package! eww) (package! eww)
(package! math-symbol-lists)
(package! company-emoji)
(if (>= emacs-major-version 27)
(progn
(unpin! org-roam)
(package! org-roam-ui)
(package! simple-httpd)
(package! websocket)))
(package! org-bullets
:recipe (:host github :repo "sabof/org-bullets"))
(package! org-anki)
(package! wrap-region)