Compare commits
10 commits
7b24216fe1
...
bd24cb6def
Author | SHA1 | Date | |
---|---|---|---|
bd24cb6def | |||
e178ca2d41 | |||
5836a55f4c | |||
7e581611fb | |||
3c75681b25 | |||
348f71e570 | |||
c76c236991 | |||
1de5e3892c | |||
f460c3a19f | |||
9c1ef54e74 |
5 changed files with 168 additions and 50 deletions
28
oni-core.el
28
oni-core.el
|
@ -4,7 +4,7 @@
|
|||
|
||||
;; Author: Tom Willemse <tom@ryuslash.org>
|
||||
;; Keywords: local
|
||||
;; Version: 2023.0401.230128
|
||||
;; Version: 2023.0415.204431
|
||||
;; Package-Requires: (oni-data-dir oni-embrace oni-hydra expand-region multiple-cursors gcmh diminish ws-butler which-key insert-char-preview mixed-pitch ace-window vertico marginalia orderless consult embark docstr)
|
||||
|
||||
;; This program is free software; you can redistribute it and/or modify
|
||||
|
@ -429,7 +429,9 @@ _s_: String list"
|
|||
|
||||
(with-eval-after-load 'consult
|
||||
(with-eval-after-load 'related-files
|
||||
(add-to-list 'consult-buffer-sources 'oni-core-related-places-source)))
|
||||
(add-to-list 'consult-buffer-sources 'oni-core-related-places-source))
|
||||
|
||||
(consult-customize consult-buffer :preview-key nil))
|
||||
|
||||
;;; Embark
|
||||
|
||||
|
@ -450,6 +452,28 @@ _s_: String list"
|
|||
(slot . 0)
|
||||
(window-width . oni-core-fit-window-to-buffer)))
|
||||
|
||||
;;; Extra debugging
|
||||
|
||||
;;; From https://gist.github.com/jdtsmith/1fbcacfe677d74bbe510aec80ac0050c
|
||||
(defun oni-core-reraise-error (func &rest args)
|
||||
"Call function FUNC with ARGS and re-raise any error which occurs.
|
||||
Useful for debugging post-command hooks and filter functions,
|
||||
which normally have their errors suppressed."
|
||||
(condition-case err
|
||||
(apply func args)
|
||||
((debug error) (signal (car err) (cdr err)))))
|
||||
|
||||
(defun toggle-debug-on-hidden-errors (func)
|
||||
"Toggle hidden error debugging for function FUNC."
|
||||
(interactive "a")
|
||||
(cond
|
||||
((advice-member-p #'oni-core-reraise-error func)
|
||||
(advice-remove func #'oni-core-reraise-error)
|
||||
(message "Debug on hidden errors disabled for %s" func))
|
||||
(t
|
||||
(advice-add func :around #'oni-core-reraise-error)
|
||||
(message "Debug on hidden errors enabled for %s" func))))
|
||||
|
||||
;;; Native Compilation
|
||||
|
||||
(setq native-comp-async-report-warnings-errors 'silent)
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
;; Author: Tom Willemse <tom@ryuslash.org>
|
||||
;; Keywords: local
|
||||
;; Version: 2023.0401.234314
|
||||
;; Version: 2023.0412.115324
|
||||
;; Package-Requires: (elfeed olivetti)
|
||||
|
||||
;; This program is free software; you can redistribute it and/or modify
|
||||
|
@ -39,7 +39,6 @@
|
|||
|
||||
(setq elfeed-feeds
|
||||
'("http://nullprogram.com/feed/"
|
||||
("http://planet.emacsen.org/atom.xml" emacs)
|
||||
("http://oremacs.com/atom.xml" emacs)
|
||||
("http://emacshorrors.com/feed.atom" emacs)
|
||||
("http://emacsredux.com/atom.xml" emacs)
|
||||
|
@ -53,8 +52,6 @@
|
|||
"https://news.ycombinator.com/rss"
|
||||
("https://lwn.net/headlines/newrss" linux)
|
||||
("https://serversforhackers.com/feed.xml" linux)
|
||||
"http://julien.danjou.info/blog/index.xml"
|
||||
"https://sites.google.com/site/darkwavestyle/SecretPage1/posts.xml"
|
||||
("http://lispblog.xach.com/rss" lisp)
|
||||
"http://esr.ibiblio.org/?feed=rss2"
|
||||
"http://feeds.feedburner.com/GiantRobotsSmashingIntoOtherGiantRobots"
|
||||
|
@ -83,7 +80,8 @@
|
|||
"https://planet.emacslife.com/atom.xml"
|
||||
"https://www.reddit.com/r/wallpapers/new.xml"
|
||||
"https://picolisp-explored.com/rss.xml"
|
||||
"https://onethingwell.org/rss"))
|
||||
"https://onethingwell.org/rss"
|
||||
"https://hackaday.com/tag/cyberdeck/feed/"))
|
||||
|
||||
(add-hook 'elfeed-new-entry-hook
|
||||
(elfeed-make-tagger :before "2 weeks ago"
|
||||
|
@ -93,7 +91,11 @@
|
|||
(add-hook 'elfeed-new-entry-hook
|
||||
(elfeed-make-tagger :feed-url (rx "lwn.net")
|
||||
:entry-title (rx bos (or "[$]"
|
||||
"Security updates for"))
|
||||
(seq "Security"
|
||||
whitespace
|
||||
"updates"
|
||||
whitespace
|
||||
"for")))
|
||||
:remove 'unread))
|
||||
|
||||
;;; Mark any post not containing my resolutions as read.
|
||||
|
@ -105,13 +107,16 @@
|
|||
|
||||
;;; Mark any post from Planet Emacslife read if I also follow the originating
|
||||
;;; blog. This way I won't have so many duplicates.
|
||||
(add-hook 'elfeed-new-entry-hook
|
||||
(elfeed-make-tagger :feed-url (rx "planet.emacslife.com")
|
||||
:entry-title `(not ,(rx bos (or "Irreal"
|
||||
"Sacha Chua"
|
||||
"Andrea")
|
||||
":"))
|
||||
:remove 'unread))
|
||||
(defvar oni-elfeed-duplicate-tagger
|
||||
(elfeed-make-tagger :feed-url (rx "planet.emacslife.com")
|
||||
:entry-title (rx bos (or "Irreal"
|
||||
(seq "Sacha" whitespace "Chua")
|
||||
"Andrea")
|
||||
":")
|
||||
:remove 'unread)
|
||||
"Tagger for elfeed that marks certain posts as read for Emacslife.")
|
||||
|
||||
(add-hook 'elfeed-new-entry-hook oni-elfeed-duplicate-tagger)
|
||||
|
||||
(add-hook 'elfeed-show-mode-hook #'oni-elfeed-enable-olivetti-mode)
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
;; Author: Tom Willemse <tom@ryuslash.org>
|
||||
;; Keywords: local
|
||||
;; Version: 2023.0314.001059
|
||||
;; Version: 2023.0411.133217
|
||||
;; Package-Requires: (oni-company oni-flycheck oni-paredit oni-yasnippet oni-hydra rainbow-delimiters nameless erefactor flycheck-relint handle elisp-format)
|
||||
|
||||
;; This program is free software; you can redistribute it and/or modify
|
||||
|
@ -84,6 +84,16 @@
|
|||
(:eval (buffer-name ielm-working-buffer))
|
||||
mode-line-end-spaces)))
|
||||
|
||||
(defun oni-elisp-ielm-remove-paredit-newline-keys ()
|
||||
"Disable ‘C-j’ and ‘RET’ keybindings from ‘paredit-mode’."
|
||||
(let ((oldmap (map-elt minor-mode-map-alist 'paredit-mode))
|
||||
(newmap (make-sparse-keymap)))
|
||||
(set-keymap-parent newmap oldmap)
|
||||
(define-key newmap (kbd "RET") nil)
|
||||
(define-key newmap (kbd "C-j") nil)
|
||||
(make-local-variable 'minor-mode-overriding-map-alist)
|
||||
(push `(paredit-mode . ,newmap) minor-mode-overriding-map-alist)))
|
||||
|
||||
(defhydra oni-elisp-hydra (:color teal :hint nil)
|
||||
"
|
||||
^Eval^
|
||||
|
@ -102,6 +112,7 @@ _eb_: Buffer
|
|||
(add-hook 'emacs-lisp-mode-hook 'paredit-mode)
|
||||
(add-hook 'emacs-lisp-mode-hook 'rainbow-delimiters-mode)
|
||||
|
||||
(add-hook 'ielm-mode-hook #'oni-elisp-ielm-remove-paredit-newline-keys)
|
||||
(add-hook 'ielm-mode-hook #'oni-elisp-setup-ielm-mode-line)
|
||||
(add-hook 'ielm-mode-hook 'company-mode)
|
||||
(add-hook 'ielm-mode-hook 'paredit-mode)
|
||||
|
|
106
oni-eshell.el
106
oni-eshell.el
|
@ -4,7 +4,7 @@
|
|||
|
||||
;; Author: Tom Willemse <tom@ryuslash.org>
|
||||
;; Keywords: local
|
||||
;; Version: 2022.1127.221317
|
||||
;; Version: 2023.0414.233822
|
||||
;; Package-Requires: (eshell-fringe-status esh-autosuggest xterm-color eshell-syntax-highlighting)
|
||||
|
||||
;; This program is free software; you can redistribute it and/or modify
|
||||
|
@ -81,34 +81,26 @@
|
|||
(eshell/cd (file-name-directory (buffer-file-name (get-buffer buffer-name))))
|
||||
(eshell-reset))
|
||||
|
||||
(defun oni-eshell-shorten-directories (path)
|
||||
"Shorten PATH to a list of unique shortened directory names."
|
||||
(let* ((directories (split-string path "/" t))
|
||||
(new-path
|
||||
(string-join
|
||||
(mapcar (lambda (d)
|
||||
(let ((name (substring d 0 1))
|
||||
(length 1))
|
||||
(while (cl-find-if (lambda (s) (and (not (string= s d))
|
||||
(string-prefix-p name s)))
|
||||
directories)
|
||||
(setq name (substring d 0 (cl-incf length))))
|
||||
name))
|
||||
directories) "/")))
|
||||
(if (string-prefix-p "~" new-path)
|
||||
new-path
|
||||
(concat "/" new-path))))
|
||||
|
||||
(defun oni-eshell-disable-beacon-on-scroll ()
|
||||
"Disable ‘beacon-blink-when-window-scrolls’ in the current buffer."
|
||||
(setq-local beacon-blink-when-window-scrolls nil))
|
||||
|
||||
(defun oni-eshell-change-font ()
|
||||
"Remap the default font to the one I use for terminals."
|
||||
(face-remap-add-relative 'default :family "Classic Console Neue"))
|
||||
|
||||
(defun oni-eshell-set-page-delimiter ()
|
||||
"Change the page delimiter so that it matches the prompt for easy navigation."
|
||||
(setq-local page-delimiter eshell-prompt-regexp))
|
||||
|
||||
(add-hook 'eshell-before-prompt-hook #'oni-eshell--set-xterm-variables)
|
||||
(add-hook 'eshell-first-time-mode-hook #'oni-eshell--expand-keymap)
|
||||
(add-hook 'eshell-load-hook #'oni-eshell--disable-ansi-color-handling)
|
||||
(add-hook 'eshell-load-hook #'oni-eshell--enable-truncating-buffers)
|
||||
(add-hook 'eshell-load-hook #'oni-eshell--enable-xterm-filter)
|
||||
(add-hook 'eshell-mode-hook #'oni-eshell-change-font)
|
||||
(add-hook 'eshell-mode-hook #'oni-eshell-disable-beacon-on-scroll)
|
||||
(add-hook 'eshell-mode-hook #'oni-eshell-set-page-delimiter)
|
||||
(add-hook 'eshell-mode-hook 'esh-autosuggest-mode)
|
||||
(add-hook 'eshell-mode-hook 'eshell-syntax-highlighting-mode)
|
||||
(add-hook 'eshell-mode-hook 'goto-address-mode)
|
||||
|
@ -126,5 +118,81 @@
|
|||
(slot . 0)
|
||||
(window-height . 0.33)))
|
||||
|
||||
;;; Eshell prompt
|
||||
|
||||
(defun oni-eshell-shortest-unique-directory (current-path directory)
|
||||
"Find the shortest unique substring of DIRECTORY.
|
||||
DIRECTORY should be a directory that exists within CURRENT-PATH."
|
||||
(catch 'result
|
||||
(dotimes (i (length directory))
|
||||
(let* ((current-directory (substring directory 0 (1+ i)))
|
||||
(dir-rx (rx string-start
|
||||
(literal current-directory)
|
||||
(zero-or-more any)))
|
||||
(matches (directory-files current-path nil dir-rx)))
|
||||
(when (= (length matches) 1)
|
||||
(throw 'result current-directory))))))
|
||||
|
||||
(defun oni-eshell-shorten-directory (directory)
|
||||
"Shorten DIRECTORY to the shortest unique names of each directory."
|
||||
(let ((current-path "/")
|
||||
(current-short-path "/")
|
||||
(home (concat (getenv "HOME") "/"))
|
||||
(components (string-split (expand-file-name directory) "/" t)))
|
||||
(dolist (dir components current-short-path)
|
||||
(let* ((shortened (propertize (oni-eshell-shortest-unique-directory current-path dir)
|
||||
'help-echo dir))
|
||||
(new-path (format "%s%s/" current-path dir))
|
||||
(new-short-path (if (string= new-path home)
|
||||
"~/"
|
||||
(format "%s%s/" current-short-path shortened))))
|
||||
(setq current-path new-path
|
||||
current-short-path new-short-path)))))
|
||||
|
||||
(defun oni-eshell-show-perforce-info-p ()
|
||||
"Predicate to indicate whether or not powershell info should be shown."
|
||||
(locate-dominating-file "." ".p4config"))
|
||||
|
||||
(defun oni-eshell-perforce-workspace ()
|
||||
"Function returning the current Perforce workspace."
|
||||
(car (map-elt (mapcar (lambda (str) (split-string str ": "))
|
||||
(split-string (shell-command-to-string "p4 info -s") "\n"))
|
||||
"Client name")))
|
||||
|
||||
(defun oni-eshell-perforce-root ()
|
||||
"Function returning the root directory of the current Perforce workspace."
|
||||
(string-replace
|
||||
"\\"
|
||||
"/"
|
||||
(car (map-elt (mapcar (lambda (str) (split-string str ": "))
|
||||
(split-string (shell-command-to-string "p4 info") "\n"))
|
||||
"Client root"))))
|
||||
|
||||
(defun oni-eshell-perforce-stream ()
|
||||
"Function returning the current Perforce stream."
|
||||
(string-trim-right (shell-command-to-string "p4 switch")))
|
||||
|
||||
(defun oni-eshell-prompt-function ()
|
||||
"Construct a prompt string for Eshell."
|
||||
(let* ((perforcep (oni-eshell-show-perforce-info-p))
|
||||
(pwd (eshell/pwd))
|
||||
(dir (if perforcep
|
||||
(concat (propertize (oni-eshell-perforce-workspace)
|
||||
'face '((foreground-color . "#ca3cad90828e")))
|
||||
":"
|
||||
(let ((relative-path (string-remove-prefix (oni-eshell-perforce-root) pwd)))
|
||||
(if (string= relative-path "") "/" relative-path)))
|
||||
(oni-eshell-shorten-directory pwd)))
|
||||
(stream (if perforcep (concat " ("
|
||||
(propertize (oni-eshell-perforce-stream)
|
||||
'face '((foreground-color . "#90e4ca3c828e")))
|
||||
")")
|
||||
"")))
|
||||
(concat dir
|
||||
stream
|
||||
(if (= (user-uid) 0) " # " " $ "))))
|
||||
|
||||
(setq eshell-prompt-function #'oni-eshell-prompt-function)
|
||||
|
||||
(provide 'oni-eshell)
|
||||
;;; oni-eshell.el ends here
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
;; Author: Tom Willemse <tom@ryuslash.org>
|
||||
;; Keywords: local
|
||||
;; Version: 2023.0409.214302
|
||||
;; Version: 2023.0411.202312
|
||||
;; Package-Requires: (oni-yasnippet oni-alert oni-hydra org org-contrib org-bullets org-edna diminish all-the-icons olivetti form-feed org-pretty-table)
|
||||
|
||||
;; This program is free software; you can redistribute it and/or modify
|
||||
|
@ -600,16 +600,7 @@ also move point to the start of the heading."
|
|||
(setq org-agenda-dim-blocked-tasks 'invisible)
|
||||
|
||||
(setq org-agenda-custom-commands
|
||||
`(("t" . "Things to do")
|
||||
("tt" "Todo at this computer" tags-todo ,(format "@%s|@computer|@emacs/TODO" (system-name))
|
||||
((org-overriding-columns-format "%TODO %46ITEM %1BLOCKED %Effort")))
|
||||
("tf" "Fun things to do" tags-todo "+fun")
|
||||
;; ("r" "Reading list" tags-todo "TODO=\"READ\"+SCHEDULED=\"\"-Effort=\"\""
|
||||
;; ((org-overriding-columns-format "%8CATEGORY %ITEM %3EFFORT")
|
||||
;; (org-agenda-sorting-strategy '(priority-down effort-up))
|
||||
;; (org-agenda-prefix-format " (%3e) %i %-12:c")))
|
||||
;; ("R" "Reading list (requires estimating)" tags-todo
|
||||
;; "TODO=\"READ\"+Effort=\"\"")
|
||||
`(("t" "Todo" tags-todo "TODO=\"TODO\"-CATEGORY=\"project\"+(SCHEDULED<\"<tomorrow>\"|TODO=\"TODO\"-CATEGORY=\"project\"+SCHEDULED=\"\")")
|
||||
("r" . "Reading")
|
||||
("rc" "Casual reading" tags-todo "TODO=\"READ\"+casual")
|
||||
("rn" "Noteworthy reading" tags-todo "TODO=\"READ\"+note")
|
||||
|
@ -776,6 +767,26 @@ After running it once remove it from `org-capture-after-finalize-hook'."
|
|||
(org-goto-first-child)
|
||||
(list (point-marker))))
|
||||
|
||||
(defun org-edna-condition/day-of-week? (neg weekday)
|
||||
(let ((condition (not (= (string-to-number (format-time-string "%u")) weekday))))
|
||||
(when (xor condition neg)
|
||||
"Not the right day.")))
|
||||
|
||||
(defun org-edna-condition/night-time? (neg)
|
||||
"A condition for ‘org-edna’ see if it's what I consider nighttime."
|
||||
(let* ((hour (nth 2 (decode-time)))
|
||||
(condition (or (> hour 20)
|
||||
(< hour 8))))
|
||||
(when (xor condition neg)
|
||||
"Too late!")))
|
||||
|
||||
(defun org-edna-condition/business-hours? (neg timezone)
|
||||
"A condition for ‘org-edna’ to see if it's during regular business hours."
|
||||
(let* ((hour (nth 2 (decode-time nil timezone)))
|
||||
(condition (> 9 hour 18)))
|
||||
(when (xor condition neg)
|
||||
(format "Outside of business hours in %s!" timezone))))
|
||||
|
||||
;;; Refile
|
||||
|
||||
(defun oni-org-refile-to-top ()
|
||||
|
@ -1083,10 +1094,9 @@ placed above TARGET. Otherwise it will be placed below it."
|
|||
(goto-char (point-min))
|
||||
(org-forward-heading-same-level 1)
|
||||
(let* ((element (org-element-at-point-no-context))
|
||||
(element-data (when element (cadr element)))
|
||||
(element-title (when element-data (map-elt element-data :raw-value)))
|
||||
(contents-begin (when element-data (map-elt element-data :contents-begin)))
|
||||
(contents-end (when element-data (map-elt element-data :contents-end))))
|
||||
(element-title (org-element-property :raw-value element))
|
||||
(contents-begin (org-element-property :contents-begin element))
|
||||
(contents-end (org-element-property :contents-end element)))
|
||||
(when contents-begin
|
||||
(let ((text (buffer-substring-no-properties contents-begin contents-end)))
|
||||
(delete-region contents-begin contents-end)
|
||||
|
|
Loading…
Reference in a new issue