YStudio Y++

YSS · 超级文本框(supertextbox)

Y++ / YStudio 开发文档 · 一点滴

选择器: supertextbox · 设计器组件: 超级文本框 · 按名称: supertextbox#名称#名称

定位: 大文本 / 日志 / 类编辑器控件(始终多行、自绘)。普通表单输入请用「文本框 / 多行文本框」。

伪状态: :hover :focus :disabled

与多行文本框对照

超级文本框 多行文本框
场景 日志、源码、大文件浏览与编辑 表单备注、短多行输入
大文件 mmap / 虚拟窗口;可保存;可尝试物化后编辑 适合中等以内全文缓冲
行号 支持「显示行号」;宽度按位数自适应;可用「字体类」+「置行号字体」
富文本 选区样式 + HTML/Markdown 只读预览 无(纯文本编辑)

可用属性(YSS / 设计器)

类别 属性
通用 colorbackground-colorborder-*border-radiusshow-bordertransparent-background
字体 font-sizefont-familyfont-boldfont-italic
对齐 text-alignleft / center / right
焦点 focus-border-colorfocus-background-colorfocus-glow-color
编辑 word-wrap(自动折行)、只读、最大长度、滚动条、行间距
外观 显示行号(设计器属性;运行时也可用 显示行号(真)

示例 YSS

supertextbox#日志框 {
    color: #D4D4D4;
    background-color: #1E1E1E;
    border-color: #3C3C3C;
    border-width: 1;
    border-radius: 4;
    font-size: 13;
    word-wrap: true;
}

supertextbox#日志框:focus {
    focus-border-color: #007ACC;
    focus-glow-color: #007ACC;
}

代码侧常用 API

读写与文件

超级文本框1.文本 = "初始内容"
整数 ok = 超级文本框1.载入文件("log.txt")
ok = 超级文本框1.保存文件("out.txt")   // 可选第二参:编码(0=沿用载入编码)
整数 cp = 超级文本框1.取文件编码()

// 打开文件:组合对话框 + 载入(筛选器/标题由你传入,控件不写死)
文本 路径 = 打开文件对话框("打开文本", "", "文本(*.txt;*.log)|*.txt;*.log|所有文件(*.*)|*.*")
如果 (路径 != "") {
    超级文本框1.载入文件(路径)
}

// 拖入文件:自行用「拖放类」注册目标,在事件里 载入文件(路径)。控件不内置拖放。

查找 / 替换 / 选区

整数 p = 超级文本框1.查找("error")
p = 超级文本框1.查找("error", 0, 假, 真)          // 全词匹配
p = 超级文本框1.查找("err\\w+", 0, 假, 假, 真)    // 正则(ECMAScript)
p = 超级文本框1.查找下一个("error")
整数 命中 = 超级文本框1.取查找命中数("error")
p = 超级文本框1.替换("error", "ok")
整数 n = 超级文本框1.全部替换("\t", "    ")
超级文本框1.置选区(0, 10)
超级文本框1.滚到选区()
整数 起 = 超级文本框1.取选区起()
整数 止 = 超级文本框1.取选区止()

命中靠选区高亮;查找面板/快捷键请自己做,调用上述方法即可。

书签 / 重新载入 / 跟随末尾

整数 bi = 超级文本框1.加入书签()          // 当前行;或 加入书签(100)
超级文本框1.跳到书签(bi)
超级文本框1.置跟随末尾(真)
整数 ok = 超级文本框1.重新载入()          // 按上次载入路径刷新;文件监视见 docs/filewatch-support.md

换行风格 / 浏览模式

整数 s = 超级文本框1.取换行风格()         // 0=LF,1=CRLF;载入后尽量跟随文件
超级文本框1.置换行风格(1)                 // 保存时按 CRLF 写出
超级文本框1.置浏览模式(真)                // 只看不改(含虚拟补丁);不内置拖放
逻辑 浏 = 超级文本框1.取浏览模式()

片段读取(不限定「日志」场景)

文本 一片 = 超级文本框1.取文本范围(0, 80)       // 字符半开区间;虚拟模式=当前窗口
文本 多行 = 超级文本框1.取行文本范围(1, 20)     // 行号闭区间,从 1 起
如果 (超级文本框1.是否虚拟模式()) {
    文本 头 = 超级文本框1.取文件字节范围(0, 4096)  // 相对数据区字节;单次最多约 8MB
}

剪贴板与行列

超级文本框1.置选区(0, 5)
超级文本框1.复制()      // 多行无选区返回 0;Ctrl+C 同
超级文本框1.剪切()      // Ctrl+X
超级文本框1.粘贴()      // Ctrl+V
超级文本框1.删除选区()
整数 行 = 超级文本框1.取当前行()   // 从 1 起
整数 列 = 超级文本框1.取当前列()
文本 一行 = 超级文本框1.取行文本(行)

快捷键(焦点在控件内):Ctrl+A 全选、Ctrl+C/X/V 复制/剪切/粘贴、Ctrl+Z/Y 撤销/重做。

撤销 / 重做

如果 (超级文本框1.可撤销()) {
    超级文本框1.撤销()
}
如果 (超级文本框1.可重做()) {
    超级文本框1.重做()
}

