ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

PRQL 语法高亮集成指南:为 KSyntaxHighlighting(Kate / KWrite / KDevelop)安装与定制 prql.xml

PRQL 语法高亮集成指南:为 KSyntaxHighlighting(Kate / KWrite / KDevelop)安装与定制 prql.xml PRQL 语法高亮集成指南为 KSyntaxHighlightingKate / KWrite / KDevelop安装与定制 prql.xml【免费下载链接】prqlPRQL is a modern language for transforming data — a simple, powerful, pipelined SQL replacement项目地址: https://gitcode.com/gh_mirrors/pr/prql本文以 PRQL 仓库中 grammars/KSyntaxHighlighting/README.md 为核心深入讲解如何在基于 KSyntaxHighlighting 的编辑器Kate、KWrite、KDevelop中启用 PRQL 语法高亮从各平台安装路径、Flatpak/Snap 包的特殊处理到 prql.xml 内部的关键词分类、上下文规则与词法分析器的对应关系。读完本文你将能在自己的桌面环境中一键接入 PRQL 高亮并能读懂并维护这份语法定义文件。PRQL 与 KSyntaxHighlighting 的集成背景PRQLPipelined Relational Query Language是一种面向数据转换的现代语言旨在以管道式语法替代 SQL 的繁琐嵌套。为了让 PRQL 代码在各种编辑器与 IDE 中获得一致的着色体验仓库在grammars/目录下维护了多套语法定义grammars/README.md 对它们进行了索引覆盖 Ace、CotEditor、Lezer、GtkSourceView、nano、Raku、MonarchPlayground 所用、TextMate 等十余个生态。其中KSyntaxHighlighting 是 KDE 框架下的语法高亮组件被 Kate、KWrite、KDevelop 等 Qt 系编辑器广泛采用。PRQL 为它提供的定义文件即grammars/KSyntaxHighlighting/prql.xml由社区成员 vanillajonathan 贡献见 CHANGELOG.md 中 Add syntax highlight file for KSyntaxHighlighting 一条并在后续版本中持续与标准库同步如 Sync the KSyntaxHighlighting and book highlighters with the std lib。安装 prql.xml各平台的存放路径KSyntaxHighlighting 以用户级目录扫描语法文件因此安装的核心动作只有一个把 prql.xml 复制到对应平台的语法目录。原文给出的路径对照表如下系统环境目标路径本机用户Linux 原生安装$HOME/.local/share/org.kde.syntax-highlighting/syntax/Flatpak 打包应用$HOME/.var/app/PACKAGE_NAME/data/org.kde.syntax-highlighting/syntax/Snap 打包应用$HOME/snap/PACKAGE_NAME/current/.local/share/org.kde.syntax-highlighting/syntax/Windows%USERPROFILE%\AppData\Local\org.kde.syntax-highlighting\syntax\macOS$HOME/Library/Application Support/org.kde.syntax-highlighting/syntax/对于 Flatpak 与 SnapPACKAGE_NAME需替换为实际的应用包标识常见如org.kde.kate、org.kde.kwrite或org.kde.kdevelop。例如通过 Flatpak 安装的 Kate应复制到$HOME/.var/app/org.kde.kate/data/org.kde.syntax-highlighting/syntax/复制完成后重启编辑器或重新加载高亮配置打开任意.prql文件即可看到 PRQL 语法着色。prql.xml中通过extensions*.prql声明了文件扩展名关联因此新建的.prql文件会被自动识别为 PRQL 语言。解析 prql.xml一份自包含的 KSyntaxHighlighting 语法定义prql.xml是一份标准的 KSyntaxHighlighting XML 语法文件整体由language、highlighting与general三大部分组成。理解其结构既能帮助你排查高亮异常也为向其它语法文件迁移提供了模板。语言声明区language namePRQL version1 kateversion5.0 sectionDatabase extensions*.prql authorvanillajonathan licenseMITnamePRQL在编辑器语言选择器中显示的名称kateversion5.0要求 KSyntaxHighlighting 的最低版本sectionDatabase语言分类数据库类extensions*.prql关联的扩展名licenseMIT定义文件本身的许可证。关键词列表与词法分析器一一对应list定义了若干命名词表供上下文规则引用。这些词表并非随意罗列而是严格对齐 PRQL 编译器词法分析器lexer的保留词实现——prql.xml内注释明确说明“与prqlc/prqlc-parser/src/lexer/mod.rs中的keywordparser 保持同步”。PRQL lexer 中定义了唯一事实来源的保留词表见 lexer/mod.rspub const KEYWORDS: [str; 10] [ let, into, case, prql, type, module, internal, func, import, enum, ]; pub const RESERVED_LITERALS: [str; 3] [true, false, null];对应到prql.xml中则被细分为多个语义列表列表名内容说明importsmodule、import模块与导入关键字keywordscase、enum、func、internal、into、prql除let、type外的其余关键字后两者单独归类declarationstype、alias类型/别名声明letExpressionslet、inlet表达式及其in关键字builtinfuncsaggregate、derive、filter、from、group、join、select、sort、take、window十个内置管道变换specialvarsnull、this、that、true、false特殊变量与保留字面量typesbool、float、int、int8/16/32/64、text、date、time、timestamp基础数据类型modules_builtindate、math、text、prql内置模块名date_functionsnow、to_text、diff、truncdate 模块方法math_functionsabs、acos、asin、atan、ceil、cos、degrees、exp、floor、ln、log、log10、pi、pow、radians、round、sin、sqrt、tanmath 模块方法text_functionslower、upper、ltrim、rtrim、trim、length、extract、replace、starts_with、contains、ends_withtext 模块方法durationsmicroseconds、milliseconds、seconds、minutes、hours、days、weeks、months、years时间单位字面量其中durations与 lexer 中value_and_unit解析器支持的时间单位完全一致见 lexer/mod.rs 的unit分支例如2 days、3 hours中的单位部分会被正确着色而true、false、null在 lexer 中属于RESERVED_LITERALS而非 Keyword token因此与this、that一起归入specialvars并在itemData中被映射为常量样式dsConstant。上下文规则Normal 主上下文contexts中定义了 KSyntaxHighlighting 的状态机。入口为Normal上下文按顺序尝试以下规则#开头进入Hash comment行注释依次匹配types、specialvars、builtinfuncs、declarations、letExpressions、imports、keywords各词表进入Number与StringVariants两个子上下文用正则识别注解\{.*\}如{foo}用长正则匹配运算符与标点匹配十进制、十六进制与浮点数。运算符正则覆盖了 PRQL 的全部语法记号包括管道符|、范围..、整除//、幂**、逻辑/||、比较/!//以及箭头-等这些与 lexer 中的multi_char_operators见 lexer/mod.rs定义的ArrowThin、Eq、Ne、Gte、Lte、And、Or、DivInt、Pow等 token 一一对应。数字字面量进制、浮点与后缀错误检查PRQL 支持多种进制与浮点写法prql.xml通过Number → AssumeNumber → CheckSuffixError三个状态处理十六进制0xA1、二进制0b01、八进制0o71浮点1.1、1.、.1、1e3、1.1e3及带指数符号的变体十进制123、000并支持_数字分隔符词表通过digitPart 0-9*实体定义。CheckSuffixError会在数字后继续出现字母等字符时把其后缀标记为Error样式这与 lexer 中parse_number_with_base对非法数字的拒绝行为在语义上保持一致。字符串体系普通、f-、r-、s- 字符串PRQL 的字符串类型最为丰富prql.xml为每种变体都定义了单引号与双引号、单行与三引号共四组上下文如Single A-string、Triple Q-F-String等普通字符串A-string即 ASCII 字符串与双引号 Q-stringf-string插值字符串内部识别{{、}}转义花括号与{expr}插值区String Interpolation上下文会回落到Normal规则使插值内的代码同样被着色r-string原始字符串不处理转义仅识别反斜杠与引号的边界组合s-stringSQL 字符串同样支持插值是 PRQL 向 SQL 注入片段的机制。转义序列由stringescape上下文处理支持\\、\、\、\b、\f、\n、\r、\t、八进制\NNN、十六进制\xNN与 Unicode\u{1-6位十六进制}见文件头escapedHex/escapedHexUni实体。这与 lexer 中parse_escape_sequence的实现见 lexer/mod.rs逐项对应包括u{...}最多 6 位十六进制、x后恰好 2 位十六进制的约束。主题映射itemDatas 与默认样式itemDatas将上面所有高亮分类映射到 KSyntaxHighlighting 的默认主题样式defStyleNumitemData默认样式语义Keyword/ImportdsKeyword/dsImport关键字与导入OperatordsOperator运算符Data TypedsDataType类型名Builtin FunctiondsBuiltIn内置变换函数Special VariabledsConstantthis/that/true/false/nullFloat/Int/Hex/Octal/BinarydsFloat/dsDecVal/dsBaseN数字字面量CommentdsComment注释String/F-String/R-String/S-StringdsString/dsSpecialString/dsVerbatimString各类字符串String Char/String SubstitutiondsChar/dsSpecialChar转义字符与插值AnnotationdsAttribute{...}注解ErrordsError非法后缀所有 itemData 均关闭拼写检查spellCheckingfalse避免高亮对拼写校正的干扰。通用配置折叠、注释与大小写general中声明了三条全局行为folding indentationsensitive1启用基于缩进的代码折叠PRQL 以换行与缩进表达管道结构这一配置对长查询折叠非常有用单行注释以#开头与 lexer 的comment()解析器一致该解析器同时支持文档注释#!keywords casesensitive1关键字匹配区分大小写。从源码印证高亮定义为何这样划分将prql.xml与编译器源码对照可以得出几个有价值的结论let、type被单独放入declarations/letExpressions列表是因为它们在语法结构上承担声明职责着色上通常期望与普通关键字有所区分而其余关键字统一归入keywords两份清单合起来正好覆盖 lexer 的KEYWORDS常量let、into、case、prql、type、module、internal、func、import、enum见 lexer/mod.rs。builtinfuncs中的 10 个变换对应 PRQL 标准库的管道式变换详见 web/book/src/reference/syntax/keywords.md 对 transforms 的说明——它们本质是std命名空间下的普通函数并非语言关键字。语法文件为它们单独着色使其在查询流水线中一目了然。日期/时间字面量与注解的区分PRQL 中2022-01-01是日期字面量{...}是注解。lexer 在token()中特意让date_token()先于just()匹配见 lexer/mod.rs 的注释 Date literals must come before handling for annotationsprql.xml的注解正则限定为\{.*\}天然不会误吞日期字面量两者互不干扰。模块函数按模块拆分成三个词表date_functions、math_functions、text_functions配合FindMemberModuleMath/MemberModuleMath等上下文可在math.abs这样的模块访问中把方法名单独着色。验证与常见问题如何确认文件被加载复制prql.xml到对应目录后在 Kate 中打开任一.prql文件查看“工具 → 模式”或文档语言选择器应显示 PRQLDatabase 分类。Flatpak/Snap 无效最常见原因是PACKAGE_NAME未替换或路径大小写不一致请核对org.kde.syntax-highlighting目录是否真实存在应用首次运行后才会创建。Windows 路径使用%USERPROFILE%环境变量定位到AppData\Local下的同名目录。macOS注意Application Support中间的空格目录名为org.kde.syntax-highlighting/syntax。如果需要为其它 KSyntaxHighlighting 风格编辑器如 KDevelop 的调试高亮定制行为可直接基于 prql.xml 修改itemDatas中的样式映射或参照同仓库中 GtkSourceView/prql.lang、CotEditor/PRQL.yaml 等兄弟语法文件的做法它们与prql.xml共享同一套关键词来源都注释标明与 lexer 同步改动时可以互相参照。小结PRQL 的 KSyntaxHighlighting 支持由一份自包含的 prql.xml 提供按平台复制到指定目录即可在 Kate、KWrite、KDevelop 中启用。这份文件以 lexerprqlc/prqlc-parser/src/lexer/mod.rs的保留词表为唯一事实来源将关键字、内置变换、模块函数、类型、时间单位、各类字符串与数字字面量、注解与错误后缀完整映射到 KSyntaxHighlighting 的主题体系并支持缩进折叠与大小写敏感匹配。对于希望深度定制 PRQL 高亮体验的开发者读懂这份 XML 的状态机与词表结构即可在此基础上快速修改或移植。【免费下载链接】prqlPRQL is a modern language for transforming data — a simple, powerful, pipelined SQL replacement项目地址: https://gitcode.com/gh_mirrors/pr/prql创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表