文本编辑器kate

Kate 运行手册(max2-nixos)
============================================================

因为kate经常触发oom(64G内存),专门分析并设置限制kate最大内存上限,避免波及其它应用
本文件只讲「运行时不 nixos-rebuild 就能改」的 Kate 参数。
需要 rebuild 的声明式设置统一在:
 /etc/nixos/modules/system/component/kate.nix

============================================================
A. 内存上限(当前 1 GiB,声明式)
============================================================
机制:kate.nix 的单例启动器 kate-singleton 会把每次启动包进
     systemd-run --user --scope -p MemoryMax=1G -p MemorySwapMax=0 -- kate …
     所有启动路径(菜单 / Dolphin / 终端敲 kate)都走它。
     一旦某次分配超过 1G → 内核在该 cgroup 内 OOM 杀掉 Kate
     (只杀这一个 Kate,不动系统;cgroup 约束,不是全局 OOM)。

查看某次 Kate 的实际用量 / 上限:
 systemctl --user status 'app-org.kde.kate@*.service'     # 看 Memory / Memory peak 行
 systemctl --user show   'run-*.scope' -p MemoryMax -p MemoryCurrent
 ps -eo pid,rss,comm | grep -i kate

临时用「别的大上限」启动一次(不重建、不改默认):
 systemd-run --user --scope -p MemoryMax=8G -p MemorySwapMax=0 -- kate 文件…
 (前台阻塞;要后台就末尾加 &)

完全绕过上限启动(应急/危险,不经 kate-singleton):
 /run/current-system/sw/bin/kate 文件…     ← 直调本体
 ks=/nix/store/xrcai40sbhp2y9p63s85lx9gjm0w5d05-kate-26.04.3/bin/kate   # 或直接调 store 本体

永久改上限 = 改 kate.nix 一行再 rebuild:
 kateMemMax = "1G";        # 想 2G/4G 就改这里 → nixos-rebuild switch

被上限杀掉后看现场:
 journalctl --user -u 'app-org.kde.kate@*.service' | grep -i oom
 sudo journalctl -b -k | grep -iE 'kate|oom|Memory cgroup'

============================================================
B. 配置项(katerc,运行时改)
============================================================
用户级(优先级最高,运行时改):   ~/.config/katerc
系统级默认(声明式,在 kate.nix,改要 rebuild): /etc/xdg/katerc

命令行:
 读:  kreadconfig6   --file katerc --group <组> --key <键>
 写:  kwriteconfig6  --file katerc --group <组> --key <键> <值>
GUI:设置 → 配置 Kate → …

常用键(组名/键名照抄,非通用 KDE 拼法):
 [General]                SDI Mode=false        # false=单窗口多标签;true=一窗一文档
 [General]                Startup Session=last  # 启动恢复哪个会话(manual=不自动恢复)
 [KTextEditor Document]   Tab Width=4
 [KTextEditor Document]   Indentation Width=4
 [KTextEditor Document]   ReplaceTabsDyn=true   # Tab 键插空格
 [KTextEditor Document]   On-The-Fly Spellcheck=false   # 实时拼写检查
 [KTextEditor Document]   Backup Local=false    # 不生成 file~ 备份
 [KTextEditor View]       Dynamic Word Wrap=true
 [KTextEditor View]       Line Numbers=true
 [KTextEditor View]       Folding Bar=true

生效时机:多数键要「重开 Kate」或对该文档重新加载才生效,不是全部热生效。

============================================================
C. 插件开关(运行时)
============================================================
 kwriteconfig6 --file katerc --group Plugins --key <插件名> false
 例:kateprojectplugin      (项目插件:会索引 git 仓库,大仓库可致内存暴涨——KDE #525771)
     lspclientplugin        (LSP 客户端)
     katefiletreeplugin     (文件树)
     katectagsplugin        (ctags 符号)
 查看是否已关:kreadconfig6 --file katerc --group Plugins --key kateprojectplugin
GUI:设置 → 配置 Kate → 插件 → 勾选/取消。改完需重启 Kate。

============================================================
D. 会话 / 文档
============================================================
匿名会话文件:~/.local/share/kate/anonymous.katesession(记录上次打开的文档)
卡死/异常恢复:关掉所有 Kate 后删该文件即可重置(只丢「上次打开列表」,不丢磁盘文件)

============================================================
E. 应急速查
============================================================
看谁在吃内存:      ps -eo pid,rss,comm --sort=-rss | head
强杀某个 Kate 实例: systemctl --user stop 'app-org.kde.kate@<hash>.service'
                    (或 KDE「系统监视器 / 任务管理器」里结束 kate)
完整链:内核 OOM Killer ← systemd 用户 cgroup (app.slice) ← kate-singleton(带 MemoryMax) ← Kate
提醒:别用文本编辑器打开 .qcow2/.img/.vhdx 等虚拟磁盘(超大二进制)。
     这类文件的打开方式在 ~/.config/mimeapps.list 里控制(已移除 octet-stream→Kate)。
 

============================================================
F. Markdown 支持(语法高亮 / 实时预览 / LSP) [2026-10-15 补]
============================================================
结论:语法高亮本来就内置、无需装任何东西;唯一缺的是「预览」的渲染后端 markdownpart。
另:Kate 的 LSP 客户端内置默认把 markdown 指向 marksman,不装则每次打开 .md 都报错。

① 语法高亮(已内置,无需额外组件)
 由 KSyntaxHighlighting 提供,自查:
 ksyntaxhighlighter6 --list | grep -i markdown   # 应见 Markdown / R Markdown(全量 456 条)

② 实时预览(要装 1 个包 + 开 1 个插件开关)
 Kate 自带预览插件(ktexteditorpreviewplugin.so);界面名是「预览」,不是「文档预览」。
 渲染 markdown 需要一个 KPart 渲染器 = kdePackages.markdownpart:
 /run/current-system/sw/lib/qt-6/plugins/kf6/parts/markdownpart.so   # 装好后应存在
 插件开关(组名 Plugins、键名 ktexteditorpreviewplugin):
 kreadconfig6  --file katerc --group Plugins --key ktexteditorpreviewplugin
 kwriteconfig6 --file katerc --group Plugins --key ktexteditorpreviewplugin true
 GUI:设置 → 配置 Kate → 插件 → 勾「预览」
 用法:勾上后 视图 → 工具视图 里出现 Preview 面板(打开 .md 即实时渲染)。
 注意:Kate 是「退出时」才把插件状态写进 ~/.config/katerc ⇒ 故 kate.nix 在 /etc/xdg/katerc
      预置了一份(系统级 fallback;用户级同键存在时以用户级为准)。

③ LSP(marksman)
 为什么必须装:Kate 的 LSP 客户端内置默认就把 markdown 指向 marksman
 (~/.config/kate/lspclient/settings.json 为 0 字节 = 用内置默认);不装则每次打开 .md 都报
 「查找语言 markdown 的服务器二进制 marksman 失败」。装上后无需手配:
 which marksman && marksman --version   # 2026-02-08

④ 声明式落点(要 rebuild):/etc/nixos/modules/system/component/kate.nix
 environment.systemPackages →
      pkgs.kdePackages.markdownpart     # 预览后端(KPart)
      pkgs.marksman                 # LSP 服务器
 environment.etc."xdg/katerc" → [Plugins] ktexteditorpreviewplugin=true
 不装 kparts(是 markdownpart 的构建依赖,nix 自动带上);不装第三方 Katemark(排版/导出向,与「浏览+修改」用途不符)。

⑤ 验证:用户实测预览与 LSP 均正常(世代 200,标签 kate-md-part-and-marksman)。