diff options
Diffstat (limited to 'config/doom/config.org')
-rw-r--r-- | config/doom/config.org | 212 |
1 files changed, 164 insertions, 48 deletions
diff --git a/config/doom/config.org b/config/doom/config.org index 63e6977..339dc73 100644 --- a/config/doom/config.org +++ b/config/doom/config.org @@ -28,11 +28,6 @@ (add-hook 'prog-mode-hook 'on/prettify-symbols) #+end_src -This determines the style of line numbers in effect. If set to `nil', line -numbers are disabled. For relative line numbers, set this to `relative'. -#+begin_src emacs-lisp -;(setq display-line-numbers-type 'relative) -#+end_src ** Frame title includes visited file #+BEGIN_SRC emacs-lisp ;;http://emacs-fu.blogspot.fr/2011/01/setting-frame-title.html @@ -41,15 +36,6 @@ numbers are disabled. For relative line numbers, set this to `relative'. (abbreviate-file-name (buffer-file-name)) "%b")))) #+END_SRC -** Keybindings -#+begin_src emacs-lisp -(map! :leader - :desc "M-x" "x" #'execute-extended-command - ) -(after! evil - (setq evil-default-state 'emacs) - (set-evil-initial-state! '(prog-mode text-mode fundamental-mode conf-mode pass-view-mode) 'normal)) -#+end_src ** Package Manager Doom manages packages separately. Keep that file separate #+begin_src emacs-lisp :tangle "packages.el" @@ -60,6 +46,35 @@ Doom manages packages separately. Keep that file separate #+begin_src emacs-lisp (setenv "SSH_AUTH_SOCK" (concat (getenv "XDG_RUNTIME_DIR")"/gnupg/S.gpg-agent.ssh")) #+end_src +** Auth mechanisms +#+begin_src emacs-lisp :tangle "packages.el" +(package! pass) +(package! password-store) +(package! password-store-otp) +#+end_src + +#+begin_src emacs-lisp +(use-package! pass + :init + (require 'auth-source) + (auth-source-pass-enable) + (defun on/fetch-password (&rest params) + (if-let* ((match (car (apply #'auth-source-search params))) + (secret (plist-get match :secret))) + (if (functionp secret) + (funcall secret) + secret) + (user-error "Password not found for %S" params)))) +#+end_src +** Keybindings +#+begin_src emacs-lisp +;; (map! :leader +;; :desc "M-x" "x" #'execute-extended-command +;; ) +(after! evil + (setq evil-default-state 'emacs) + (set-evil-initial-state! '(prog-mode text-mode fundamental-mode conf-mode pass-view-mode) 'normal)) +#+end_src ** Avy This allows me to jump to buffer positions using my home row ordering #+begin_src emacs-lisp @@ -71,7 +86,6 @@ This allows me to jump to buffer positions using my home row ordering ** Ace window #+begin_src emacs-lisp (after! ace-window - (global-set-key (kbd "s-w") 'evil-window-map) (setq aw-keys '(?r ?t ?i ?e ?a ?o ?n ?s))) #+end_src ** Which-key @@ -107,6 +121,20 @@ Because I always need help and it should come up quickly #+begin_src emacs-lisp (add-hook 'after-save-hook 'executable-make-buffer-file-executable-if-script-p) #+end_src +** AI queries +#+begin_src emacs-lisp +(use-package! ai-query + :load-path "~/dev/dotfiles/elisp/" + :commands (ai-query-request)) +#+end_src + +** Track Deliveries +#+begin_src emacs-lisp +(use-package! delivery-track + :load-path "~/dev/dotfiles/elisp/" + :commands (delivery-track-update-dhl)) +#+end_src + * Dictionary #+begin_src emacs-lisp :tangle "packages.el" (package! lexic) @@ -157,6 +185,15 @@ Shamelessly copied from https://tecosaur.github.io/emacs-config/#dictionary `("e" "Event" entry (file ,(expand-file-name "caldav.org" org-directory)) "* %?\n%^T\n%i\n%a")) + (add-to-list 'org-capture-templates + `("m" "NBG-TM Contact" entry + (file+headline ,(expand-file-name "toastmasters/NBG-membership.org" org-directory) "Guest") + "* INTRS [[notmuch-search:%:reply-to][%:fromname]] +:PROPERTIES: +:EMAIL: %:reply-to +:END: +Invited: %^t +")) (setq org-roam-capture-templates '(("d" "default" plain "%i\n%?" :target (file+head "%<%Y%m%d%H%M%S>-${slug}.org" @@ -203,8 +240,10 @@ this new window. (call-process "org_agenda_sync" nil (list :file (expand-file-name "~/org/caldav.org")) nil "--format" "org")) - (setq cal-sync-url "https://oscar@cloud.oscarnajera.com/remote.php/dav/calendars/oscar" - cal-sync-calendar-id "personal-1" + (setq cal-sync-connection + (cal-sync-calendar-create + "https://cloud.oscarnajera.com/remote.php/dav/calendars/oscar/personal-1/" + "oscar" "~/org/caldav.org") org-icalendar-date-time-format ":%Y%m%dT%H%M%SZ")) #+end_src ** References @@ -265,6 +304,7 @@ this new window. "http://feeds.feedburner.com/TroyHunt" "http://kitchingroup.cheme.cmu.edu/blog/feed/index.xml" "http://www.howardism.org/index.xml" + "https://www.reddit.com/r/Common_Lisp/.rss" "https://ag91.github.io/rss.xml" "https://architectelevator.com/feed.xml" "https://bitcoinops.org/feed.xml" @@ -291,7 +331,7 @@ this new window. #+begin_src emacs-lisp :tangle "packages.el" (package! notmuch :pin "c769658360e10a6d01a4134e680e2f498741bc5c") (package! org-mime :pin "cc00afcf0291633324364c1c83bfe2833cfdc1bf") -(package! ol-notmuch :pin "781c3518a537da2a8b5e8a4424f9441df463a147") +(package! ol-notmuch :pin "2704345ac8c4558c7c787d2ea0a4777607789a62") #+end_src #+BEGIN_SRC emacs-lisp (use-package! notmuch @@ -328,7 +368,7 @@ this new window. (:name "Isar-Speak" :query "(tag:Isar-Speak or tag:lists/isar-speak-officers) and tag:unread" :key "t") (:name "flagged" :query "tag:flagged" :key "f") (:name "sent" :query "tag:sent" :key "s") - (:name "unread" :query "tag:unread" :key "u") + (:name "unread" :query "tag:unread and not tag:fail2ban and not tag:Checkm-Alerts" :key "u") (:name "drafts" :query "tag:draft" :key "d"))) (setq notmuch-show-all-tags-list t @@ -425,12 +465,9 @@ this new window. "Read mbsync config to extract IMAPAccounts." (with-temp-buffer (insert-file-contents (expand-file-name "~/.mbsyncrc")) - (let ((pick (thread-last - (cl-loop while (search-forward-regexp (rx bol "IMAPAccount " (group (+ any)) eol) nil t) - collect (match-string 1)) - (cons "all") - (completing-read "Which mailbox")))) - (if (string= pick "all") nil (list pick))))) + (cl-loop while (search-forward-regexp (rx bol "IMAPAccount " (group (+ any)) eol) nil t) + collect (match-string 1)))) + (define-derived-mode mail-sync-log-mode comint-mode "mail-sync-log" "Major mode for reading mail sync." @@ -439,16 +476,21 @@ this new window. (,(rx bol " [mv]") . font-lock-constant-face) (,(rx bol " [rm]") . font-lock-keyword-face))))) -(defun on/fetch-all-email () - "Start tagmail fetch on a subprocess." - (interactive) +(defun on/fetch-all-email (mailbox) + "Start tagmail fetch on a subprocess for MAILBOX." + (interactive (list (completing-read + "Which mailbox? " + (on/registered-mail-accounts) + nil nil nil nil "all"))) (with-current-buffer (get-buffer-create "*E-mail fetch*") (pop-to-buffer (current-buffer)) (mail-sync-log-mode) (make-process :name "E-mail fetch" :buffer (current-buffer) - :command (cons "tagmail" (on/registered-mail-accounts)) + :command (thread-last + (if (string= mailbox "all") nil (list mailbox)) + (cons "tagmail")) :filter #'comint-output-filter))) #+END_SRC ** Sending email @@ -467,6 +509,7 @@ this new window. (string-split "@"))) (smtp-servers '("oscarnajera.com" "mail.oscarnajera.com" "gmail.com" "smtp.googlemail.com" + "googlemail.com" "smtp.googlemail.com" "byteplant.com" "smtp.byteplant.com")) ((&plist :host :user :port :secret) (car @@ -489,21 +532,27 @@ this new window. (package! khardel) #+end_src #+begin_src emacs-lisp -(use-package! khardel) +(use-package! khardel + :config + (after! tree-sitter-langs + (add-to-list 'tree-sitter-major-mode-language-alist '(khardel-edit-mode . yaml))) + (add-hook 'khardel-edit-mode-hook + (lambda () + (tree-sitter-mode) + (setq imenu-create-index-function #'on/imenu-nested-path-elements)))) #+end_src * IRC #+begin_src emacs-lisp -(set-irc-server! "irc.libera.chat" - `(:tls t - :port 6697 - :nick "titan-c" - :sasl-username ,(+pass-get-user "Social/freenode/titan-c") - :sasl-password (lambda (&rest _) (+pass-get-secret "Social/freenode/titan-c")) - :channels ("#emacs" "#guix"))) +(after! circe + (set-irc-server! "irc.libera.chat" + '(:tls t + :port 6697 + :nick "titan-c" + :sasl-username "titan-c" + :sasl-password (lambda (&rest _) (on/fetch-password :user "titan-c" :host "freenode")) + :channels ("#emacs" "#guix")))) #+end_src -#+RESULTS: - * Ledger Emacs mode for managing ledger text files #+BEGIN_SRC emacs-lisp @@ -592,13 +641,83 @@ Emacs mode for managing ledger text files :load-path "~/dev/emacs-lisp/emacs-libyaml/") (use-package! yaml) -#+end_src -** Databases -#+begin_src emacs-lisp :tangle "packages.el" -(package! emacsql-psql) +(after! yaml-mode + ;; Inspired by this blog post to use tree sitter to create a imenu list. + ;; https://blog.meain.io/2022/navigating-config-files-using-tree-sitter/ + (defun on/ts-elements () + "Tree sitter matches for all entries in data buffer." + (let ((query (thread-last + (cond + ((derived-mode-p 'json-mode) + "(object (pair (string (string_content) @key) (_)) @item)") + ((derived-mode-p 'yaml-mode) + "(block_mapping_pair (flow_node) @key (_)) @item")) + (tsc-make-query tree-sitter-language))) + (root-node (tsc-root-node tree-sitter-tree))) + (tsc-query-matches query root-node #'tsc--buffer-substring-no-properties))) + + (defun on/pos-items (ts-match) + "From a TS-MATCH get element key name and region in buffer." + (pcase-let ((`[(_ . ,item) (_ . ,key)] (cdr ts-match))) + (list + (tsc-node-text key) + (tsc-node-byte-range item) + ;; (destructuring-bind (s . e) (tsc-node-byte-range key) + ;; (cons (byte-to-position s) (byte-to-position e))) + ))) + + (defun on/nested-item-names (items) + "From named ITEMS figure out the nested hierarchy for names." + (let ((node-stack '(("" 0))) + result) + (dolist (item items (nreverse result)) + (pcase-let ((`(,item-name (,item-start . ,item-end)) item) + (`((_ ,parent-end)) node-stack)) + (when (< parent-end item-end) + (setq node-stack (seq-filter (lambda (y) + (<= item-end (cadr y))) + node-stack))) + (push (list item-name item-end) node-stack) + (push (list (nreverse (mapcar #'car node-stack)) + item-start) + result))))) + + (defun on/imenu-nested-path-elements () + "On a yaml or json buffer get the element positions for imenu." + (thread-last + (seq-map #'on/pos-items (on/ts-elements)) + (on/nested-item-names) + (seq-map (lambda (item) + (seq-let (name-chain start) item + (cons (string-join name-chain ".") (byte-to-position start))))))) + + (remove-hook 'yaml-mode-hook 'yaml-set-imenu-generic-expression) ;; don't use default one + (add-hook 'yaml-mode-hook + (lambda () + (setq imenu-create-index-function #'on/imenu-nested-path-elements))) + + (ert-deftest on/tree-sitter-imenu () + "Test the imenu generation." + (with-temp-buffer + (yaml-mode) + (tree-sitter-mode) + (insert "one: Ñaño +skills: + run: 3 + jump: + high: 7 + low: 2 + +") + (should + (equal '(("one" . 1) ("skills" . 13) ("skills.run" . 23) ("skills.jump" . 32) ("skills.jump.high" . 43) ("skills.jump.low" . 55)) + (on/imenu-nested-path-elements))) + )) + ) #+end_src +** Databases #+begin_src emacs-lisp (after! format-all (define-format-all-formatter sqlformat @@ -694,15 +813,12 @@ Emacs mode for managing ledger text files (user "crazy") (port (plist-get networks (intern (completing-read "Pick network: " networks)))) - (secret (-some-> - (auth-source-search :host host) - (car) - (plist-get :secret)))) + (secret (on/fetch-password :host host))) (when (and btc-explorer-bitcoind (json-rpc-live-p btc-explorer-bitcoind)) (json-rpc-close btc-explorer-bitcoind)) (setq btc-explorer-bitcoind - (json-rpc-connect host port user (funcall secret)))))) + (json-rpc-connect host port user secret))))) (use-package! lnd :load-path "~/dev/emacs-lisp/btc-explorer/" |