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.

✅ Navigation

Scimax VS Code provides powerful navigation features inspired by Emacs, including fuzzy search, avy-style jumping, and structured outline navigation. These features work seamlessly across org-mode and markdown documents, making it easy to move around your files quickly and efficiently.

✅ Overview

Navigation in Scimax VS Code follows three main paradigms:

  1. Outline Navigation - Move between structural elements (headings, source blocks)

  2. Fuzzy Search - Swiper-style incremental search with live preview

  3. Jump Navigation - Avy-style quick jumps to visible text using character hints

  4. Speed Commands - Single-key navigation when at heading start

See also:

✅ Outline Navigation

Outline navigation lets you move between structural elements in your document - headings, source blocks, and other landmarks.

✅ Heading Navigation

Navigate between headings in org-mode, markdown, and LaTeX documents:

CommandKey BindingDescription
scimax.org.nextHeadingC-c C-nJump to next heading
scimax.org.previousHeadingC-c C-pJump to previous heading
scimax.speed.nextSiblingC-c C-fNext sibling (same level)
scimax.speed.previousSiblingC-c C-bPrevious sibling
scimax.org.parentHeadingC-c C-uJump to parent heading
scimax.org.jumpToHeadingC-c C-jFuzzy search headings

Note: These keybindings work consistently across org-mode, markdown, and LaTeX files. In LaTeX, headings correspond to \section{}, \subsection{}, etc.

✅ Next/Previous Heading

Move through all headings in document order:

,* First Heading
Content here...

,** Subheading A        <- Current position
Content...

,** Subheading B        <- Next heading
More content...

,* Second Heading       <- Another next heading

The nextHeading command moves forward through headings regardless of level. Similarly, previousHeading moves backward.

✅ Parent Heading

Jump to the parent (containing) heading:

,* Parent Heading       <- Jump here
,** Child Heading
,*** Current Position   <- From here

This is useful for quickly navigating up the document hierarchy.

✅ Jump to Heading

The jumpToHeading command (C-c C-j) opens a fuzzy search picker showing all headings in the current document. Type to filter, and select a heading to jump to it.

Features:

  • Live preview - cursor moves as you browse

  • Fuzzy matching - type any part of the heading title

  • Shows heading hierarchy with indentation

  • Displays TODO states and tags

✅ Source Block Navigation

Navigate between source blocks in org documents:

CommandKey BindingDescription
scimax.ob.nextBlockC-c C-nJump to next source block
scimax.ob.previousBlockC-c C-pJump to previous block
scimax.ob.jumpToBlock-Fuzzy search blocks
scimax.ob.jumpToResults-Jump to results section

There are also speed-commands if you are the beginning of a block to navigate with n (next) and p (previous.)

✅ Next/Previous Source Block

Move between source blocks in document order:

Some text...

,#+BEGIN_SRC python      <- Current position
print("Hello")
,#+END_SRC

More text...

,#+BEGIN_SRC python      <- Next block
print("World")
,#+END_SRC

These commands skip over regular text and headings, jumping directly to the next or previous #+BEGIN_SRC block.

✅ Jump to Source Block

cmd:scimax.ob.jumpToBlock

