[{"data":1,"prerenderedAt":319},["ShallowReactive",2],{"quirekit-doc:\u002Fconcepts\u002Fselection":3},{"id":4,"title":5,"body":6,"description":307,"extension":308,"keywords":309,"locale":310,"meta":311,"navigation":312,"order":313,"path":314,"section":315,"seo":316,"stem":317,"__hash__":318},"docs\u002Fconcepts\u002Fselection.zh-CN.md","选区与文档位置",{"type":7,"value":8,"toc":301},"minimark",[9,13,17,120,144,171,174,219,241,248,251,265,280,283,297],[10,11,12],"p",{},"选区表示下一次编辑操作的目标。它可以是一个光标、一段文字，也可以是一个完整节点。选区属于 Editor 的规范状态；屏幕上的高亮由 View 根据它绘制。",[14,15,16],"h2",{"id":16},"读取当前选区",[18,19,25],"pre",{"className":20,"code":21,"filename":22,"language":23,"meta":24,"style":24},"language-ts shiki shiki-themes github-light github-light github-dark","const { doc, selection } = editor.state.pm\nconst { from, to, empty } = selection\nconst text = doc.textBetween(from, to, '\\n')\n","读取并提取选中的文字","ts","",[26,27,28,60,87],"code",{"__ignoreMap":24},[29,30,33,37,41,45,48,51,54,57],"span",{"class":31,"line":32},"line",1,[29,34,36],{"class":35},"sDD9d","const",[29,38,40],{"class":39},"sVPnS"," { ",[29,42,44],{"class":43},"sUNQB","doc",[29,46,47],{"class":39},", ",[29,49,50],{"class":43},"selection",[29,52,53],{"class":39}," } ",[29,55,56],{"class":35},"=",[29,58,59],{"class":39}," editor.state.pm\n",[29,61,63,65,67,70,72,75,77,80,82,84],{"class":31,"line":62},2,[29,64,36],{"class":35},[29,66,40],{"class":39},[29,68,69],{"class":43},"from",[29,71,47],{"class":39},[29,73,74],{"class":43},"to",[29,76,47],{"class":39},[29,78,79],{"class":43},"empty",[29,81,53],{"class":39},[29,83,56],{"class":35},[29,85,86],{"class":39}," selection\n",[29,88,90,92,95,98,101,105,108,112,115,117],{"class":31,"line":89},3,[29,91,36],{"class":35},[29,93,94],{"class":43}," text",[29,96,97],{"class":35}," =",[29,99,100],{"class":39}," doc.",[29,102,104],{"class":103},"sgQzM","textBetween",[29,106,107],{"class":39},"(from, to, ",[29,109,111],{"class":110},"s-HEn","'",[29,113,114],{"class":43},"\\n",[29,116,111],{"class":110},[29,118,119],{"class":39},")\n",[10,121,122,124,125,127,128,130,131,133,134,136,137,133,140,143],{},[26,123,79],{}," 表示范围是否折叠；普通文本光标的 ",[26,126,69],{}," 与 ",[26,129,74],{}," 相同。",[26,132,69],{}," \u002F ",[26,135,74],{}," 是按文档顺序排列的边界；需要保留向前或向后拖选的方向时，读取 ",[26,138,139],{},"anchor",[26,141,142],{},"head","。",[10,145,146,147,150,151,154,155,158,159,161,162,165,166,143],{},"位置是 ProseMirror 文档位置，不是纯文本字符下标，也不是像素。以只含一个段落 ",[26,148,149],{},"Hello"," 的文档为例，段落前是 ",[26,152,153],{},"0","，文字从 ",[26,156,157],{},"1"," 开始；选择 ",[26,160,149],{}," 使用 ",[26,163,164],{},"{ from: 1, to: 6 }","。容器边界也占位置，嵌套内容不能靠统计字符串长度定位。需要坐标转换时，使用 ",[167,168,170],"a",{"href":169},"\u002Fapi\u002Fview","mounted View 的几何 API",[14,172,173],{"id":173},"设置文本或节点选区",[18,175,178],{"className":20,"code":176,"filename":177,"language":23,"meta":24,"style":24},"editor.chain().setTextSelection({ from: 1, to: 6 }).focus().run()\n","在上面的 Hello 文档中选择文字",[26,179,180],{"__ignoreMap":24},[29,181,182,185,188,191,194,197,199,202,205,208,211,213,216],{"class":31,"line":32},[29,183,184],{"class":39},"editor.",[29,186,187],{"class":103},"chain",[29,189,190],{"class":39},"().",[29,192,193],{"class":103},"setTextSelection",[29,195,196],{"class":39},"({ from: ",[29,198,157],{"class":43},[29,200,201],{"class":39},", to: ",[29,203,204],{"class":43},"6",[29,206,207],{"class":39}," }).",[29,209,210],{"class":103},"focus",[29,212,190],{"class":39},[29,214,215],{"class":103},"run",[29,217,218],{"class":39},"()\n",[10,220,221,222,225,226,229,230,233,234,237,238,240],{},"传一个数字给 ",[26,223,224],{},"setTextSelection(position)"," 会放置光标；传 ",[26,227,228],{},"{ from, to }"," 则选择范围。选完整图片或其他可选择节点时，用 ",[26,231,232],{},"setNodeSelection(position)","，位置指向节点之前；",[26,235,236],{},"selectAll()"," 选择整个文档。节点选区的 ",[26,239,79],{}," 通常为 false，但它不等于一段连续文字。",[10,242,243,244,247],{},"不要把前一份文档或更早事务中的数字位置直接套到当前内容。同步命令链共享事务；复杂命令中先改动结构、再定位后续位置时，需要用该事务的 ",[26,245,246],{},"tr.mapping"," 映射。异步操作还要校验文档、目标和任务是否仍有效。",[14,249,250],{"id":250},"工具栏如何保留目标",[10,252,253,254,257,258,261,262,143],{},"普通加粗按钮可以调用 ",[26,255,256],{},"editor.chain().focus().toggleBold().run()","：不传位置的 ",[26,259,260],{},"focus()"," 恢复当前选区，不会把光标移到末尾。不要在每次点击按钮时硬编码 ",[26,263,264],{},"focus('end')",[10,266,267,268,271,272,275,276,143],{},"用 ",[26,269,270],{},"editor.isActive('bold')"," 判断粗体状态，用 ",[26,273,274],{},"editor.getAttributes('heading').level"," 读取标题属性；二者都只查询当前状态。Word 的有效格式还可能来自样式继承，应使用对应 Word 格式查询，见",[167,277,279],{"href":278},"\u002Fbuild\u002Fcommands","连接工具栏",[14,281,282],{"id":282},"订阅变化",[10,284,285,288,289,292,293,143],{},[26,286,287],{},"selectionUpdate"," 适合更新选区统计；工具栏还需要响应正文和光标处待输入格式的变化，可以订阅 ",[26,290,291],{},"transaction","，只读取所需的少量状态。光标移动时不应序列化全文或保存文件。如何清理订阅见",[167,294,296],{"href":295},"\u002Fconcepts\u002Flifecycle","生命周期与事件",[298,299,300],"style",{},"html pre.shiki code .sDD9d, html code.shiki .sDD9d{--shiki-default:#D73A49;--shiki-light:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVPnS, html code.shiki .sVPnS{--shiki-default:#24292E;--shiki-light:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sUNQB, html code.shiki .sUNQB{--shiki-default:#005CC5;--shiki-light:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sgQzM, html code.shiki .sgQzM{--shiki-default:#6F42C1;--shiki-light:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s-HEn, html code.shiki .s-HEn{--shiki-default:#032F62;--shiki-light:#032F62;--shiki-dark:#9ECBFF}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 .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":24,"searchDepth":62,"depth":62,"links":302},[303,304,305,306],{"id":16,"depth":62,"text":16},{"id":173,"depth":62,"text":173},{"id":250,"depth":62,"text":250},{"id":282,"depth":62,"text":282},"读取光标范围、选中文字或节点，并让工具栏保留当前编辑目标。","md",null,"zh-CN",{},true,6,"\u002Fconcepts\u002Fselection","核心概念",{"title":5,"description":307},"concepts\u002Fselection.zh-CN","GUay0k-jXQrwSQAVJ-95jolEX3Tk-wKrYNDXDvwAprk",1793045207996]