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 '<leader> g o h' to open homepage in browser
- Rebind '<leader> g o o' to open file or region (omits the #L<N> suffix
  if no selection is active).
This commit is contained in:
Henrik Lissner 2019-12-15 01:55:02 -05:00
parent 20a733a861
commit bb702acfd0
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395
4 changed files with 44 additions and 45 deletions

View file

@ -121,6 +121,8 @@
;;; <leader> v --- versioning ;;; <leader> v --- versioning
(:prefix-map ("v" . "versioning") (:prefix-map ("v" . "versioning")
:desc "Git revert file" "R" #'vc-revert :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) (:when (featurep! :ui vc-gutter)
:desc "Git revert hunk" "r" #'git-gutter:revert-hunk :desc "Git revert hunk" "r" #'git-gutter:revert-hunk
:desc "Git stage hunk" "s" #'git-gutter:stage-hunk :desc "Git stage hunk" "s" #'git-gutter:stage-hunk
@ -145,7 +147,8 @@
:desc "Find issue" "i" #'forge-visit-issue :desc "Find issue" "i" #'forge-visit-issue
:desc "Find pull request" "p" #'forge-visit-pullreq) :desc "Find pull request" "p" #'forge-visit-pullreq)
(:prefix ("o" . "open in browser") (: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 remote" "r" #'forge-browse-remote
:desc "Browse commit" "c" #'forge-browse-commit :desc "Browse commit" "c" #'forge-browse-commit
:desc "Browse an issue" "i" #'forge-browse-issue :desc "Browse an issue" "i" #'forge-browse-issue

View file

@ -396,8 +396,8 @@
;;; <leader> g --- git ;;; <leader> g --- git
(:prefix-map ("g" . "git") (:prefix-map ("g" . "git")
:desc "Git revert file" "R" #'vc-revert :desc "Git revert file" "R" #'vc-revert
:desc "Copy git link" "y" #'git-link :desc "Copy link to remote" "y" #'+vc/browse-at-remote-kill-file-or-region
:desc "Copy git link to homepage" "Y" #'git-link-homepage :desc "Copy link to homepage" "Y" #'+vc/browse-at-remote-kill-homepage
(:when (featurep! :ui vc-gutter) (:when (featurep! :ui vc-gutter)
:desc "Git revert hunk" "r" #'git-gutter:revert-hunk :desc "Git revert hunk" "r" #'git-gutter:revert-hunk
:desc "Git stage hunk" "s" #'git-gutter:stage-hunk :desc "Git stage hunk" "s" #'git-gutter:stage-hunk
@ -423,7 +423,8 @@
:desc "Find issue" "i" #'forge-visit-issue :desc "Find issue" "i" #'forge-visit-issue
:desc "Find pull request" "p" #'forge-visit-pullreq) :desc "Find pull request" "p" #'forge-visit-pullreq)
(:prefix ("o" . "open in browser") (: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 remote" "r" #'forge-browse-remote
:desc "Browse commit" "c" #'forge-browse-commit :desc "Browse commit" "c" #'forge-browse-commit
:desc "Browse an issue" "i" #'forge-browse-issue :desc "Browse an issue" "i" #'forge-browse-issue

View file

@ -1,46 +1,41 @@
;;; emacs/vc/autoload/vc.el -*- lexical-binding: t; -*- ;;; emacs/vc/autoload/vc.el -*- lexical-binding: t; -*-
;;;###autoload ;;;###autoload
(defun +vc-git-root-url () (defun +vc/browse-at-remote-file-or-region ()
"Return the root git repo URL for the current file." "Open the current file at remote in your browser.
(require 'git-link) If a selection is active, highlight them. Otherwise omits the #L<N> suffix in
(let* ((remote (git-link--select-remote)) the URL."
(remote-url (git-link--remote-url remote)) (interactive)
(remote-info (if remote-url (git-link--parse-remote remote-url)))) (if (or (use-region-p)
(if remote-info (ignore-errors (evil-visual-state-p)))
(format "https://%s/%s" (car remote-info) (cadr remote-info)) (browse-at-remote)
(error "Remote `%s' is unknown or contains an unsupported URL" remote)))) (browse-url (browse-at-remote--file-url (buffer-file-name)))))
(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)))))
;;;###autoload ;;;###autoload
(defun +vc-update-header-line-a (revision) (defun +vc/browse-at-remote-kill-file-or-region ()
"Show revision details in the header-line, instead of the minibuffer. "Copy the current file's remote URL to your clipboard.
If a selection is active, highlight them. Otherwise omits the #L<N> 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." (defun +vc--remote-homepage ()
(let* ((date-relative (nth 3 revision)) (or (let ((url (browse-at-remote--remote-ref)))
(date-full (nth 4 revision)) (cdr (browse-at-remote--get-url-from-remote (car url))))
(author (if git-timemachine-show-author (concat (nth 6 revision) ": ") "")) (user-error "Can't find homepage for current project")))
(sha-or-subject (if (eq git-timemachine-minibuffer-detail 'commit) (car revision) (nth 5 revision))))
(setq header-line-format ;;;###autoload
(format "%s%s [%s (%s)]" (defun +vc/browse-at-remote-homepage ()
(propertize author 'face 'git-timemachine-minibuffer-author-face) "Open homepage for current project in browser."
(propertize sha-or-subject 'face 'git-timemachine-minibuffer-detail-face) (interactive)
date-full date-relative)))) (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)))

View file

@ -5,7 +5,7 @@
(package! vc-annotate :built-in t) (package! vc-annotate :built-in t)
(package! smerge-mode :built-in t) (package! smerge-mode :built-in t)
(package! git-link) (package! browse-at-remote)
(package! git-timemachine) (package! git-timemachine)
(package! gitconfig-mode) (package! gitconfig-mode)
(package! gitignore-mode) (package! gitignore-mode)