#Tinymist

1 messages · Page 2 of 1

buoyant sand
#

OK now I get it

calm birch
#

Does tinymist ship with embedded fonts? I get unknown font family: new computer modern mono when previewing my document

#

i was under the impression that typst ships with new computer modern?

lilac hedge
calm birch
#

I see, didn't realize!

#

yeah looks like no mono variant (?) indeed

#

maybe typst never shipped with it, 0.12 includes a new warning if it cant find the font so maybe i'm just seeing that..

harsh wing
harsh wing
lilac hedge
harsh wing
#

At least if we are talking about the same warning.

calm birch
#

Funny how it might have been broken for ages and I've just never realized!

harsh wing
oak quest
#

The syntax of parameter docs is based on tidy. Parsing the docs is fully implemented. In a parameter doc, you need to fill a type. Filling a built-in types, such as str or string or any, is fully implemented. Filling with complex types, like function signature, is neither sufficiently discussed nor fully implemented.

#

In conclusion, the syntax plus annotating parameters and resultant of a function with built-in types is what tidy and the guideline supported and detailed and fully supported by tinymist 0.12. But how we can annotate them with some more complex types is still in draft state.

#

The docstring support is not first implemented by tinymist but tidy. tinymist just continues working on utilizing type information inside for language support.

wheat garnet
#

Tidy parses doc comments in Typst, right? Does that mean you reimplemented the parsing for tinymist? Could tidy in theory share that parser via a plugin?

buoyant sand
#

It could've already before in theory, the parsing of tidy is unfortunately very flaky when it comes to non standard comment placement (on parameters)

#

I previously suggested the parsing be done within typst-syntax, but I think mczen did not have time for it yet

harsh wing
#

I tried adding built-in types, and it worked, but when I added a deconstructed dictionary...

harsh wing
#

If I used the _ as the pos parameter name, then it would kill the function parameter docs and I had to restart the server after undoing changes.

#

Oh, so based it purely in syntax? I thought it's a Rust project.

#

I already forgot about the package.

oak quest
# harsh wing I tried adding built-in types, and it worked, but when I added a deconstructed d...

Filling with complex types, like function signature, is neither sufficiently discussed nor fully implemented.
I tbh haven't come up with a good syntax for these complex types. First, tidy package dislikes to see them in braces, because tidy parses types by a simple regex ([\w\d\-_ ,]+). Second, typst itself also doesn't have syntax of type annotations on functions. So I have to implement a type annotation parser for them, instead of reusing typst-syntax. For example, I cannot put any annotation on the positional argument pos in (pos) => {}, or spread argument args in (..args) => {}.

harsh wing
#

There are sometimes XML comments in the docs.

#

Here, there is no description for the pos arg:

#

Adding a blank line in the doc string removes the XML comments:

#

Here is what I was talking about:

#

I renamed the arg name in the doc string to match the one that is shown on hover — _. But this doesn't change anything unless I restart the server. After the restart it will show docs from the screenshot.

#

So all of the other's args description is now gone. Undoing the pos arg's name in the doc string again doesn't change anything, unless you restart the server.

#

That's all what I have found for now.

#

I think adding some description/limitations of this feature somewhere in the repo would be helpful. Because a few small test files is kinda not enough. And as you can see, I had some problems that are not outlined in those test files.

harsh wing
#

There was also an auto-indent on Enter press in math mode, which doesn't work for me:

oak quest
#

onEnter is an experimental feature, so you need to call it by your self at the client side (neovim plugin).

harsh wing
#