The jumpToBlock command shows a fuzzy picker of all source blocks in the document. Each block is labeled with:

  • Language (e.g., python, javascript)

  • Block name (if it has a #+NAME: line)

  • Preview of first line of code

✅ Jump to Results

cmd:scimax.ob.jumpToResults

When cursor is in a source block, jumpToResults jumps to the #+RESULTS: section below the block (if it exists). This is useful after executing a block to quickly review the output.

✅ Sibling Navigation (Speed Commands)

Speed commands provide efficient navigation between sibling headings (headings at the same level):

KeyCommandDescription
fscimax.speed.nextSiblingNext heading at same level
bscimax.speed.previousSiblingPrevious heading at same level

These commands only work when:

  1. Speed commands are enabled

  2. Cursor is at the beginning of a heading line

Example:

,* Parent
,** Sibling 1
,** Sibling 2          <- Press 'f' to jump to Sibling 3
,** Sibling 3          <- Press 'b' to jump back to Sibling 2
,** Sibling 4

Sibling navigation skips over child headings:

,** Sibling 1           <- Current position
,*** Child of Sibling 1
,*** Another child
,** Sibling 2           <- Press 'f' jumps here (skips children)

✅ Fuzzy Search (Swiper-Style)

Fuzzy search provides incremental search with live preview, inspired by Emacs Swiper. As you type, matching lines are filtered and the cursor moves to show a live preview.

✅ Search Current File

CommandKey BindingDescription
scimax.fuzzySearchC-c sSearch lines in current file

Opens a quick pick showing all non-empty lines in the current file. Features:

  • Live preview - cursor moves to selected line as you browse

  • Fuzzy matching - type space-separated terms, all must match

  • Match highlighting - matching terms are highlighted in results

  • Cancel restores position - press Escape to return to original location

Example workflow:

  1. Press C-c s to open fuzzy search

  2. Type "function calculate" to find lines with both words

  3. Use arrow keys or continue typing to narrow results

  4. Press Enter to jump to selected line

  5. Press Escape to cancel and return to original position

✅ Search Open Files

CommandKey BindingDescription
scimax.fuzzySearchOpenFilesC-c Shift-sSearch lines in all open files

Like fuzzy search but searches across all open buffers/files. Results are grouped by file with file separators.

Use this to:

  • Find text across multiple open files

  • Navigate between related files quickly

  • Review related code across different modules

✅ Search Outline (Headings/Symbols)

CommandKey BindingDescription
scimax.fuzzySearchOutlineC-c M-sSearch headings and symbols

Searches only structural elements:

  • Org files - Headlines (lines starting with *)

  • Markdown files - Headings (lines starting with #)

  • Code files - Function/class definitions

This provides a fast way to navigate document structure without seeing every line.

Icons indicate heading level:

  • $(symbol-class) - Top-level or class

  • $(symbol-class) $(symbol-class) - Second level

  • $(symbol-method) - Functions/methods

👀 Jump Navigation (Avy-Style)

Jump navigation provides character-based quick jumps to visible text, inspired by Emacs Avy. You specify what to jump to (character, word, line), and each match is labeled with a hint character. Type the hint to jump instantly.

⚠️ How a Jump Works

There is no prompt or picker: while a jump is running, your keystrokes are read straight from the editor, exactly as in Avy. The cursor never leaves the buffer and the status bar shows what the jump is waiting for.

Every jump command follows the same two steps. First you say what you are looking for, which for most commands is a single keystroke: C-c j c takes one character, C-c j j takes two, C-c j w takes the first character of a word, and C-c j l takes nothing at all. Second, each match is overlaid with a short label drawn on top of the text at its screen position, and typing the label jumps there. Nothing on the line shifts to make room.

If the query matches exactly one place, the jump happens immediately with no label to type.

Two-character labels narrow as you type. After the first character, only the matching targets stay lit and they redraw showing just the character that remains, so you always see exactly what to press next. Backspace undoes the last character you typed, and Escape cancels.

Labels are handed out nearest-first from the cursor, so the closest targets get the single-character labels and the far ones get pairs. When scimax.jump.allVisibleEditors is on (the default), every visible editor is labeled, so a jump can cross a split.

⚠️ Jump to Text (Timer)

CommandKey BindingDescription
scimax.jump.gotoCharTimerC-c j tJump to text of any length

This is the avy-goto-char-timer equivalent and the most flexible of the jump commands. Instead of a fixed number of characters, you type as much of the target text as you like and the matches highlight as you go. When you stop typing for a moment (300 ms by default, see scimax.jump.timeoutMs), the labels appear over whatever still matches.

Use it when one or two characters would leave too many candidates on screen. Backspacing past the labels returns you to editing the query.

👀 Jump to Character

CommandKey BindingDescription
scimax.jump.gotoCharC-c j cJump to any character
scimax.jump.gotoChar2C-c j jJump to 2-character sequence

👀 Single Character

  1. Invoke scimax.jump.gotoChar

  2. Type a character, e.g. "e"

  3. All visible occurrences of "e" are labeled: a, s, d, f, etc.

  4. Type the label to jump, e.g. "s" for the second occurrence

The character goes straight into the jump, not into a prompt, so this is two keystrokes plus the chord.

✅ Two Characters

For more precision, use scimax.jump.gotoChar2:

  1. Invoke the command

  2. Type two characters (e.g., "th")

  3. All visible "th" sequences are labeled

  4. Type the label to jump

This reduces the number of matches, making jumps faster.

👀 Jump to Word

CommandKey BindingDescription
scimax.jump.gotoWordC-c j wJump to word starts

Jumps to the start of a word, filtered by its first character:

  1. Invoke scimax.jump.gotoWord

  2. Type the character the word starts with, e.g. "f"

  3. Every visible word starting with "f" is labeled (function, for, first, …)

  4. Type the label to jump

The starting character is required rather than optional. Labeling every word on screen at once buries the text under labels, and the first character of the word you want is nearly always known.

⚠️ Jump to Heading

CommandKey BindingDescription
scimax.jump.gotoHeadingC-c j hJump to any visible heading

Labels every visible heading at once, with no character to type first. In a folded buffer that is most of the outline, which is where the overlay beats the fuzzy picker in scimax.org.jumpToHeading (C-c C-j): you can see the whole structure and pick from it directly rather than describing what you want.

The label is drawn over the leading stars rather than over the title, so the headings stay readable while you choose, and the cursor lands at the start of the heading line where the speed commands are active.

Headings are recognized per language, so org files use * headings, markdown files use # headings, and LaTeX files use \section and friends. A # comment inside an org source block is not mistaken for a heading.

✅ Jump to Line

CommandKey BindingDescription
scimax.jump.gotoLineC-c j lJump to any visible line

Labels every visible line for quick vertical navigation:

  1. Invoke scimax.jump.gotoLine

  2. Every visible line gets a label (a, s, d, etc.)

  3. Type the label to jump to that line

The cursor is placed at the first non-whitespace character of the selected line.

✅ Jump to Symbol

CommandKey BindingDescription
scimax.jump.gotoSymbolC-c j oJump to symbols and headings

Jumps to structural elements in the visible area:

  • Function/class definitions

  • Org headings (* Heading)

  • Markdown headings (# Heading)

  • Comment markers (TODO, FIXME, NOTE, etc.)

Only visible symbols are labeled, making it very fast for navigating code structure.

👀 Jump to Subword

CommandKey BindingDescription
scimax.jump.gotoSubwordC-c j sJump to subword boundaries

Like Jump to Word, but the boundaries inside an identifier count too. Type the character the part starts with, in either case: "v" labels the V in myVariableName as well as the v in my_variable_name. Useful for landing inside a long identifier rather than at its start.

⚠️ Listing the Jump Commands

CommandKey BindingDescription
scimax.jump.listCommandsC-c j ?List all the jump commands

If you cannot remember which letter follows C-c j, press ? instead. A picker lists every jump command with its keybinding and a one-line description, and choosing one runs it. The keybindings shown are read from the extension manifest, so they always reflect what is actually bound.

✅ Jump Actions

Beyond navigation, jump commands can perform actions:

CommandKey BindingDescription
scimax.jump.copyLine-Select a line and copy it
scimax.jump.killLine-Select a line and delete it

These commands use the same labeling system but perform actions instead of just moving the cursor.

👀 Label Characters

Jump labels use home row keys for efficiency, ordered by ease of typing:

a s d f j k l g h q w e r u i o p z x c v b n m t y

Small numbers of matches use single characters. When there are more matches than characters, only as many prefixes as necessary are reserved for two-character labels, so most targets still get a single keystroke. Since labels are assigned nearest-first, the two-character labels land on the targets furthest from the cursor.

⚠️ Jump Settings

SettingDefaultDescription
scimax.jump.timeoutMs300Pause before labels appear (avy-timeout-seconds)
scimax.jump.labelCharsasdfjklghqweruiopzxcvbnmtyLabel characters in order of preference (avy-keys)
scimax.jump.allVisibleEditorstrueLabel targets in every split, not just the active editor
scimax.jump.dimBackgroundfalseGrey out the text while labels show (avy-background)
scimax.jump.labelBackground#d33682Label background color (any CSS color)
scimax.jump.labelForeground#ffffffLabel text color (any CSS color)

Raise scimax.jump.timeoutMs if the labels appear while you are still typing a longer query; lower it toward 0 to get labels immediately.

✅ Document Symbol Provider

VS Code's built-in outline view and breadcrumb navigation are enhanced with org-mode support.

✅ Outline View

The Outline panel (View -> Outline) shows document structure:

For org files:

  • Document title (from #+TITLE:)

  • All headings in hierarchical structure

  • TODO state indicators (box for TODO, check for DONE)

  • Tags and priorities shown as details

  • Source blocks (labeled with language)

  • Tables

  • Drawers

Symbols use semantic icons:

  • $(symbol-class) - Level 1 headings

  • $(symbol-method) - Level 2 headings

  • $(symbol-function) - Level 3 headings

  • $(symbol-key) - TODO items

  • $(symbol-event) - DONE items

✅ Breadcrumb Navigation

The breadcrumb bar at the top of the editor shows your location in the document hierarchy:

Document Title > Level 1 Heading > Level 2 Heading > Current Position

Click any breadcrumb to see siblings and navigate quickly.

✅ Quick Outline

Press C-S-O (or s-S-O on Mac) to open VS Code's quick outline:

  • Shows all document symbols

  • Type to filter

  • Press Enter to jump to symbol

This works similar to fuzzySearchOutline but uses VS Code's native UI.

✅ Go to Definition

While not Scimax-specific, VS Code's go to definition works in org files for:

CommandKey BindingDescription
editor.action.revealDefinitionF12Go to definition
editor.action.peekDefinitionM-F12Peek definition
editor.action.goToReferencesS-F12Find all references

✅ Navigation History

VS Code tracks your navigation history across files:

CommandKey BindingDescription
workbench.action.navigateBackC-x C-LeftGo to previous location
workbench.action.navigateForwardC-x C-RightGo to next location

Every jump creates a history entry:

  • Jump to heading

  • Follow a link

  • Go to definition

  • Search result navigation

Use these commands to backtrack through your navigation path.

✅ Speed Commands

Speed commands provide single-key navigation when the cursor is at the start of a heading. See the table in *Sibling Navigation (Speed Commands) above, or press ? at a heading start to see all speed commands.

Navigation speed commands (available at heading start):

KeyCommandDescription
nNext visible headingMove to next heading
pPrevious visible headingMove to previous heading
fNext sibling headingNext heading at same level
bPrevious sibling headingPrevious heading at same level
uParent headingJump to parent heading
jJump to headingFuzzy search headings
gGo to... submenuMore navigation options

To enable speed commands:

  1. Open settings (C-,)

  2. Search for "scimax speed commands"

  3. Enable "Scimax: Speed Commands Enabled"

Or add to settings.json:

{
  "scimax.speedCommandsEnabled": true
}

✅ Keybinding Reference

All navigation keybindings:

✅ Global (All Modes)

Key BindingCommandDescription
C-c sscimax.fuzzySearchFuzzy search current file
C-c S-sscimax.fuzzySearchOpenFilesFuzzy search open files
C-c M-sscimax.fuzzySearchOutlineFuzzy search outline
C-S-OVS Code Quick OutlineJump to symbol

✅ Org/Markdown Mode

Key BindingCommandDescription
C-c C-jscimax.org.jumpToHeadingJump to heading

✅ Speed Commands (at heading start)

KeyCommandDescription
nNext headingMove to next heading
pPrevious headingMove to previous heading
fNext siblingNext heading at same level
bPrevious siblingPrevious heading at same level
uParent headingJump to parent heading
jJump to headingFuzzy search headings

✅ Tips and Workflows

✅ Quick Heading Navigation

Combine speed commands and fuzzy search:

  1. Use j speed command for fuzzy heading search (when at heading start)

  2. Use C-c C-j for heading search (from anywhere)

  3. Use f/b speed commands to move between siblings

  4. Use n/p speed commands to scan all headings

✅ Finding Code in Large Files

For code files:

  1. C-c M-s - Search outline to find function/class

  2. scimax.jump.gotoSymbol - Jump to visible function

  3. C-S-O - VS Code quick outline for all symbols

✅ Cross-File Navigation

When working across multiple files:

  1. C-c S-s - Search all open files

  2. Open related files

  3. Use navigation history (M-/M-) to move between locations

  4. Use breadcrumbs to see context

✅ Precision Jumping

For maximum precision:

  1. scimax.jump.gotoChar2 - Two characters gives fewer matches

  2. scimax.jump.gotoSubword - Jump within camelCase names

  3. scimax.jump.gotoWord with starting character - Filter words

✅ Source Block Workflows

When working with literate programming:

  1. scimax.ob.jumpToBlock - Find block by name/language

  2. scimax.ob.nextBlock/previousBlock - Navigate between blocks

  3. scimax.ob.jumpToResults - Check execution results

  4. Execute block (C-c C-c)

  5. Jump to results to verify output

✅ Configuration

✅ Enable/Disable Features

{
  // Enable speed commands (single-key navigation at heading start)
  "scimax.speedCommandsEnabled": true,

  // Maximum number of items in fuzzy search (performance)
  "scimax.fuzzySearch.maxResults": 1000
}

✅ Custom Keybindings

Add custom keybindings in keybindings.json:

[
  // Custom jump to character binding
  {
    "key": "ctrl+;",
    "command": "scimax.jump.gotoChar",
    "when": "editorTextFocus"
  },

  // Custom next source block binding
  {
    "key": "ctrl+shift+n",
    "command": "scimax.ob.nextBlock",
    "when": "editorTextFocus && editorLangId == 'org'"
  }
]

✅ Troubleshooting

✅ Fuzzy Search Not Working

If fuzzy search doesn't show results:

  1. Check that the file has non-empty lines

  2. Try searching with simpler terms

  3. Check if file is too large (increase maxResults setting)

✅ Speed Commands Not Triggering

Speed commands require:

  1. scimax.speedCommandsEnabled set to true

  2. Cursor at column 0 (start of line)

  3. Cursor on a heading line (starts with * in org, # in markdown)

Move cursor to beginning of heading with Home key, then try speed command.

✅ Jump Labels Not Appearing

If jump commands don't show labels:

  1. Make sure there are visible matches in the viewport

  2. Check that the editor has focus

  3. Try scrolling to ensure matches are visible

✅ Navigation History Not Working

VS Code's navigation history works best when:

  1. You make explicit jumps (jump commands, follow links)

  2. You move between files

  3. You use go to definition

Cursor movement with arrow keys doesn't create history entries.

✅ See Also

✅ Comparison with Emacs

Scimax VS Code navigation is inspired by Emacs packages:

Emacs PackageVS Code EquivalentNotes
Avyscimax.jump.* commandsCharacter-based jumping
Swiperscimax.fuzzySearchIncremental search with preview
Helm/IvyQuick Pick UIVS Code native fuzzy picker
Org speed keysSpeed commandsSingle-key commands at heading
ImenuDocument symbol providerOutline view and breadcrumbs

Key differences:

  • VS Code uses Quick Pick UI instead of minibuffer

  • Some Emacs packages have richer configuration

  • VS Code navigation history is cross-file by default

  • Speed commands in VS Code require explicit enable

✅ Index

Navigation