diff --git a/modules/config/default/+emacs-bindings.el b/modules/config/default/+emacs-bindings.el index f7d8cad3b..b054d4abb 100644 --- a/modules/config/default/+emacs-bindings.el +++ b/modules/config/default/+emacs-bindings.el @@ -346,8 +346,8 @@ ;;; v --- versioning (:prefix-map ("v" . "versioning") :desc "Git revert file" "R" #'vc-revert - :desc "Kill link to remote" "y" #'+vc/browse-at-remote-kill - :desc "Kill link to homepage" "Y" #'+vc/browse-at-remote-kill-homepage + :desc "Kill link to remote" "y" #'+vc/git-link-kill + :desc "Kill link to homepage" "Y" #'+vc/git-link-kill-homepage (:when (modulep! :ui vc-gutter) :desc "Git revert hunk" "r" #'+vc-gutter/revert-hunk :desc "Git stage hunk" "s" #'+vc-gutter/stage-hunk @@ -374,8 +374,8 @@ :desc "Find issue" "i" #'forge-visit-issue :desc "Find pull request" "p" #'forge-visit-pullreq) (:prefix ("o" . "open in browser") - :desc "Browse file or region" "." #'+vc/browse-at-remote - :desc "Browse homepage" "h" #'+vc/browse-at-remote-homepage + :desc "Browse file or region" "." #'+vc/git-link + :desc "Browse homepage" "h" #'+vc/git-link-homepage :desc "Browse remote" "r" #'forge-browse-remote :desc "Browse commit" "c" #'forge-browse-commit :desc "Browse an issue" "i" #'forge-browse-issue diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 6e080c245..72c628fd2 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -522,8 +522,8 @@ ;;; g --- git/version control (:prefix-map ("g" . "git") :desc "Revert file" "R" #'vc-revert - :desc "Copy link to remote" "y" #'+vc/browse-at-remote-kill - :desc "Copy link to homepage" "Y" #'+vc/browse-at-remote-kill-homepage + :desc "Copy link to remote" "y" #'+vc/git-link-kill + :desc "Copy link to homepage" "Y" #'+vc/git-link-kill-homepage :desc "Git time machine" "t" #'git-timemachine-toggle (:when (modulep! :ui vc-gutter) :desc "Revert hunk at point" "r" #'+vc-gutter/save-and-revert-hunk @@ -551,8 +551,8 @@ :desc "Find issue" "i" #'forge-visit-issue :desc "Find pull request" "p" #'forge-visit-pullreq) (:prefix ("o" . "open in browser") - :desc "Browse file or region" "o" #'+vc/browse-at-remote - :desc "Browse homepage" "h" #'+vc/browse-at-remote-homepage + :desc "Browse file or region" "o" #'+vc/git-link + :desc "Browse homepage" "h" #'+vc/git-link-homepage :desc "Browse remote" "r" #'forge-browse-remote :desc "Browse commit" "c" #'forge-browse-commit :desc "Browse an issue" "i" #'forge-browse-issue diff --git a/modules/emacs/vc/autoload/vc.el b/modules/emacs/vc/autoload/vc.el index dd29ae030..42662bc96 100644 --- a/modules/emacs/vc/autoload/vc.el +++ b/modules/emacs/vc/autoload/vc.el @@ -3,69 +3,38 @@ ;; ;;; Helpers -(defun +vc--remote-homepage () - (require 'browse-at-remote) - (or (let ((url (browse-at-remote--remote-ref))) - (plist-get (browse-at-remote--get-url-from-remote (car url)) :url)) - (user-error "Can't find homepage for current project"))) - -;; TODO: PR these upstream? -;;;###autoload -(defun browse-at-remote--format-region-url-as-codeberg (repo-url location filename &optional linestart lineend) - "URL formatted for codeberg." - (cond - ((and linestart lineend) - (format "%s/src/%s/%s#L%d-L%d" repo-url location filename linestart lineend)) - (linestart (format "%s/src/%s/%s#L%d" repo-url location filename linestart)) - (t (format "%s/src/%s/%s" repo-url location filename)))) - -;;;###autoload -(defun browse-at-remote--format-commit-url-as-codeberg (repo-url commithash) - "Commit URL formatted for codeberg" - (format "%s/src/commit/%s" repo-url commithash)) - ;; ;;; Commands -(defvar browse-at-remote-prefer-symbolic) ;;;###autoload -(defun +vc/browse-at-remote (&optional arg) - "Open URL to current file (and line if selection is active) in browser. -If prefix ARG, negate the default value of `browse-at-remote-prefer-symbolic'." - (interactive "P") - (require 'browse-at-remote) - (let ((vc-ignore-dir-regexp locate-dominating-stop-dir-regexp) - (browse-at-remote-prefer-symbolic - (if arg - (not browse-at-remote-prefer-symbolic) - browse-at-remote-prefer-symbolic))) - (browse-at-remote))) +(defun +vc/git-link () + "Open URL to current file (and line if selection is active) in browser." + (interactive) + (require 'magit) + (if (region-active-p) + (browse-url (git-link (magit-get-remote) (line-number-at-pos (region-beginning) ) (line-number-at-pos (region-end)))) + (browse-url (git-link (magit-get-remote) nil nil)))) ;;;###autoload -(defun +vc/browse-at-remote-kill (&optional arg interactive?) - "Copy URL to current file (and line if selection is active) to clipboard. -If prefix ARG, negate the default value of `browse-at-remote-prefer-symbolic'." - (interactive (list current-prefix-arg 'interactive)) - (require 'browse-at-remote) - (let ((vc-ignore-dir-regexp locate-dominating-stop-dir-regexp) - (browse-at-remote-prefer-symbolic - (if arg - (not browse-at-remote-prefer-symbolic) - browse-at-remote-prefer-symbolic))) - (browse-at-remote-kill) - (if interactive? (message "Copied to clipboard")))) +(defun +vc/git-link-kill () + "Open URL to current file (and line if selection is active) in browser." + (interactive) + (require 'magit) + (if (region-active-p) + (kill-new (git-link (magit-get-remote) (line-number-at-pos (region-beginning)) (line-number-at-pos (region-end)))) + (kill-new (git-link (magit-get-remote) nil nil)))) ;;;###autoload -(defun +vc/browse-at-remote-homepage () +(defun +vc/git-link-homepage () "Open homepage for current project in browser." (interactive) - (browse-url (+vc--remote-homepage))) + (require 'magit) + (browse-url (git-link-homepage (magit-get-remote)))) ;;;###autoload -(defun +vc/browse-at-remote-kill-homepage () +(defun +vc/git-link-kill-homepage () "Copy homepage URL of current project to clipboard." (interactive) - (let ((url (+vc--remote-homepage))) - (kill-new url) - (message "Copied to clipboard: %S" url))) + (require 'magit) + (kill-new (git-link-homepage (magit-get-remote)))) diff --git a/modules/emacs/vc/config.el b/modules/emacs/vc/config.el index 9a5336ccf..6e09fd0ea 100644 --- a/modules/emacs/vc/config.el +++ b/modules/emacs/vc/config.el @@ -89,34 +89,6 @@ ;; `header-line-format', which has better visibility. (setq git-timemachine-show-minibuffer-details t) - ;; REVIEW: PR this to `git-timemachine' - (defadvice! +vc-support-git-timemachine-a (fn) - "Allow `browse-at-remote' commands in git-timemachine buffers to open that -file in your browser at the visited revision." - :around #'browse-at-remote-get-url - (if git-timemachine-mode - (let* ((start-line (and (use-region-p) (line-number-at-pos - (min (region-beginning) (region-end))))) - (point-end (and (use-region-p) (max (region-beginning) (region-end)))) - (end-line (and (use-region-p) (line-number-at-pos point-end))) - (remote-ref (browse-at-remote--remote-ref buffer-file-name)) - (remote (car remote-ref)) - (ref (car git-timemachine-revision)) - (relname - (file-relative-name - buffer-file-name (expand-file-name (vc-git-root buffer-file-name)))) - (target-repo (browse-at-remote--get-url-from-remote remote)) - (remote-type (browse-at-remote--get-remote-type (plist-get target-repo :unresolved-host))) - (repo-url (plist-get target-repo :url)) - (url-formatter (browse-at-remote--get-formatter 'region-url remote-type))) - (unless url-formatter - (error (format "Origin repo parsing failed: %s" repo-url))) - (funcall url-formatter repo-url ref relname - (if start-line start-line) - (when (and end-line (not (equal start-line end-line))) - (if (eq (char-before point-end) ?\n) (- end-line 1) end-line)))) - (funcall fn))) - (defadvice! +vc-update-header-line-a (revision) "Show revision details in the header-line, instead of the minibuffer. @@ -149,27 +121,3 @@ info in the `header-line-format' is a more visible indicator." :n "C-n" #'git-timemachine-show-next-revision :n "gb" #'git-timemachine-blame :n "gtc" #'git-timemachine-show-commit)) - - -(after! browse-at-remote - ;; It's more sensible that the user have more options. If they want line - ;; numbers, users can request them by making a selection first. Otherwise - ;; omitting them. - (setq browse-at-remote-add-line-number-if-no-region-selected nil) - ;; Opt to produce permanent links with `browse-at-remote' by default, using - ;; commit hashes rather than branch names. - (setq browse-at-remote-prefer-symbolic nil) - - ;; Expand recognition for more forges (like self-hosted gitlab.* subdomains - ;; and codeberg). - ;; REVIEW: PR these upstream? - (add-to-list 'browse-at-remote-remote-type-regexps '(:host "^codeberg\\.org$" :type "codeberg")) - (add-to-list 'browse-at-remote-remote-type-regexps '(:host "^gitlab\\." :type "gitlab") 'append) - - ;; HACK: `browse-at-remote' produces urls with `nil' in them, when the repo is - ;; detached. This creates broken links. I think it is more sensible to fall - ;; back to master in those cases. - (defadvice! +vc--fallback-to-master-branch-a () - "Return 'master' in detached state." - :after-until #'browse-at-remote--get-local-branch - "master")) diff --git a/modules/emacs/vc/packages.el b/modules/emacs/vc/packages.el index cb13e3d74..8fb485576 100644 --- a/modules/emacs/vc/packages.el +++ b/modules/emacs/vc/packages.el @@ -5,7 +5,7 @@ (package! vc-annotate :built-in t) (package! smerge-mode :built-in t) -(package! browse-at-remote :pin "38e5ffd77493c17c821fd88f938dbf42705a5158") +(package! git-link :pin "3870ae57408dc72ae2215b0056d6661e2c198e75") (package! git-timemachine ;; The original lives on codeberg.org; which has uptime issues. :recipe (:host github :repo "emacsmirror/git-timemachine")