In case anyone's interested in writing hyperbole commands that can act on regions but be located in other windows... To write a hyperbole command that restores the previous window and selection, just call bill/hyp-load-state at the start of your code and call bill/hyp-restore at the end (see bill/recalc for an example). This lets recalculate org tables in any buffer with the button in a different (or the same) window. Here's some example text: Here's a table. Click in it and then shift-middle-click recalc, above. "aaa12" should change to "12" and your cursor should stay in the same place. | a | aaa12 | | a | 5 | | | 17 | #+TBLFM: @1$2=3*4::@2$2=2+3::@3$2=vsum(@1..@2) Here's my current definition for recalc (defvar bill/hyp-state nil) (defun bill/hyp-save-state (&rest args) (setq bill/hyp-state (list (selected-window) (point-marker) (and (use-region-p) (copy-marker (mark-marker)))))) (cl-defun bill/hyp-load-state (&optional (state bill/hyp-state)) (let ((window (car state)) (point (cadr state)) (mark (caddr state))) (when window (select-window window) (set-buffer (marker-buffer point)) (and mark (set-mark (marker-position mark))) (goto-char point)))) (defun bill/hyp-restore () (let ((state bill/hyp-state)) (run-at-time 0 nil (lambda () (bill/hyp-load-state state))))) (advice-add 'action-key-depress :before 'bill/hyp-save-state) ;; evaluate this to remove the advice ;;(advice-remove 'action-key-depress 'bill/hyp-save-state) (defun bill/recalc (end) (let ((act-point action-key-depress-prev-point)) (bill/hyp-load-state) (when (org-at-table-p) (org-table-analyze) (org-table-maybe-eval-formula) (call-interactively 'org-table-recalculate) (org-table-align))) (bill/hyp-restore)) (defib recalc () "recalculate the table at point" (save-excursion (let* ((pos (point)) (eol (progn (re-search-forward "\n") (point))) (bol (progn (re-search-backward "\n" nil t 2) (1+ (point)))) (start (progn (goto-char pos) (re-search-backward "<" bol t))) (end (progn (goto-char pos) (re-search-forward ">" eol t)))) (and start end (string-match " ].*" (buffer-substring start end)) (hact 'bill/recalc end))))) -- Bill