Dropstone CLI

키바인드

키보드 단축키를 사용자 정의하세요.

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리더 키 후 다음 키를 Dropstone이 기다리는 시간(밀리초). 기본값은 2000.
sectionsUI 영역을 명령 바인딩에 매핑하는 맵.

바인딩 값

문자열에는 하나의 단축키 또는 쉼표로 구분된 여러 단축키가 포함될 수 있습니다. 여러 단축키에는 배열을 사용하거나 명령을 비활성화하려면 "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",
        "workspace.open": "ctrl+o,<leader>o",
        "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는 더 이상 사용되지 않습니다. 사용자가 keymap으로 마이그레이션하는 동안 기존 구성이 계속 작동하도록 유지됩니다.

keybinds는 keymap이 없을 때만 사용하세요. 두 필드가 모두 설정된 경우 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 터미널

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 터미널을 다시 시작하거나 새 탭을 엽니다.

Ctrl+I