I'm not sure if it's also configurable via LSP, but I'd prefer server to do:

  1. After starting a list/enum/term item and pressing Enter, the caret should go to the next line and auto-create the next item (insert -/+// + space).
  2. For nested lists, it should maintain the currently nested indent when pressing Enter.
harsh wing
oak quest
oak quest
harsh wing
#

I'm not sure if it's possible, so I might just wait when it will be stable.

harsh wing
#

I'm not sure, but maybe such stuff is configurable through Neovim directly. I might try looking into it at some point.

oak quest
harsh wing
oak quest
#

I suspect neovim also doesn't like the embedded images in docs, because they are encoded as data url.

oak quest
harsh wing
oak quest
oak quest
harsh wing
harsh wing
#

Comment line splitting/merging does work in most languages, but I have no idea if it's a client-side feature or an LSP feature. Maybe it differs.

oak quest
harsh wing
#

If rust-analyzer doesn't call the experimental feature, then it's a Neovim setting.

oak quest
#

In other word, the rust-analyzer isn't called for comment line splitting/merging

harsh wing
#

ok

#

Oh, no, not the ai!

oak quest
#

Does somebody get interested in making a tinymist neovim plugin? As time going, there will be more and more typst-specific features which cannot work without client-side support.

harsh wing
#

Looks like indentation is broken because it's enabled in the treesitter plugin. Adding:

indent = { enable = false }

fixes it. Now autoindent works as I expect (at list for Typst (nested) lists).

harsh wing
lean latch
lean latch
#

according to the spec (and that's what neovim works with) you can just return plaintext or markdown

#

more or less
there are some special cases but xml isn't one of them

lean latch
#

which would likely include these things

#

atm it just sets up lsp with tinymist, has some utils like context, ToC, jumping from heading to heading and a lot of snippets

#

also planning to add preview with tinymist preview to it

#

my time is quite limited at the moment though because of uni and also working on care.nvim (a new completion engine for neovim)

harsh wing
harsh wing
oak quest
#

But the problem is not whether it renders html. The docs in screenshots are just syntax highlighted code, and don't get rendered at all.

harsh wing
harsh wing
#

I think there are some plugins that want or already making Markdown rendering of images in Neovim possible. So that it's even more native-like.

oak quest
#

This sounds a bit lazy.

harsh wing
#

It processes them, though it doesn't look like there is syntax highlighting for them, but there is no rendering, so they are kept. Because it's and editor and you need to have access to the comments in the file editor. Pasting the raw Markdown text with comments into a floating window like hover docs doesn't make it special, so it's just yet another buffer with text, but it's not modifiable, therefore you can only select/copy text, but not edit it.

#

So the "rendering", i.e., "removing of comments" for markdown is up to the producer of the Markdown text, i.e., the LSP server.

oak quest
#

I find a capability flag to check whether client supports HTML tag. I might check whether I can use it for docstrings rendering.

harsh wing
#

At least this is my understanding. Neovim can have some features that I'm not aware of.

oak quest
#

But this means I need to introduce some markdown parser to process them 🥺, another heavy dependency.

lean latch
lean latch
harsh wing
#

remove them, I guess.

#

The more important question would be why they are there in the first place?

oak quest
lean latch
#

so you e.g. have

/// #name
/// idk
/// *more markdown*
#my function

?

#

you definitely have to pass the thing without the /// then

oak quest
harsh wing
patent ibex
#

This newest update doesn't seem to work for me

#

will investigate a bit - but at the moment all I know is it crashes immediately

#
[Error - 5:23:37 PM] Server initialization failed.
  Message: failed to parse typstExtraArgs: error: unexpected argument '--font-path ./fonts' found

  tip: a similar argument exists: '--font-path'
cursive bough
#

Do you have a settings file maybe?

oak quest
harsh wing
#

Oh yeah, that would explain the single quotes. I didn't even notice those until now.

harsh wing
#

There is some degree of rendering, but it is just the conceal feature:

#

:h conceallevel

lean latch
#

It seems like there is a bug with tinymist
I can do set math.mat(align:right) which works fine and which typst can also compile
but tinymist gives an error and won‘t compile and also show no preview

jaunty kiln
#

Are you using the same version of the typst compiler?

lean latch
#

oh my tinymist was outdated

last crystal
#

i figured it out

if there is an import it does work(?)

#

idk, will try to troubleshoot after class

#

and double checked – i did not redefine lt inside my ../config.typ file

#

this is related to this discussion
idk why I failed to reply properly at first try

lean latch
cursive bough
lean latch
#

😂

harsh wing
#

Typst, on the other hand, I compile to musl manually. Which isn't that long.

inner goblet
#

I have a weird behavior but I don't know if it's comming from tinymist or typst itself. I'm on nixos but I use the cargo version of both tools. I'm on v12 for both.
I have this code #propriete[ Les côtés opposés d'un parallélogramme sont parallèles. ]
That produces a box with my own flavour, it'usually working but when I preview the pdf I get this

#

If I use the cli typst command I get the correct result :

#

also sometimes tinymist complains about delimiters not closed even though they are
I use neovim btw

inner goblet
#

Here is another exemple of an unexpected behavior

buoyant sand
#

do you use semantic or syntactic highlighting?

#

it seems that is directly related, can you reproduce this in another editor?

inner goblet
#

I haven't tried in another editor
I use treesitter for highlights

buoyant sand
#

hmm that's odd because clearly tree sitter is also experiencing problems with this file

#

no apparent changes other than updating?

inner goblet
#

not that I remember, I started having troubles with 12rc1 and had to add extraOptions.offset_encoding = "utf-8"; to my config or I had index out of bound errors for highlights

#

I disabled treesitter highlights and it when I use Inspect on my file I get a message telling me that I use semantics token
but I don't get highlights for math mode in that case for exemple

inner goblet
#

To answer your previous question tinder I don't seem to have problems in vscode

buoyant sand
#

I figured it could've been a incorrectly encoded file, but if it works fine in vs code then maybe neovim is doing something wrong, perhaps @harsh wing can help

inner goblet
#

thanks for your time 🙂

harsh wing
#

I don't think I had this problem before. Maybe a long time ago with another language.

#

Which version of the Neovim?

inner goblet
#

I'm on v0.10.2

harsh wing
#

oh, wow, is this a nightly version?

inner goblet
#

no release, though i'm on nixos unstable

harsh wing
#

It might be the problem, so try using v0.10.0 for now.

inner goblet
#

Ok will try and downgrade 🙂

oak quest
inner goblet
#

tyvm 🙂

bitter geode
#

Is there spellchecking in tinymist?

jaunty kiln
last crystal
#

is there a collection of snippets for typst, to use with Neovim+LuaSnip?

harsh wing
#

Tinymist does add a few snippets, but don't know of other snippets. With Typst you don't really need any of that.

lean latch
#

max397574/typst-tools.nvim
got some stuff there

harsh wing
#

I only have snippets for importing packages and a few small ones.

lean latch
#

i got a ton of snippets

harsh wing
#

Why?

#

I'm not sure Typst is that snippetable to make a ton of snippets and use all of them.

#

I have a few pretty useful, like adding a cetz canvas and fletcher diagram. But that's about it.

#

Ah, yes, and the most useful one is:

last crystal
last crystal
last crystal
# harsh wing Why?

I added for example over
automatically expands to overline({cursor here}) {and after pressing tab cursor is here}

lean latch
last crystal
#

btw, when I was searching for some snippets online, a guy used this:

vim.api.nvim_eval("typst#in_math()") == 1

to check if the cursor is inside math mode or not

is there a way to do it with tinymist? or treesitter?
I just dk how

#

he seemed to have some deprecated typst plugin ig

last crystal
#

oh, right
you have got that in your repo
awesome! ❤️

oak quest
#

Since the expression checker PR, we can check lexical kind of some identifier fast and reliably. But I cannot get accustomed to the theme color of the refined semantic tokens.

#

In the picture, types, modules, and constants all have yellow colors in my theme.

last crystal
# oak quest

omg
can you please share ur colorscheme and how you made that doc, if that isn't too much trouble? 🥹
looks so cool!

here's what I have :[

oak quest
#

If we define variables, it also shows different color than the builtin (constant) ones.

last crystal
#

yea

last crystal
oak quest
#

You should configure semantic tokens to get semantic highlighting (as shown by my screenshot)

oak quest
harsh wing
harsh wing
last crystal
#

idk, it feels much faster than typing by hand

lean latch
lean latch
#

also stuff like matrices
there is absolutely no way you get even close to the speed of me typing this with snippets

last crystal
#

btw, is there any way to make treesitter update on type, compared to on pressing esc/jk?

harsh wing
harsh wing
last crystal
harsh wing
#

Then just search for nvim-treesitter/nvim-treesitter or something, with it I definitely have everything working as it should be.

last crystal
#

empty file (the right window shows :InspectTree)

#

typed $$ without exiting insert mode

#

after exiting the insert mode with escape of jk

lean latch
#

it obviously does update because e.g. highlights are applied to newly written text

#

ig the syntax tree just doesn't

last crystal
#

btw, the thing I was writing here abt that lt. doesn't show autocomplete suggestions...

the issue was that one of the imported files had sys.inputs.at(value), which had no default key provided (for a reason tho: so I can quickly catch a bug if I did smth wrong)

so LSP just complained abt that and stuck

#

adding a default value resolved the issue

harsh wing
#

yeah, it probably always gets stuck if there is a single error, so no autocompletion or hover etc.

vital crown
#

[related to nvim, I think]

Does anyone have an idea of what this means?

If I use a new typst file and just insert one emoji, I get an error message.

#

File like this:

#

Error:

#

If I turn off lsp I don't get the error

#

I get the same error if I'm using Japanese in typst

#

And, the error comes very frequently - like, every time I stop insert mode.

harsh wing
#

I don't remember having such error.

lean latch
vital crown
vital crown
# lean latch the relevant part of the error is cut off

Uff.. yeah sorry. Here's the full text of it:

   Error  19:49:26 msg_show.lua_error Error executing vim.schedule lua callback: ...0.2_1/share/nvim/runtime/lua/vim/lsp/semantic_tokens.lua:304: ...0.2_1/share/nvim/runtime/lua/vim/lsp/semantic_tokens.lua:149: index out of range
stack traceback:
    [builtin#36]: at 0x010093d078
    ...0.2_1/share/nvim/runtime/lua/vim/lsp/semantic_tokens.lua:304: in function 'handler'
    ...eovim/0.10.2_1/share/nvim/runtime/lua/vim/lsp/client.lua:687: in function ''
    vim/_editor.lua: in function <vim/_editor.lua:0>
lean latch
#

hm
either a vim or tinymist error
not sure in this case
one thing you could do is go there and edit this file locally to debug what the range is

buoyant sand
#

Seems the lsp lua script is failing itself, not tinymist

#

Most likely a typical utf8 issue

vital crown
#

I will try to this workaround:

#

Well, that does something lol.
Now tinymist will just stop working with that offset_encoding work around.

20:04:01 notify.warn Client tinymist quit with exit code 0 and signal 6.
inner goblet
#

Have you tried downgrading nvim to 10.1 or using the nightly, I fell like it's the same pb I had and that solved the errors I got

harsh wing
harsh wing
#

Because the nightly builds definitely have more bugs than the stable ones.

vital crown
#

Ugh. No go on this and it's late for me. I'm going to head to bed...!

So, Andrew... versions:

harsh wing
vital crown
#

I grabbed the binary of neovim v0.11.0 (brew install --HEAD failed and I'm too tired lol) ... anyway, v0.11.0 doesn't give me an issue so that seems good. I'll have to troubleshoot installing it via brew later.

harsh wing
#

Hm, didn't know that v0.10.2 is actually the new latest stable version. But it's also strange that there are a few problems with .1 and .2 versions, while the .0 is pretty good.

buoyant sand
#

It seems tinymist cannot handle packages that require 0.12 as the compiler version because this patch is still 0.11.0, resulting in a failure at this check

context: #quick-questions message

harsh wing
buoyant sand
#

then maybe you have a better explanation for the linked message then

#

but that doesn't check the package version anywhere?

#

did you follow the links i sent

#

try using the newest fletcher package

harsh wing
#

I think I already did.

harsh wing
#

Looks fine?

buoyant sand
#

peculiar

harsh wing
#

Yeah, I even just downloaded the binary through the mason registry. Same thing.

buoyant sand
#

I'm not sure when or how the patch thing applies, but the fork that is linked in the cargo.toml of tinymist is not outdated in features, but the verison definitely is, which would explain the package check failing

#

since that usest the cargo manifest version

#

ok i retract what i said i forgot to check the tag that the fork uses

#

that indeed uses the updated version

oak quest
# harsh wing Looks fine?

You've used tinymist main. 🤩 But I also see the typical bad expression formatting (for the default values of named arguments).. I've considered it for a week. Might just replace the long values with their type, like label-wrapper: (any) => box = [:closure:].

oak quest
last crystal
#

this is going to be very strange..
but when I do
:che lspconfig
or
:che nvim-treesitter

tinymist immediately crashes...

#

Client tinymist quit with exit code 0 and signal 6. Check log for errors: ~/.local/state/astronvim/lsp.log

#

otherwise it works fine – goto def etc

harsh wing
#

can't reproduce with 0.10.0 + 0.12.0

last crystal
#

installed tinymist like this

return {
  "AstroNvim/astrocommunity",
  { import = "astrocommunity.pack.typst" },
}
#

this is just

return {
  { "kaarmu/typst.vim", ft = { "typst" } },
  {
    "williamboman/mason-lspconfig.nvim",
    opts = function(_, opts)
      opts.ensure_installed = require("astrocore").list_insert_unique(opts.ensure_installed, { "tinymist" })
    end,
  },
  {
    "WhoIsSethDaniel/mason-tool-installer.nvim",
    optional = true,
    opts = function(_, opts)
      opts.ensure_installed = require("astrocore").list_insert_unique(opts.ensure_installed, { "tinymist" })
    end,
  },
  {
    "chomosuke/typst-preview.nvim",
    cmd = { "TypstPreview", "TypstPreviewToggle", "TypstPreviewUpdate" },
    build = function() require("typst-preview").update() end,
    opts = {
      dependencies_bin = {
        tinymist = "tinymist",
      },
    },
  },
}
#

seems like this has something to do with highlighting(?)
going by textDocument/documentHighlight all over logs

harsh wing
#

Try reproducing the problem while running tinymist lsp --mirror ~/file.json. Then the crash must be present with tinymist lsp --replay ~/file.json. If so, then you can open an issue with the attached JSON file or send it to @oak quest if there is any sensitive info for you in that file.

last crystal
last crystal
oak quest
#

The experimental #example rendering looks amazing. It is even theme-aware.

harsh wing
#

Now we are approaching the inception level.

bitter geode
#

It could be a silly thing to think but do you thing you can integrated utpm on Tinymist in the package/commands section of the panel?

It could sync 2 projects used by the community and add more functionalities.

last crystal
# harsh wing Try reproducing the problem while running `tinymist lsp --mirror ~/file.json`. T...

I finally found some time for that
And managed to make it reproducible

here's the code that makes tinymist LSP exit when entering :che lspconfig

{
  "AstroNvim/astrocommunity",
  { import = "astrocommunity.pack.typst" },
  
  -- the trouble maker 👇
  { import = "astrocommunity.color.nvim-highlight-colors" },
}

commenting out astrocommunity.color.nvim-highlight-colors fixes the issue

And for the life of me, I cannot figure out how the hell that happened. I checked first all LSP / null-ls / Mason related configs, and somehow, the plugin that has nothing to do with LSP's, breaks everything 😢

here's what that import does under the hood:

return {
  "brenoprata10/nvim-highlight-colors",
  event = "User AstroFile",
  cmd = "HighlightColors",
  dependencies = {
    {
      "AstroNvim/astrocore",
      opts = function(_, opts)
        local maps = opts.mappings
        maps.n["<Leader>uz"] = { function() vim.cmd.HighlightColors "Toggle" end, desc = "Toggle color highlight" }
      end,
    },
  },
  opts = { enabled_named_colors = false },
  specs = {
    { "NvChad/nvim-colorizer.lua", optional = true, enabled = false },
  },
}

I will open an issue on astrocommunity, since the issue is not on the tinymist's end

harsh wing
oak quest
bitter geode
last crystal
#

and it looked like it also had something to do with textDocument/documentHighlight, as in my case

harsh wing
#

Then it's not a tinymist issue. And it's good that the package itself has an issue open for that.

last crystal
oak quest
# bitter geode I'm making a diff between them but I only saw `publish` command that can automat...

No worries. We could create an initial issue that first describes features and plans. This could also attract people to comment and rich the list of package related features to be done. For the publish command, I think it is a great function but tbh only package creators including me can benefit from it. There is already some light "local package commands" in current tinymist, which create, push, and pull "local" packages. We can also try to continue develop this idea, further managing and publishing "git" packages. But, there is no concrete concept about "git" packages yet. We can have some discussion on it before working.

copper cedar
#

I heard that typst will natively support html export, will that affect the preview for tinymist or typlite?

buoyant sand
#

probably not in the short term, but maybe in the long term

rough olive
#

guess not, because I heard that the official HTML output will look very different from the SVG one. However, we want them to look exactly the same for previewing.

jaunty kiln
copper cedar
#

I don't know the relationship of shiroa with Tinymist, but while that be modified for the official html export?

buoyant sand
#

i reckon once typst html export is good enough, shiroa would simply become an opinionated output template for html export

oak quest
# copper cedar I heard that typst will natively support html export, will that affect the previ...

For preview, tinymist can add a "target" parameter, either "html" or "paged". For typlite (markdown export), little thing can be done because the strategy was changed. There was a unified IR proposed after layout stage and before export stage. A markdown export should be benefited from having such IR. But the IR design is rejected for simplicity. New strategy is that: you must hard specify target to "html" to affect execution of script, and the content type (typst elements) becomes poor man's IR.

sleek wave
#

when i use tinymist in vscode, and i click in the preview somewhere, it will open a new pane with the .typ file and jumps to respective place line. is that intended? can i make it so that it uses my already opened editor?

copper cedar
#

The new pane should be the preview not the file

sleek wave
#

what do you mean by the preview? i CLICK in the preview

#

and i want it to jump to the typ file

copper cedar
#

oh I missunderstood you

sleek wave
#

oh actually now it works when i restarted vscode!

#

let's hope it keeps working

lone glacier
#

A few thoughts I had:

  • Typst-preview uses a ludicrous amount of CPU. This makes sense because the problem it's solving is hard, but it'd be nice to optimize it somewhat.
  • when the document is big enough that it stops being real time and instead starts lagging behind, the way it "catches up" is by replaying through every keystroke. It seems like it'd be faster and more CPU efficient to just abort any render tasks invalidated by a further keystroke and just start rendering the current state
  • Implementing that may be difficult, I'm not sure what it's doing under the hood, so probably much simpler would be a "render on pause" functionality of some sort, where it doesn't render on every keystroke but only when you go 0.2 seconds without a keystroke or whatever. While responsiveness of on-type is nice for small documents, it's not necessary and when I'm doing homework for 6 hours, it'd be nice to spare the battery life lmao
#

Love Tinymist though, use it for about 20 hours a week I think lmao

lilac hedge
lone glacier
#

I mean, memoization does not inherently make aborting impossible (either by rewinding or by only "committing" useful things) but that's why I figured it might be difficult, yeah

lone glacier
wheat garnet
#

Basically the difference between

a b c d      e   f
aabbccdddddD eeeefffffF

here, all renders were started but all but d and f were aborted before finishing

a b c d      e   f
aaaaaAdddddD eeeeeEfffffF

here, a was rendered even though keystrokes b, c, d already occurred, then rendering resumes at d.

I think that's even preferable, since you're guaranteed that there will be some renders that finish regularly

lone glacier
#

True, guaranteeing some forward progress is probably nice, though tbh I don't think anyone types continuously in bursts long enough for that to matter too much

#

but yeah, it would also hopefully help the power usage issues

#

Since if the renderer does less work, that's less power consumed lol

oak quest
lone glacier
#

Ah, fair enough—it looks a bit like faithful rendering but I guess the difference may be non-obvious

oak quest
#

But there is a little difference, typst-cli will wait for 100ms for possible consecutive user inputs, but typst-preview will not.

lean latch
#

🤔 also interesting that I‘m not experience any high cpu usage at all
and also never had lag
how big are your documents if I may ask?

lone glacier
lean latch
#

any particular reason why typst-preview doesn‘t use such a thing?

oak quest
lone glacier
#

But even when using ~10-15 page documents, Typst-preview burns through power faster than discord or a chromium browser with a hundred tabs

lean latch
#

🤔 debounce by 0ms is just queueing isn‘t it?

oak quest
lone glacier
#

Would it be possible to expose debounce timeout as a setting or something?

oak quest
lone glacier
#

shrug I dunno, I don't think I'm doing anything too unusual, though I have a decent number of non-local and fairly complicated show rules which might be affecting power usage

copper cedar
#

I think monitering the memory usage might also be important at the point (and maybe easier

lone glacier
#

Memory usage also gets very high

#

but this bothers me less because I have memory to spare

lean latch
#

I didn‘t experience any issues with power usage
even though can‘t know for sure because I didn‘t rly ever use my laptop without using typst-preview for a longer period of time xD

lone glacier
#

(I do get the impression that there a psuedo-memory leaks with insufficient cache invalidation, because reloading the preview can dramatically cut memory without substantially hampering rendering performance)

lean latch
# oak quest

not 100% sure if I interpet this correctly
but I‘m quite sure this just has a debounce >0
and with 0 it‘s sth different

lean latch
lone glacier
#

I dunno, I don't see why it would be because reloading just the preview without reloading all of vscode helps iirc

#

I'm on an M3 macbook pro using tinymist in VSCode

#

tinymist version is whatever the latest version is, no updates available

lone glacier
#

(I am, however, also a programmer, so I'm not entirely incapable in this regard, just not actually familiar with any such tools)

oak quest
lone glacier
#

I mean, should be power ≈ CPU usage ≈ a stack sample or whatever

#

any performance benchmarking tool should probably work fine

oak quest
# lone glacier Memory usage also gets very high

I'm recently busy with building basic infra of code analysis so things are getting worse recently. But I've done it just now. I'll turn to focus on optimizing CPU and memory usage for a wile.

copper cedar
#

I am doing some logs for the memory usage these days

oak quest
#

The bad thing is that every time I tried to catch some huge memory usage, that the final reason was that there was too much compilation cache in comemo.

copper cedar
#

but I only have toooo simple typst files

lone glacier
#

Would you like some 50 page files covered in stateful bullshit?

oak quest
# lone glacier any performance benchmarking tool should probably work fine

If we just care about CPU or memory stats, tinymist has very advanced arch among language servers. To catch concrete CPU/memory usage, you can record inputs by tinymist lsp --mirror and then replay inputs with having intel vtune (for flamegraph) or cargo build --release --bin tinymist --features dhat-heap (for heap memory stats).

https://github.com/Myriad-Dreamin/tinymist/blob/fc3099a27caed9724436c1259af8346b25145276/docs/tinymist/module/lsp.typ#L38

lean latch
lean latch
#

while keeping the document
would be useful for testing

oak quest
#

It now renders docs conditionally. There is a supportHtmlInMarkdown configuration item that controls whether to render equation and remove html in contents. The configuration item is not a user configuration, but for lsp client developers (people who are knowledgeable to configure editors).

oak quest
#

I posted Add More Maintainers to Tinymist and somepeople would like to become a maintainer of their interested domains. We are going to add them to list of maintainers on GitHub since 2024-11-22 (in 7 days):

Please reply in PRs or DM @Myriad-Dreamin if you have any concerns about adding these maintainers to list.

last crystal
#

how to replicate:

$ echo "Straße" > main.typ
$ nvim main.typ

text of the error:

Error executing vim.schedule lua callback: ...0.2_1/share/nvim/runtime/lua/vim/lsp/semantic_tokens.lua:304: ...0.2_1/share/nvim/runtime/lua/vim/lsp/semantic_tokens.lua:149: index
 out of range
stack traceback:
        [builtin#36]: at 0x0108f64def
        ...0.2_1/share/nvim/runtime/lua/vim/lsp/semantic_tokens.lua:304: in function 'handler'
        ...eovim/0.10.2_1/share/nvim/runtime/lua/vim/lsp/client.lua:687: in function ''
        vim/_editor.lua: in function <vim/_editor.lua:0>
#

with timymist disabled no error appears

#

and if there are only english chars it doesn't break:

$ echo "street" > main.typ
$ nvim main.typ
lean latch
#

quite sure the fix (or at least reason) was related to offset encoding
idk what exactly it was though

last crystal
last crystal
#

the wonders of downgrading a package on macos 😭

$ brew uninstall neovim

# manually find needed commit for
# https://github.com/Homebrew/homebrew-core/commits/master/Formula/n/neovim.rb 
# and copy its URL

$ wget [URL] && brew install --HEAD -s ./neovim.rb
==> cmake --build build
Last 15 lines from ~/Library/Logs/Homebrew/neovim/02.cmake:
/tmp/neovim-20241115-13099-j026jy/src/nvim/mbyte.c:1356:15: error: no member named 'ambiguous_width' in 'struct utf8proc_property_struct'
 1356 |     if (prop->ambiguous_width || prop_is_emojilike(prop)) {
      |         ~~~~  ^
3 errors generated.
lean latch
#

use bob for neovim installation

last crystal
lean latch
copper cedar
#

if u cannot downgrade, why not upgrade, it should be fixed already

copper cedar
last crystal
last crystal
#

f*ck this.
when I finally managed to build/install neovim 0.10.1 instead of 0.10.2, tresitter broke :((((((((((((((

whatever ig

lean latch
#

you definitely shouldn't be using 0.10.1

#

and as I said
with bob you'll have no issues installing different versions

#

this is my whole setup for tinymist with 0.10.2 and it works just fine

vim.api.nvim_create_autocmd("FileType", {
    pattern = "typst",
    callback = function(args)
        vim.lsp.start({
            name = "tinymist",
            cmd = { "tinymist" },
            root_dir = vim.fs.dirname(vim.api.nvim_buf_get_name(args.buf)),
            autostart = true,
            settings = {
                exportPdf = "never",
            },
        })
    end,
})
#

oh actually

#

I got this in my on_attach

if client.name == "tinymist" then
    -- vim.lsp.semantic_tokens.stop(bufnr, client.id)
    client.server_capabilities.semanticTokensProvider = nil
end
last crystal
#

hmm

lean latch
#

to just disable semantic tokens

#

ig they're broken for me too

last crystal
#

thanks!

lean latch
#

🤔
just removed that line and everything's working fine xD
so ig stuff has been fixed either on tinymist or neovim side

harsh wing
stray heron
#

Guys, the last time I asked about Tinymist's preview, someone said that it's being worked on and there will be a newer version that's faster, more performant. Did those changes get committed?

oak quest
copper cedar
oak quest
#

I finally make ufcs work.

jaunty kiln
#

Ultimate fighting championship?

oak quest
#

😂 unified function call syntax

#

The rule is in short: if the "dotted" target is T type, lsp will complete functions accepting target as the first argument (having T type) for you.

toxic minnow
#

fantastic!

rough olive
#

amazing!

cursive bough
#

Wow I saw the praise and then went "WHAT DID I MISS?!". Loooks beautiful!

copper cedar
#

Awesome! is it pushed to the repo? Can;t wait to use it!

#

I also hope that Typst can have the UFCS built in

oak quest
buoyant sand
#

I've updated to what appears to be tinymist 0.12.2 and despite the logs reporting that it receives the config with exportPdf = never it still does occasionally export the pdf for some files and I don't know why

oak quest
oak quest
#

Challenge: create an aligned image without pressing "brace buttons".

copper cedar
#

How can I setup vscode to use the Tinymist in my path without setting its full path?

oak quest
#

no ways out of box; you could bundle an extension again with the specific binary.

copper cedar
#

I prefer create a feature request for it maybe🤪

oak quest
#

What's your use case? Why do you have to use a binary on some relative path?

copper cedar
#

Not relative path, but I hope it search the server on my system PATH

#

Or can I use any environment variables in the config?

#

For example, zig.zls.path: "zls" config, Path to zls executable. Example: C:/zls/zig-cache/bin/zls.exe. The string "zls" means lookup ZLS in PATH.

oak quest
#

I just checked if. What if you set configuration tinymist.serverPath to tinymist

copper cedar
#

It's working🥸

#

ty

oak quest
copper cedar
#

Why Neovim users need this? Isn't neovim tryies to use tinymist from the $PATH by default?

oak quest
#

in fact for all editors who own users loving cargo install. they use tinymist from .cargo (env)

copper cedar
#

It might be helpfule to do it like this for VSCode only

scenic wolf
#

Thanks for this amazing project!
Any chance for supporting custom snippets?

buoyant sand
#

aren't custom snippets a vs code thing? you don't really need any tinymist support for them i believe

#

at least last i checked

scenic wolf
#

Looking for a walk around for Helix haha

buoyant sand
#

ah LSP also supports this independently it seems

lean latch
#

that's something you'd do in your editor

scenic wolf
oak quest
lean latch
#

🤔

#

ic

buoyant sand
#

a language server should also not really handle custom snippets i think. that's the editor's job, the lsp should only provide common ones for a langauge on top of those

cursive bough
buoyant sand
#

hmm, an odd choice though considering vs code supports them by itself

#

and so do plenty of other editors

patent ibex
#

Are snippets something packages might be able to ship? If tinymist knows where packages are stored, could it look for "snippet files" or whatever? Thinking like cetz or fletcher

empty girder
#

I have a large document where VSCode is getting particularly laggy. Is there a way to start tinymist in a more “minimal” configuration? Syntax highlighting and preview are probably all that I need to work either way

jaunty kiln
#

are you saying vs code is lagging, or the preview is lagging?

#

getting fast preview on large documents requires you to be careful when choosing what kind of packages you use

#

some are massive resource hogs

empty girder
#

The preview seems fine but the editor is really laggy

jaunty kiln
#

ok

empty girder
#

My baseline is Typst watch perfomance, with that running I can write just fine

cursive bough
#

Fascinating. How many lines is it?

oak quest
empty girder
empty girder
jaunty kiln
oak quest
patent ibex
#

I've experienced slowdowns with tinymist previously, generally when working with cetz. Is there some cache that's just exploding in size or something maybe?

oak quest
#

Is the problem still existing in 0.12.4?

patent ibex
#

Not sure as I haven't had much time for typst stuff of recent, so I think for the moment what I said should be read as an anecdote

#

I just remember constantly needing to reload the window

#

(ps: tinymist is awesome, and what I'm saying doesn't detract from that <3)

oak quest
#

I added more caches in 0.12.2+, so things might change.

patent ibex
#

I'll try and find a moment to test. What sucks is I don't know concretely what makes it slow down so testing isn't the easiest

harsh wing
#

I've also noticed that not all errors are shown in the file, so if the document doesn't update I have to open a shell and run typst manually to see the error. I'm not sure if it only does that when the error happens in some package file or not, but even if so, I would like to see the error in the main file where the package is being imported.

#

Could be a new feature? Or should this already work like this?

harsh wing
#

Looks like codly() parameters are also not autocompletable.

oak quest
oak quest
#

I doubt whether we can complete its parameters without any other information 🤔.

harsh wing
#

Oh... ok, I didn't think that there are no explicit parameters. Now I'm not sure if it was working before or not. I feel like it was. But the parameters are available only in 0.2.0. I used 1.0.0 before.

harsh wing
oak quest
#

The related issue caused sublime users receiving command-not-found errors again and again so I merged some commit and opened this issue for neovim.

#

Only shows that not all efforts are done at the server side, so we defintely have different experience in different editors.

viral trench
# oak quest

Yeah codly it wayyyyy too complicated unfortunately, it has like 60+ args I think

#

And I use this weird JSON file to automate most of it

#

Maybe I'll make a 1.1.2 with it done "traditionally"

jaunty kiln
#

Can't the documentation be automated too?

patent ibex
jaunty kiln
#

That's what I thought we were talking about

oak quest
#

no, it cannot document a not existing parameter (we must also document whether it is positional, named, or variadic). But I might change it somehow

patent ibex
#

It would be good if we could. It could check if the function accepts vargs (error if undeclared Param is defined when vargs aren't used).

oak quest
#

When I implemented docstring, I found that the current way of documenting types of parameters is not good. The best way in my mind is typescript's overloaded sigantures. https://www.geeksforgeeks.org/typescript-overload-signatures-and-implementation-signature/

patent ibex
#

Typescript is 🤌😊

#

That said documented vargs still have their place, like in cetz-plot for axis options

oak quest
#

There is also a great example in typst is rgb. will look like this in typescript:

function rgb(hex: string);
function rgb(r: number, g: number, b: number);
viral trench
#

The main problem is that codly acts like a set rule

#

I don't want to override arguements that are not provided

#

but there is no good default value that I can use for it

#

since auto and none are used as actual argument values

#

and therefore cannot be used as placeholders

oak quest
viral trench
oak quest
#

The code is easy to understand.

viral trench
#

I see, just a dict with a special value

#

ugh that's not bad, but a bit ugly

wheat garnet
#

if you want to get really cursed, you can do let _placeholder = context none, afaik that's not equal to anything, not even other context none 😛

patent ibex
#

Typst enums when

patent ibex
#

Is it equal to itself?

wheat garnet
#

?r ```
#let _placeholder = context none

#(_placeholder == _placeholder) but #(_placeholder == context none)

patent ibex
#

Awh heck yes, unique symbols!

oak quest
#

🙀

#

How do you find so hacking ways?

wheat garnet
#

a quick question made me think of it; I'll look for it, I want to know myself 😅

#

#quick-questions message no context (pun not intended) there, must have been a spontaneous thought...

oak quest
copper cedar
vital crown
copper cedar
harsh wing
copper cedar
#

test should be able to catch such errors

#

(but I am too lazy to understand how to write snapshot test for completions yet

oak quest
#

For the completion one, yes snapshot testing can cover that. For the missing diagnostics, I don't know the way of continous testing that for neovim. There were suggestion about some lua framework, but I haven't started for years.

#

when I asked neovim one, I wrote some scripts that automate testing electron+vscode by myself. The diagnostics in vscode then never went wrong after that.

harsh wing
#

Does cargo build still depend on yarn run compile for the 2 sub projects?

copper cedar
#

I think no

#

As tinymist already has a pretty good support for doc comment before typst, should we consider create a linter from tinymist?

oak quest
copper cedar
#

Does anyone using tinymist with Neovim has such error when using postfix snippet for context, like text.fill. It's only happening on Neovim, I am not sure is it problem from Neovim, cmp/blink or LspConfig.nvim(Or my config)

oak quest
#

neovim may be applying additional text edits with side effect, i.e. replace and calculate the ranges in order and one by one, while VS Code sorts and applies text edits to ensure all ranges are applied based on the state of text document before change, as lsp required (but undocumented). You could try to ensure the order at the server side and see whether the bug is fixed.

harsh wing
#

I saw this with text size.

harsh wing
#

So... Now the import items do autocomplete, but...only if I start typing them. There are times when I just want to see which items I can import, so having just : still doesn't show any import items.

copper cedar
#

excited you are correct

#

let me fix it

harsh wing
#

thanks

copper cedar
copper cedar
# oak quest neovim may be applying additional text edits with side effect, i.e. replace and ...

Seems that we should avoid using additional text edit for completion items

An optional array of additional text edits that are applied when
selecting this completion. Edits must not overlap (including the same
insert position) with the main edit nor with themselves.

Additional text edits should be used to change text unrelated to the
current cursor position (for example adding an import statement at the
top of the file if the completion item will insert an unqualified type).

oak quest
copper cedar
#

I am pretty sure they overlaped with the main edit here

scenic wolf
#

The formatter in helix is not working for me, any tips on how to fix that?
in the config the lsp is defined as follows:

[language-server.tinymist]
command = "tinymist"
config = { formatterMode = "typstyle" }

buoyant sand
#

I think helix doesn't yet support formatting like that

oak quest
#

Is it known to ever work?

buoyant sand
#

rust analyzer does it, but I believe it works out side of helix by formatting the file itself

harsh wing
#

I remember that hovering over * should reveal all the items that were imported, right? Guess if this currently works or not.
Not that I really need this, but it's an interesting feature.

copper cedar
oak quest
oak quest
#

it is amazing that we have already created 791 test points by snapshot testing, but this is still far from covering all features..

> (Get-ChildItem -Path $folderPath -Recurse -Filter  '*.snap' | Measure-Object).Count 
791
harsh wing
#

The good news:

#

The bad news:

oak quest
harsh wing
#

nice

copper cedar
#

How do I get the type of an expr with its ast node in the code of Tinymist properly?

oak quest
#

SyntaxNode or LinkedNode? You'll get proper type by ctx.type_of_span or collect all related union types by ctx.literal_type_of_node()

#

for the latter one, it also sees the context, e.g. call context if the node is the part of a call, so is much slower. for example, given a query on the string node in read("path"), the former one only says it is string type but the latter one also says it is a path (type) as the string is used for the read function.

last crystal
#

sorry for a probably too basic question, but how does tinymist render to html?

does it like reimplement typst compiler from scratch, or does it use it as a black box and transforms pdf to html, or maybe something different?

#

going by this issue, it looks like vanilla typst compiler can't compile to html 🤔

GitHub

A new markup-based typesetting system that is powerful and easy to learn. - Issues · typst/typst

jaunty kiln
oak quest
vast rock
#

tinymist uses the typst compiler as a dependency and always releases two versions, a stable one and an rc based on the most recent commit

harsh wing
#

Is it known that (I think) always the named parameters are not the immediate items in autocompletion? I always look at the list, hoping that I will find that I'm looking for, but usually I have to partially write the thing for it to even appear in the list, let alone be at the very top.

oak quest
#

What do you mean? I don't understand but your neovim completion plugin might reorder the list by their owned intelligence.

harsh wing
#

Try this

oak quest
harsh wing
#

{ name = "nvim_lsp" }, is the first source in hrsh7th/nvim-cmp.

harsh wing
# oak quest

no-no, in a new file with a clean launch of tinymist

#

otherwise it always can suggest different things depending on the context and previously chosen items.

oak quest
harsh wing
#

weird

copper cedar
#

cmp nvim has a ranking mechanism for items, I think it's theirs fault. Btw, I would recommend you to hover for doc instead of betting on a smart rank from completion in this case, as typst functions usually have a long~~~ list of arguments

copper cedar
harsh wing
harsh wing
lean latch
harsh wing
lean latch
#

not 100% sure tbh
you could change source priorities
and perhaps overwrite the scoring function (should be possible, I haven‘t done it before though)

harsh wing
#

I'm not sure if I have this problem with Python or Rust, but I need to pay more attention. Because if it's just tinymist, then I'm surprised the plugin only messes one server.

lean latch
#

🤷‍♂️

#

it's just that the only thing a language server can do for sorting of the entries (to give some entries a higher priority that is)
is just providing a dummy sort text (alphabetic characters or numbers)
which is just a horrible hack

#

so all the sorting is just done on the client-side (nvim-cmp) in your case and tinymist can^t really do anything (apart from hack mentioned above) against it

harsh wing
#

Wait, who does the contextual item suggestion? Isn't it a server? Like, when you trigger a completion menu, doesn't the client send the cursor position to the server with the file content and the server needs to figure out which items should appear on top?

#

in my client I only know that I can change the priority from different sources, but the lsp is at the top.

jaunty kiln
lean latch
lean latch
#

also what is interesting
that apparently in vscode you get very different completions

harsh wing
#

We need Helix people to show what are the suggestions for this: #1260973804637786224 message

#

@buoyant sand

buoyant sand
#

which version of tinymist

harsh wing
#

I have v0.12.10-9-ga1fdeab

buoyant sand
#

ok --version does not show this for me

#

it shows the version of the typst source

harsh wing
#

because I compiled myself recently

buoyant sand
#

ok

harsh wing
#

I think the version name should be fixed, because there is no g in a1fdeab commit

buoyant sand
#

I can't find a1fdeab either

harsh wing
#

the branch is probably deleted, it's fee46d2 on the main

#

5 days ago

#

oh, wait, no

#

ab23463

harsh wing
buoyant sand
#

ok I'm building

#

500 crates is crazy

harsh wing
#

yeah

#

but wait till you see the Dioxus CLI building...

#

1000+ dependencies...

buoyant sand
#

someone should smack them

harsh wing
#

It went up from 750 in maybe a year

buoyant sand
#

dependency hell is awaiting

harsh wing
#

I see a neovim-completion-cb branch

#

ok, it's not related to this

#

btw, here is my updated justfile:

install: pull
  cargo install --path ./crates/tinymist/ --profile gh-release --locked
  cd target && \
  llvm-objcopy-14 --compress-debug-sections --only-keep-debug "$CARGO_HOME/bin/tinymist" "tinymist.debug" && \
  llvm-objcopy-14 --strip-debug --add-gnu-debuglink="tinymist.debug" "$CARGO_HOME/bin/tinymist"
  cp "$CARGO_HOME/bin/tinymist" "$XDG_DATA_HOME/nvim/mason/packages/tinymist/tinymist-linux-x64"

alias p := pull
pull:
  git pull

alias c := clean
clean:
  cargo clean
#

I'll try the latest just in case

harsh wing
buoyant sand
#

this is what i see on b19810ea

harsh wing
buoyant sand
#

apparently

harsh wing
#

I need to make a MRE later

harsh wing
harsh wing
#

I think tinymist had this feature at some point:

#

But now it shows docs for both parentheses.

#

Is this a yet another broken feature or was it removed?

copper cedar
#

what is this feature, I dont get it

harsh wing
#

It's super useful as it does not require a let or panic to see the result value.

harsh wing
oak quest
#

It just prefer to showing the signature of map call than showing values for you.

harsh wing
#

Who is "it"?

#

If rust-analyzer can do this, then it means the server has the ability to choose.

copper cedar
#

it's falut of typst and neovim

#

vscode behaves a little better

#

btw if you use neovim , you have to always check workspace diagnostic, for me, I use :Trouble diagnostics

harsh wing
#

Who's Trouble?

copper cedar
#

trouble.nvim

harsh wing
#

yeah, so this isn't shown is any of 2 local files

harsh wing
copper cedar
harsh wing
#

no

#

or I'm blind, but I fixed the issue, so I can't double check

copper cedar
#

can I have a smaller example?

harsh wing
#

I accidentally edited a file in the package and not the local

#

I redownloaded the package

#

no example

copper cedar
#

fine, in short, only limited errors can be shown on the caller side, most are only known at compile(run) time, and can only be shown on the callee side.

harsh wing
#

server can't figure out the call stack?

copper cedar
#

let me create a simple example

#
// main.typ
#import "lib.typ": testFun

#testFun(x: "1")
// lib.typ
#let testFun(x: 1, y: 2) = {
  x + y
}
// result from typst compile main.typ
error: cannot add string and integer
  ┌─ lib.typ:4:2
  │
4 │   x + y
  │   ^^^^^

help: error occurred in this call of function `testFun`
  ┌─ main.typ:4:1
  │
4 │ #testFun(x: "1")
  │  ^^^^^^^^^^^^^^^
#

now the help: is handled as a realtedInformation (which is a common practice I believe), while neovim cannot handle this, but vscode shows it

#

You might not like this behavior, but this is the limit of dynamic type language.

#

Python lsps might behave worse in this case.

#

At some point Tinymist will diagnostic for wrong type, but that will bepends on the type check of tinymist

#

Bubble up this diagnostic is not simple, there might be a long tracing path, it's hard to determine where exactly we want to show it.

harsh wing
#

I want to see it at all levels for easier discoverability

copper cedar
#

having multiple diagnostics points to the same issue might not be a common thing

wicked quest
#

This is the distinction between diagnostics and workspace diagnostics in Neovim

#

I ended up going with Trouble too, but you can also use fzf-lua: require('fzf-lua').diagnostics_workspace()

harsh wing
oak quest
harsh wing
#

old but gold

oak quest
#

@harsh wing I forked your typstfmt and bumped it

#

may push the changes back to your repository.

trim juniper
#

Hello, I've been trying to add "PageUp" and "PageDown" to change slides in tinymist-preview
I found the place to add them in tools/typst-preview-frontend/src/ws.ts but i cant figure out how to include the changes in the final binary

why im doing this?

KDE Connect's presenter remote uses page up and page down buttons for changing slides

#

(please ping me if anyone replies)

copper cedar
#

For now, left/right arrow keys works as pageup/down

#

btw, it might be working just you are not rebuilding with that module

#

checkout tinymist assets

#

@trim juniper

trim juniper
trim juniper
trim juniper
#

what i tried

do yarn; yarn build for all 3 folders in tools
do yarn, yarn build:preview, build:editor-tools in root
do cargo build --profile dist -F typst-preview

it still didnt change the script for preview

copper cedar
#

@trim juniper

trim juniper
#

kk lemme try

#

it works now!

#

thank you <3

harsh wing
#

I'm thinking that I probably should implement that new version with markers.

#

For a much better formatting

#

And I think it will also fix the un-typstfmt::off.

harsh wing
#

With 0.12.10 I don't get the label completion if there is ( before @:

iea <a>
(@)
oak quest
#

@harsh wing webapp also has this issue, because (@) is a whole text and the @ inside doesn't trigger any completion.

#

not a regression

#

I sometimes float some thinking in mind to invite you to add some cases in tinymist-query/fixtures/completion. This is a set of fixtures testing the completion function. You can also view it as the details how we expect a completion to work. We could add a specification file that systematically sort and identify each of them.

harsh wing
#

is this a typo?

copper cedar
#

this testcases is not needed, maybe @oak quest used it for test and forgot to delete it

harsh wing
#

I've noticed that at least in some cases it will incorrectly autocomplete half-written item.

oak quest
#

it is a known issue that cannot be solved by current completion framework. it might be solved when we switch to a new framework.

harsh wing
#

Well, I'm not sure, but I think previously or in other situations tinymist autocomplets half-written items just fine. So what's the difference between such situations?

copper cedar
#

what does completion framework mean?

harsh wing
#

probably some crate

copper cedar
#

seems that the completion part of code is refactored

strong bear
#

I'm very close to solving all of the neovim issues but I'm geting a weird error

#

tinymist: -32602: expect Vec<String> at args[0], error: invalid type: string "/Users/sylvanfranklin/.config/test.typ", expected a sequence

#

I'm sending it like this lua vim.lsp.buf.execute_command({ command = 'tinymist.doStartPreview', arguments = { vim.api.nvim_buf_get_name(0) }})

harsh wing
#

I had kinda the same error, but in a completely different program.

strong bear
#

huh

harsh wing
#

Though since both of them written in Rust, maybe they are about the same thing.

strong bear
#

yeah they are going through the same api in the end

#

but interesting you say that bc I thought it was a lua problem on my end

#

thing is it works when I just type the same thing into the cli so I'm lost

harsh wing
#

My error was in Dioxus when I used the submitted form data like let data: MyData = event.data().parsed() or something and it said something very similar with the same set of words. And the problem was that each field/name/value was of type FormValue(['']) and not String. MyData struct was a set of String fields, since in web all fields will be sent in a string form anyway. So instead I had to do this, cuz I don't know any other way:

#

I was going to make it a bit better, but I don't have time for this.

harsh wing
oak quest
harsh wing
oak quest
#

you are requested to pass the clI arguments of typst-preview

#

as.the first argument of the command

harsh wing
#

then I'm probably right

#

nope

strong bear
#

wait no you are onto something though

harsh wing
#

maybe the API is simply not interoperable?

strong bear
#

I'm still confused but I see what you are saying

harsh wing
#

like, in Lua it expects a single string for the command, but in tinymist it expects an array.

#

and somewhere in between there is a miscommunication

strong bear
#

could be yeah, I'll keep trying tho

strong bear
# oak quest

I see how you are calling that function, but do you have a guide for that somewhree in the docs?

strong bear
#

okay fixed that issue

#

now passing correctly as an array, but still not opening the frontend for some reason

strong bear
#

I did get exportingPNG to work though which is very promising

#

hoping to get full parity by tommor and push an updated lsp config + docs

oak quest
#

The commands are really a bit internal. They are internally used and indirectly documented somewhere in vscode though. Perhaps we should also maintain some docs of these commands for other editors.

oak quest
# strong bear I see how you are calling that function, but do you have a guide for that somewh...

No, I'm not documenting that. Due to my limited bandwidth to open-sourced projects, documentation is only issue-driven or chat-with-me-driven :(.

GitHub

Since lack of contributors, we focus on adding more functions instead of documenting everything. But tinymist has finished its software architecture since 0.12.2, it'll deserve to slow down dev...

modern falcon
#

thank y'all smart people for fixing these issues!

strong bear
#

okay sounds good

#

if I have time I can try to write the docs for that once I understand it a little more

#

I think it will be much easier for people maintaining the other editor integrations

oak quest
#

You could directly ask me to get answers quickly. I was answering in short words because I was on my phone, but when I back to the front of my computer, you solved it by yourself.

strong bear
#

okay thanks

stray heron
#

I noticed that the preview in VSCode is a lot clunkier than the preview in browser. Why is that?

toxic minnow
#

vscode webview and editor live in the same thread. so they will share the cpu/gpu resource. when in chrome, they are in different processes, so generally it's more fluent when open preview in browser

oak quest
#

I start to design the tinymist.lock instead of some configuration. All of our previous design of project configuration seems not very easy to use.

#

New design introduces a tinymist.lock connecting typst compile with the tinymist. Let's alias typst compile to tinymist project-compile, then tinymist can "instrument" your compilation in terminal!

Then, when it runs compilation compile main.typ, it will know the main.typ is a main file, and all of the dependencies are known as well. We can store these information into the lock file. Our language server can be also very responsive by watch the file. Fairly easy, right?

Let's also introduce a headless preview which doesn't specify any input to preview. This looks very nice for TUI editor users, e.g. neovim and helix.

  • In a fresh workspace, tinymist preview will wait for people performing any action, e.g. typst compile (the tinymist project-compile).
  • When you execute typst compile, it updates the lock file, and tinymist reloads the compiler with the compiled main file soon.
  • In a recently visited workspace, tinymist preview can simply use the recent (the entry having highest priority), and your "state" is recovered successfully.

This is my random thought today, and I implemented it quickly. Some details could be discuss or we can also discard the lock file design if we feel it is not great actually.

harsh wing
#

I failed to see the usefulness in this. Sounds like I will have to run the compile/watch command anyway.

oak quest
#

Weren't you running pin commands repeatedly?

#

If you add some extra arguments to tell tinymist to export PDF on save or on type, you'll not have to run compile/watch in the workspace after that anymore.

harsh wing
#

Well, I don't always want to export the PDF, but I always want to have the best LSP suggestions.

#

And I remember that after pinning the main file some other files where autocompletion works to some degree stops working. I don't want that too, if I can just not pin the main upon opening the editor.

oak quest
#

If you don't want to export the PDF on save or on type, you can set it to never. Then the "tinymist compile" only save the information about the compilation, like the main file and depended source files into the lock file. You can somehow customize the main file to use by such a sequence of compilation (or introduce some priority design).

#

like "tinymist compile main.typ" and then "tinymist compile main2.typ". Or saying main2.typ has higher priority. tinymist can use main2.typ to compile first if the viewing file is any dependencies of main2.typ, otherwise it uses main.typ when possible, otherwise it uses the current opening file.

harsh wing
#

I'm gonna be honest, after the first sentence, the rest doesn't make any sense to me. Sounds like something about nothing. x)

copper cedar
#

to me a project level config sounds super useful for the one and only editor without plugin for type preview, helix

strong bear
#

I agree I think that it could take a lot of pressure out of the imlementation of language server featuers for all the different editors

#

or at least it could make it much easier

#

on the neovim side I would like to work on getting more of the featuers that are built into vscode, like commands for exporting images and html / markdown

#

it is possible to call them currently but kinda internal

#

I don't know how changeable the nvim-lspconfig code is

#

if we can't push changes to that the next best thing is just expanding the docs to show examples for setting up all of these client commands as easy to call neovim commands

harsh wing
#

at that time the upstream config broke something so I stick to mine.

#

don't know if this has changed

strong bear
#

yeah pretty much same

#

I have a bunch of years experenice with configuration though and I feel like newer people might struggle to set up some things

#

also you're right I think something kinda broke

#

preview for me

harsh wing
#

I think the only concern was the one-file-mode, other than this probably is good.

#

well and the default settings like saving pdf etc., but that can be set with the upstream config

oak quest
#

finally the time to get rid of pin. It remembers which ones are main files after editor reloading and typst compile in terminal.

#

With remembering main files, when I switch to the template file, it still shows values in the template functions. This is the screenshot.

scenic wolf
#

Someone here is using helix and knows how to define formatting for typst?

buoyant sand
#

I think helix doesn't yet support explicit formatting through an LSP

#

Last I checked the keybind for it it said it was disabled for now

#

rust analyzer has a setting to simply format a file on save, so if tinymist does too that should work

scenic wolf
#

Thanks!

signal moss
#

can tinymist export to SVG? I did not see the option.

somber drum
#

Hey there, is there some way to have tinymist preview working properly in Zed? I don't necessarily mean the SyncTeX-like clicking but rather the quick refreshing of the pdf

jaunty kiln
somber drum
#

Hmm okay, is there still some way to have a quickly refreshing preview?

#

It could work with some pdf viewer but I sadly haven't found one that does refresh automatically and doesn't blink on every refresh

jaunty kiln
#

Disclaimer: I have not tried it

#

not sure if it does preview at all

harsh wing
#

Someone is using zathura, but when I tried it it was crashing waaay too much.

somber drum
somber drum
somber drum
#

For some reason the pdf is really blurry in mupdf...

#

Even with -r 300

#

Feels like both don't really suit me, don't know any of the vim-style keybindings and don't really wanna learn them :/

#

I'm currently using vscode + tinymist but also not really feeling it...

harsh wing
#

Something is wrong.

#

In MuPDF I think I only use g and G from Vim motions, other shortcuts are app-specific.

#

I also use Z and I. That's about as much as you need to learn.

oak quest
oak quest
signal moss
somber drum
somber drum
harsh wing
strong bear
#

yo neovim people

#

looking to export svg

#

I got that working recently

#

I'll open a pr to show how I did this in the neovim docs

#

cuz currently it's kinda internal

modern falcon
normal harness
#

has anyone here used typst with termux? tinymists seems to be incompatible with Android. it would have been great to have all those lsp features. could anyone share any info or guidance please ;)

normal harness
harsh wing
#

You can potentially set everything up with nix via nix-on-droid

#

but for me it takes a lot of minutes to add anything new.

#

But it does work. It's basically like a home-manager setup.

normal harness
# harsh wing I don't see it.

what do you mean ( my message was just exclaiming that i didn't bother to check if there is a termux package before going through all those time consuming steps. i wasn't complaining )

normal harness
buoyant sand
#

I don't think you want to dive right into nix then

#

Honestly I'm gonna be a bit of a dick head and say don't listen to Andrew right now giggle

normal harness
harsh wing
normal harness
#

hm? it does for me

harsh wing
normal harness
harsh wing
#

ok, so the cli is misleading. if I run a command that isn't installed it will show that I can install it. But with tinymist it didn't do that.

#

and with apt show tinymist it also didn't show it

harsh wing
#

but installing it anyway does result in installing a package

normal harness
#

okay

harsh wing
#

I guess I should've used pkg search.

normal harness
#

ah yes. im not used to apt so i didn't think of using it

harsh wing
#

Is the HTML feature present/enabled in the tinymist?

oak quest
#

the compilation and analysis targeting HTML was supported last month. but it is not smooth to configure a document and its dependencies to target HTML. I should not provide a configuration item to switch between paged target (pdf) and html target, because it is a document-specific option, i.e. whether a document is targeting html or not.

#

to make an analogy, typst has introduced something like "crate-specific feature", but we cannot enable all features at the same time. it is kinda worse because we can somehow have a global configuration item in rust-analyzer that enables all feature and runs diagnostics and analysis once, but we have to run once for paged and run once for html in typst and deduplicate results then.

oak quest
harsh wing
oak quest
oak quest
harsh wing
#

it doesn't show html globals

oak quest
#

ok html module is not in global if html feature is not enabled

#

then we are unlucky.

oak quest
harsh wing
oak quest
harsh wing
#

nightly builds are experimental

#

you can make it a feature flag and only enable for nightly builds

somber drum
#

Exactly 1k commits on main!

cursive bough
#

Is it possible to zoom in in the preview pane?

jaunty kiln
cursive bough
#

I tried cmd plus and minus. Didn't work. Also ctrl plus and minus.. Didn't work. Scrolling did though.!

oak quest
cursive bough
#

I cannot even... 👏 👏 And one more for good measure 👏

keen moon
#

Is this extension working on vscode-server?

oak quest
keen moon
modern falcon
#

Does anyone else have the issue that when something is pasted in, that gets ignored?

#

-# I’m using neovim

harsh wing
#

Since when?

modern falcon
#

ok, wait

#

it's not when pasting

#
[ERROR][2025-02-04 10:52:12] .../vim/lsp/rpc.lua:770    "rpc"    "/home/tijme/.local/share/nvim/mason/bin/tinymist"    "stderr"    "[2025-02-04T09:52:12Z INFO  sync_lsp] notifying textDocument/didChange - at Instant { tv_sec: 337, tv_nsec: 682524111 }\nthread 'main' panicked at crates/tinymist/src/server.rs:976:26:\ninvalid range\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace\n"
#

this is when

#

uh

#

i'm using rofimoji

#

and it's typing it out for me

#

or when i press tab with copilot
-# this seems to have been fixed ig, used to have problems with this

harsh wing
#

which should be basically the same thing

#

The only reason I can think of is invalid UTF-8 string.

#

But how can you paste it from a valid Unicode, I have no idea.

#

Maybe tinymist doesn't support some range of Unicode code points?

modern falcon
#
[ERROR][2025-02-04 10:59:35] .../vim/lsp/rpc.lua:770    "rpc"    "/home/tijme/.local/share/nvim/mason/bin/tinymist"    "stderr"    "thread 'main' panicked at crates/tinymist/src/server.rs:976:26:\ninvalid range\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace\n"
harsh wing
#

Check the pasting implementation

#

splatmoji:

  config['history_length']=5
  config['paste_command']='xdotool key ctrl+v'
  config['rofi_command']="rofi -dmenu -p '' -i -monitor -2"
  config['xdotool_command']='xdotool sleep 0.2 type --delay 100'
  config['xsel_command']='xsel -b -i'
modern falcon
#

Looks like wtype

harsh wing
#

I guess some wayland stuff.

modern falcon
#

fr

marsh lance
somber drum
#

Hey, just wondering when the preview in browser for Zed is supposed to be released

#

It was supposed to be in 0.12.20, but I can only see a 0.12.21 branch

#

How will this feature work and is there any way to use it in the nightly 0.12.21 branch?

keen moon
oak quest
#

the related prs are still in draft.

somber drum
somber drum
jaunty kiln
cursive bough
oak quest
jaunty kiln
#

@oak quest I should clarify, the picture above is an error message I get any time I try to run the restart server command

oak quest
jaunty kiln
oak quest
#

Some bugs are reported via the group in the chinese community.

cursive bough
#

How big is the Chinese typst community? Or how many are active? I'm very curious 😊

oak quest
#

There are thousands of people in the group, and a small dev group having 19 developers. They talk about typst from time to time, :).

jaunty kiln
#

Would it be possible to change the font used for the symbol list?

marsh lance
#

oh wait, this is the tinymist forge

jaunty kiln
marsh lance
#

I thought you were talking about the docs

jaunty kiln
#

I want it to match my math font

marsh lance
#

yeah, I was confused because the docs do use New CM Math

#

though I guess you're a Stix Two user?

jaunty kiln
jaunty kiln
marsh lance
#

most come from New CM Math simply because the first two don't have them

jaunty kiln
#

Maybe it would be a good idea to make NCMM the first entry in the list?

marsh lance
#

yeah maybe, I can't remember whether there was a reason to do it this way

jaunty kiln
#

I don't think Latin Modern Math is necessary, since it won't contain anything NCMM doesn't

marsh lance
#

that's probably just a relic

#

not sure we even have it in our font assets

jaunty kiln
signal moss
#

Is there a way to use a previous version of typst with tinymist?

jaunty kiln
signal moss
#

Awesome, thanks

solemn tulip
#

just updated today and it seems tinymist no longer provides stack traces for errors in the output panel. Is there a way to enable it?

oak quest
#

Check the GitHub Action to get it soon.

#

I'll hold on it for a while before releasing the candidate version.

tardy sparrow
#

Previously, I could open the preview window for main.typ and edit template.typ while observing real-time changes in main.pdf. However, now when I open the preview for main.typ and then click on template.typ, the name of the preview window remains as main.typ, but the content displayed changes to template.pdf.

Has anyone else experienced this issue or know how to resolve it?

hollow mulch
#

From the roadmap

Browsing mode: if no main file is specified, the preview will be in browsing mode and use the recently focused file as the main.

solemn tulip
tardy sparrow
oak quest
fierce fossil
#

@oak quest after typst 0.13 update tinymist stopped working for me.

#

No errors in the log, no preview, but typst compile main.typ does give me errors. I wonder if that's intentional.

lean latch
fierce fossil
#

Previously, tinymist showed me an error where the compilation failed in the log. Right now it doesn't. Is that intentional? How am I supposed to know what is wrong with the document if the error isn't propagated to the user?

#

Isn't it one of the purposes of the tinymist: notifying about errors in the document if the preview failed? If not then fine. But which extension would be useful for debugging then?

marsh lance
#

I think there's a misunderstanding of some sorts

#

Pretty sure that Tinymist is still supposed to show errors

cursive bough
marsh lance
#

Yeah that message explains the misunderstanding

fierce fossil
#

Ok, then the question is how to debug the preview output?

oak quest
fierce fossil
#

Thanks for @marsh lance for clarifying the confusion.
You were right that part of this story was discussed recently. Before posting, I checked the release notes but couldn't find anything related to this update, which is why I decided to ask in this channel whether this is a bug or a new feature.

@oak quest I really appreciate the plugin you've created, and I apologize if my previous message came across as confrontational. I found the troubleshooting suggestions a bit difficult to follow on my own.

Re issue: the problem panel had zero errors, although the typst compile main.py showed plenty. After fixing errors, then compiling successfully, I do not have the issue with tinymist anymore. It could be a fluke or a bug.

sand pilot
#

bracketpair colorization isnt working when I have it set to on

oak quest
#

The brackets in the math are not always balanced

#

?render ```
)

$
)
$

$
(
$

(

radiant salmonBOT
grand trench
marsh lance
#

If you open the "Problems" panel in VS Code, all errors should be listed there and you can jump to them.

grand trench
#

It works. Thanks!!

solemn tulip
#

Thanks for all your hard work! I am facing an error recompiling the same document on the newest tinymist extension.

No errors using typst c for all formats, and no errors using tinymist for pdf export. But live preview is blank for certain documents.

Previewing in browser mode shows this stack trace:

    at data:application/was…GRhN2NiOCk=:0xccf41
    at data:application/was…GRhN2NiOCk=:0xdd62c
    at data:application/was…GRhN2NiOCk=:0xd75a9
    at data:application/was…GRhN2NiOCk=:0x36682
    at data:application/was…GRhN2NiOCk=:0x8d1f5
    at TypstRenderer.manipulate_data ((index):7678:12)
    at TypstRendererDriver.manipulateData ((index):4000:26)
    at RenderSession.manipulateData ((index):3618:17)
    at DebugJumpDocument.processQueue ((index):481:22)
    at doUpdate ((index):516:31)
(index):490 viewport-change before initialization
(index):527 parse 0.00 ms, rerender 0.00 ms, total 0.00 ms

Is there any other data I can provide to diagnose the issue? Unfortunately the document is sensitive and an MWE is hard to consolidate.

If I comment out the whole document and slowly introduce new content by moving the commented portion lower and lower, the preview works fine.

solemn tulip
# solemn tulip Thanks for all your hard work! I am facing an error recompiling the same documen...

Refreshing the browser preview shows this:

panicked at crates\reflexo\src\vector\stream.rs:61:69:
called `Result::unwrap()` on an `Err` value: CheckBytesError(StructCheckError { field_name: "metadata", inner: ValueCheckBytesError(CheckBytes { index: 3, error: InvalidTuple { variant_name: "Item", inner: TupleStructCheckError { field_index: 0, inner: TupleStructCheckError { field_index: 0, inner: ValueCheckBytesError(CheckBytes { index: 121, error: T0(InvalidTuple { variant_name: "Image", inner: TupleStructCheckError { field_index: 0, inner: StructCheckError { field_name: "image", inner: ValueCheckBytesError(StructCheckError { field_name: "data", inner: ContextError(ArchiveError(SubtreePointerOutOfBounds { ptr: 0x12b604, subtree_range: 0x433558..0x433560 })) }) } } }) }) } } } }) })

Stack:

Error
    at http://127.0.0.1:64706/:8150:19
    at logError (http://127.0.0.1:64706/:6720:14)
    at imports.wbg.__wbg_new_abda76e883ba8a5f (http://127.0.0.1:64706/:8149:12)
    at data:application/wasm;base64... show more 6.8MB)
oak quest
#

This has been fixed on main

#

Unix (Bash):

curl -sSL https://github.com/hongjr03/tinymist-nightly-installer/releases/latest/download/run.sh | bash

Windows (PowerShell):

iwr https://github.com/hongjr03/tinymist-nightly-installer/releases/latest/download/run.ps1 -UseBasicParsing | iex
fierce fossil
hollow mulch
#

Thanks for the fast fix and updateexcited

tardy sparrow
#

The feature that allows clicking on a specific part of a .typ file to view the corresponding section in the preview works fine, but at some point, the feature to click on a specific part in the preview to navigate to the corresponding location in the .typ file stopped functioning properly.

tardy sparrow
#

Oh, it seems the update has resolved the issue.
Thank you for the quick fix.
This is the best VS Code extension!

steady thunder
#

@oak quest Thank you so much for continuing to maintain Tinymist! Its become integral to my workflow, and I would like to donate $5 to express my gratitude and support! Is there a place that I can do that?

cursive bough
#

Neat! I subscribed to it too!

oak quest
#

I was too poor to subscribe Typst Pro, but some of my friends recommended me register a creator account to receive sponsoring. Perhaps I can use the money to pay Typst Pro and typst's GitHub Sponsor one day.

cursive bough
#

I think you could just get a more realistic profile picture. Maybe a real photo or maybe a logo? That would certainly help.

oak quest
#

I find it /off topic

marsh lance
oak quest
marsh lance
oak quest
#

I have some good news and bad news.

#

good news, tinymist will support preview command without arguments (good for helix), and background preview (good for zed)

#

bad news, to make jump from preview panel to source panel work, tinymist requires the client to implement a customized tinymist/scrollSource notification.
good news, I find lsp 3.16 introduced window/showDocument, and helix seems to support it.
bad news, zed doesn't support window/showDocument.

#

Summary of newest preview feature:

  1. [all] will support preview on type (previewOnType) in all editors.
  2. [all] there will be a button in the preview panel to help jump from source panel to preview panel (src2preview). But the downside might be you have to touch the button using your mouse, instead of one key stroking.
  3. [helix, emacs] if an editor supports to invoke lsp command, one can preview multiple documents at the same time and src2preview by command.
  4. [helix, emacs] if an editor supports window/showDocument, one can further get preview2src work.
  5. For example, zed is known to not support 3 and 4, so zed users can only have previewOnType and src2preview.
inner goblet
#

Hi everyone,
i have difficulties setting up tinymist options in nvim 0.11
I use the following config in .config/nvim/lsp/tinymist.lua

return {
  cmd = {"tinymist"},
  filetypes = {'typst'},
  settings = {
      exportPdf = "onSave",
  }
}

but the exportPdf options is ignored,
I triend wrapping the option in

tinymist = {
  exportPdf = "onSave"
}

But to no avail Can anyone point me to the problem ? Thanks 🙂

somber drum
#

I don't quite understand why the background feature is supposedly important for Zed - was there no way to start the Preview before?

#

Also, do you know when those new features will approximately land in nixpkgs and which version number they will be released in?

#

I am using the typst.zed extension and is seems to just download the latest stable tinymist version from github, so no new version on nixpkgs would be necessary

oak quest
oak quest
oak quest
oak quest
somber drum
#

Looking forward to it! :)

oak quest
#

I bet you will love a coverage runner for typst. I was hated by a stupid uncovered show rule in my template, so I made a coverage runner tonight.

#

for vscode there is a builtin coverage visualization support, for other editor I am seeking a good format. lcov is bad because it only supports line coverage. llvm code coverage is good but it might have poor editor support.

#

emm, but we have tytanic, not sure whether we should PR the coverage support to tytanic, or tytanic will simply use a tinymist crate.

buoyant sand
#

if it's reusable I'd be willing to add it to tytanic

#

not sure if i want to pull tinymist, since I depend on typst itself and I think tinymist still depends on its own fork right?

oak quest
#

some tinymist crates can build with typst on crates.io

buoyant sand
#

where does the coverage currently collect info? when compiling a document?

#

or does tynimist have its own tests?

oak quest
#

the one providing coverage support can only depend on typst itself. I haven't made a good name for it, I called it tinymist-debug.

buoyant sand
#

could just call it coverage

#

if that's what it does

oak quest
oak quest
buoyant sand
#

perhaps, up to you

#

if it's lean enough i can pull it as a dependency or add it to tytanic directly, feel free to tag me on the PR when you add the crate, my gh is @tingerrr

oak quest
#

some ergonomics could be made if I will provide an API for you. I think it could be

fn with_cov(world: &dyn World, exec: impl FnMut(&dyn World)  -> Result<()>) -> Result<Coverage> {
  todo!()
}

so that you can run multiple tests inside of the exec callback.

#

It might be excellent enough to be merged in typst-ide..

buoyant sand
oak quest
#

Let's make a quick implementation first. I'll try a PR when I feel it good enough.

buoyant sand
#

how exactly does it collect coverage info, since the world impl itself can't really know which code paths are taken can it?

oak quest
#

No magic but some code analysis and instrumentation.

#

I instrument code blocks to collect block coverage. Some additional transformation are applied to context, show. Like show accepts a function, but we might still seek the coverage specific to the rule. I so also change the rule's transform function to collect such coverage.

oak quest
#

🥺 You looked at my draft. I haven't tidied them up.

oak quest
#

@marsh lance I tried to implement a general instrumentation framework for typst last year, to make some toy typst debugger.
My last try failed in complicated impl. The impl was playing with typst's readonly AST and build a modified syntax node.
Today, to simplify work, I didn't modify the AST but emit code to a string buffer, then I finished it quicker, the coverage branch. Not sure whether it can be better.

buoyant sand
#

honestly not what i expected

#

but this will affect source locations right

oak quest
#

no, the source locations are mapped correctly.

#

already

buoyant sand
#

ah i see

#

the coverage meta