Keybinding Note: This extension uses Emacs-style keybindings where Ctrl is used on all platforms (not Cmd on Mac), except where explicitly noted. Mac alternatives are shown as Cmd where applicable.
✅ Hyperlinks
Links in org documents connect your notes to files, websites, headings, and more. Scimax VS Code supports a variety of link types and provides commands for creating and following links.
✅ Link Types
Org-mode supports many types of links. Scimax VS Code handles the most common ones:
✅ External Links
Links to resources outside your document:
| Type | Example |
|---|---|
| HTTP(S) | https://www.example.com |
| File | file:~/documents/report.pdf |
| mailto:user@example.com | |
| FTP | ftp://ftp.example.com/file.txt |
✅ Internal Links
Links to locations within your documents:
| Type | Example |
|---|---|
| Heading | *My Heading |
| Custom ID | #my-custom-id |
| Target | |
| ID | id:550e8400-e29b-41d4-a716-446655440000 |
✅ Citation Links (org-ref style)
For academic references (see References):
| Type | Example |
|---|---|
| cite | (smith-2024) |
| citet | jones-2023 |
| citep | (doe-2022) |
✅ Creating Links
✅ Bracket Link Syntax
The standard link format uses double brackets:
[[link-target][description]]
Examples:
[[https://www.example.com][Example Website]]
[[file:report.pdf][Quarterly Report]]
[[*Introduction][Go to Introduction]]
[[#methods][Methods Section]]
If no description is provided, the link target is displayed:
[[https://www.example.com]]
Insert Link Command
| Key | Command |
|---|---|
| C-c l | Store link (scimax.org.storeLink) |
| C-c C-l | Insert or edit link (scimax.org.insertLink) |
With the cursor on an existing [[target][description]] link, C-c C-l edits
that link instead of inserting a new one: it prompts for the target and then
the description, both prefilled. Clear the description to leave a bare
[[target]]; press Escape to leave the link unchanged.
This opens a dialog to enter:
Stored link or
Link target (URL, file path, or internal reference)
Description (optional) ┌───────────────────────────────┬────────────────────────────────┐ │ Link Format │ Action │ ├───────────────────────────────┼────────────────────────────────┤ │ file:name.org::123 │ Jump to line 123 │ ├───────────────────────────────┼────────────────────────────────┤ │ file:name.org::c456 │ Jump to character offset 456 │ ├───────────────────────────────┼────────────────────────────────┤ │ file:name.org::*Heading │ Jump to heading │ ├───────────────────────────────┼────────────────────────────────┤ │ file:name.org::#custom-id │ Jump to custom ID │ ├───────────────────────────────┼────────────────────────────────┤ │ *Heading │ Jump to heading in same file │ ├───────────────────────────────┼────────────────────────────────┤ │ #custom-id │ Jump to custom ID in same file │ ├───────────────────────────────┼────────────────────────────────┤ │ block-name │ Jump to #+NAME: block-name │ └───────────────────────────────┴────────────────────────────────┘
✅ Angle Link Syntax
Simple URLs can be written with angle brackets: https://www.example.com
Plain URLs
Plain URLs are also recognized:
Visit https://www.example.com for more info.
In HTML and LaTeX export and the Org Preview, plain and angle-bracket
http://, https:// and mailto: URLs become links. A plain URL can contain
one level of balanced parentheses (as in Wikipedia URLs), and punctuation at
its end, such as a full stop or comma, is left out of the link. The // in a
URL does not start italics.
✅ Following Links
✅ Open Link
| Key | Command |
|---|---|
| C-c C-o | Open link at point (scimax.org.openLink) |
Click on a link or use this command to:
Open URLs in your default browser
Open files in VS Code (or associated application)
Jump to internal targets
✅ Link Behavior by Type
| Link Type | Behavior |
|---|---|
| https:// | Opens in default browser |
| http:// | Opens in default browser |
| file: | Opens in VS Code or associated app |
| file: (dir) | Opens the directory in dired |
| mailto: | Opens default email client |
| #custom-id | Jumps to heading with CUSTOM_ID |
| *Heading | Jumps to heading with that title |
| id: | Jumps to entry with that ID property |
| nb: | Opens file in a notebook project |
✅ Link Display (Descriptive vs Literal)
By default org links are shown by their description only, like Emacs
org-link-descriptive. The brackets and target are hidden, so
[[file:25-commands.org::1868][* Utilities]] reads as just * Utilities, and a
link without a description such as [[https://orgmode.org]] reads as
https://orgmode.org. The text stays clickable.
Links stay collapsed when the cursor moves into them. To change a link, put the
cursor on it and press C-c C-l (see Insert Link Command). Set
scimax.org.descriptiveLinksReveal to cursor to have the literal link
reappear while the cursor is inside it instead. Links inside source and example
blocks are always shown literally.
The hidden brackets and target are still in the text, but the cursor skips
over them, as Emacs skips invisible text. Arrow keys move one visible character
at a time, and a click never leaves the cursor inside the hidden part.
For clicks and the cursor to line up with the collapsed text, scimax sets
editor.disableMonospaceOptimizations to true for org files. If you override
it to false, the cursor on lines of plain ASCII text is drawn as if the hidden
text were still there, and clicking a link puts the cursor in the wrong place.
Tables measure links as displayed, so a table of links lines up on screen (see
the Tables chapter).
| Action | How |
|---|---|
| Edit the link at the cursor | C-c C-l (scimax.org.insertLink) |
| Toggle descriptive/literal | scimax.org.toggleLinkDisplay (command palette) |
| Toggle from the editor | Right-click > Scimax: Toggle Link Display |
| Set the default | scimax.org.descriptiveLinks (default: true) |
| Reveal links at the cursor | scimax.org.descriptiveLinksReveal (default: never) |
✅ Link Targets and Anchors
✅ Headings as Targets
Link to headings by title using *:
* Introduction
...content...
* Methods
See [[*Introduction][the introduction]] for background.
✅ Custom IDs
Create stable link targets with CUSTOM_ID property:
* Introduction
:PROPERTIES:
:CUSTOM_ID: intro
:END:
Link to it with:
[[#intro][Introduction section]]
Custom IDs are preferred over heading text because:
They don't break when heading text changes
They're shorter and cleaner
They're unique within the document
✅ Dedicated Targets
Create named anchors anywhere with :
This paragraph contains a that we reference later.
...
As mentioned at important-point, this is significant.
✅ Radio Targets
Radio targets create automatic links throughout the document:
We introduce the concept of Machine Learning here.
...
Later, when we mention Machine Learning, it automatically links back.
Any occurrence of "Machine Learning" becomes a link to the radio target.
✅ ID Properties
The ID property provides globally unique identifiers:
ID links work across files:
✅ File Links
✅ Basic File Links
A link to a directory, such as [[file:../src/]], opens the directory in
dired (cmd:scimax.dired.open) instead of the "this is a directory" page VS
Code would otherwise show. This works for Ctrl+click, C-c C-o, and links in
the agenda hover preview.
✅ File Links with Search
Search for text in the target file by heading, ID, or text:
File Links with Search Section
By Custom ID in Links Document
By Text Search in Links Document
Search options:
| Syntax | Searches for |
|---|---|
| ::*Heading | Heading with that title |
| ::#id | Entry with that CUSTOM_ID |
| ::search text | First occurrence of text |
| ::123 | Line number 123 |
✅ Relative vs Absolute Paths
file:./14-journal.org ; Same directory file:../tasks.org ; Relative path file:~/Dropbox/emacs/projects/scimax_vscode/docs/14-journal.org ; Home-relative file:/Users/jkitchin/Dropbox/emacs/projects/scimax_vscode/docs/14-journal.org ; Absolute path
Prefer relative paths for portability.
✅ Special Link Types
✅ Protocol Links
Not many protocols are supported beyond HTTP(S) and FILE, but a few useful ones include:
✅ Image Links
Link to images (see also Image Overlays):

Images are displayed in tooltips or overlays when hovering over the link.
Marp Slideshow Links
A marp: link presents a Marp slide deck (a Markdown file with marp: true)
as a slideshow in the browser. Click it, or press C-c C-o on it.
[[marp:talks/group-meeting.md][Group meeting slides]] [[marp:talks/group-meeting.md::5][Start at slide 5]]
The path is relative to the org file; absolute paths and ~/ work too. ::N
starts at slide /N/. In exported HTML or LaTeX the link points to the .md
file. See Slideshow.
Hovering over the link shows a picture of the deck's first slide, the number
of slides, and links to Edit the .md file, open its Preview beside the
editor, or Present the slideshow (from slide N for a ::N link). The
picture uses the deck's theme and inlines local images; remote images and web
fonts are not loaded, so those may look different from the slideshow.
✅ Excalidraw Drawing Links
Link to Excalidraw drawings for visual diagrams:
Supported Extensions:
| Extension | Description |
|---|---|
| .excalidraw | Native Excalidraw format |
| .excalidraw.json | Explicit JSON format |
| .excalidraw.svg | Exported SVG with scene data |
| .excalidraw.png | Exported PNG with scene data |
Features:
Hover Preview: Hovering over an Excalidraw link shows:
A visual preview of the drawing (for SVG/PNG exports)
File information (size, modification date)
Element count (for JSON files)
Click to Edit: Clicking the link opens the drawing in the Excalidraw editor
Requires the Excalidraw VS Code extension (
excalidraw-editor)If the file doesn't exist, a new empty drawing is created
Auto-creation: If you link to a non-existent Excalidraw file and click it, the file is automatically created with an empty drawing.
Prerequisites:
Install the Excalidraw extension from the VS Code marketplace:
Extension ID:
pomdtr.excalidraw-editorSearch: "Excalidraw" in VS Code extensions
Usage Tips:
Save drawings as
.excalidraw.svgor.excalidraw.pngto get hover previewsThese formats embed the full Excalidraw scene data, so they remain editable
Store drawings alongside your org files for easy linking with relative paths
✅ Notebook Links
Notebook links provide cross-project navigation using the nb: link type. Inspired
by scimax-notebook in Emacs, they allow you to link to files within registered
notebook projects.
✅ Link Format
[[nb:project-name::relative-file-path::target][description]]
| Component | Description |
|---|---|
| project-name | Name of the notebook/project |
| relative-path | Path to file relative to project root |
| target | Optional: line number, char offset, heading or ID |
✅ Examples
| Link | Description |
|---|---|
| nb:my-research::README.org | Open README.org in my-research |
| nb:my-research::data/notes.org | Open notes.org in data/ subfolder |
| nb:my-research::paper.org::10 | Jump to line 10 |
| nb:my-research::paper.org::c453 | Jump to character offset 453 |
| nb:my-research::paper.org::*Methods | Jump to "Methods" heading |
| nb:my-research::doc.org::#intro | Jump to custom ID "intro" |
✅ Target Syntax
The target component (after the second ::) supports:
| Syntax | Description |
|---|---|
123 | Jump to line 123 |
c456 | Jump to character 456 |
*Heading | Jump to heading by name |
#id | Jump to custom ID |
✅ Commands
| Key | Command | Description |
|---|---|---|
| C-c C-o | scimax.org.openLink | Open notebook link |
| (none) | scimax.notebook.insertLink | Insert a notebook link |
✅ Inserting Notebook Links
Use the command Scimax: Insert Notebook Link to interactively create links:
Select a project from registered notebooks
Select a file within that project
Optionally specify a target (line, heading, ID)
The link is inserted at the cursor position.
✅ Project Resolution
The project-name is matched against registered notebooks by:
Exact name match (from
.scimax/config.jsonor directory name)Case-insensitive name match
Directory name at the end of the path
If multiple projects match, you'll be prompted to select one.
✅ Link Descriptions
✅ With Description
Note it is not currently possible to use a display mode like Emacs does, but descriptions can be used for export.
✅ Description Formatting
Descriptions can contain emphasis:
[[https://important.com][/Very/ *Important* Link]]
But descriptions cannot contain other links.
✅ Links in Export
✅ HTML Export
Links become elements:
<a href="https://www.example.com">Visit Example.com</a>
Internal links become anchor references.
✅ LaTeX Export
Links become \href{}{} commands:
\href{https://www.example.com}{Visit Example.com}
Internal links become \ref{} or \hyperref[]{} commands.
✅ Markdown Export
Links become standard Markdown format:
[Visit Example.com](https://www.example.com)
✅ Citation Links
For academic documents, Scimax VS Code supports citation links. See References for complete documentation.
✅ Quick Insert
| Key | Command |
|---|---|
| C-c ] | Insert citation |
✅ Citation Styles
(kitchin-2015-examp-effec) (skitchin-2015-examp-effec) ; Basic citation kitchin-2015-examp-effec ; Textual: Kitchin (2015) (kitchin-2015-examp-effec) ; Parenthetical: (Kitchin, 2015) ; Author only: Kitchin (kitchin-2015-examp-effec) ; Year only: 2015
✅ Best Practices
✅ Use Stable Link Targets
Prefer stable identifiers over content-based links:
; Fragile - breaks if heading changes: *My Current Heading Title
; Stable - survives heading changes: #my-heading-id
; Most stable - globally unique: id:uuid-here
✅ Organize File Links
Keep related files together with relative paths:
project/
├── notes.org ; Main document
├── data/
│ └── results.csv ; [[file:./data/results.csv]]
├── images/
│ └── figure1.png ; [[file:./images/figure1.png]]
└── references/
└── paper.pdf ; [[file:./references/paper.pdf]]
✅ Quick Reference
✅ Keybindings
| Key | Action |
|---|---|
| C-c l | Store link |
| C-c C-l | Insert link |
| C-c C-o | Open link at point |
| C-c ] | Insert citation (org-ref) |
✅ Commands
| Command | Description |
|---|---|
| scimax.org.storeLink | Store a new link |
| scimax.org.insertLink | Insert a link or edit the one at point |
| scimax.org.openLink | Open link at cursor |
| scimax.org.insertFinderLink | Insert link from Finder selection (macOS) |
| scimax.org.insertChromeLink | Insert link from front Chrome tab (macOS) |
| scimax.ref.insertCitation | Insert citation link |
macOS Quick Links
Two commands pull link targets from other macOS apps via AppleScript and insert them at the cursor as org-mode links.
| Command | What it inserts |
|---|---|
| scimax.org.insertFinderLink | [[file:/path][name]] for each item selected in Finder. |
| Falls back to the front Finder window's folder if no items. | |
| scimax.org.insertChromeLink | [[url][title]] for the front tab of Google Chrome. |
Both commands require macOS. On first run, macOS will prompt you to grant VS Code permission to control Finder / Google Chrome via Automation (System Settings → Privacy & Security → Automation).
These commands are intentionally unbound by default — assign your own
keybindings in keybindings.json if you use them often.
✅ Link Syntax Summary
| Format | Example |
|---|---|
| URL with description | desc |
| URL only | url |
| Angle brackets | |
| Heading link | *Heading |
| Custom ID link | #id |
| ID link | id:uuid |
| File link | file:path |
| File with line | file:path::123 |
| File with search | file:path::text |
| Target | target-name |
| Notebook link | nb:project::file::target |