diff options
| author | Craig Jennings <c@cjennings.net> | 2026-05-27 15:08:52 -0500 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2026-05-27 15:08:52 -0500 |
| commit | a6157f471c9d64c00f0a2e33224e373864a7ae80 (patch) | |
| tree | c20d4e8503fda76356f9cfb994e3ffab0b3ae056 /tests | |
| parent | 9b04860a22b30db746bbe4cd3376383cc19432ea (diff) | |
| download | dotemacs-a6157f471c9d64c00f0a2e33224e373864a7ae80.tar.gz dotemacs-a6157f471c9d64c00f0a2e33224e373864a7ae80.zip | |
feat(org): open file links in the same window on shift/right-click
Plain left-click on an Org file link keeps org's default of opening in the other window. I added S-mouse-1 and mouse-3 as a second gesture that opens the file link in the current window instead, for when I want the file to replace the buffer the link sits in.
The bindings live in org-mouse-map, the keymap org attaches to each link as a text property, rather than org-mode-map. That layer outranks both org-mode-map and the mouse-trap-mode emulation keymap, which otherwise swallows clicks in org buffers. Off a link the gesture does nothing, so a stray right-click is a silent no-op instead of a "No link found" error.
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/test-org-config--org-follow-link-same-window.el | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/tests/test-org-config--org-follow-link-same-window.el b/tests/test-org-config--org-follow-link-same-window.el new file mode 100644 index 00000000..57caf691 --- /dev/null +++ b/tests/test-org-config--org-follow-link-same-window.el @@ -0,0 +1,72 @@ +;;; test-org-config--org-follow-link-same-window.el --- same-window link follow -*- lexical-binding: t; -*- + +;;; Commentary: +;; `cj/--org-follow-link-same-window' follows the Org link at point, opening +;; file: links in the *current* window instead of org's default other-window +;; (`org-link-frame-setup' file entry). It is the kernel behind the S-mouse-1 +;; and mouse-3 bindings (`cj/org-follow-link-at-mouse-same-window'). Off a +;; link it does nothing, so a right-click in empty space is a silent no-op +;; rather than org's "No link found" user-error. +;; +;; `org-open-at-point' (the visit boundary) is stubbed to record whether it +;; was called and what the file entry of `org-link-frame-setup' resolved to at +;; call time; real temp Org buffers place point on / off a link. + +;;; Code: + +(require 'ert) +(require 'cl-lib) +(require 'org) + +(add-to-list 'load-path (expand-file-name "modules" user-emacs-directory)) +(require 'org-config) + +(ert-deftest test-org-config-follow-link-same-window-file-link () + "Normal: on a file link, follow it with the file frame-setup as find-file." + (with-temp-buffer + (let ((org-mode-hook nil) + (frame-file nil) + (called nil)) + (insert "see [[file:/tmp/notes.org][notes]] here") + (org-mode) + (goto-char (point-min)) + (search-forward "notes]") + (backward-char 2) ; land inside the link's description + (cl-letf (((symbol-function 'org-open-at-point) + (lambda (&rest _) + (setq called t + frame-file (cdr (assq 'file org-link-frame-setup)))))) + (cj/--org-follow-link-same-window)) + (should called) + (should (eq frame-file 'find-file))))) + +(ert-deftest test-org-config-follow-link-same-window-off-link-noop () + "Boundary: off any link, do nothing (no error, no visit)." + (with-temp-buffer + (let ((org-mode-hook nil) + (called nil)) + (insert "plain text, no link at all") + (org-mode) + (goto-char (point-min)) + (cl-letf (((symbol-function 'org-open-at-point) + (lambda (&rest _) (setq called t)))) + (cj/--org-follow-link-same-window)) + (should-not called)))) + +(ert-deftest test-org-config-follow-link-same-window-http-link () + "Boundary: on a non-file link, still follow it (frame-setup is harmless)." + (with-temp-buffer + (let ((org-mode-hook nil) + (called nil)) + (insert "site [[https://example.com][example]] end") + (org-mode) + (goto-char (point-min)) + (search-forward "example]") + (backward-char 2) + (cl-letf (((symbol-function 'org-open-at-point) + (lambda (&rest _) (setq called t)))) + (cj/--org-follow-link-same-window)) + (should called)))) + +(provide 'test-org-config--org-follow-link-same-window) +;;; test-org-config--org-follow-link-same-window.el ends here |
