✅ 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 #+BEGINSRC 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.

✅ Jump to Character

CommandKey BindingDescription
scimax.jump.gotoCharC-c jcJump to any character
scimax.jump.gotoChar2C-c jjJump 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., type "s" to jump to the second occurrence)

✅ 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 jwJump to word starts

Jumps to word boundaries. You can optionally filter by starting character:

  1. Invoke scimax.jump.gotoWord

  2. Enter a starting character or leave empty for all words

  3. All matching word starts are labeled

  4. Type the label to jump

Example: Type "f" to see only words starting with "f" (function, for, first, etc.)

✅ Jump to Line

CommandKey BindingDescription
scimax.jump.gotoLineC-c jlJump 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 joJump 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 jwJump to subword boundaries

Jumps to camelCase and snakecase boundaries:

  • myVariableName - Labels 'm', 'V', 'N'

  • myvariablename - Labels 'm', 'v', 'n'

  • MYCONSTANT - Labels 'M', 'C'

Useful for navigating within identifiers in code.

✅ 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

  • Larger numbers of matches use two-character combinations (aa, as, ad, etc.)

✅ 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