虚拟模式:当前窗口缓冲内可撤销/重做(标记脏,滚动或保存时刷盘);换窗后撤销栈清空。

大文件虚拟模式

≥4MB(或超过「最大长度」)载入后进入虚拟窗口:不全量进内存,可滚动 / 全文件查找 / 跳行 / 保存 / 编辑。

能力目标:流畅处理约 400MB 级文本(x64);映射上限约 4GB(行偏移为 32 位)。4MB 只是切入虚拟模式的阈值,不是最大体积。

  • 可编辑(延迟刷盘):键入 / 删除 / 粘贴先改当前窗口缓冲,滚动换窗、查找、替换、保存时再一次性写回源文件,避免对 400MB 文件「每字拷一遍」。
  • 替换 仍按次写回;全部替换(UTF-8/UTF-16)单次流式写回整文件。
  • 仍可 开始编辑() 尝试全文物化(受「最大长度」约束,约 2 亿字符 / ~400MB UTF-16);失败则继续虚拟补丁编辑。
  • 是否虚拟模式() / 取文件字节数() 查询状态。
  • 查找下一个 从上次命中字节之后继续。
  • 文本 属性在虚拟模式下仅反映当前窗口切片;取行数 / 跳到行 / 查找 按全文件。
如果 (超级文本框1.是否虚拟模式()) {
    整数 bytes = 超级文本框1.取文件字节数()
    如果 (超级文本框1.开始编辑() == 0) {
        // 仍为虚拟模式:键入/替换即可,超大文件建议直接编辑无需物化
        超级文本框1.替换("error", "ok")
    }
}

行号与富文本

超级文本框1.显示行号(真)
超级文本框1.置自动折行(假)   // 软换行关:长行可横向滚;大文件/虚拟模式始终硬换行排版
逻辑 wrap = 超级文本框1.取自动折行()

// 行号栏宽度按总行数位数自适应;可用字体类单独设行号外观
字体类 ln
ln.置名称("Consolas")
ln.置字号(12)
ln.置文本色("#B0B0B0")
ln.置背景色("#282828")
超级文本框1.置行号字体(ln)

字体类 body
body.置名称("Consolas")
body.置字号(13)
超级文本框1.置内容字体(body)   // 或 超级文本框1.置字体(body) / body.应用到("超级文本框1")

// 可组合关键字着色(日志高亮):关键字/颜色由你传入,不内置 error/warn
超级文本框1.加入关键字色("error", "#FF5555")
超级文本框1.加入关键字色("warn", "#DCDCAA", "#3A3A00")
超级文本框1.清除关键字色()   // 或 清除关键字色("error")
超级文本框1.置显示空白(真)   // 空格· 制表→ 换行拐角;可关

超级文本框1.置选区(0, 5)
超级文本框1.置选区样式(真, 假, 假, "#FF5555")  // 整体替换该段样式,并记住后续键入样式
超级文本框1.置选区加粗(真)      // 只改粗体,保留颜色等
超级文本框1.置选区前景色("#55FF55")
超级文本框1.置选区背景色("#3A3A00")  // 编辑态底色高亮
文本 html = 超级文本框1.取富文本()
超级文本框1.置富文本("<b>标题</b><br/>正文")
超级文本框1.置预览格式(1)   // 0纯文本编辑 1HTML预览 2Markdown预览(预览只读)
超级文本框1.置预览格式(0)

键入 / 粘贴 / 删除会维护多 run:新字继承光标左侧样式,或最近一次「置选区*」记住的样式。大缓冲(约 >64KB)时「内容改变/文本改变」事件载荷可能为空文本,避免每键拷贝全文——需要全文时请自行「取文本」。

事件

函数 超级文本框1.内容改变 (文本 新内容) {
    输出 (新内容)
}

函数 超级文本框1.选区改变 () {
    输出("选区 " + 到文本(超级文本框1.取选区起()) + "-" + 到文本(超级文本框1.取选区止()))
}

函数 超级文本框1.光标移动 () {
    输出("行=" + 到文本(超级文本框1.取当前行()))
}

函数 超级文本框1.文件已载入 (文本 路径) {
    输出("已载入 " + 路径)
}

函数 超级文本框1.虚拟模式改变 (整数 当前值) {
    // 当前值:1=虚拟窗口,0=否
    输出("虚拟=" + 到文本(当前值))
}

函数 超级文本框1.替换进度 (整数 当前值) {
    // 全部替换进行中;当前值=已替换次数
    输出("已替换 " + 到文本(当前值))
}

说明

  • 虚拟模式保存:编码与载入一致时可按原文件字节写出;指定其它编码时会先解码再按新编码写入。
  • 自动折行:设计器 / YSS word-wrap / 置自动折行 同一开关。大文件与虚拟窗口按硬换行排版(可横向滚),不在此路径做软折行。
  • 富文本约定为简易 HTML(span 样式 + <br/>);编辑态键入会继承样式并绘制背景色。完整 Word 式排版(多段落/列表等)仍可继续增强。
  • 内存上限由属性「最大长度」与运行时默认上限共同约束;超限物化会失败,但仍可在虚拟模式下编辑(延迟刷盘)。
  • 极端密换行(超过约 3200 万行)会拒绝建立行索引;请先用外部工具拆分文件。