키바인드
키보드 단축키를 사용자 정의합니다.
tui.json의 keymap으로 Dropstone의 키보드 단축키를 사용자 정의합니다.
keymap은 기본 설정과 병합되므로 변경하려는 단축키만 구성하면 됩니다.
이전 keybinds 필드는 마이그레이션 폴백으로 계속 허용되지만 더 이상 사용되지 않습니다. keymap이 있으면 Dropstone은 keybinds를 무시합니다.
리더 키
Dropstone은 많은 단축키에 leader 키를 사용합니다. 이는 터미널의 충돌을 방지합니다.
기본적으로 ctrl+x는 리더 키이며 리더 단축키는 먼저 리더 키를 누른 다음 단축키를 눌러야 합니다. 예를 들어 새 세션을 시작하려면 먼저 ctrl+x를 누른 다음 n을 누릅니다.
리더 키를 사용할 필요는 없지만 사용하는 것을 권장합니다.
최소 예제
{
"$schema": "https://dropstone.io/schema/tui.json",
"keymap": {
"leader": "ctrl+x",
"leader_timeout": 2000,
"sections": {
"global": {
"command.palette.show": "ctrl+p",
"session.new": "<leader>n",
"session.list": "<leader>l"
},
"session": {
"session.compact": "<leader>c",
"session.undo": "<leader>u",
"session.redo": "<leader>r"
},
"input": {
"input.submit": "return",
"input.newline": ["shift+return", "ctrl+return", "alt+return", "ctrl+j"]
}
}
}
}
키맵 구조
keymap.sections은 의미론적 영역으로 그룹화됩니다. 각 섹션에는 명령 이름과 이를 트리거하는 키 시퀀스가 포함됩니다.
| 필드 | 설명 |
|---|---|
leader | <leader> 시퀀스에서 사용되는 키입니다. 기본값은 ctrl+x입니다. |
leader_timeout | 리더 키 이후 다음 키를 기다리는 시간(밀리초)입니다. 기본값은 2000입니다. |
sections | UI 영역을 명령 바인딩으로 매핑합니다. |
바인딩 값
문자열은 하나의 단축키 또는 쉼표로 구분된 여러 단축키를 포함할 수 있습니다. 여러 단축키에 배열을 사용하거나 명령을 비활성화하려면 "none"/false를 사용할 수 있습니다.
{
"$schema": "https://dropstone.io/schema/tui.json",
"keymap": {
"sections": {
"session": {
"session.compact": "none",
"session.export": "<leader>x,ctrl+shift+x",
"session.copy": ["<leader>y", "ctrl+shift+c"]
}
}
}
}
고급 경우에는 key, event, preventDefault 또는 fallthrough가 있는 객체를 사용합니다.
{
"$schema": "https://dropstone.io/schema/tui.json",
"keymap": {
"sections": {
"prompt": {
"prompt.paste": {
"key": "ctrl+v",
"preventDefault": false
}
}
}
}
}
키맵 참조
이들은 바인딩할 수 있는 사용자 대면 명령입니다. "none"으로 설정된 명령은 바인딩할 수 있지만 기본적으로 비활성화됩니다.
{
"$schema": "https://dropstone.io/schema/tui.json",
"keymap": {
"leader": "ctrl+x",
"leader_timeout": 2000,
"sections": {
"global": {
"command.palette.show": "ctrl+p",
"session.list": "<leader>l",
"session.new": "<leader>n",
"model.list": "<leader>m",
"model.cycle_recent": "f2",
"model.cycle_recent_reverse": "shift+f2",
"agent.list": "<leader>a",
"agent.cycle": "tab",
"agent.cycle.reverse": "shift+tab",
"variant.cycle": "ctrl+t",
"variant.list": "none",
"help.show": "none",
"app.exit": "ctrl+c,ctrl+d,<leader>q",
"terminal.suspend": "ctrl+z"
},
"session": {
"session.rename": "ctrl+r",
"session.timeline": "<leader>g",
"session.fork": "none",
"session.compact": "<leader>c",
"session.undo": "<leader>u",
"session.redo": "<leader>r",
"session.sidebar.toggle": "<leader>b",
"session.toggle.conceal": "<leader>h",
"session.page.up": "pageup,ctrl+alt+b",
"session.page.down": "pagedown,ctrl+alt+f",
"session.line.up": "ctrl+alt+y",
"session.line.down": "ctrl+alt+e",
"session.half.page.up": "ctrl+alt+u",
"session.half.page.down": "ctrl+alt+d",
"session.first": "ctrl+g,home",
"session.last": "ctrl+alt+g,end",
"messages.copy": "<leader>y",
"session.copy": "none",
"session.export": "<leader>x",
"session.child.first": "<leader>down",
"session.parent": "up",
"session.child.next": "right",
"session.child.previous": "left"
},
"prompt": {
"prompt.submit": "none",
"prompt.editor": "<leader>e",
"session.interrupt": "escape",
"prompt.clear": "ctrl+c",
"prompt.paste": {
"key": "ctrl+v",
"preventDefault": false
},
"prompt.history.previous": "up",
"prompt.history.next": "down"
},
"autocomplete": {
"prompt.autocomplete.prev": "up,ctrl+p",
"prompt.autocomplete.next": "down,ctrl+n",
"prompt.autocomplete.hide": "escape",
"prompt.autocomplete.select": "return",
"prompt.autocomplete.complete": "tab"
},
"input": {
"input.submit": "return",
"input.newline": "shift+return,ctrl+return,alt+return,ctrl+j",
"input.move.left": "left,ctrl+b",
"input.move.right": "right,ctrl+f",
"input.move.up": "up",
"input.move.down": "down",
"input.select.left": "shift+left",
"input.select.right": "shift+right",
"input.select.up": "shift+up",
"input.select.down": "shift+down",
"input.line.home": "ctrl+a",
"input.line.end": "ctrl+e",
"input.select.line.home": "ctrl+shift+a",
"input.select.line.end": "ctrl+shift+e",
"input.visual.line.home": "alt+a",
"input.visual.line.end": "alt+e",
"input.select.visual.line.home": "alt+shift+a",
"input.select.visual.line.end": "alt+shift+e",
"input.buffer.home": "home",
"input.buffer.end": "end",
"input.select.buffer.home": "shift+home",
"input.select.buffer.end": "shift+end",
"input.delete.line": "ctrl+shift+d",
"input.delete.to.line.end": "ctrl+k",
"input.delete.to.line.start": "ctrl+u",
"input.backspace": "backspace,shift+backspace",
"input.delete": "ctrl+d,delete,shift+delete",
"input.undo": "ctrl+-,super+z",
"input.redo": "ctrl+.,super+shift+z",
"input.word.forward": "alt+f,alt+right,ctrl+right",
"input.word.backward": "alt+b,alt+left,ctrl+left",
"input.select.word.forward": "alt+shift+f,alt+shift+right",
"input.select.word.backward": "alt+shift+b,alt+shift+left",
"input.delete.word.forward": "alt+d,alt+delete,ctrl+delete",
"input.delete.word.backward": "ctrl+w,ctrl+backspace,alt+backspace",
"input.select.all": "super+a"
},
"dialog_select": {
"dialog.select.prev": "up,ctrl+p",
"dialog.select.next": "down,ctrl+n",
"dialog.select.page_up": "pageup",
"dialog.select.page_down": "pagedown",
"dialog.select.home": "home",
"dialog.select.end": "end",
"dialog.select.submit": "return"
},
"dialog_actions": {
"dialog.action.toggle": "space",
"dialog.action.delete": "ctrl+d",
"dialog.action.rename": "ctrl+r"
},
"permission": {
"permission.reject.cancel": "ctrl+c,ctrl+d,<leader>q",
"permission.prompt.escape": "ctrl+c,ctrl+d,<leader>q",
"permission.prompt.fullscreen": "ctrl+f"
},
"question": {
"question.reject": "ctrl+c,ctrl+d,<leader>q",
"question.edit.clear": "ctrl+c"
},
"home_tips": {
"tips.toggle": "<leader>h"
}
}
}
}
레거시 keybinds
keybinds는 더 이상 사용되지 않습니다. 기존 구성이 계속 작동하고 사용자가 keymap으로 마이그레이션할 수 있도록 유지됩니다.
keymap이 없을 때만 keybinds를 사용합니다. 두 필드가 모두 설정되면 keymap이 우선이고 keybinds는 단축키 해석에서 무시됩니다.
{
"$schema": "https://dropstone.io/schema/tui.json",
"keybinds": {
"command_list": "ctrl+p",
"session_new": "<leader>n",
"session_compact": "<leader>c"
}
}
Windows 기본값:
네이티브 Windows에서 keymap 및 레거시 keybinds 모두에 대한 실행 취소 및 터미널 일시 중단의 기본값이 다릅니다:
input.undo는 명시적으로 구성되지 않은 경우ctrl+z,ctrl+-,super+z로 기본값이 설정됩니다(ctrl+z바인딩은 Windows 터미널이 POSIX 일시 중단을 지원하지 않기 때문에 추가됨).terminal.suspend는 네이티브 Windows 터미널이 POSIX 일시 중단을 지원하지 않기 때문에 비활성화됩니다.
기본 제공 입력 단축키
프롬프트 입력은 텍스트 편집을 위한 일반적인 Readline/Emacs 스타일 단축키를 지원합니다. 이들은 기본 제공 기본값입니다: 위의 tui.json의 input 섹션에서 재정의할 수 있습니다.
| 단축키 | 작업 |
|---|---|
ctrl+a | 현재 줄의 시작으로 이동 |
ctrl+e | 현재 줄의 끝으로 이동 |
ctrl+b | 커서를 한 문자 뒤로 이동 |
ctrl+f | 커서를 한 문자 앞으로 이동 |
alt+b | 커서를 한 단어 뒤로 이동 |
alt+f | 커서를 한 단어 앞으로 이동 |
ctrl+d | 커서 아래의 문자 삭제 |
ctrl+k | 줄의 끝까지 삭제 |
ctrl+u | 줄의 시작까지 삭제 |
ctrl+w | 이전 단어 삭제 |
alt+d | 다음 단어 삭제 |
ctrl+t | 문자 교환 |
ctrl+g | 팝오버 취소 / 실행 중인 응답 중단 |
Shift+Enter
일부 터미널은 기본적으로 Enter와 함께 수정자 키를 보내지 않습니다. 터미널을 구성하여 Shift+Enter를 이스케이프 시퀀스로 보내야 할 수 있습니다.
Windows Terminal
다음 위치에서 settings.json을 엽니다:
%LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json
루트 수준 actions 배열에 다음을 추가합니다:
"actions": [
{
"command": {
"action": "sendInput",
"input": "\u001b[13;2u"
},
"id": "User.sendInput.ShiftEnterCustom"
}
]
루트 수준 keybindings 배열에 다음을 추가합니다:
"keybindings": [
{
"keys": "shift+enter",
"id": "User.sendInput.ShiftEnterCustom"
}
]
파일을 저장하고 Windows Terminal을 다시 시작하거나 새 탭을 엽니다.