This repository has been archived on 2024-10-22. You can view files and clone it, but cannot push or open issues or pull requests.
spacemacs/layers/+emacs/org/local/space-doc/space-doc.el
2016-04-12 23:16:59 -04:00

104 lines
4.2 KiB
EmacsLisp

;;; space-doc.el --- Spacemacs documentation minor mode.
;;
;; Copyright (c) 2012-2016 Sylvain Benner & Contributors
;;
;; Author: Sylvain Benner <sylvain.benner@gmail.com>
;; URL: https://github.com/syl20bnr/spacemacs
;;
;; 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)
(require 'org)
;;;###autoload
(define-minor-mode space-doc-mode
"Buffer local minor mode for Spacemacs documentation files.
This mode:
- hides `org-mode' meta tags like #+TITLE: while
keeping their content visible.
- enables buffer local link opening with `spacemacs//space-doc-open'."
:init-value nil
:lighter " SD"
(if (derived-mode-p 'org-mode)
(if space-doc-mode
(let ((bg (face-attribute 'default :background)))
;; Make `space-doc' https link opener buffer local
;; and enable it only when `space-doc' mode is enabled.
(make-local-variable 'org-link-types)
(make-local-variable 'org-link-protocols)
(org-add-link-type "https" 'spacemacs//space-doc-open)
;; Make `org-mode' meta tags invisible.
(set (make-local-variable
'spacemacs--org-face-remap-cookie-org-tag)
(face-remap-add-relative 'org-tag
`(:foreground ,bg)))
(set (make-local-variable
'spacemacs--org-face-remap-cookie-org-meta-line)
(face-remap-add-relative 'org-meta-line
`(:foreground ,bg)))
(set (make-local-variable
'spacemacs--org-face-remap-cookie-org-block-begin-line)
(face-remap-add-relative 'org-block-begin-line
`(:foreground ,bg)))
(set (make-local-variable
'spacemacs--org-face-remap-cookie-org-document-info-keyword)
(face-remap-add-relative 'org-document-info-keyword
`(:foreground ,bg))))
(kill-local-variable 'org-link-types)
(kill-local-variable 'org-link-protocols)
;; Trigger `org-mode' internal updates.
(org-add-link-type nil)
;; Make `org-mode' meta tags visible.
(face-remap-remove-relative
spacemacs--org-face-remap-cookie-org-tag)
(face-remap-remove-relative
spacemacs--org-face-remap-cookie-org-meta-line)
(face-remap-remove-relative
spacemacs--org-face-remap-cookie-org-block-begin-line)
(face-remap-remove-relative
spacemacs--org-face-remap-cookie-org-document-info-keyword)
(setq spacemacs--org-face-remap-p nil))
(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)))))
(provide 'space-doc)
;;; space-doc.el ends here