aboutsummaryrefslogtreecommitdiffstats
path: root/config/doom/config.org
diff options
context:
space:
mode:
Diffstat (limited to 'config/doom/config.org')
-rw-r--r--config/doom/config.org212
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/"