Skip to content

Make Open With palette commands bindable - #4112

Closed
austinywang wants to merge 15 commits into
mainfrom
issue-4111-bindable-open-with-shortcuts
Closed

austinywang wants to merge 15 commits into
mainfrom
issue-4111-bindable-open-with-shortcuts

Conversation

@austinywang

@austinywang austinywang commented May 13, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • Adds first-class shortcut action IDs for every palette.terminalOpenDirectory.* Open With command.
  • Routes those shortcuts through the same in-process directory launcher used by the command palette, avoiding shell execution and focused PTY stdin.
  • Updates cmux.json schema/docs shortcut listings and adds focused shortcut registry coverage.

Fixes #4111

Testing

  • Not run locally per repository policy.
  • git diff --check
  • python3 -m json.tool web/data/cmux.schema.json >/tmp/cmux-schema-issue-4111.json

Note

Medium Risk
Adds new user-configurable shortcut actions and event routing to launch external apps for the current directory; incorrect mapping or directory resolution could make shortcuts fail or open the wrong location, but changes are localized and guarded with beeps/fallbacks and tests.

Overview
Makes the command palette’s Open With (palette.terminalOpenDirectory.*) commands first-class, bindable KeyboardShortcutSettings.Actions (all unbound by default), including labels and settings-file parsing support.

Centralizes “open current directory” behavior in TerminalDirectoryOpenLauncher and routes these new shortcut actions through AppDelegate (including chord-prefix arming), while ContentView now delegates its focused-directory opener to the same launcher.

Updates the web shortcut registry/schema and i18n category label, and adds unit tests covering action exposure, cmux.json binding parsing, directory fallback selection, and launch failure reporting.

Reviewed by Cursor Bugbot for commit 73a764b. Bugbot is set up for automated code reviews on this repo. Configure here.


Summary by cubic

Makes all “Open With” palette commands bindable to keyboard shortcuts and routes them through a single in‑process launcher for consistent behavior from both the palette and shortcuts. Satisfies #4111; you can bind actions like palette.terminalOpenDirectory.vscode in cmux.json.

  • New Features

    • Added shortcut actions for every palette.terminalOpenDirectory.* (all unbound; configurable in cmux.json and shown under the new “Open With” category).
    • Introduced TerminalDirectoryOpenLauncher for centralized directory resolution (focused panel, then workspace) and app launching; used by the palette and AppDelegate; supports chorded bindings, Finder reveal, Inline VS Code, and beeps on failure.
    • Mapped palette IDs to actions via ContentView.commandPaletteShortcutAction and TerminalDirectoryOpenTarget(commandPaletteCommandId:); updated web/data/cmux.schema.json, web/data/cmux-shortcuts.ts, and localized the “Open With” category.
  • Bug Fixes

    • Restored fallback to the workspace directory when the focused directory is missing or stale.
    • Fixed launcher test error unwrapping to validate failure reporting.

Written for commit 73a764b. Summary will update on new commits. Review in cubic

Summary by CodeRabbit

  • New Features

    • Added keyboard actions to open the current directory in 15 apps (Android Studio, Antigravity, Cursor, Finder, Ghostty, IntelliJ, iTerm2, Terminal, Tower, VS Code, VS Code Inline, Warp, Windsurf, Xcode, Zed) and a centralized opener to perform the action.
  • Settings

    • Exposed new actions as customizable keyboard shortcuts; all are unbound by default and parse from settings files.
  • UI Integration

    • Command palette and shortcut routing now surface and trigger the open-directory actions.
  • Tests

    • Added tests for palette actions, settings parsing, and directory-fallback behavior.
  • Localization

    • Added "Open with" label for shortcut UI.

Review Change Stack

@vercel

vercel Bot commented May 13, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
cmux Ready Ready Preview, Comment May 22, 2026 9:02pm
cmux-staging Building Building Preview, Comment May 22, 2026 9:02pm

@coderabbitai

coderabbitai Bot commented May 13, 2026 •

Copy link
Copy Markdown

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds bindable "Open Current Directory in " palette commands: parses palette IDs, adds KeyboardShortcutSettings actions, routes shortcut events in AppDelegate, implements a launcher to resolve and open the focused directory, updates ContentView, adds tests, web/schema entries, and Xcode project wiring.

Changes

