Next: Tables in arbitrary syntax, Previous: Hacking, Up: Hacking
Org has a large number of hyperlink types built-in (see Hyperlinks). If you would like to add new link types, it provides an interface for doing so. Lets look at an example file org-man.el that will add support for creating links like `[[man:printf][The printf manpage]]' to show Unix manual pages inside emacs:
;;; org-man.el - Support for links to manpages in Org
(require 'org)
(org-add-link-type "man" 'org-man-open)
(add-hook 'org-store-link-functions 'org-man-store-link)
(defcustom org-man-command 'man
"The Emacs command to be used to display a man page."
:group 'org-link
:type '(choice (const man) (const woman)))
(defun org-man-open (path)
"Visit the manpage on PATH.
PATH should be a topic that can be thrown at the man command."
(funcall org-man-command path))
(defun org-man-store-link ()
"Store a link to a manpage."
(when (memq major-mode '(Man-mode woman-mode))
;; This is a man page, we do make this link
(let* ((page (org-man-get-page-name))
(link (concat "man:" page))
(description (format "Manpage for %s" page)))
(org-store-link-props
:type "man"
:link link
:description description))))
(defun org-man-get-page-name ()
"Extract the page name from the buffer name."
;; This works for both `Man-mode' and `woman-mode'.
(if (string-match " \\(\\S-+\\)\\*" (buffer-name))
(match-string 1 (buffer-name))
(error "Cannot create link to this man page")))
(provide 'org-man)
;;; org-man.el ends here
You would activate this new link type in .emacs with
(require 'org-man)
Lets go through the file and see what it does.
(require 'org) to make sure that org.el has been
loaded.
org-add-link-type to define a new link type
with prefix `man'. The call also contains the name of a function
that will be called to follow such a link.
org-store-link-functions, in
order to allow the command C-c l to record a useful link in a
buffer displaying a man page.
The rest of the file defines the necessary variables and functions.
First there is a customization variable that determines which emacs
command should be used to display man pages. There are two options,
man and woman. Then the function to follow a link is
defined. It gets the link path as an argument - in this case the link
path is just a topic for the manual command. The function calls the
value of org-man-command to display the man page.
Finally the function org-man-store-link is defined. When you try
to store a link with C-c l, also this function will be called to
try to make a link. The function must first decide if it is supposed to
create the link for this buffer type, we do this by checking the value
of the variable major-mode. If not, the function must exit and
return the value nil. If yes, the link is created by getting the
manual topic from the buffer name and prefixing it with the string
`man:'. Then it must call the command org-store-link-props
and set the :type and :link properties. Optionally you
can also set the :description property to provide a default for
the link description when the link is later inserted into an Org
buffer with C-c C-l.