If you have an archive of files in org-mode and you want to link between them, say from today’s entry to the entry of 9 March 2013, you have several options, as laid out here:
The Simplest Case, for .org
The simplest is to provide the text of the header in the link, like so: so:
[[file:2013.org::Saturday 9 March 2013][9 March 2013]]
which, on typing the final closing square bracket, will collapse on screen to “9 March 2013”, and when you’re on the link and type “C-c C-o”, it will open the “2013.org” file at the header “Saturday 9 March 2013”. If you find you’ve made an error in the link target or title, typing “C-c C-l” will let you edit it.
And this works perfectly, until you export it to html, and then, of course, it doesn’t.
The Extra Step, for .html
To get a link also to work in html, you need to set a custom_id on the header, which you do like this:
*** Saturday 9 March 2013
or, less manually, with the org-set-property command (keyboard shortcut C-c C-x p):
C-c C-x p RET CUSTOM_ID RET 20130309
This will also attach an id attribute to the header element in the exported html, so in both .org and .html it is recognized as #20130309, and if you then change the link to
[[file:2013.org::#20130309][9 March 2013]]
it will work as before in the *.org file, and also in the exported *.html file.
The Final Step
Having done this a few times, you may get tired of typing “CUSTOM_ID” each time, and build a function that lets you just type the id value:
(defun cid (custom-id)
(interactive "MCUSTOM_ID: ")
(org-set-property "CUSTOM_ID" custom-id))
after which you can type, even more briefly:
M-x cid RET 20130309 RET