Merge branch 'main' into dev

This commit is contained in:
2026-01-20 10:11:12 +01:00
8 changed files with 106 additions and 93 deletions

1
.gitignore vendored
View File

@@ -3,4 +3,5 @@
.obsidian .obsidian
assets assets
result

View File

@@ -156,6 +156,7 @@ require('typstar').setup({ -- depending on your neovim plugin system
</details> </details>
### Snippets ### Snippets
0. The snippets are designed to work with Typst `0.14`. For older versions check out the legacy `typst-0.13` branch.
1. Install [LuaSnip](https://github.com/L3MON4D3/LuaSnip/), set `enable_autosnippets = true` and set a visual mode selection key (e.g. `store_selection_keys = '<Tab>'`) in the configuration 1. Install [LuaSnip](https://github.com/L3MON4D3/LuaSnip/), set `enable_autosnippets = true` and set a visual mode selection key (e.g. `store_selection_keys = '<Tab>'`) in the configuration
2. Install [jsregexp](https://github.com/kmarius/jsregexp) as described [here](https://github.com/L3MON4D3/LuaSnip/blob/master/DOC.md#transformations) (You will see a warning on startup if jsregexp isn't installed properly) 2. Install [jsregexp](https://github.com/kmarius/jsregexp) as described [here](https://github.com/L3MON4D3/LuaSnip/blob/master/DOC.md#transformations) (You will see a warning on startup if jsregexp isn't installed properly)
3. Install [nvim-treesitter](https://github.com/nvim-treesitter/nvim-treesitter) and run `:TSInstall typst` 3. Install [nvim-treesitter](https://github.com/nvim-treesitter/nvim-treesitter) and run `:TSInstall typst`
@@ -175,7 +176,6 @@ require('typstar').setup({ -- depending on your neovim plugin system
4. See comment 4 above at Excalidraw 4. See comment 4 above at Excalidraw
### Anki ### Anki
0. Typst version `0.12.0` or higher is required
1. Install [Anki](https://apps.ankiweb.net/#download) 1. Install [Anki](https://apps.ankiweb.net/#download)
2. Install [Anki-Connect](https://ankiweb.net/shared/info/2055492159) and make sure `http://localhost` is added to `webCorsOriginList` in the Add-on config (should be added by default) 2. Install [Anki-Connect](https://ankiweb.net/shared/info/2055492159) and make sure `http://localhost` is added to `webCorsOriginList` in the Add-on config (should be added by default)
3. Install the typstar python package (I recommend using [pipx](https://github.com/pypa/pipx) via `pipx install git+https://github.com/arne314/typstar`, you will need to have python build tools and clang installed) \[Note: this may take a while\] 3. Install the typstar python package (I recommend using [pipx](https://github.com/pypa/pipx) via `pipx install git+https://github.com/arne314/typstar`, you will need to have python build tools and clang installed) \[Note: this may take a while\]

18
flake.lock generated
View File

@@ -5,11 +5,11 @@
"nixpkgs-lib": "nixpkgs-lib" "nixpkgs-lib": "nixpkgs-lib"
}, },
"locked": { "locked": {
"lastModified": 1749398372, "lastModified": 1762040540,
"narHash": "sha256-tYBdgS56eXYaWVW3fsnPQ/nFlgWi/Z2Ymhyu21zVM98=", "narHash": "sha256-z5PlZ47j50VNF3R+IMS9LmzI5fYRGY/Z5O5tol1c9I4=",
"owner": "hercules-ci", "owner": "hercules-ci",
"repo": "flake-parts", "repo": "flake-parts",
"rev": "9305fe4e5c2a6fcf5ba6a3ff155720fbe4076569", "rev": "0010412d62a25d959151790968765a70c436598b",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -20,11 +20,11 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1750386251, "lastModified": 1762156382,
"narHash": "sha256-1ovgdmuDYVo5OUC5NzdF+V4zx2uT8RtsgZahxidBTyw=", "narHash": "sha256-Yg7Ag7ov5+36jEFC1DaZh/12SEXo6OO3/8rqADRxiqs=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "076e8c6678d8c54204abcb4b1b14c366835a58bb", "rev": "7241bcbb4f099a66aafca120d37c65e8dda32717",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -36,11 +36,11 @@
}, },
"nixpkgs-lib": { "nixpkgs-lib": {
"locked": { "locked": {
"lastModified": 1748740939, "lastModified": 1761765539,
"narHash": "sha256-rQaysilft1aVMwF14xIdGS3sj1yHlI6oKQNBRTF40cc=", "narHash": "sha256-b0yj6kfvO8ApcSE+QmA6mUfu8IYG6/uU28OFn4PaC8M=",
"owner": "nix-community", "owner": "nix-community",
"repo": "nixpkgs.lib", "repo": "nixpkgs.lib",
"rev": "656a64127e9d791a334452c6b6606d17539476e2", "rev": "719359f4562934ae99f5443f20aa06c2ffff91fc",
"type": "github" "type": "github"
}, },
"original": { "original": {

View File

@@ -6,7 +6,8 @@
flake-parts.url = "github:hercules-ci/flake-parts"; flake-parts.url = "github:hercules-ci/flake-parts";
}; };
outputs = inputs @ { outputs =
inputs@{
self, self,
nixpkgs, nixpkgs,
flake-parts, flake-parts,
@@ -19,7 +20,9 @@
"aarch64-darwin" "aarch64-darwin"
]; ];
perSystem = {system, ...}: let perSystem =
{ system, ... }:
let
pkgs = import nixpkgs { inherit system; }; pkgs = import nixpkgs { inherit system; };
typstar = pkgs.vimUtils.buildVimPlugin { typstar = pkgs.vimUtils.buildVimPlugin {
name = "typstar"; name = "typstar";
@@ -28,15 +31,13 @@
pkgs.vimPlugins.luasnip pkgs.vimPlugins.luasnip
pkgs.vimPlugins.nvim-treesitter-parsers.typst pkgs.vimPlugins.nvim-treesitter-parsers.typst
]; ];
# TODO: make this check pass instead of skipping
neovimRequireCheckHook = ''
echo "Skipping neovimRequireCheckHook"
'';
}; };
in { in
{
packages = { packages = {
default = typstar; default = typstar;
nvim = let nvim =
let
config = pkgs.neovimUtils.makeNeovimConfig { config = pkgs.neovimUtils.makeNeovimConfig {
customRC = '' customRC = ''
lua << EOF lua << EOF

View File

@@ -9,7 +9,6 @@ local cap = helper.cap
return { return {
snip('fa', 'forall ', {}, math), snip('fa', 'forall ', {}, math),
snip('ex', 'exists ', {}, math), snip('ex', 'exists ', {}, math),
snip('ni', 'in.not ', {}, math),
snip('Sq', 'square', {}, math), snip('Sq', 'square', {}, math),
-- logical chunks -- logical chunks
@@ -19,6 +18,8 @@ return {
snip('een', 'exists epsilon>>0 ', {}, math), snip('een', 'exists epsilon>>0 ', {}, math),
-- boolean logic -- boolean logic
snip('and', 'and ', {}, math),
snip('or', 'or ', {}, math),
snip('not', 'not ', {}, math), snip('not', 'not ', {}, math),
snip('ip', '==>> ', {}, math), snip('ip', '==>> ', {}, math),
snip('ib', '<<== ', {}, math), snip('ib', '<<== ', {}, math),
@@ -49,28 +50,29 @@ return {
snip('sa', 'space ', {}, math), snip('sa', 'space ', {}, math),
-- operators -- operators
snip('ak([^k ])', '+ <>', { cap(1) }, math, 100, { wordTrig = false }),
snip('sk([^k ])', '- <>', { cap(1) }, math, 100, { wordTrig = false }),
snip('oak', 'plus.circle ', {}, math),
snip('bak', 'plus.square ', {}, math),
snip('mak', 'plus.minus ', {}, math), snip('mak', 'plus.minus ', {}, math),
snip('oak', 'plus.o ', {}, math),
snip('bak', 'plus.square ', {}, math),
snip('osk', 'minus.o ', {}, math),
snip('bsk', 'minus.square ', {}, math),
snip('xx', 'times ', {}, math), snip('xx', 'times ', {}, math),
snip('oxx', 'times.circle ', {}, math), snip('oxx', 'times.o ', {}, math),
snip('bxx', 'times.square ', {}, math), snip('bxx', 'times.square ', {}, math),
snip('ff', '(<>) / (<>) <>', { i(1), i(2), i(3) }, math), snip('ff', '(<>) / (<>) <>', { i(1), i(2), i(3) }, math),
snip('nab', 'arrow(nabla) ', {}, math), snip('nab', 'arrow(nabla) ', {}, math),
-- exponents -- subscript/superscript
snip('iv', '^(-1) ', {}, math, 500, { wordTrig = false, blacklist = { 'equiv' } }), snip('iv', '^(-1) ', {}, math, 500, { wordTrig = false, blacklist = { 'equiv' } }),
snip('tp', '^top ', {}, math, 500, { wordTrig = false }), snip('tp', '^top ', {}, math, 500, { wordTrig = false }),
snip('cmp', '^complement ', {}, math, 500, { wordTrig = false }),
snip('prp', '^perp ', {}, math, 500, { wordTrig = false }),
snip('sr', '^2 ', {}, math, 500, { wordTrig = false }), snip('sr', '^2 ', {}, math, 500, { wordTrig = false }),
snip('cb', '^3 ', {}, math, 500, { wordTrig = false }), snip('cb', '^3 ', {}, math, 500, { wordTrig = false }),
snip('jj', '_(<>) ', { i(1, 'n') }, math, 500, { wordTrig = false }), snip('jj', '_(<>) ', { i(1, 'n') }, math, 500, { wordTrig = false }),
snip('kk', '^(<>) ', { i(1, 'n') }, math, 500, { wordTrig = false }), snip('kk', '^(<>) ', { i(1, 'n') }, math, 500, { wordTrig = false }),
snip('ep', 'exp(<>) ', { i(1, '1') }, math),
-- sets -- sets
-- 'st' to '{<>} in ./visual.lua -- 'st' to '{<>}' in ./visual.lua
snip('set', '{<> mid(|) <>}', { i(1), i(2) }, math), snip('set', '{<> mid(|) <>}', { i(1), i(2) }, math),
snip('es', 'emptyset ', {}, math), snip('es', 'emptyset ', {}, math),
snip('ses', '{emptyset} ', {}, math), snip('ses', '{emptyset} ', {}, math),
@@ -83,24 +85,28 @@ return {
snip('bnn', 'inter.big ', {}, math), snip('bnn', 'inter.big ', {}, math),
snip('buu', 'union.big ', {}, math), snip('buu', 'union.big ', {}, math),
snip('swo', 'without ', {}, math), snip('swo', 'without ', {}, math),
snip('ni', 'in.not ', {}, math),
-- misc -- misc
snip('to', '->> ', {}, math), snip('to', '->> ', {}, math),
snip('mt', '|->> ', {}, math), snip('mt', '|->> ', {}, math),
snip('Oo', 'compose ', {}, math), snip('cp', 'compose ', {}, math),
snip('iso', 'tilde.equiv ', {}, math), snip('iso', 'tilde.equiv ', {}, math),
snip('cc', 'cases(\n\t<>\n)\\', { i(1) }, math), snip('cc', 'cases(\n\t<>\n)\\', { i(1) }, math),
snip('([A-Za-z])o([A-Za-z0-9]) ', '<>(<>) ', { cap(1), cap(2) }, math, 100, { snip('([A-Za-z])o([A-Za-z0-9]) ', '<>(<>) ', { cap(1), cap(2) }, math, 100, {
maxTrigLength = 4, maxTrigLength = 4,
blacklist = { 'bot ', 'cos ', 'cot ', 'dot ', 'log ', 'mod ', 'top ', 'won ', 'xor ' }, blacklist = { 'bot ', 'cos ', 'cot ', 'dot ', 'log ', 'mod ', 'not ', 'top ', 'won ', 'xor ' },
}), }),
snip('(K|M|N|Q|R|S|Z)([\\dn]) ', '<><>^<> ', { cap(1), cap(1), cap(2) }, math), snip('(K|M|N|Q|R|S|Z)([\\dn]) ', '<><>^<> ', { cap(1), cap(1), cap(2) }, math),
-- derivatives
snip('dx', 'dif / (dif <>) ', { i(1, 'x') }, math), snip('dx', 'dif / (dif <>) ', { i(1, 'x') }, math),
snip('ddx', '(dif <>) / (dif <>) ', { i(1, 'f'), i(2, 'x') }, math), snip('ddx', '(dif <>) / (dif <>) ', { i(1, 'f'), i(2, 'x') }, math),
snip('DX', 'diff / (diff <>) ', { i(1, 'x') }, math), snip('DX', 'partial / (partial <>) ', { i(1, 'x') }, math),
snip('DDX', '(diff <>) / (diff <>) ', { i(1, 'f'), i(2, 'x') }, math), snip('DDX', '(partial <>) / (partial <>) ', { i(1, 'f'), i(2, 'x') }, math),
snip('ppa', 'partial ', {}, math, 1600), snip('part', 'partial ', {}, math, 1600),
-- integrals
snip('it', 'integral ', {}, math), snip('it', 'integral ', {}, math),
snip('iot', 'integral.vol ', {}, math), snip('iot', 'integral.vol ', {}, math),
snip('ift', 'integral.surf ', {}, math), snip('ift', 'integral.surf ', {}, math),
@@ -108,13 +114,16 @@ return {
snip('oit', 'integral.cont_(<>) ', { i(1, 'C') }, math), snip('oit', 'integral.cont_(<>) ', { i(1, 'C') }, math),
snip('dit', 'integral_(<>) ', { i(1, 'Omega') }, math), snip('dit', 'integral_(<>) ', { i(1, 'Omega') }, math),
-- sums
snip('sm', 'sum ', {}, math), snip('sm', 'sum ', {}, math),
snip('sum', 'sum_(<>)^(<>) ', { i(1, 'k=1'), i(2, 'oo') }, math), snip('sum', 'sum_(<>)^(<>) ', { i(1, 'k=1'), i(2, 'oo') }, math),
snip('dsm', 'sum_(<>) ', { i(1, 'Omega') }, math), snip('dsm', 'sum_(<>) ', { i(1, 'Omega') }, math),
-- products
snip('prd', 'product ', {}, math), snip('prd', 'product ', {}, math),
snip('prod', 'product_(<>)^(<>) ', { i(1, 'k=1'), i(2, 'n') }, math), snip('prod', 'product_(<>)^(<>) ', { i(1, 'k=1'), i(2, 'n') }, math),
-- limits
snip('lm', 'lim ', {}, math), snip('lm', 'lim ', {}, math),
snip('lim', 'lim_(<> ->> <>) ', { i(1, 'n'), i(2, 'oo') }, math), snip('lim', 'lim_(<> ->> <>) ', { i(1, 'n'), i(2, 'oo') }, math),
snip('lim (sup|inf)', 'lim<> ', { cap(1) }, math), snip('lim (sup|inf)', 'lim<> ', { cap(1) }, math),

View File

@@ -28,7 +28,7 @@ local operations = { -- first boolean: existing brackets should be kept; second
{ 'sQ', '[', ']', false, false }, -- replace with square brackets { 'sQ', '[', ']', false, false }, -- replace with square brackets
{ 'BB', '', '', false, false }, -- remove brackets { 'BB', '', '', false, false }, -- remove brackets
{ 'ss', '"', '"', false, false }, { 'ss', '"', '"', false, false },
{ 'agl', 'lr(angle.l ', ' angle.r)', false, false }, { 'chv', 'lr(chevron.l ', ' chevron.r)', false, false },
{ 'abs', 'abs', '', true, true }, { 'abs', 'abs', '', true, true },
{ 'ul', 'underline', '', true, true }, { 'ul', 'underline', '', true, true },
{ 'ol', 'overline', '', true, true }, { 'ol', 'overline', '', true, true },
@@ -39,9 +39,11 @@ local operations = { -- first boolean: existing brackets should be kept; second
{ 'br', 'macron', '', true, true }, { 'br', 'macron', '', true, true },
{ 'dt', 'dot', '', true, true }, { 'dt', 'dot', '', true, true },
{ 'dou', 'dot.double', '', true, true }, { 'dou', 'dot.double', '', true, true },
{ 'dia', 'diaer', '', true, true },
{ 'ci', 'circle', '', true, true }, { 'ci', 'circle', '', true, true },
{ 'td', 'tilde', '', true, true }, { 'td', 'tilde', '', true, true },
{ 'nr', 'norm', '', true, true }, { 'nr', 'norm', '', true, true },
{ 'arr', 'arrow', '', true, true },
{ 'vv', 'vec', '', true, true }, { 'vv', 'vec', '', true, true },
{ 'rt', 'sqrt', '', true, true }, { 'rt', 'sqrt', '', true, true },
{ 'flo', 'floor', '', true, true }, { 'flo', 'floor', '', true, true },

View File

@@ -4,7 +4,7 @@ build-backend = "pdm.backend"
[project] [project]
name = "typstar" name = "typstar"
version = "1.4.1" version = "1.4.2"
description = "Neovim plugin for efficient note taking in Typst" description = "Neovim plugin for efficient note taking in Typst"
authors = [ authors = [
{ name = "arne314" } { name = "arne314" }

2
uv.lock generated
View File

@@ -516,7 +516,7 @@ wheels = [
[[package]] [[package]]
name = "typstar" name = "typstar"
version = "1.4.1" version = "1.4.2"
source = { editable = "." } source = { editable = "." }
dependencies = [ dependencies = [
{ name = "aiohttp" }, { name = "aiohttp" },