+
+
+
+
{showPolicy ? (
-
-
- void updateSettings({
- terminalShortcutPolicy: value as TerminalShortcutPolicy
- })
- }
- >
-
-
-
-
- Orca first
- Terminal first
-
-
- }
- />
-
+ updateSettings={updateSettings}
+ />
) : null}
- {showCtrlTab ? (
-
-
- void updateSettings({ ctrlTabOrderMode: value as CtrlTabOrderMode })
- }
- >
-
-
-
-
- Most recent
- Tab strip order
-
-
- }
- />
-
- ) : null}
+
+
+ {
+ setRecordingActionId(actionId)
+ clearError(actionId)
+ }}
+ onCancelRecording={() => setRecordingActionId(null)}
+ onCapture={(actionId, input) => void captureBinding(actionId, input)}
+ onClearError={clearError}
+ onDisable={(actionId) => void disableBinding(actionId)}
+ onReset={(actionId) => void resetBinding(actionId)}
+ />
- ) : null}
-
-
-
-
- {groups
- .filter((group) => matchesSettingsSearch(searchQuery, groupEntries[group.title] ?? []))
- .map((group) => (
-
-
- {group.title}
-
-
- {group.items.map((item) => {
- const effective = getEffectiveKeybindingsForAction(
- item.id,
- platform,
- keybindings
- )
- const modified = hasOwnBindingOverride(keybindings, item.id)
- const warnings = conflictByAction.get(item.id) ?? []
- const terminalStatus = getShortcutTerminalStatus(
- item,
- terminalShortcutPolicy,
- effective.length > 0
- )
-
- return (
- {
- setRecordingActionId(actionId)
- clearError(actionId)
- }}
- onCancelRecording={() => setRecordingActionId(null)}
- onCapture={(actionId, input) => void captureBinding(actionId, input)}
- onClearError={clearError}
- onDisable={(actionId) => void disableBinding(actionId)}
- onReset={(actionId) => void resetBinding(actionId)}
- />
- )
- })}
-
-
- ))}
diff --git a/src/renderer/src/components/settings/general-search.ts b/src/renderer/src/components/settings/general-search.ts
index f1fdfc259da..22b935a72fb 100644
--- a/src/renderer/src/components/settings/general-search.ts
+++ b/src/renderer/src/components/settings/general-search.ts
@@ -61,6 +61,23 @@ export const GENERAL_EDITOR_SEARCH_ENTRIES: SettingsSearchEntry[] = [
}
]
+export const GENERAL_NAVIGATION_SEARCH_ENTRIES: SettingsSearchEntry[] = [
+ {
+ title: 'Tab Order',
+ description: 'Recent or tab strip.',
+ keywords: [
+ 'recent tab order',
+ 'tab',
+ 'ctrl',
+ 'control',
+ 'recent',
+ 'mru',
+ 'sequential',
+ 'switch'
+ ]
+ }
+]
+
export const GENERAL_CLI_SEARCH_ENTRIES: SettingsSearchEntry[] = [
{
title: 'Shell command',
@@ -119,6 +136,7 @@ export const GENERAL_SUPPORT_SEARCH_ENTRIES: SettingsSearchEntry[] = [
export const GENERAL_PANE_SEARCH_ENTRIES: SettingsSearchEntry[] = [
...GENERAL_WORKSPACE_SEARCH_ENTRIES,
+ ...GENERAL_NAVIGATION_SEARCH_ENTRIES,
...GENERAL_EDITOR_SEARCH_ENTRIES,
...GENERAL_CLI_SEARCH_ENTRIES,
...GENERAL_CACHE_TIMER_SEARCH_ENTRIES,
diff --git a/src/renderer/src/components/settings/shortcuts-search.ts b/src/renderer/src/components/settings/shortcuts-search.ts
index 945f1224f65..c5108c41de5 100644
--- a/src/renderer/src/components/settings/shortcuts-search.ts
+++ b/src/renderer/src/components/settings/shortcuts-search.ts
@@ -1,12 +1,6 @@
import { KEYBINDING_DEFINITIONS } from '../../../../shared/keybindings'
import type { SettingsSearchEntry } from './settings-search'
-export const CTRL_TAB_BEHAVIOR_SEARCH_ENTRY: SettingsSearchEntry = {
- title: 'Recent Tab Order',
- description: 'Choose recent or sequential tab switching.',
- keywords: ['shortcut', 'tab', 'ctrl', 'control', 'recent', 'mru', 'sequential', 'switch']
-}
-
export const TERMINAL_SHORTCUT_POLICY_SEARCH_ENTRY: SettingsSearchEntry = {
title: 'Shortcuts in Terminal',
description: 'Choose whether Orca or the focused terminal wins when shortcuts overlap.',
@@ -29,6 +23,5 @@ export const SHORTCUTS_PANE_SEARCH_ENTRIES: SettingsSearchEntry[] = [
description: `${item.group} shortcut`,
keywords: [...item.searchKeywords]
})),
- TERMINAL_SHORTCUT_POLICY_SEARCH_ENTRY,
- CTRL_TAB_BEHAVIOR_SEARCH_ENTRY
+ TERMINAL_SHORTCUT_POLICY_SEARCH_ENTRY
]
diff --git a/src/renderer/src/hooks/useComposerState.ts b/src/renderer/src/hooks/useComposerState.ts
index 43e5b2175d2..c54e643c68d 100644
--- a/src/renderer/src/hooks/useComposerState.ts
+++ b/src/renderer/src/hooks/useComposerState.ts
@@ -48,8 +48,6 @@ import {
type LinkedWorkItemSummary,
type SetupConfig
} from '@/lib/new-workspace'
-import { getShortcutPlatform } from '@/lib/shortcut-platform'
-import { useShortcutLabel } from '@/hooks/useShortcutLabel'
import {
getFullComposerCreateDisabled,
getQuickComposerCreateDisabled
@@ -77,7 +75,6 @@ import {
} from '@/lib/workspace-create-error-format'
import type { SshConnectionStatus } from '../../../shared/ssh-types'
import { resolveComposerBranchSelection } from './composer-branch-selection'
-import { keybindingMatchesAction } from '../../../shared/keybindings'
export type UseComposerStateOptions = {
initialRepoId?: string
@@ -134,7 +131,6 @@ export type ComposerCardProps = {
onClearSmartNameSelection: () => void
agentPrompt: string
onAgentPromptChange: (value: string) => void
- onPromptKeyDown: (event: React.KeyboardEvent
) => void
/** Rendered issueCommand template to preview inside the empty prompt
* textarea when the user has linked a work item but not typed anything. */
linkedOnlyTemplatePreview: string | null
@@ -142,7 +138,6 @@ export type ComposerCardProps = {
getAttachmentLabel: (pathValue: string) => string
onAddAttachment: () => void
onRemoveAttachment: (pathValue: string) => void
- addAttachmentShortcut: string
linkedWorkItem: LinkedWorkItemSummary | null
onRemoveLinkedWorkItem: () => void
linkPopoverOpen: boolean
@@ -1372,28 +1367,6 @@ export function useComposerState(options: UseComposerStateOptions): UseComposerS
}
}, [])
- const handlePromptKeyDown = useCallback(
- (event: React.KeyboardEvent): void => {
- if (
- !keybindingMatchesAction(
- 'composer.addAttachment',
- event,
- getShortcutPlatform(),
- useAppStore.getState().keybindings
- )
- ) {
- return
- }
-
- // Why: the attachment picker should only steal Cmd/Ctrl+U while the user
- // is composing a prompt, so the shortcut is scoped to the textarea rather
- // than registered globally for the whole new-workspace surface.
- event.preventDefault()
- void handleAddAttachment()
- },
- [handleAddAttachment]
- )
-
const handleRepoChange = useCallback(
(value: string): void => {
if (value === repoId) {
@@ -2153,8 +2126,6 @@ export function useComposerState(options: UseComposerStateOptions): UseComposerS
createGateMode === 'quick'
? getQuickComposerCreateDisabled(createGateInput)
: getFullComposerCreateDisabled(createGateInput)
- const addAttachmentShortcut = useShortcutLabel('composer.addAttachment')
-
const cardProps: ComposerCardProps = {
eligibleRepos,
repoId,
@@ -2170,14 +2141,12 @@ export function useComposerState(options: UseComposerStateOptions): UseComposerS
onClearSmartNameSelection: handleClearSmartNameSelection,
agentPrompt,
onAgentPromptChange: setAgentPrompt,
- onPromptKeyDown: handlePromptKeyDown,
linkedOnlyTemplatePreview: shouldApplyLinkedOnlyTemplate ? linkedOnlyTemplatePrompt : null,
attachmentPaths,
getAttachmentLabel,
onAddAttachment: () => void handleAddAttachment(),
onRemoveAttachment: (pathValue) =>
setAttachmentPaths((current) => current.filter((currentPath) => currentPath !== pathValue)),
- addAttachmentShortcut,
linkedWorkItem,
onRemoveLinkedWorkItem: handleRemoveLinkedWorkItem,
linkPopoverOpen,
diff --git a/src/shared/keybindings.ts b/src/shared/keybindings.ts
index e170f928ca6..17e1021cd3a 100644
--- a/src/shared/keybindings.ts
+++ b/src/shared/keybindings.ts
@@ -71,7 +71,6 @@ export type KeybindingActionId =
| 'fileExplorer.copyPath'
| 'fileExplorer.copyRelativePath'
| 'fileExplorer.delete'
- | 'composer.addAttachment'
| 'settings.search'
| 'terminal.copySelection'
| 'terminal.paste'
@@ -566,14 +565,6 @@ export const KEYBINDING_DEFINITIONS: readonly KeybindingDefinition[] = [
},
allowBareKeybindings: true
},
- {
- id: 'composer.addAttachment',
- title: 'Add Attachment',
- group: 'Composer',
- scope: 'composer',
- searchKeywords: ['shortcut', 'composer', 'attachment', 'upload'],
- defaultBindings: platformBindings(['Mod+U'])
- },
{
id: 'settings.search',
title: 'Search Settings',