跳到正文

这是开发版文档,跟随主分支更新,可能包含尚未发布的功能。

代码编辑器 ​

@dou-ui/code 提供代码编辑器 DouCodeEditor,用于编辑配置、脚本、练习题这类代码。只展示代码时,使用 CodeBlock 代码块。

安装 ​

代码编辑器是单独的包,需要和 dou-ui 一起安装:

sh
bun add dou-ui @dou-ui/code

引入样式,再注册组件:

ts
import 'dou-ui/style.css'
import '@dou-ui/code/style.css'
import { DouCodeEditor } from '@dou-ui/code'

app.use(DouCodeEditor)

基础用法 ​

使用 v-model 绑定代码字符串,language 设置语言。

编辑器的高度随内容增长。内容较多时,用 CSS 给编辑器设置 height 或 max-height,超出的部分在编辑器内滚动。

字符串里的 \r\n 和 \r 都按换行读入,v-model 交回的字符串统一使用 \n。

编辑辅助 ​

设置 language 后,编辑器会:

  • 按 Enter 时保留缩进,在左括号或 HTML 开始标签之后多缩进一级。
  • 输入左括号或引号时补上另一半,有选区时用它们包住选区。
  • 标出光标旁的括号和与它配对的括号,找不到配对时标为红色。
  • 按 Mod + / 注释或取消注释所在的行。

Mod 在 Apple 设备上是 ⌘,在其他系统上是 Ctrl。

closeBrackets 设为 false 关闭括号补全,matchBrackets 设为 false 关闭括号配对标记。

只读与禁用 ​

readonly 让编辑器只能选择和复制,disabled 让编辑器不能获得焦点。placeholder 设置内容为空时的提示文字。

外观 ​

lineNumbers 控制是否显示行号,activeLine 控制是否给光标所在行加底色。tabSize 设置制表位宽度,也是一级缩进的宽度;indentWithTabs 设为 true 时用制表符缩进。

字号、行高、背景色等通过 CSS 变量调整,见下方 CSS 变量。行高请使用整数像素。

在其他组件中使用 ​

以下生态包提供了基于代码编辑器的版本,都在各自的 code 子路径中:

用在哪里引入文档
块编辑器codeEditorBlock from @dou-ui/editor/code代码块
电子表格DouSheetCodeFormulaBar from @dou-ui/sheet/code代码版编辑栏
表单设计器codeExpressions from @dou-ui/form-builder/code用代码输入框写表达式

完整的页面示例见区块代码练习和配置编辑。

API ​

CodeEditor Props ​

名称说明类型默认值
v-model代码;v-model.lazy 在失去焦点时才更新string—
v-model:doc以 CodeText 绑定代码,见大文件CodeText—
v-model:selection选区,见选区CodeSelection开头的光标
language语言,见语言CodeLanguage | null—
readonly只读booleanfalse
disabled禁用booleanfalse
placeholder内容为空时的提示文字string—
lineNumbers显示行号booleantrue
gutter显示行号左侧的栏(行号、折叠箭头、问题图标);关闭后问题只有波浪线booleantrue
activeLine给光标所在行加底色booleantrue
tabSize制表位宽度number2
indentWithTabs用制表符缩进booleanfalse
tabIndentsTab 用于缩进;关闭后 Tab 移到下一个控件,补全和片段中仍然可用booleantrue
closeBrackets输入括号和引号时补上另一半booleantrue
matchBrackets标出光标旁的括号和它的配对booleantrue
searchable提供查找替换面板,见查找与替换booleantrue
wrap长行自动换行booleanfalse
foldable允许折叠代码booleantrue
minimap在右侧显示小地图,编辑器窄于 480px 时不显示booleanfalse
worker在 Web Worker 中分析语法,见大文件boolean | (() => Worker)false
keys触屏上键盘上方的符号栏,见手机触控boolean | (CodeKey | string)[]true
keymap额外的快捷键,优先于内置快捷键,见用代码修改CodeKeymap—
extensions扩展,见扩展CodeExtension[]—
diagnostics要显示的问题,见诊断CodeDiagnostic[]—
teleport补全列表、说明和触屏把手的渲染位置;false 时在编辑器内,可能被裁掉string | HTMLElement | false全局配置,否则 body
messages改写编辑器中的文字(符号栏、工具条等),默认跟随 ConfigProvider 的语言Partial<CodeMessages>—
autofocus挂载后获得焦点booleanfalse
ariaLabel读屏读出的名称string—

CodeEditor Events ​

名称说明参数
transaction文字或选区变化后触发,包括撤销和外部传入的新值CodeTransactionResult
foldChange折叠状态变化时触发number[](各段的起始行号,从 1 开始)
focus获得焦点时触发FocusEvent
blur失去焦点时触发FocusEvent

CodeEditor Exposes ​

名称说明
state、doc、selection当前的文本与选区
transact(run, meta?)做一次修改,返回结果,见用代码修改
run(command)执行一个命令
undo()、redo()撤销、重做,返回是否执行
canUndo、canRedo能否撤销、重做
select(anchor, head?)选中一段或放置光标,也可以传入整个选区;会滚动到可见
scrollIntoView(pos?)把某个位置(默认是主光标)滚动到可见
coordsAtPos(pos)某个位置在视口中的坐标;所在行没有绘制时返回 null
posAtCoords({ x, y })视口中某一点最近的文本位置
focus()、blur()获得、失去焦点
openSearch(query?)打开查找面板;searchable 关闭时返回 false
closeSearch()关闭查找面板;没有打开时返回 false
fold(line?)、unfold(line?)折叠、展开某一行开始的一段,不传时用光标所在行;返回是否有变化
foldAll()、unfoldAll()折叠所有最外层的段、全部展开;返回是否有变化
folds当前折叠的各段的起始行号
diagnostics当前的所有问题,按位置排序

CSS 变量 ​

变量说明默认值
--dou-code-editor-font-size字号var(--dou-font-size-sm)
--dou-code-editor-line-height行高,请使用整数像素20px
--dou-code-editor-padding-y第一行上方和最后一行下方的空白8px
--dou-code-editor-padding-x每行左右的空白12px
--dou-code-editor-bg背景色var(--dou-color-bg-surface)
--dou-code-editor-selection选区颜色主色的浅色
--dou-code-editor-active-line光标所在行的底色文字色的 4%

浮在页面上的补全列表、说明和提示会带上编辑器上的字号、背景色、选区颜色和问题颜色(--dou-code-editor-error、--dou-code-editor-warning、--dou-code-editor-info),在编辑器上设置即可。

语法颜色见语言 · 颜色。