aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-05-27 15:08:52 -0500
committerCraig Jennings <c@cjennings.net>2026-05-27 15:08:52 -0500
commita6157f471c9d64c00f0a2e33224e373864a7ae80 (patch)
treec20d4e8503fda76356f9cfb994e3ffab0b3ae056 /tests
parent9b04860a22b30db746bbe4cd3376383cc19432ea (diff)
downloaddotemacs-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.el72
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