如何在KDE Kate中配置Tinymist LSP解决跨文件标签报错?
问题场景
在KDE Kate里编辑Typst文件时,切换标签页会导致Tinymist LSP的上下文跟着切换。编译主文件main.typ时所有引用都正常,但编辑被包含的子文件(比如chapter1.typ)时,LSP会弹出[typst] label <labelnamehere> does not exist in the document的错误提示。已知Tinymist可以通过运行pinMain函数固定主文件上下文来解决这个问题,下面是具体的实现方法。
最小示例
main.typ
= Chapter from main Text in `main` @adams95guide #include "chapter1.typ" #bibliography("bibliography.bib")
chapter1.typ
Text in included file. @munroe14whatif // lsp error: "[typst] label <labelnamehere> does not exist in the document"
bibliography.bib
@book{munroe14whatif, title = {What If? Serious Scientific Answers to Absurd Hypothetical Questions}, author = {Munroe, Randall}, year = 2014 } @book{adams95guide, author = {Adams, Douglas}, title = {The Hitchhiker's Guide to the Galaxy}, year = 1995 }
编译main.typ时所有引用均正常:
Kate默认Typst LSP配置
{ "typst": { "command": [ "tinymist" ], "path": [ "~/.cargo/bin" ], "root": ".", "url": "https://github.com/Myriad-Dreamin/tinymist", "highlightingModeRegex": "^Typst$" } }
解决办法
一、修改Kate配置自动触发pinMain
Tinymist支持通过启动参数或LSP请求固定主文件,下面两种方式都能实现自动处理:
给Tinymist添加启动参数
直接修改Kate的LSP配置文件(通常位于~/.config/kate/lspclient/servers/typst.json),让Tinymist启动时就固定主文件。把command字段改成带--pin-main参数的形式:{ "typst": { "command": [ "tinymist", "--pin-main", "./main.typ" ], "path": [ "~/.cargo/bin" ], "root": ".", "highlightingModeRegex": "^Typst$" } }注意:如果你的Tinymist版本不支持
--pin-main参数,就用下面的快捷键方式。设置快捷键一键发送
pinMain请求
给Kate添加快捷键,打开子文件后按一下就能切换到主文件上下文:- 打开Kate的「设置」→「配置Kate」→「快捷键」,搜索「Send LSP Request」
- 新建快捷键,将请求内容改为:
{"jsonrpc":"2.0","id":1,"method":"typst/pinMain","params":{"uri":"file:///你的main.typ绝对路径"}} - 替换路径后保存,以后打开子文件时按下该快捷键,LSP就会以主文件为上下文进行分析,引用错误会自动消失。
二、手动和LSP服务器交互
如果不想修改配置,也可以手动给运行中的Tinymist发送请求:
用Kate内置的LSP通信窗口发送请求
- 打开Kate的「工具」→「LSP客户端」→「显示LSP通信」,就能看到当前和Tinymist的会话内容
- 在窗口中输入以下请求内容并发送:
{"jsonrpc":"2.0","id":1,"method":"typst/pinMain","params":{"uri":"file:///你的main.typ绝对路径"}}
发送成功后,子文件中的引用错误提示会立刻消失。
终端进程交互(可选)
先通过终端命令找到Tinymist的进程ID:ps aux | grep tinymist然后通过进程的标准输入发送请求,但这种方式操作繁琐,一般用Kate内置的通信窗口就足够了。
内容的提问来源于stack exchange,提问作者Uwe Krause