Terminal Directory Open Keyboard Shortcuts

Layer / File(s) Summary
Terminal Directory Open Launcher and Action Plumbing
Sources/App/TerminalDirectoryOpenSupport.swift, Sources/App/TerminalDirectoryOpenLauncher.swift, Sources/App/KeyboardShortcutSettings+TerminalDirectoryOpen.swift
TerminalDirectoryOpenTarget gains a command-palette ID parser, and TerminalDirectoryOpenLauncher resolves the current directory from TabManager and opens it with target-specific behavior (Finder selection, inline VS Code, or generic app launch). KeyboardShortcutSettings.Action extension enumerates terminal-directory-open action cases and maps bidirectionally to targets.
Keyboard Shortcut Action Cases and Defaults
Sources/KeyboardShortcutSettings.swift
15 new Action enum cases added for terminal directory open targets, each with raw-value strings. Action.label returns command-palette titles and Action.defaultShortcut marks all as unbound.
Keyboard Event Handler Integration
Sources/AppDelegate.swift
handleCustomShortcut now calls handleTerminalDirectoryOpenShortcut first, which matches configured shortcuts against terminal-directory-open actions, resolves the tab manager, and invokes the launcher (playing a beep on failure).
Command Palette Shortcut Action Routing
Sources/ContentView+RightSidebarCommandPalette.swift
commandPaletteShortcutAction(forCommandID:) now detects terminal directory open command IDs and returns the corresponding action before falling back to right-sidebar shortcuts.
ContentView Directory Opening Refactoring
Sources/ContentView.swift
openFocusedDirectory now delegates directly to the launcher instead of computing a URL via a removed local helper, consolidating directory-resolution logic.
Shortcut Action and Settings File Tests
cmuxTests/CommandPaletteShortcutCustomizationTests.swift
Three new tests verify action <-> command ID mapping, settings-file cmux.json palette.terminalOpenDirectory.* bindings parse into expected StoredShortcut values, and launcher fallback to workspace directory for stale focused directories.
Web Shortcuts Documentation and Schema
web/data/cmux-shortcuts.ts, web/data/cmux.schema.json, web/messages/en.json, web/messages/ja.json
New open-with shortcut category with "Open current directory in …" shortcuts; schema updated to allow palette.terminalOpenDirectory.* binding property names and i18n labels added.
Xcode Project Wiring
cmux.xcodeproj/project.pbxproj
New Swift source file references and PBX build entries added so the launcher and action plumbing compile into the cmux target.

Sequence Diagram

sequenceDiagram
  participant User
  participant AppDelegate
  participant KeyboardShortcutSettings
  participant TerminalDirectoryOpenLauncher
  participant TabManager
  participant NSWorkspace
  User->>AppDelegate: Press keyboard shortcut
  AppDelegate->>KeyboardShortcutSettings: Identify matching terminalDirectoryOpenAction
  AppDelegate->>TerminalDirectoryOpenLauncher: openCurrentDirectory(in: tabManager)
  TerminalDirectoryOpenLauncher->>TabManager: Get focused panel/workspace directory
  TabManager-->>TerminalDirectoryOpenLauncher: Directory path
  TerminalDirectoryOpenLauncher->>NSWorkspace: Open with chosen app / Finder select
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Poem

🐰 I’m a rabbit with a key to spare,
I hop and bind the palette air,
Fifteen apps now heed my knock—
One keystroke opens any dock,
Hooray, no stray shells or startled flocks!

