From bb702acfd06bd55f7726678f0a24d7242fff1c2d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 15 Dec 2019 01:55:02 -0500 Subject: [PATCH] emacs/vc: replace git-link w/ browse-at-remote git-link is no longer maintained and browse-at-remote has support for more remotes. - Bind ' g o h' to open homepage in browser - Rebind ' g o o' to open file or region (omits the #L suffix if no selection is active). --- modules/config/default/+emacs-bindings.el | 5 +- modules/config/default/+evil-bindings.el | 7 ++- modules/emacs/vc/autoload/vc.el | 75 +++++++++++------------ modules/emacs/vc/packages.el | 2 +- 4 files changed, 44 insertions(+), 45 deletions(-) diff --git a/modules/config/default/+emacs-bindings.el b/modules/config/default/+emacs-bindings.el index 5f41a0883..ee5bde218 100644 --- a/modules/config/default/+emacs-bindings.el +++ b/modules/config/default/+emacs-bindings.el @@ -121,6 +121,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-file-or-region + :desc "Kill link to homepage" "Y" #'+vc/browse-at-remote-kill-homepage (:when (featurep! :ui vc-gutter) :desc "Git revert hunk" "r" #'git-gutter:revert-hunk :desc "Git stage hunk" "s" #'git-gutter:stage-hunk @@ -145,7 +147,8 @@ :desc "Find issue" "i" #'forge-visit-issue :desc "Find pull request" "p" #'forge-visit-pullreq) (:prefix ("o" . "open in browser") - :desc "Browse region or line" "." #'+vc/git-browse-region-or-line + :desc "Browse file or region" "." #'+vc/browse-at-remote-file-or-region + :desc "Browse homepage" "h" #'+vc/browse-at-remote-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 27d1f1277..009833c54 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -396,8 +396,8 @@ ;;; g --- git (:prefix-map ("g" . "git") :desc "Git revert file" "R" #'vc-revert - :desc "Copy git link" "y" #'git-link - :desc "Copy git link to homepage" "Y" #'git-link-homepage + :desc "Copy link to remote" "y" #'+vc/browse-at-remote-kill-file-or-region + :desc "Copy link to homepage" "Y" #'+vc/browse-at-remote-kill-homepage (:when (featurep! :ui vc-gutter) :desc "Git revert hunk" "r" #'git-gutter:revert-hunk :desc "Git stage hunk" "s" #'git-gutter:stage-hunk @@ -423,7 +423,8 @@ :desc "Find issue" "i" #'forge-visit-issue :desc "Find pull request" "p" #'forge-visit-pullreq) (:prefix ("o" . "open in browser") - :desc "Browse region or line" "o" #'+vc/git-browse-region-or-line + :desc "Browse file or region" "o" #'+vc/browse-at-remote-file-or-region + :desc "Browse homepage" "h" #'+vc/browse-at-remote-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 c91328d6c..c4909587a 100644 --- a/modules/emacs/vc/autoload/vc.el +++ b/modules/emacs/vc/autoload/vc.el @@ -1,46 +1,41 @@ ;;; emacs/vc/autoload/vc.el -*- lexical-binding: t; -*- ;;;###autoload -(defun +vc-git-root-url () - "Return the root git repo URL for the current file." - (require 'git-link) - (let* ((remote (git-link--select-remote)) - (remote-url (git-link--remote-url remote)) - (remote-info (if remote-url (git-link--parse-remote remote-url)))) - (if remote-info - (format "https://%s/%s" (car remote-info) (cadr remote-info)) - (error "Remote `%s' is unknown or contains an unsupported URL" remote)))) - -(defvar git-link-default-branch) -(defvar git-link-open-in-browser) -(defvar git-link-use-commit) -;;;###autoload -(defun +vc/git-browse-region-or-line (&optional arg) - "Open the website for the current line of this version controlled file. -Uses the currently checked out branch. If prefix ARG, then use 'master' branch. -If an url can't be ascertained, opens the repository's root." - (interactive "P") - (require 'git-link) - (let ((git-link-default-branch (if arg "master" git-link-default-branch)) - current-prefix-arg ; don't propagate to `git-link' - git-link-use-commit) - (cl-destructuring-bind (beg end) - (if buffer-file-name (git-link--get-region)) - (let ((git-link-open-in-browser t)) - (git-link (git-link--select-remote) beg end))))) +(defun +vc/browse-at-remote-file-or-region () + "Open the current file at remote in your browser. +If a selection is active, highlight them. Otherwise omits the #L suffix in +the URL." + (interactive) + (if (or (use-region-p) + (ignore-errors (evil-visual-state-p))) + (browse-at-remote) + (browse-url (browse-at-remote--file-url (buffer-file-name))))) ;;;###autoload -(defun +vc-update-header-line-a (revision) - "Show revision details in the header-line, instead of the minibuffer. +(defun +vc/browse-at-remote-kill-file-or-region () + "Copy the current file's remote URL to your clipboard. +If a selection is active, highlight them. Otherwise omits the #L suffix in +the URL." + (interactive) + (if (or (use-region-p) + (ignore-errors (evil-visual-state-p))) + (browse-at-remote-kill) + (kill-new (browse-at-remote--file-url (buffer-file-name))))) -Sometimes I forget `git-timemachine' is enabled in a buffer. Putting revision -info in the `header-line-format' is a good indication." - (let* ((date-relative (nth 3 revision)) - (date-full (nth 4 revision)) - (author (if git-timemachine-show-author (concat (nth 6 revision) ": ") "")) - (sha-or-subject (if (eq git-timemachine-minibuffer-detail 'commit) (car revision) (nth 5 revision)))) - (setq header-line-format - (format "%s%s [%s (%s)]" - (propertize author 'face 'git-timemachine-minibuffer-author-face) - (propertize sha-or-subject 'face 'git-timemachine-minibuffer-detail-face) - date-full date-relative)))) + +(defun +vc--remote-homepage () + (or (let ((url (browse-at-remote--remote-ref))) + (cdr (browse-at-remote--get-url-from-remote (car url)))) + (user-error "Can't find homepage for current project"))) + +;;;###autoload +(defun +vc/browse-at-remote-homepage () + "Open homepage for current project in browser." + (interactive) + (browse-url (+vc--remote-homepage))) + +;;;###autoload +(defun +vc/browse-at-remote-kill-homepage () + "Copy homepage URL of current project to clipboard." + (interactive) + (kill-new (+vc--remote-homepage))) diff --git a/modules/emacs/vc/packages.el b/modules/emacs/vc/packages.el index 8a5c76dad..a8a174152 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! git-link) +(package! browse-at-remote) (package! git-timemachine) (package! gitconfig-mode) (package! gitignore-mode)