Use the auto-imported defineShortcuts composable to define keyboard shortcuts.
<script setup lang="ts">
const open = ref(false)
defineShortcuts({
  meta_k: () => {
    open.value = !open.value
  }
})
</script>
meta to ctrl.useEventListener to handle keydown events.KeyboardEvent.key API documentation. Note that the key should be written in lowercase.defineShortcuts(config: ShortcutsConfig, options?: ShortcutsOptions): void
Define keyboard shortcuts for your application.
250.Shortcuts are defined using the following format:
'a', 'b', '1', '?', etc._ to separate keys, e.g., 'meta_k', 'ctrl_shift_f'- to define a sequence, e.g., 'g-d'meta: Represents ⌘ Command on macOS and Ctrl on other platformsctrl: Represents Ctrl on all platformsshift: Used for alphabetic keys when Shift is requiredescape: Triggers on Esc keyenter: Triggers on Enter keyarrowleft, arrowright, arrowup, arrowdown: Trigger on respective arrow keysEach shortcut can be defined as a function or an object with the following properties:
interface ShortcutConfig { handler: () => void; usingInput?: boolean | string }
false (default): Shortcut only triggers when no input is focusedtrue: Shortcut triggers even when any input is focusedstring: Shortcut only triggers when the specified input (by name) is focused<script setup lang="ts">
defineShortcuts({
  '?': () => openHelpModal(),
  'meta_k': () => openCommandPalette(),
  'g-d': () => navigateToDashboard()
})
</script>
The usingInput option allows you to specify that a shortcut should only trigger when a specific input is focused.
<template>
  <UInput v-model="query" name="queryInput" />
</template>
<script setup lang="ts">
const query = ref('')
defineShortcuts({
  enter: {
    usingInput: 'queryInput',
    handler: () => performSearch()
  },
  escape: {
    usingInput: true,
    handler: () => clearSearch()
  }
})
</script>
The extractShortcuts utility can be used to automatically define shortcuts from menu items:
<script setup lang="ts">
const items = [{
  label: 'Save',
  icon: 'i-lucide-file-down',
  kbds: ['meta', 'S'],
  onSelect() {
    save()
  }
}, {
  label: 'Copy',
  icon: 'i-lucide-copy',
  kbds: ['meta', 'C'],
  onSelect() {
    copy()
  }
}]
defineShortcuts(extractShortcuts(items))
</script>