From 91d98231ff7be65d9bab5eb3a7a21f4504d6c12d Mon Sep 17 00:00:00 2001 From: JAremko Date: Sat, 19 Mar 2016 04:59:36 +0200 Subject: [PATCH] Add org-mode link-type "https" to open local copies The https link-type opens the local copies of the Spacemacs documentation files with the spacemacs/view-org-file function. It supports GitHub style heading links For example, the link: https://github.com/syl20bnr/spacemacs/blob/develop/layers/org/README.org#links Will be handled similary to as if it was: file:~/.emacs.d/layers/org/README.org::*links Also the `space-doc' mode will be applied. Refactored GH style anchor search. --- core/core-funcs.el | 24 ++++++++++++++--- layers/org/local/space-doc/space-doc.el | 34 +++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/core/core-funcs.el b/core/core-funcs.el index 4cffcf022017..a3a6ef7b0397 100644 --- a/core/core-funcs.el +++ b/core/core-funcs.el @@ -171,12 +171,30 @@ Supported properties: (find-file file) (org-indent-mode) (view-mode) - (when(and(boundp 'space-doc-mode)(fboundp 'space-doc-mode)(space-doc-mode))) + + ;; Enable `space-doc-mode' if defined. + (when (and (boundp 'space-doc-mode) + (fboundp 'space-doc-mode)) + (space-doc-mode)) + (goto-char (point-min)) (when anchor-text - (re-search-forward anchor-text)) - (beginning-of-line) + ;; If `anchor-text' is GitHub style link. + (if (string-prefix-p "#" anchor-text) + ;; If the toc-org package is loaded. + (if (configuration-layer/package-usedp 'toc-org) + ;; For each heading. Search the heading that corresponds to `anchor-text'. + (while (and (re-search-forward "^[\\*]+\s\\(.*\\).*$" nil t) + (not (string= (toc-org-hrefify-gh (match-string 1)) + anchor-text)))) + ;; This is not a problem because without the space-doc package + ;; those links will be opened in the browser. + (message (format "Can't follow the GitHub style anchor: '%s' without the org layer." anchor-text))) + + (re-search-forward anchor-text))) + +(beginning-of-line) (cond ((eq expand-scope 'subtree) diff --git a/layers/org/local/space-doc/space-doc.el b/layers/org/local/space-doc/space-doc.el index 63bc93a28383..ea8d1e411928 100644 --- a/layers/org/local/space-doc/space-doc.el +++ b/layers/org/local/space-doc/space-doc.el @@ -7,6 +7,22 @@ ;; ;; This file is not part of GNU Emacs. ;; +;; Description: +;; This package provides: +;; - `space-doc-mode' - buffer local minor mode +;; for viewing the Spacemacs documentation files. +;; The mode hides org meta tags to improve readability. +;; - `org-mode' link-type "https" that opens the local +;; copies of the Spacemacs documentation files with +;; `spacemacs/view-org-file' and supports GitHub style +;; heading links. +;; +;; For example, the link: +;; https://github.com/syl20bnr/spacemacs/blob/develop/layers/org/README.org#links +;; Will be handled similary to as if it was: +;; file:~/.emacs.d/layers/org/README.org::*links +;; Also the `space-doc' mode will be applied. + ;;; License: GPLv3 ;;; Code: (require 'face-remap) @@ -42,5 +58,23 @@ keeping their content visible." (progn (message (format "space-doc-mode error:%s isn't an org-mode buffer" (buffer-name))) (setq org-mode nil)))) +(defun spacemacs//space-doc-open (path) + "If the `path' argument is a link to an .org file that is located +in the Spacemacs GitHub repository - Visit the local copy +of the file with `spacemacs/view-org-file'. +Open all other links with `browse-url'." + (let ((git-url-root-regexp + (concat "\\/\\/github\\.com\\/syl20bnr" + "\\/spacemacs\\/blob\\/[^/]+\\/\\(.*\\.org\\)\\(\\#.*\\)?"))) + (if (string-match git-url-root-regexp path) + (spacemacs/view-org-file (concat user-emacs-directory + (match-string 1 path)) + (or (match-string 2 path) + "^") + 'subtree) + (browse-url (concat "https://" path))))) + +(org-add-link-type "https" 'spacemacs//space-doc-open) + (provide 'space-doc) ;;; space-doc.el ends here