Skip to content

VS Code Extension v2.0.0

Latest

Choose a tag to compare

@couimet couimet released this 13 Jun 01:04
0b20c8f

Added

  • RangeLink Menu (R-M) - Press Cmd+R Cmd+M (Mac) / Ctrl+R Ctrl+M (Win/Linux) or click the πŸ”— RangeLink status bar item to access ⚑ quick actions
    • Jump to Bound Destination (shows quick pick of available destinations when unbound)
    • Unbind Destination (when bound)
    • Go to Link
    • Show Version Info
  • Bind to Destination (R-D) - Direct keybinding to open the destination picker and bind (#330)
    • Keyboard shortcut: Cmd+R Cmd+D (Mac) / Ctrl+R Ctrl+D (Win/Linux)
    • 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 inline threshold: rangelink.terminalPicker.maxInline (default: 5)
    • When more terminals than the threshold exist, extras collapse into "More terminals..." which opens a secondary picker
    • Escaping the secondary picker returns to the destination picker
    • Terminal picker also appears inline in the RangeLink Menu (R-M) and destination picker when unbound
  • File Picker - Choose a specific open file as text editor destination (#355, #356)
    • Open files appear as individual items inline in the destination picker; active file (frontmost tab) per tab group shown first
    • Bound file marked with "bound" badge and sorted to the top
    • Files with duplicate names show path disambiguation
    • When more open files exist beyond the inline list, extras collapse into "More files..." which opens a secondary picker
    • Secondary picker organizes all open files into "Active Files" section + per-"Tab Group N" sections
    • Escaping the secondary picker returns to the destination picker
  • Gemini Code Assist Integration - Paste destination for Google's Gemini Code Assist (#529)
    • Automatically inserts links and selected text directly into Gemini Code Assist
    • Requires Gemini Code Assist extension (Google.geminicodeassist)
    • 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)
    • New setting rangelink.customAiAssistants: three-tier command schema β€” insertCommands (direct text delivery), focusAndPasteCommands (focus + auto-paste), focusCommands (focus + manual paste toast)
    • 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)
  • Send File Path Commands - Send file paths directly to bound destinations (#243)
    • 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)
    • Explorer (right-click on files):
      • "RangeLink: Send File Path" - Send absolute path to bound destination
      • "RangeLink: Send Relative File Path" - Send relative path to bound destination
      • "RangeLink: Bind Here" - Open file and bind it as text editor destination (#247)
      • "RangeLink: Unbind" - Unbind current destination (when bound, files only)
    • Editor Tab (right-click on tabs):
      • "RangeLink: Send File Path" - Send absolute path to bound destination
      • "RangeLink: Send Relative File 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)
    • 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
    • Keyboard shortcut: Cmd+R Cmd+G (Mac) / Ctrl+R Ctrl+G (Win/Linux)
    • Supports all link formats: full paths, ranges, columns (e.g., recipes/baking/chickenpie.ts#L3C14-L15C9)
    • Also available via Command Palette and status bar menu for discoverability
  • Unbind (R-U) - Keybinding to unbind the current destination (#348)
    • Keyboard shortcut: Cmd+R Cmd+U (Mac) / Ctrl+R Ctrl+U (Win/Linux)
    • 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)
    • After: "RangeLink: Send RangeLink" (consistent prefix, cleaner appearance)
  • 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)
    • "Paste File Path" β†’ Send File Path; "Paste File Path (Absolute)" β†’ Send File Path (Absolute)
    • Context menu entries updated to match (e.g., "RangeLink: Paste Selected Text" β†’ "RangeLink: Send Selected Text")
  • Vocabulary alignment: "Paste Destination" β†’ "Destination" - Docs now use "destination" and "bind/bound" consistently (#339)
    • The "Paste" prefix was coined in v0.3.0 when destinations only pasted links β€” the feature now supports bind, unbind, jump, focus, and pick
    • Section headers, body text, and context menu descriptions updated across README and CHANGELOG
  • Cleaner command titles - Removed redundant "RangeLink" from command palette titles (#243)
    • 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)