✅ Introduction

Speed commands are single-letter keyboard shortcuts that work when the cursor is positioned at the very beginning (column 0) of a heading line. This feature, borrowed from Emacs org-mode, provides lightning-fast navigation and editing without the need for complex key chords.

✅ What are Speed Commands?

Speed commands transform the beginning of each heading into a powerful command interface. When your cursor is at column 0 of a heading (the first star * in org-mode or the first hash # in markdown), you can press a single key to execute common operations:

  • Navigation: jump between headings, siblings, parent

  • Visibility: fold/unfold sections

  • Structure editing: move, promote, demote, cut, paste

  • TODO management: cycle states, set priorities

  • Planning: add schedules and deadlines

  • Metadata: set tags, properties, effort estimates

  • Time tracking: clock in and out

  • Archiving: archive completed tasks

This approach is significantly faster than using traditional keybindings or menu commands for frequent operations.

✅ Why Use Speed Commands?

  • Efficiency: Single keystrokes instead of multi-key combinations

  • Contextual: Only active at heading starts, so no conflicts with normal typing

  • Discoverable: Press ? at a heading start to see all available commands

  • Emacs-compatible: Familiar workflow for Emacs org-mode users

✅ Configuration

✅ Enabling Speed Commands

Speed commands are enabled by default in Scimax VS Code. To toggle them on or off:

✅ Via Settings UI

  1. Open VS Code Settings (C-, or s-, on Mac)

  2. Search for "speed commands"

  3. Toggle the checkbox for Scimax: Speed Commands > Enabled

✅ Via settings.json

Add or modify this setting in your settings.json:

{
  "scimax.speedCommands.enabled": true
}

✅ Via Command Palette

  1. Open Command Palette (C-S-P or s-S-P on Mac)

  2. Type "speed" and select Scimax: Toggle Speed Commands

✅ Supported File Types

Speed commands work in:

  • Org-mode files (`.org')

  • Markdown files (`.md', `.markdown')

✅ When Speed Commands are Active

Speed commands are only active when all of the following conditions are met:

  1. Speed commands are enabled in settings (scimax.speedCommands.enabled: true)

  2. Cursor is at column 0 (the very beginning of the line)

  3. Line is a heading (starts with * for org-mode or # for markdown)

  4. No text is selected (cursor position only, not a selection)

✅ Visual Indicator

When speed commands are active, you'll notice that single key presses trigger actions immediately. If speed commands aren't working:

  1. Check that your cursor is at position 0 (before the first * or #)

  2. Ensure no text is selected

  3. Verify the file type is org or markdown

  4. Check settings to confirm speed commands are enabled

✅ Speed Command Reference

This section provides a complete listing of all available speed commands, organized by functional category.

✅ Navigation Commands

Move efficiently through your document structure.

KeyCommandDescription
nNext headingMove to the next visible heading at any level
pPrevious headingMove to the previous visible heading at any level
fNext siblingMove to next heading at the same level
bPrevious siblingMove to previous heading at the same level
uParent headingMove up to the parent heading
jJump to headingQuick picker to jump to any heading in file
gGo to... (submenu)Show navigation submenu with more options

✅ Go To Submenu Options

The g key opens a submenu with additional navigation choices:

KeyCommandDescription
nNext headingNext visible heading
pPrevious headingPrevious visible heading
fNext siblingNext heading at same level
bPrevious siblingPrevious heading at same level
uParent headingParent heading
jJump to any headingQuick picker for any heading
1First headingJump to first heading in document
$Last headingJump to last heading in document

✅ Visibility/Folding Commands

Control how much content is visible in your document.

KeyCommandDescription
cCycle global visibilityCycle through: overview → contents → show all
CShow all childrenUnfold all children of current subtree
oOverviewFold all headings (show only top-level)
Cycle fold at pointToggle folding of current heading

✅ Structure Editing Commands

Reorganize and modify your document structure.

KeyCommandDescription
UMove subtree upMove entire subtree (and children) up
DMove subtree downMove entire subtree (and children) down
rDemote headingDecrease level of heading only (shift right)
lPromote headingIncrease level of heading only (shift left)
RDemote subtreeDecrease level of subtree (and children)
LPromote subtreeIncrease level of subtree (and children)
kKill (cut) subtreeCut subtree to clipboard
yYank (paste) subtreePaste subtree from clipboard with level adjust
wRefile subtreeMove subtree to another location
WClone subtreeDuplicate the current subtree
mMark subtreeSelect (highlight) the current subtree
@Mark subtree (alt)Select subtree (alternate key)
^Sort entriesSort child entries by various criteria

✅ Structure Editing Notes

  • Promote (left) decreases the heading level (fewer stars/hashes)

  • Demote (right) increases the heading level (more stars/hashes)

  • Lowercase l/r affect only the heading line

  • Uppercase L/R affect the entire subtree (heading and children)

  • `y' (yank) intelligently adjusts heading levels to match context

  • `k' kills (cuts) the subtree, matching Emacs scimax

  • `w' refiles the subtree, matching Emacs org-mode

  • m and @ both mark (select) the subtree

✅ Sorting Entries (^)

The ^ speed command sorts child entries of the current heading. When invoked, it presents a menu of sorting criteria:

KeySort Type
a/AAlphabetically (A = reverse)
n/NNumerically (by leading number)
t/TBy timestamp (first in entry)
d/DBy DEADLINE date
s/SBy SCHEDULED date
p/PBy priority ([#A], [#B], [#C])
o/OBy TODO keyword order
c/CBy creation time
k/KBy total clocked time
r/RBy property value (prompts)

Sorting scope depends on cursor position:

  • On a heading: Sorts direct children of that heading

  • With a selection: Sorts entries within the selection

  • Before first heading: Sorts all top-level entries

✅ TODO and Priority Commands

Manage task states and priorities.

KeyCommandDescription
tCycle TODO stateCycle through: (none) → TODO → DONE → (none)
,Cycle priority upIncrease priority: C → B → A
1Priority [#A]Set priority to A (highest)
2Priority [#B]Set priority to B (medium)
3Priority [#C]Set priority to C (lowest)
0Remove priorityRemove priority marker entirely

✅ Priority System

Org-mode uses a three-level priority system:

  • [#A] - High priority (critical, urgent)

  • [#B] - Medium priority (normal importance)

  • [#C] - Low priority (nice to have)

Priorities appear after the TODO keyword: ** TODO [#A] Important task

✅ Planning/Timestamp Commands

Add scheduling and deadline information to tasks.

KeyCommandDescription
sAdd/edit SCHEDULEDSet when you plan to work on this task
dAdd/edit DEADLINESet when this task must be completed
.Insert timestampInsert an inactive timestamp at point

✅ Timestamp Types

  • SCHEDULED: When you plan to start working on the task

  • DEADLINE: When the task must be completed

  • Plain timestamp: Reference dates, events, notes

✅ Metadata Commands

Add tags, properties, and effort estimates to headings.

KeyCommandDescription
:Set tagsAdd or modify tags (colon-separated)
eSet effortSet estimated effort/duration for task
PSet propertySet a custom property in the properties drawer

✅ Tags

Tags are keywords attached to headings for categorization and filtering:

** TODO Complete documentation :work:urgent:docs:

Tags are:

  • Separated by colons (:)

  • Can contain letters, numbers, and special chars (_@#%)

  • Inherited by child headings

  • Used for agenda filtering and searches

  • Automatically aligned to column 77 (Emacs-style)

✅ Effort Estimates

Effort is stored as a property in H:MM format:

** TODO Write documentation
:PROPERTIES:
:Effort: 2:00
:END:

Common effort values:

  • 0:15 - 15 minutes

  • 0:30 - 30 minutes

  • 1:00 - 1 hour

  • 2:00 - 2 hours

  • 4:00 - Half day

  • 8:00 - Full day

✅ Properties

Properties are key-value pairs stored in a properties drawer:

** Research Project
:PROPERTIES:
:CUSTOM_ID: research-2026
:CATEGORY: Research
:Effort: 8:00
:ASSIGNED: John Doe
:END:

Common property names:

  • `ID' - Unique identifier

  • CUSTOM_ID - User-defined ID for linking

  • `CATEGORY' - Category for agenda display

  • `Effort' - Estimated effort

  • `LOGGING' - Log state changes

  • `COLUMNS' - Column view format

✅ Clocking Commands

Track time spent on tasks.

KeyCommandDescription
IClock inStart time tracking for current task
OClock outStop time tracking

✅ Clocking Workflow

  1. Position cursor at column 0 of a task heading

  2. Press `I' to clock in - starts timer

  3. Work on the task

  4. Press `O' to clock out - stops timer and records duration

Clock entries are stored in a :LOGBOOK: drawer:

** TODO Write documentation
:LOGBOOK:
CLOCK: [2026-01-13 Mon 09:00]--[2026-01-13 Mon 11:30] =>  2:30
CLOCK: [2026-01-12 Fri 14:00]--[2026-01-12 Fri 15:45] =>  1:45
:END:

✅ Clocking Notes

  • Only one task can be clocked in at a time

  • Clocking in a new task automatically clocks out the previous one

  • Clock duration is automatically calculated

  • Clock data is used for time reports and agenda views

✅ Archive Commands

Move completed tasks to archive storage.

KeyCommandDescription
aArchive subtreeMove subtree to archive file
AToggle :ARCHIVE: tagAdd/remove ARCHIVE tag (marks for archiving)
$Archive to siblingMove subtree under an "Archive" sibling heading

✅ Archive File

By default, a moves the subtree to a file named {basename}_archive.org:

  • notes.orgnotes_archive.org

  • projects.orgprojects_archive.org

The archived subtree is tagged with :ARCHIVE: and includes metadata:

* DONE Completed project :ARCHIVE:
:PROPERTIES:
:ARCHIVE_TIME: [2026-01-13 Mon 15:30]
:ARCHIVE_FILE: ~/org/projects.org
:END:

✅ Tips for Effective Use

✅ Learning the Commands

  1. Start with navigation: n, p, f, b, u are the most frequently used

  2. Use the help: Press ? at any heading start to see all commands

  3. Muscle memory: The keys are mnemonic:

✅ Common Workflows

✅ Quick Task Management

  1. Create heading with C-<return>

  2. Move to beginning of line (`Home' or `C-a')

  3. Press `t' to add TODO state

  4. Press `1' to set high priority

  5. Press `s' to schedule it

  6. Press : to add tags

✅ Organizing Content

  1. Navigate to a heading

  2. Use U/D to reorder siblings

  3. Use l/r to adjust hierarchy

  4. Use `k' to cut and `y' to paste sections

  5. Use `w' to refile sections to another location

  6. Use ^ to sort child entries

  7. Use `a' to archive completed work

✅ Reviewing Documents

  1. Press `o' to see overview (all headings folded)

  2. Use n/p to navigate between sections

  3. Press `Tab' to expand interesting sections

  4. Press `c' to cycle through visibility levels

✅ Combining with Regular Keybindings

Speed commands complement (don't replace) regular keybindings:

  • Use speed commands for quick operations when cursor is at heading start

  • Use regular keybindings (`C-c C-t', etc.) when cursor is elsewhere

  • Use `C-a' or `Home' to quickly jump to column 0 to activate speed commands

✅ Cursor Position Matters

Remember: speed commands only work at column 0. If a speed command doesn't trigger:

  1. Press `Home' or `C-a' to move to beginning of line

  2. Verify you're on a heading line (starts with * or #)

  3. Check that no text is selected

✅ Customization

Currently, speed command keys are pre-defined and cannot be customized. The key mappings follow standard Emacs org-mode conventions for consistency and muscle memory compatibility.

If you need custom keybindings, use VS Code's keybinding system to bind the underlying commands (e.g., `scimax.org.nextHeading', `scimax.org.cycleTodo') to your preferred key combinations.

✅ Reference: All Speed Commands

Complete alphabetical reference of all speed commands.

KeyCategoryCommand
,TODOCycle priority up
.PlanningInsert timestamp
0TODORemove priority
1TODOSet priority [#A]
2TODOSet priority [#B]
3TODOSet priority [#C]
:MetadataSet tags
?SpecialSpeed commands help
@StructureMark subtree (alt)
^StructureSort entries
$SpecialArchive to sibling
aSpecialArchive subtree
ASpecialToggle :ARCHIVE: tag
bNavigationPrevious sibling
cVisibilityCycle global visibility
CVisibilityShow all children
dPlanningAdd/edit DEADLINE
DStructureMove subtree down
eMetadataSet effort
fNavigationNext sibling
gNavigationGo to... (submenu)
IClockingClock in
jNavigationJump to heading
kStructureKill (cut) subtree
lStructurePromote heading
LStructurePromote subtree
mStructureMark subtree
nNavigationNext heading
NSpecialNarrow to subtree
oVisibilityOverview (fold all)
OClockingClock out
pNavigationPrevious heading
PMetadataSet property
rStructureDemote heading
RStructureDemote subtree
sPlanningAdd/edit SCHEDULED
SSpecialWiden (show all)
tTODOCycle TODO state
VisibilityCycle fold at point
uNavigationParent heading
UStructureMove subtree up
wStructureRefile subtree
WStructureClone subtree
yStructureYank (paste) subtree

✅ Troubleshooting

✅ Speed Commands Not Working

  1. Verify cursor is at column 0 (before the * or #)

  2. Check file type is `.org' or `.md'

  3. Ensure no text is selected

  4. Verify speed commands are enabled: scimax.speedCommands.enabled: true

  5. Restart VS Code after changing settings

✅ Wrong Command Executes

  1. Press `?' to see command list and verify key mapping

  2. Check for conflicting VS Code keybindings

  3. Ensure you're in an org or markdown file

  4. Update extension to latest version

✅ Help Menu Shows Wrong Commands

✅ BibTeX Speed Commands

BibTeX speed commands provide single-key shortcuts for navigating and manipulating BibTeX entries when editing .bib files. These commands are active when the cursor is at column 0 of a line starting with @ (entry definition line).

✅ Activation

BibTeX speed commands are active when:

  1. You are editing a `.bib' file

  2. Cursor is at column 0

  3. Line starts with @ (e.g., @article{, @book{)

  4. Speed commands are enabled in settings

✅ Command Reference

KeyCategoryCommand
nNavigationNext entry
pNavigationPrevious entry
jNavigationJump to entry (search)
sFormattingSort fields in entry
dFormattingDowncase entry
tFormattingTitle case article title
SFormattingSentence case title
cFormattingClean/format entry
oAccessOpen PDF
uAccessOpen URL/DOI
NAccessOpen notes
gAccessGoogle Scholar search
xAccessOpen in CrossRef
wAccessOpen in Web of Science
yActionsCopy citation key
bActionsCopy BibTeX entry
kActionsKill (delete) entry
KActionsGenerate citation key
?HelpShow speed commands help

✅ Navigation Commands

✅ Next Entry (n)

Jump to the next BibTeX entry in the file.

@article{smith2020,
  title = {First Article}
}
                       <- press n here
@book{jones2021,       <- cursor moves here
  title = {Second Book}
}

✅ Previous Entry (p)

Jump to the previous BibTeX entry in the file.

✅ Jump to Entry (j)

Opens a quick pick dialog showing all entries in the file. Search by key, author, or title.

✅ Formatting Commands

✅ Sort Fields (s)

Reorders fields in the current entry according to the standard BibLaTeX field order:

  1. author, title, journaltitle/journal, booktitle

  2. editor, edition, volume, number, pages

  3. publisher, location/address, year, date

  4. doi, url, isbn/issn

  5. note, abstract, keywords

✅ Downcase Entry (d)

Converts entry type and field names to lowercase:

Before: @ARTICLE{key, AUTHOR = {Name}}
After:  @article{key, author = {Name}}

✅ Title Case (t)

Converts the article title to Title Case, preserving braced content like {DNA} or {LaTeX}.

✅ Sentence Case (S)

Converts the article title to Sentence case (only first letter capitalized), preserving braced content.

✅ Clean Entry (c)

Applies all cleaning operations:

  • Normalizes whitespace

  • Downcases entry type and field names

  • Sorts fields

  • Removes double braces

✅ Access Commands

✅ Open PDF (o)

Attempts to open the PDF associated with the entry:

  1. Checks the `file' field in the entry

  2. Looks in the configured PDF directory

  3. Offers to open DOI in browser if no PDF found

✅ Open URL/DOI (u)

Opens the URL or DOI associated with the entry:

  • Prefers DOI if available

  • Falls back to URL field

  • Supports arXiv eprint field

✅ Open Notes (N)

Opens or creates notes for the entry. Notes are stored as org files in the configured notes directory.

✅ Google Scholar (g)

Searches Google Scholar for the entry using DOI or title.

✅ CrossRef (x)

Opens the entry in CrossRef search using the DOI.

✅ Web of Science (w)

Opens the entry in Web of Science using the DOI.

✅ Action Commands

✅ Copy Key (y)

Copies the citation key to the clipboard.

✅ Copy BibTeX (b)

Copies the entire BibTeX entry to the clipboard.

✅ Kill Entry (k)

Deletes the entire entry (with confirmation). The deleted entry is copied to the clipboard for easy recovery.

✅ Generate Citation Key (K)

Generates a standardized citation key from the entry's author and year fields. Offers multiple format options:

  • lastname-year (e.g., smith-2020)

  • lastname-titleword-year (e.g., smith-machine-2020)

  • lastname-titlewords-year (e.g., smith-machine-learning-2020)

Features:

  • Extracts first author's last name from various formats ("John Smith", "Smith, John")

  • Removes stop words from title (the, a, an, using, novel, etc.)

  • Checks for uniqueness against all other entries in the file

  • Adds suffix (a, b, c) if key already exists

  • Shows quick pick menu to choose format

Example:

Before: @article{ABC123,
          author = {John Smith and Jane Doe},
          title = {Machine Learning for Science},
          year = {2020}
        }

After:  @article{smith-2020,  (or smith-machine-2020, smith-machine-learning-2020)

✅ Help Command

✅ Show Help (?)

Displays a quick pick menu with all available BibTeX speed commands. Select a command to execute it.

✅ Configuration

BibTeX speed commands use the same enable/disable setting as org-mode speed commands:

{
  "scimax.speedCommands.enabled": true
}

For PDF and notes access, configure:

{
  "scimax.ref.pdfDirectory": "~/Papers",
  "scimax.ref.notesDirectory": "~/Notes/papers"
}

✅ Comparison with Emacs org-ref

These BibTeX speed commands are inspired by the functions in Emacs org-ref-bibtex.el:

ScimaxEmacs org-ref Function
norg-ref-bibtex-next-entry
porg-ref-bibtex-previous-entry
sorg-ref-sort-bibtex-entry
dorg-ref-downcase-bibtex-entry
torg-ref-title-case-article
Sorg-ref-sentence-case-article
corg-ref-clean-bibtex-entry
oorg-ref-open-bibtex-pdf
uorg-ref-open-in-browser
Norg-ref-open-bibtex-notes
gorg-ref-bibtex-google-scholar
xorg-ref-bibtex-crossref
worg-ref-bibtex-wos

✅ See Also

✅ Implementation Details

Speed commands are implemented in:

  • /src/org/speedCommands/ - Core implementation for org/markdown

  • /src/references/bibtexSpeedCommands.ts - BibTeX speed commands

Navigation