You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Shows all available destinations (terminals, text editors, AI assistants) in a single picker
Smart bind handles the already-bound case with a confirmation dialog
Also available via Command Palette as "RangeLink: Bind to Destination"
Terminal Picker - Choose which terminal to bind to instead of auto-binding the active one (#255)
Command Palette "Bind to Terminal" shows a QuickPick list of eligible terminals
Active terminal marked with "active" badge, bound terminal marked with "bound" badge (dual badge "bound Β· active" when same terminal)
Terminals sorted: bound first, active second, rest in natural order β bound terminal never hidden behind "More terminals..."
Hidden IDE terminals (e.g., Cursor's background terminal) are automatically filtered out
Extension-managed pty terminals (Jest test runners, task runners, debug consoles, etc.) are filtered out across every entry point β picker, context-menu "Bind Here", and the "Bind to Terminal" command β so you can only target shell terminals that actually accept input (#592)
Configurable cold-start timing: rangelink.destinations.gemini.coldStartDelayMs (default: 2500) and rangelink.destinations.gemini.coldRefocusIntervalMs (default: 300) β tune for your machine's speed; increase the delay on slower hardware if the initial paste after binding silently fails to reach the Gemini panel
Custom AI Assistants - Connect RangeLink to any AI tool with a VS Code extension (#500)
Custom assistants appear in the destination picker (R-D) alongside built-in destinations
Lazy tier resolution: RangeLink checks which commands are registered on first use and caches the winning tier β no per-operation overhead
Override built-in assistants (Cursor, Claude Code, Copilot) via config with automatic fallback to hardcoded commands
${content} template interpolation for insert commands with non-standard argument formats
Claude Code Cold-Start Timing - Configurable cold-start settings for the Claude Code Extension destination
rangelink.destinations.claudeCode.coldStartDelayMs (default: 2500) and rangelink.destinations.claudeCode.coldRefocusIntervalMs (default: 300) β tune for your machine's speed; increase the delay on slower hardware if the initial paste after binding silently fails to reach the Claude Code panel
Release Notifier - Once-per-upgrade notification so new versions don't go unnoticed (#525)
On upgrade, shows "RangeLink updated to vX.Y.Z. See what changed!" with "What's New" and "Skip for this version" buttons
"What's New" opens the GitHub releases page; "Skip for this version" silences without opening the browser
Dismissing (X) is temporary β the notification reappears on the next activation until you act
Clipboard Preservation - RangeLink no longer silently overwrites your clipboard (#353)
New setting rangelink.clipboard.preserve ("always" | "never", default: "always")
Under "always", your prior clipboard content is saved before each transport operation (R-L, R-V, R-F, AI assistant paste, terminal paste) and restored afterward β your clipboard is only permanently overwritten when you explicitly ask for it (R-C)
Under "never", your clipboard always contains the last RangeLink output (previous behavior)
Context menu commands - See "Context Menu Integrations" section below for full details
Command palette commands - For the currently active editor
"Send Current File Path" - Sends workspace-relative path (default)
"Send Current File Path (Absolute)" - Sends absolute path
Keyboard shortcuts - Cmd+R Cmd+F for relative, Cmd+R Cmd+Shift+F for absolute
Shell-safe quoting - Paths with special characters (spaces, parentheses, etc.) are automatically wrapped in single quotes when sent to any destination, matching Cursor's drag-drop behavior. Clipboard retains the unquoted path.
Includes separate smartPadding.pasteFilePath setting (default: both) for controlling whitespace around pasted paths
Copies to clipboard + sends to bound destination (like other send commands)
Shows quick pick to bind a destination when unbound
Context Menu Integrations - Right-click access to RangeLink commands (#73, #243, #246)
"RangeLink: Bind Here" - Bind this editor as destination (file/untitled only)
"RangeLink: Unbind" - Unbind current destination (when bound)
Editor Content (right-click inside editor):
"RangeLink: Send RangeLink" - Send relative path link to destination (has selection)
"RangeLink: Send RangeLink (Absolute)" - Send absolute path link to destination (has selection)
"RangeLink: Send Portable Link" - Send BYOD portable link to destination (has selection)
"RangeLink: Send Portable Link (Absolute)" - Send BYOD portable link to destination (has selection)
"RangeLink: Send Selected Text" - Send selected text to bound destination (has selection)
βββ visual separator βββ
"RangeLink: Send This File's Path" - Send absolute path to bound destination
"RangeLink: Send This File's Relative Path" - Send relative path to bound destination
"RangeLink: Bind Here" - Bind this editor as destination (file/untitled only)
"RangeLink: Unbind" - Unbind current destination (when bound)
Terminal Tab (right-click on tabs):
"RangeLink: Bind Here" - Bind this terminal as destination
"RangeLink: Unbind" - Unbind current destination (when bound)
Terminal Content (right-click inside terminal):
"RangeLink: Send Selected Text" - Send the selected terminal text to the bound destination (hidden when the terminal IS the bound destination; opens the destination picker if nothing is bound)
"RangeLink: Bind Here" - Bind this terminal as destination
"RangeLink: Unbind" - Unbind current destination (when bound)
Navigation clamping feedback - Navigation now warns when a link points beyond file boundaries instead of silently landing at the nearest valid position
Navigation toast settings - Control which toasts appear after clicking a RangeLink (#54)
rangelink.navigation.showNavigatedToast (default: true) β suppress the "Navigated to β¦" info toast for a quieter workflow
rangelink.navigation.showClampingWarning (default: true) β suppress the clamping warning when navigation is adjusted to file boundaries
Navigation itself is unaffected β only the feedback toasts are controlled
Dirty Buffer Warning - Warning when generating a link from a file with unsaved changes (#298)
Shows a dialog with options: "Save & Generate", "Generate Anyway", or dismiss to abort
Controlled by rangelink.warnOnDirtyBuffer setting (default: true)
Helps avoid creating links that may point to incorrect positions after the file is saved
Also applies to Send File Path (R-F) commands β warns when the file has unsaved changes that may cause the AI tool to read stale content from disk (#513)
Send Terminal Selection (R-V) - Send terminal text to your bound destination (#331)
Keyboard shortcut:Cmd+R Cmd+V (Mac) / Ctrl+R Ctrl+V (Win/Linux) when terminal has focus
Terminal context menu "Send Selection to Destination" entry when text is selected β opens the destination picker if nothing is bound
R-L and R-C gracefully guide users who press editor keybindings while in the terminal
Go to Link Command (R-G) - Paste or type a RangeLink to go directly to that code location
Previously only accessible via Command Palette and context menus
Smart Padding settings documented - All 4 smartPadding.* settings now in README Configuration section (#270)
Clickable File Paths - Plain file paths in terminal output and editor documents are now clickable (#253)
Cmd+click (Mac) / Ctrl+click (Win/Linux) navigates directly to the file in the editor
Supports quoted paths with spaces (e.g., "/path/with spaces/file.ts"), absolute paths (/path/to/file.ts), relative paths (./file.ts, ../file.ts), and tilde paths (~/file.ts)
Quoted path detection requires a file extension and excludes backtick-delimited code, so English prose with possessive apostrophes (e.g. branch's β¦ base's) is never matched as a quoted path
File existence is validated on click (not during detection) to keep terminal and document scanning fast
Works alongside existing RangeLink #L navigation β no conflicts
Forgiving filename navigation - Links with bare filenames (no directory path) now navigate when exactly one matching file exists in the workspace (#342)
Covers links generated by AI tools that omit directory prefixes (e.g., RangeLinkNavigationHandler.ts#L10)
When the filename is ambiguous (multiple matches) or not found, the existing "Cannot find file" warning is shown
Status bar bound-state appearance - The R-M status bar icon now dynamically reflects bind state (#23)
Tooltip shows the bound destination name (e.g., RangeLink β Terminal ("bash")) when bound, or RangeLink β no destination bound when unbound
Uses prominent theme color (statusBarItem.prominentForeground) when bound, resets to default when unbound
Changed
Links with unsafe paths auto-quoted - RangeLinks containing spaces, parentheses, or other shell-unsafe characters are automatically single-quoted at generation time, enabling round-trip navigation. Both single-quoted ('My Folder/file.ts#L10') and double-quoted ("My Folder/file.ts#L10") formats are detected by the clickable link scanner in terminal and document providers. Clipboard always receives the raw unquoted link. Quoting is handled in the core library so all consumers benefit automatically. (#320)
Text editor destination no longer requires split editor - Bind to any text editor regardless of tab group layout (#279)
Before: Required 2+ tab groups (split editor) to bind a text editor destination
After: Bind any text editor; if you try to paste to the same file you're selecting from, RangeLink copies to clipboard and shows a helpful message
Self-paste detection prevents the "paste into yourself" problem without restricting valid workflows
Tip: When self-paste is detected for R-L, the message suggests R-C (clipboard-only) as an alternative
Editor context menu labels - Selection items now have "RangeLink:" prefix (#243)
Before: "Copy Range Link [βR βL]" (command palette title with keybinding in title)
Improved error message for stale selections - Better guidance when external file changes cause selection loss (#258)
Before: "No text selected. Select text and try again."
After: "No text selected. Click in the file, select text, and try again."
Addresses VSCode behavior where editor.selections returns stale data after external modifications
Paste Selected Text UX - Quick pick when no destination bound (#90)
Before: Silently copied to clipboard with no indication
After: Select destination β binds and pastes in one action
Dismisses silently when user presses Escape (no clipboard fallback β user can retry)
Edge case: Shows info notification if no destinations exist
Send RangeLink and Send Portable Link show picker when unbound β These commands now open the destination picker when no destination is bound, consistent with Send Selected Text and Send File Path (#373)
Before: Fell back silently to clipboard when unbound
After: Opens destination picker; binds and sends in one action; dismisses silently on Escape
Use Copy RangeLink or Copy RangeLink (Absolute) for clipboard-only behavior
Untitled file navigation works in all locales - Clicking a RangeLink that references an open untitled file now navigates correctly regardless of VS Code's display language (#101)
Before: Only English "Untitled-N" names were recognized; non-English locales (e.g., French "Sans titre-1") showed "Cannot find file"
After: The fallback searches all open untitled documents by URI scheme, which is locale-independent
Case-insensitive matching ensures links work even when casing differs between the link and the document name
Jump to Bound Destination UX - Quick pick when no destination bound (#173)
Before: Error message "No destination bound. Bind a destination first."
After: Select destination β binds and jumps in one action
Dismisses silently when user presses Escape
Edge case: Shows info notification if no destinations exist (e.g., no terminal, no AI extensions)
Two-verb command vocabulary β Commands now use Send (deliver to destination, picker if unbound) or Copy (clipboard only) instead of the previous mix of "Copy" and "Paste" verbs (#373)
"Copy Range Link" β Send RangeLink (now delivers to destination; see picker-when-unbound behavior below)
"Copy Range Link (Absolute)" β Send RangeLink (Absolute)
"Copy Portable Link" β Send Portable Link
"Copy Portable Link (Absolute)" β Send Portable Link (Absolute)
"Copy Range Link (Clipboard Only)" β Copy RangeLink (always clipboard; verb is now unambiguous)
"Copy Range Link (Clipboard Only, Absolute)" β Copy RangeLink (Absolute)
"Paste Selected Text to Bound Destination" β Send Selected Text
"Paste Current File Path" β Send Current File Path; "Paste Current File Path (Absolute)" β Send Current File Path (Absolute)
Before: "RangeLink: Bind RangeLink to Terminal Destination"
After: "RangeLink: Bind to Terminal"
Category "RangeLink" already provides the namespace; titles now focus on the action
Unbind hidden when nothing bound - "RangeLink: Unbind" now hides from the command palette when no destination is bound (via when: rangelink.isBound) instead of showing grayed out (#571)
Before: Unbind always appeared in the command palette, grayed out when unbound
After: Unbind only appears when a destination is bound, matching the existing menu and keybinding behavior
Consistent status bar prefix - Every status bar message now carries RangeLink: (or β RangeLink: for success confirmations) so the source is always identifiable in the shared IDE status bar (#549)
Toast messages (info/warning/error) no longer carry RangeLink: since VS Code already shows the extension source in the toast popup
Fixed
Full-line navigation selection - Fixed #L10 selecting only first character instead of entire line. Full-line links (#L10, #L10-L15) now correctly select from start of first line to end of last line.
Full-line link generation with newline - Fixed link generation when selection includes trailing newline. Selecting "line 20 + newline" now correctly generates #L20 instead of #L20-L21.
Wrapped link navigation - Fixed navigation failing when RangeLinks are wrapped in backticks, quotes, or angle brackets. Wrapper characters (`, ', ", <, >) were captured as part of the path, producing unresolvable paths like `file.ts. The link detection pattern now excludes these characters from path matching. (#310)
Clickable File Paths ignored custom delimiter config - Fixed the file path terminal and document providers hardcoding the default #L delimiter for the RangeLink coexistence guard. With custom delimiters (e.g. @l), paths like ./src/file.ts@l10 were incorrectly matched as plain file paths instead of deferring to RangeLink. Both providers now use the runtime delimiter config. (#253)
Markdown link navigation - Fixed navigation failing when a RangeLink appears as the URL inside Markdown link syntax, e.g. [`file.ts:876`](src/file.ts#L876). The ]( boundary was captured as part of the path, producing unresolvable paths like ](src/file.ts. (#379)
Web URLs no longer hijacked as RangeLinks - Fixed clickable links incorrectly capturing URLs like https://example.com/path/file.ts#L10, which caused "file not found" errors when clicked. HTTP, HTTPS, and FTP URLs are now properly ignored while local file paths continue to work. (#288)
Stale viewColumn after split/move - Fixed paste targeting the wrong tab group when a bound text editor is moved between tab groups after binding. The editor's viewColumn is now resolved dynamically at paste time instead of using the stale bind-time snapshot. Shows clear error messages when the bound editor is no longer visible or is open in multiple tab groups. (#307)
Text editor paste to hidden tabs - Bound text editor no longer needs to be the topmost tab in its pane. Paste now works even when the bound file is hidden behind other tabsβRangeLink automatically brings it to the foreground during paste. (#181)
Document link tooltip shows raw JSON - Fixed hover tooltip displaying raw markdown with command URIs and JSON payloads instead of clean human-readable text. Defers the command URI target to resolveDocumentLink() so the hover shows only the tooltip string (e.g., "Open path/to/file.ts:10-20 β’ RangeLink"). (#311)
Full-line selection validation error - Fixed SELECTION_ZERO_WIDTH error when using Ctrl+L or triple-click to select full lines. The selection normalization now correctly sets the end character to the line length instead of 0. (#306)
Text editor binding validation - Prevents binding to read-only editors (git diff views, output panels, settings UI) that would cause paste operations to fail with confusing errors. Now shows clear error messages: "Cannot bind to read-only editor (git)" or "Cannot bind to file.png - binary file".
Smart padding preserves whitespace-only text - Fixed applySmartPadding() incorrectly trimming whitespace-only strings to empty. Now whitespace-only content is preserved when using destinations.
Re-binding same AI assistant no longer shows redundant confirmation - Binding to an AI assistant you're already bound to now shows "already bound" instead of a "Replace?" dialog. (#396)
Guard against paste to wrong tab group β RangeLink now detects when the bound file is open in multiple editor groups and shows a clear error instead of pasting to the wrong instance. A proactive warning also appears immediately when the conflict is detected so you know before attempting to paste. (#315)
Whitespace-only content no longer silently dropped - Selecting whitespace (spaces, tabs, newlines) from terminal output or code indentation now reaches the bound destination. Previously the eligibility check rejected it, showing "copied to clipboard" while nothing arrived. (#362)
Unbind active when no destination bound β The Unbind command (R-U) and its context menu entries were active even with no destination bound. Unlike send/paste commands that show a destination picker when unbound, unbind has no useful unbound flow β binding just to immediately unbind is pointless. Now disabled via rangelink.isBound context key. (#114)
Binding survives language-mode changes β Changing a bound file's language mode (manually or via auto-detection) no longer silently breaks the binding. Previously the binding was lost with no notification, requiring a re-bind. (#472)