[{"data":1,"prerenderedAt":596},["ShallowReactive",2],{"docs-\u002Fdocs\u002Fv2\u002Ftui\u002Fapi\u002Fkeys":3},{"id":4,"title":5,"body":6,"description":15,"extension":590,"meta":591,"navigation":114,"path":592,"seo":593,"stem":594,"__hash__":595},"docs\u002Fdocs\u002Fv2\u002Ftui\u002Fapi\u002Fkeys.md","keys",{"type":7,"value":8,"toc":583},"minimark",[9,12,16,154,159,270,289,296,300,308,336,348,352,412,415,419,492,496,569,579],[10,11,5],"h1",{"id":5},[13,14,15],"p",{},"Key chords. Bindings do not fire while a palette is open.",[17,18,23],"pre",{"className":19,"code":20,"language":21,"meta":22,"style":22},"language-ts shiki shiki-themes dark-plus","interface KeysApi {\n    \u002F\u002F Bind a chord. Throws KEY_CHORD_TAKEN if the terminal or another\n    \u002F\u002F extension owns it.\n    register(chord: string, handler: () => void | Promise\u003Cvoid>): Disposer\n\n    \u002F\u002F Deliver a keypress as though the user had typed it.\n    \u002F\u002F Throws KEY_CHORD_UNBOUND if nothing answers to it.\n    send(chord: string): void\n}\n","ts","",[24,25,26,43,50,56,109,116,122,128,148],"code",{"__ignoreMap":22},[27,28,31,35,39],"span",{"class":29,"line":30},"line",1,[27,32,34],{"class":33},"scz_3","interface",[27,36,38],{"class":37},"sNl3T"," KeysApi",[27,40,42],{"class":41},"sTNBD"," {\n",[27,44,46],{"class":29,"line":45},2,[27,47,49],{"class":48},"sOLPB","    \u002F\u002F Bind a chord. Throws KEY_CHORD_TAKEN if the terminal or another\n",[27,51,53],{"class":29,"line":52},3,[27,54,55],{"class":48},"    \u002F\u002F extension owns it.\n",[27,57,59,63,66,70,73,76,79,82,85,88,91,94,97,100,103,106],{"class":29,"line":58},4,[27,60,62],{"class":61},"sCudf","    register",[27,64,65],{"class":41},"(",[27,67,69],{"class":68},"s3F5K","chord",[27,71,72],{"class":41},": ",[27,74,75],{"class":37},"string",[27,77,78],{"class":41},", ",[27,80,81],{"class":61},"handler",[27,83,84],{"class":41},": () ",[27,86,87],{"class":33},"=>",[27,89,90],{"class":37}," void",[27,92,93],{"class":41}," | ",[27,95,96],{"class":37},"Promise",[27,98,99],{"class":41},"\u003C",[27,101,102],{"class":37},"void",[27,104,105],{"class":41},">): ",[27,107,108],{"class":37},"Disposer\n",[27,110,112],{"class":29,"line":111},5,[27,113,115],{"emptyLinePlaceholder":114},true,"\n",[27,117,119],{"class":29,"line":118},6,[27,120,121],{"class":48},"    \u002F\u002F Deliver a keypress as though the user had typed it.\n",[27,123,125],{"class":29,"line":124},7,[27,126,127],{"class":48},"    \u002F\u002F Throws KEY_CHORD_UNBOUND if nothing answers to it.\n",[27,129,131,134,136,138,140,142,145],{"class":29,"line":130},8,[27,132,133],{"class":61},"    send",[27,135,65],{"class":41},[27,137,69],{"class":68},[27,139,72],{"class":41},[27,141,75],{"class":37},[27,143,144],{"class":41},"): ",[27,146,147],{"class":37},"void\n",[27,149,151],{"class":29,"line":150},9,[27,152,153],{"class":41},"}\n",[155,156,158],"h2",{"id":157},"binding","Binding",[17,160,162],{"className":19,"code":161,"language":21,"meta":22,"style":22},"keys.register(\"ctrl+o\", () => commands.run(\"session open\"))\n\nkeys.register(\"ctrl+shift+r\", async () => {\n    await agents.reboot()\n    tui.info(\"rebooted\")\n})\n",[24,163,164,201,205,230,247,265],{"__ignoreMap":22},[27,165,166,168,171,174,176,180,183,185,188,190,193,195,198],{"class":29,"line":30},[27,167,5],{"class":68},[27,169,170],{"class":41},".",[27,172,173],{"class":61},"register",[27,175,65],{"class":41},[27,177,179],{"class":178},"sKc5r","\"ctrl+o\"",[27,181,182],{"class":41},", () ",[27,184,87],{"class":33},[27,186,187],{"class":68}," commands",[27,189,170],{"class":41},[27,191,192],{"class":61},"run",[27,194,65],{"class":41},[27,196,197],{"class":178},"\"session open\"",[27,199,200],{"class":41},"))\n",[27,202,203],{"class":29,"line":45},[27,204,115],{"emptyLinePlaceholder":114},[27,206,207,209,211,213,215,218,220,223,226,228],{"class":29,"line":52},[27,208,5],{"class":68},[27,210,170],{"class":41},[27,212,173],{"class":61},[27,214,65],{"class":41},[27,216,217],{"class":178},"\"ctrl+shift+r\"",[27,219,78],{"class":41},[27,221,222],{"class":33},"async",[27,224,225],{"class":41}," () ",[27,227,87],{"class":33},[27,229,42],{"class":41},[27,231,232,236,239,241,244],{"class":29,"line":58},[27,233,235],{"class":234},"sYbnZ","    await",[27,237,238],{"class":68}," agents",[27,240,170],{"class":41},[27,242,243],{"class":61},"reboot",[27,245,246],{"class":41},"()\n",[27,248,249,252,254,257,259,262],{"class":29,"line":111},[27,250,251],{"class":68},"    tui",[27,253,170],{"class":41},[27,255,256],{"class":61},"info",[27,258,65],{"class":41},[27,260,261],{"class":178},"\"rebooted\"",[27,263,264],{"class":41},")\n",[27,266,267],{"class":29,"line":118},[27,268,269],{"class":41},"})\n",[13,271,272,273,78,276,78,279,78,281,284,285,288],{},"Chords are written the way they read — ",[24,274,275],{},"\"a\"",[24,277,278],{},"\"f5\"",[24,280,179],{},[24,282,283],{},"\"shift+tab\"",",\n",[24,286,287],{},"\"ctrl+shift+p\""," — and matched case-insensitively.",[13,290,291,292,295],{},"Nothing waits on a handler; it cannot block the keyboard. A rejection is caught and\nreported as ",[24,293,294],{},"ctrl+o failed"," on the cwd row rather than taking the process down.",[155,297,299],{"id":298},"reserved-chords","Reserved chords",[17,301,306],{"className":302,"code":304,"language":305},[303],"language-text","ctrl+c   ctrl+d   escape   enter   tab\nup   down   left   right   backspace   delete\n:  ~  \u002F  ^  *  %  >  \"  #  ?\n","text",[24,307,304],{"__ignoreMap":22},[17,309,311],{"className":19,"code":310,"language":21,"meta":22,"style":22},"keys.register(\"ctrl+c\", run)   \u002F\u002F KEY_CHORD_TAKEN\n",[24,312,313],{"__ignoreMap":22},[27,314,315,317,319,321,323,326,328,330,333],{"class":29,"line":30},[27,316,5],{"class":68},[27,318,170],{"class":41},[27,320,173],{"class":61},[27,322,65],{"class":41},[27,324,325],{"class":178},"\"ctrl+c\"",[27,327,78],{"class":41},[27,329,192],{"class":68},[27,331,332],{"class":41},")   ",[27,334,335],{"class":48},"\u002F\u002F KEY_CHORD_TAKEN\n",[13,337,338,339,343,344,347],{},"Refused at ",[340,341,342],"strong",{},"registration",", not at press time: user bindings dispatch from a wildcard\nhandler that runs before exact-key ones, so a config that bound ",[24,345,346],{},"ctrl+c"," would beat the\nexit ladder. By then it is too late to defer.",[155,349,351],{"id":350},"sending","Sending",[17,353,355],{"className":19,"code":354,"language":21,"meta":22,"style":22},"keys.send(\"ctrl+o\")   \u002F\u002F a chord you bound\nkeys.send(\"&\")        \u002F\u002F a mode key your palette claimed\nkeys.send(\":\")        \u002F\u002F a built-in mode key\n",[24,356,357,375,394],{"__ignoreMap":22},[27,358,359,361,363,366,368,370,372],{"class":29,"line":30},[27,360,5],{"class":68},[27,362,170],{"class":41},[27,364,365],{"class":61},"send",[27,367,65],{"class":41},[27,369,179],{"class":178},[27,371,332],{"class":41},[27,373,374],{"class":48},"\u002F\u002F a chord you bound\n",[27,376,377,379,381,383,385,388,391],{"class":29,"line":45},[27,378,5],{"class":68},[27,380,170],{"class":41},[27,382,365],{"class":61},[27,384,65],{"class":41},[27,386,387],{"class":178},"\"&\"",[27,389,390],{"class":41},")        ",[27,392,393],{"class":48},"\u002F\u002F a mode key your palette claimed\n",[27,395,396,398,400,402,404,407,409],{"class":29,"line":52},[27,397,5],{"class":68},[27,399,170],{"class":41},[27,401,365],{"class":61},[27,403,65],{"class":41},[27,405,406],{"class":178},"\":\"",[27,408,390],{"class":41},[27,410,411],{"class":48},"\u002F\u002F a built-in mode key\n",[13,413,414],{},"The escape hatch that keeps the surface honest — anything the API forgot to expose is\nstill reachable, so a missing verb is an inconvenience rather than a wall.",[155,416,418],{"id":417},"guarding-a-mode-key","Guarding a mode key",[17,420,422],{"className":19,"code":421,"language":21,"meta":22,"style":22},"keys.register(\"ctrl+b\", async () => {\n    if (palette.isOpen) return\n    await palette.open(\"branches\")\n})\n",[24,423,424,447,469,488],{"__ignoreMap":22},[27,425,426,428,430,432,434,437,439,441,443,445],{"class":29,"line":30},[27,427,5],{"class":68},[27,429,170],{"class":41},[27,431,173],{"class":61},[27,433,65],{"class":41},[27,435,436],{"class":178},"\"ctrl+b\"",[27,438,78],{"class":41},[27,440,222],{"class":33},[27,442,225],{"class":41},[27,444,87],{"class":33},[27,446,42],{"class":41},[27,448,449,452,455,458,460,463,466],{"class":29,"line":45},[27,450,451],{"class":234},"    if",[27,453,454],{"class":41}," (",[27,456,457],{"class":68},"palette",[27,459,170],{"class":41},[27,461,462],{"class":68},"isOpen",[27,464,465],{"class":41},") ",[27,467,468],{"class":234},"return\n",[27,470,471,473,476,478,481,483,486],{"class":29,"line":52},[27,472,235],{"class":234},[27,474,475],{"class":68}," palette",[27,477,170],{"class":41},[27,479,480],{"class":61},"open",[27,482,65],{"class":41},[27,484,485],{"class":178},"\"branches\"",[27,487,264],{"class":41},[27,489,490],{"class":29,"line":58},[27,491,269],{"class":41},[155,493,495],{"id":494},"observing-instead-of-claiming","Observing instead of claiming",[17,497,499],{"className":19,"code":498,"language":21,"meta":22,"style":22},"tui.hook(\"key:pressed\", ({ key, mode }) => {\n    if (mode === \"normal\" && key === \"ctrl+g\") openThing()\n})\n",[24,500,501,534,565],{"__ignoreMap":22},[27,502,503,506,508,511,513,516,519,522,524,527,530,532],{"class":29,"line":30},[27,504,505],{"class":68},"tui",[27,507,170],{"class":41},[27,509,510],{"class":61},"hook",[27,512,65],{"class":41},[27,514,515],{"class":178},"\"key:pressed\"",[27,517,518],{"class":41},", ({ ",[27,520,521],{"class":68},"key",[27,523,78],{"class":41},[27,525,526],{"class":68},"mode",[27,528,529],{"class":41}," }) ",[27,531,87],{"class":33},[27,533,42],{"class":41},[27,535,536,538,540,542,545,548,551,553,555,558,560,563],{"class":29,"line":45},[27,537,451],{"class":234},[27,539,454],{"class":41},[27,541,526],{"class":68},[27,543,544],{"class":41}," === ",[27,546,547],{"class":178},"\"normal\"",[27,549,550],{"class":41}," && ",[27,552,521],{"class":68},[27,554,544],{"class":41},[27,556,557],{"class":178},"\"ctrl+g\"",[27,559,465],{"class":41},[27,561,562],{"class":61},"openThing",[27,564,246],{"class":41},[27,566,567],{"class":29,"line":52},[27,568,269],{"class":41},[13,570,571,572,574,575,578],{},"Fires only for keys nothing handled, and cannot consume them. ",[24,573,521],{}," round-trips —\n",[24,576,577],{},"keys.register(key, fn)"," accepts exactly what you receive.",[580,581,582],"style",{},"html pre.shiki code .scz_3, html code.shiki .scz_3{--shiki-default:#569CD6}html pre.shiki code .sNl3T, html code.shiki .sNl3T{--shiki-default:#4EC9B0}html pre.shiki code .sTNBD, html code.shiki .sTNBD{--shiki-default:#D4D4D4}html pre.shiki code .sOLPB, html code.shiki .sOLPB{--shiki-default:#6A9955}html pre.shiki code .sCudf, html code.shiki .sCudf{--shiki-default:#DCDCAA}html pre.shiki code .s3F5K, html code.shiki .s3F5K{--shiki-default:#9CDCFE}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sKc5r, html code.shiki .sKc5r{--shiki-default:#CE9178}html pre.shiki code .sYbnZ, html code.shiki .sYbnZ{--shiki-default:#C586C0}",{"title":22,"searchDepth":45,"depth":45,"links":584},[585,586,587,588,589],{"id":157,"depth":45,"text":158},{"id":298,"depth":45,"text":299},{"id":350,"depth":45,"text":351},{"id":417,"depth":45,"text":418},{"id":494,"depth":45,"text":495},"md",{},"\u002Fdocs\u002Fv2\u002Ftui\u002Fapi\u002Fkeys",{"title":5,"description":15},"docs\u002Fv2\u002Ftui\u002Fapi\u002Fkeys","zzPeUf9w1DokGDXq76MCDo4asvS_8yOBT3SpySS5SFw",1786791207941]