diff --git a/local/lib/org-x/org-x-dag.el b/local/lib/org-x/org-x-dag.el index 6ae9f0e..fda1dd9 100644 --- a/local/lib/org-x/org-x-dag.el +++ b/local/lib/org-x/org-x-dag.el @@ -31,6 +31,9 @@ (require 'org-x-files) (require 'org-x-const) +(eval-when-compile + (require 'org-x-macs)) + ;;; DATE/TIME FUNCTIONS ;; current state @@ -3678,6 +3681,11 @@ review phase)" (t (message "Cannot link child from parent in current file")))))) +(defun org-x-dag-agenda-link-parent-to-child () + (interactive) + (org-x-agenda-cmd-wrapper nil + (org-x-dag-link-parent-to-child))) + ;; child -> parent linkers ;; ;; functions to retrieve a parent headline id and add it to the current @@ -3830,6 +3838,11 @@ review phase)" (t (message "Cannot link parent from child in current file")))))) +(defun org-x-dag-agenda-link-child-to-parent () + (interactive) + (org-x-agenda-cmd-wrapper nil + (org-x-dag-link-child-to-parent))) + ;; add nodes (defun org-x-dag-read-string-until (prompt pred msg) diff --git a/local/lib/org-x/org-x-files.el b/local/lib/org-x/org-x-files.el index edfabba..780450c 100644 --- a/local/lib/org-x/org-x-files.el +++ b/local/lib/org-x/org-x-files.el @@ -144,12 +144,5 @@ PATH must be relative to `org-directory' and end in '.org'." (append (org-x-get-action-files) (org-x-get-incubator-files))) -(defmacro org-x-with-file (path &rest body) - "Open PATH and execute BODY." - (declare (indent 1)) - `(with-current-buffer (find-file-noselect ,path) - (save-excursion - ,@body))) - (provide 'org-x-files) ;;; org-x-files.el ends here diff --git a/local/lib/org-x/org-x-macs.el b/local/lib/org-x/org-x-macs.el new file mode 100644 index 0000000..7064568 --- /dev/null +++ b/local/lib/org-x/org-x-macs.el @@ -0,0 +1,76 @@ +;;; org-x-macs.el --- Org for Apple Devs ;) -*- lexical-binding: t; -*- + +;; Copyright (C) 2022 Nathan Dwarshuis + +;; Author: Nathan Dwarshuis + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;;; Code: + +(require 'org-agenda) +(require 'dash) + +(defmacro org-x-with-file (path &rest body) + "Open PATH and execute BODY." + (declare (indent 1)) + `(with-current-buffer (find-file-noselect ,path) + (save-excursion + ,@body))) + +;; lift buffer commands into agenda context + +;; TODO body prints a message and update is 'update-all' then the +;; message will be overwritten +(defmacro org-x-agenda-cmd-wrapper (update &rest body) + "Execute BODY in context of agenda buffer. +Specifically, navigate to the original header, execute BODY, then +update the agenda buffer. If UPDATE is 'update-headline', get the +headline string and use it to update the agenda (this is only +needed when the headline changes obviously). When update is +'update-all', reload the entire buffer. When UPDATE is nil, do +nothing." + (declare (indent 1)) + (-let* ((newhead (make-symbol "newhead")) + (hdmarker (make-symbol "hdmarker")) + ((update-form get-head-form) + (cond + ((eq update 'update-headline) + (list `((org-agenda-change-all-lines ,newhead ,hdmarker)) + `((setq ,newhead (org-get-heading))))) + ((eq update 'update-all) + (list '((org-agenda-redo)) + nil))))) + `(progn + (org-agenda-check-no-diary) + (let* ((,hdmarker (or (org-get-at-bol 'org-hd-marker) + (org-agenda-error))) + (buffer (marker-buffer ,hdmarker)) + (pos (marker-position ,hdmarker)) + (inhibit-read-only t) + ,newhead) + (org-with-remote-undo buffer + (with-current-buffer buffer + (widen) + (goto-char pos) + (org-show-context 'agenda) + ,@body + ,@get-head-form) + ,@update-form + (beginning-of-line 1)))))) + +(provide 'org-x-macs) +;;; org-x-macs.el ends here diff --git a/local/lib/org-x/org-x.el b/local/lib/org-x/org-x.el index 7df2cce..95e97e0 100644 --- a/local/lib/org-x/org-x.el +++ b/local/lib/org-x/org-x.el @@ -39,6 +39,9 @@ (require 'org-x-agg) (require 'org-x-dag) +(eval-when-compile + (require 'org-x-macs)) + ;;; INTERNAL CONSTANTS ;; TODO ;unscheduled should trump all @@ -1986,46 +1989,7 @@ If ARG is non-nil use long timestamp format." (org-ml-headline-map-node-properties* (cons np it) it)))) ;;; INTERACTIVE AGENDA FUNCTIONS - -;; lift buffer commands into agenda context - -(defmacro org-x-agenda-cmd-wrapper (update &rest body) - "Execute BODY in context of agenda buffer. -Specifically, navigate to the original header, execute BODY, then -update the agenda buffer. If UPDATE is 'update-headline', get the -headline string and use it to update the agenda (this is only -needed when the headline changes obviously). When update is -'update-all', reload the entire buffer. When UPDATE is nil, do -nothing." - (declare (indent 1)) - (-let* ((newhead (make-symbol "newhead")) - (hdmarker (make-symbol "hdmarker")) - ((update-form get-head-form) - (cond - ((eq update 'update-headline) - (list `((org-agenda-change-all-lines ,newhead ,hdmarker)) - `((setq ,newhead (org-get-heading))))) - ((eq update 'update-all) - (list '((org-agenda-redo)) - nil))))) - `(progn - (org-agenda-check-no-diary) - (let* ((,hdmarker (or (org-get-at-bol 'org-hd-marker) - (org-agenda-error))) - (buffer (marker-buffer ,hdmarker)) - (pos (marker-position ,hdmarker)) - (inhibit-read-only t) - ,newhead) - (org-with-remote-undo buffer - (with-current-buffer buffer - (widen) - (goto-char pos) - (org-show-context 'agenda) - ,@body - ,@get-head-form) - ,@update-form - (beginning-of-line 1)))))) - + (defun org-x-agenda-toggle-checkbox () "Toggle checkboxes in org agenda view using `org-toggle-checkbox'." (interactive)