🚥 Pre-merge checks | ✅ 15 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (15 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly identifies the main change: adding bindable keyboard shortcuts for 'Open With' palette commands.
Linked Issues check ✅ Passed All coding requirements from #4111 are met: palette commands are now bindable via shortcut actions, routed through the shared in-process launcher, and properly exposed in cmux.json.
Out of Scope Changes check ✅ Passed All changes are directly scoped to the objective of making 'Open With' commands bindable; no unrelated modifications detected.
Cmux Swift Actor Isolation ✅ Passed TerminalDirectoryOpenLauncher correctly marked @MainActor. All enums are value types. TabManager @MainActor. All calls from @MainActor contexts. No isolation debt introduced.
Cmux Swift Blocking Runtime ✅ Passed New code has no blocking primitives. Pre-existing DispatchSemaphore/NSLock unmodified; only +6 line change to TerminalDirectoryOpenSupport per PR summary.
Cmux No Hacky Sleeps ✅ Passed No hacky sleeps in non-Swift changes. TypeScript creates static objects without timing; JSON files contain only data/schema; build config adds file references only.
Cmux Swift Concurrency ✅ Passed No new legacy async patterns. TerminalDirectoryOpenLauncher uses @MainActor. No DispatchQueue, completion handlers, Tasks, or Combine in new code.
Cmux Swift @Concurrent ✅ Passed No @concurrent annotation violations. PR introduces only synchronous functions. File I/O on @MainActor is a performance concern but not a Swift 6 concurrency violation.
Cmux Swift File And Package Boundaries ✅ Passed Two small new files (51, 58 lines) with single responsibilities. File additions under 250-line threshold. No mixed concerns. Minimal AppDelegate glue. ContentView refactored cleanly.
Cmux Swift Logging ✅ Passed All Swift app/runtime code changes comply with logging rules. No print, debugPrint, dump, or NSLog statements added. No ad hoc logging. No MainActor Logger issues. No sensitive data exposure.
Cmux User-Facing Error Privacy ✅ Passed No privacy rule violations. Vendor names in shortcut titles allowed (user-configured). Error handling silent only. No credentials, tokens, or internal details exposed.
Cmux Swiftui State Layout ✅ Passed No SwiftUI state violations detected. New AppKit/Foundation files avoid SwiftUI state. ContentView refactoring simplifies without problematic patterns. State mutations only in lifecycle callbacks.
Cmux Architecture Rethink ✅ Passed Stateless launcher with clear ownership between ContentView and AppDelegate. No timing delays, locks, state duplication, or split UI lifecycle. Meets swift-architectural-rethink rules.
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed PR adds shortcut routing and directory launching without creating NSWindow, NSPanel, NSWindowController, or SwiftUI Window/WindowGroup objects. Lint script passes successfully.
Description check ✅ Passed The pull request description is comprehensive and well-structured, covering the summary, testing approach, and including both official and bot-generated summaries.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch issue-4111-bindable-open-with-shortcuts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Comment thread Sources/App/TerminalDirectoryOpenSupport.swift Outdated
coderabbitai[bot]
coderabbitai Bot previously requested changes May 13, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@Sources/App/TerminalDirectoryOpenSupport.swift`:
- Around line 330-333: The .finder branch in TerminalDirectoryOpenSupport.swift
is ignoring NSWorkspace.shared.selectFile's Bool result and always returns true;
change the .finder case (inside the function handling directory opening, e.g.,
the switch in TerminalDirectoryOpenSupport) to capture the Bool returned by
NSWorkspace.shared.selectFile(nil, inFileViewerRootedAtPath: directoryURL.path)
and return that result (or map it to the function's expected Bool/Result)
instead of unconditionally returning true so failures propagate to callers for
fallback/error handling.
- Around line 307-312: The loop currently uses
FileManager.default.fileExists(atPath:) which returns true for files and
directories; update the check to use the fileExists(atPath:isDirectory:)
overload and verify the isDirectory flag before returning the URL: call
FileManager.default.fileExists(atPath: trimmed, isDirectory: &isDir) (using an
ObjCBool local like isDir) and guard that isDir.boolValue is true (otherwise
continue) before creating and returning URL(fileURLWithPath: trimmed,
isDirectory: true) for focusedPanelDirectory and workspace.currentDirectory.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 4a3b92ed-c20e-49a8-8d07-8edf3e29d657

📥 Commits

Reviewing files that changed from the base of the PR and between 278b312 and 90ecd13.

📒 Files selected for processing (8)
  • Sources/App/TerminalDirectoryOpenSupport.swift
  • Sources/AppDelegate.swift
  • Sources/ContentView+RightSidebarCommandPalette.swift
  • Sources/ContentView.swift
  • Sources/KeyboardShortcutSettings.swift
  • cmuxTests/CommandPaletteShortcutCustomizationTests.swift
  • web/data/cmux-shortcuts.ts
  • web/data/cmux.schema.json

Comment thread Sources/App/TerminalDirectoryOpenSupport.swift Outdated
Comment thread Sources/App/TerminalDirectoryOpenSupport.swift Outdated
@greptile-apps

greptile-apps Bot commented May 13, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR makes every palette.terminalOpenDirectory.* palette command bindable as a first-class keyboard shortcut by adding 15 new KeyboardShortcutSettings.Action cases (all unbound by default), routing them through a new TerminalDirectoryOpenLauncher helper, and wiring up chord-aware dispatch in AppDelegate. The previous thread issues (silent nil in reverse mapping, duplicate category title key) have been addressed on-branch.

  • New TerminalDirectoryOpenLauncher centralizes directory resolution (focused panel → workspace fallback) with an isDirectory check that is slightly stricter than the old ContentView helper, and exposes an injectable openWithApplication handler for testability.
  • Schema, docs, and i18n are fully updated: 15 new action IDs land in cmux.schema.json, the "open-with" shortcuts category uses a dedicated titleKey backed by translations in all 21 locale files, and shortcut action labels reuse commandPaletteTitle which already uses String(localized:defaultValue:).
  • Tests cover palette-action/ID round-trips, settings-file parsing, directory-fallback resolution, async failure reporting, and chord-prefix consumption.

Confidence Score: 5/5

Safe to merge. The change is additive — new actions are unbound by default and only activate when a user configures a binding.

All 15 new shortcut actions are off by default so there is no risk of unintentional keyboard interference for existing users. The centralized launcher correctly handles directory resolution, Finder, inline VS Code, and async application launch failures. The exhaustive switch in the action↔target mapping means the compiler will catch any future mismatch. i18n is complete: the openWith category title is translated in all 21 locale files and shortcut action labels reuse the already-localized commandPaletteTitle. The previous review thread issues are fixed on-branch. Tests cover the key behavioral paths.

No files require special attention.

Important Files Changed

Filename Overview
Sources/App/TerminalDirectoryOpenLauncher.swift New @mainactor enum centralizing directory resolution and app launching. Correctly wraps NSWorkspace completion in Task { @mainactor in } for the main-actor hop; injectable openWithApplication parameter enables clean unit testing.
Sources/App/KeyboardShortcutSettings+TerminalDirectoryOpen.swift New extension wiring TerminalDirectoryOpenTarget cases to KeyboardShortcutSettings.Action values; exhaustive switch prevents silent mismatches when new targets are added.
Sources/AppDelegate.swift Adds handleTerminalDirectoryOpenShortcut before the general shortcut handler; correctly arms chord prefixes and returns true to consume the event, preventing fall-through to other handlers.
Sources/ContentView.swift openFocusedDirectory simplified to delegate to TerminalDirectoryOpenLauncher; old focusedTerminalDirectoryURL removed. New implementation also validates isDirectory, which is stricter.
Sources/KeyboardShortcutSettings.swift Adds 15 new Action cases with raw values matching palette command IDs, all defaulting to .unbound; labels delegate to commandPaletteTitle which uses String(localized:defaultValue:).
web/data/cmux-shortcuts.ts New open-with category uses dedicated titleKey openWith (not reusing the terminal title key); 15 shortcuts added following the existing LocalizedText { en, ja } pattern.
cmuxTests/CommandPaletteShortcutCustomizationTests.swift Four new tests covering action/ID round-trips, settings parsing, directory fallback, async failure propagation, and chord-prefix consumption.

Sequence Diagram

sequenceDiagram
    participant User
    participant AppDelegate
    participant TDOL as TerminalDirectoryOpenLauncher
    participant Workspace as NSWorkspace
    participant ContentView

    User->>AppDelegate: Key event
    AppDelegate->>AppDelegate: handleTerminalDirectoryOpenShortcut(event:)
    alt chord prefix
        AppDelegate->>AppDelegate: armConfiguredShortcutChordIfNeeded → return true
    else full shortcut match
        AppDelegate->>TDOL: openCurrentDirectory(in: target, tabManager:, onOpenFailure:)
        TDOL->>TDOL: currentDirectoryURL(in: tabManager)
        alt focused panel dir valid
            TDOL-->>TDOL: use panelDirectories[focusedPanelId]
        else fallback
            TDOL-->>TDOL: use workspace.currentDirectory
        end
        alt "target == .finder"
            TDOL->>Workspace: selectFile(nil, inFileViewerRootedAtPath:)
        else "target == .vscodeInline"
            TDOL->>AppDelegate: openDirectoryInInlineVSCode
        else other app
            TDOL->>Workspace: open(urls:withApplicationAt:configuration:completionHandler:)
            Workspace-->>TDOL: completion(error) [async]
            TDOL->>AppDelegate: "onOpenFailure(error) via Task @MainActor"
        end
        alt "result == false"
            AppDelegate->>User: NSSound.beep()
        end
    end

    User->>ContentView: Command palette
    ContentView->>TDOL: openCurrentDirectory(in: target, tabManager:, onOpenFailure:)
    Note over ContentView,TDOL: Same launcher path as shortcut
Loading

Reviews (11): Last reviewed commit: "Merge remote-tracking branch 'origin/mai..." | Re-trigger Greptile

Comment thread Sources/App/TerminalDirectoryOpenSupport.swift Outdated
Comment thread Sources/App/TerminalDirectoryOpenSupport.swift Outdated
Comment thread web/data/cmux-shortcuts.ts
Comment thread Sources/App/TerminalDirectoryOpenSupport.swift Outdated
@lawrencecchen
lawrencecchen dismissed coderabbitai[bot]’s stale review May 15, 2026 00:07

Stale CodeRabbit changes-requested review. Both actionable findings from this review were addressed in later commits and the current CodeRabbit check is passing.

coderabbitai[bot]
coderabbitai Bot previously requested changes May 18, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@Sources/App/TerminalDirectoryOpenLauncher.swift`:
- Around line 9-16: The current logic assigns rawDirectory =
focusedPanelDirectory ?? workspace.currentDirectory before validation, which
means a stale focusedPanelDirectory can cause early return and never try
workspace.currentDirectory; update TerminalDirectoryOpenLauncher.swift so you
first attempt to validate focusedPanelDirectory (check non-empty after trimming
and FileManager.default.fileExists(atPath:isDirectory:) with ObjCBool), and if
that fails fall back to validating workspace.currentDirectory the same way,
returning nil only if both candidates are empty/invalid; keep using the same
symbols (focusedPanelDirectory, workspace.currentDirectory, rawDirectory,
isDirectory) to locate and refactor the checks.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 2d217533-218f-4b5f-b9c7-93f588cf7588

📥 Commits

Reviewing files that changed from the base of the PR and between 4832bc0 and 26974b0.

📒 Files selected for processing (13)
  • Sources/App/KeyboardShortcutSettings+TerminalDirectoryOpen.swift
  • Sources/App/TerminalDirectoryOpenLauncher.swift
  • Sources/App/TerminalDirectoryOpenSupport.swift
  • Sources/AppDelegate.swift
  • Sources/ContentView+RightSidebarCommandPalette.swift
  • Sources/ContentView.swift
  • Sources/KeyboardShortcutSettings.swift
  • cmux.xcodeproj/project.pbxproj
  • cmuxTests/CommandPaletteShortcutCustomizationTests.swift
  • web/data/cmux-shortcuts.ts
  • web/data/cmux.schema.json
  • web/messages/en.json
  • web/messages/ja.json

Comment thread Sources/App/TerminalDirectoryOpenLauncher.swift Outdated

@cubic-dev-ai cubic-dev-ai Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2 issues found across 13 files

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

Re-trigger cubic

Comment thread Sources/AppDelegate.swift
Comment thread Sources/App/TerminalDirectoryOpenLauncher.swift Outdated
@austinywang

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented May 19, 2026

Copy link
Copy Markdown
✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@austinywang
austinywang dismissed coderabbitai[bot]’s stale review May 19, 2026 04:52

Superseded by follow-up fixes; current code validates focused and workspace directories in order, and CodeRabbit later approved the PR.

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit fd5125c. Configure here.

Comment thread web/data/cmux-shortcuts.ts
@lawrencecchen lawrencecchen added the stale-revisit Closed after 30+ days without activity; preserved for possible revisit or reopening. label Sep 23, 2026
@github-project-automation github-project-automation Bot moved this from Todo to Done in cmux backlog Sep 23, 2026

This branch was successfully deployed

1 active deployment
Preview – cmux — 73a764b2 Deployed May 22, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

stale-revisit Closed after 30+ days without activity; preserved for possible revisit or reopening.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Allow binding "Open With" palette commands (e.g. Open in VS Code) to keyboard shortcuts

3 participants