From 27416cef9979882ee8c1da819d48216974c46535 Mon Sep 17 00:00:00 2001 From: Alexander Neonxp Kiryukhin Date: Wed, 4 Jun 2025 12:06:36 +0300 Subject: [PATCH] 04.06.2025 --- nvim/init.lua | 1 + nvim/lazy-lock.json | 18 +++--- nvim/lua/autocommands.lua | 10 ++-- nvim/lua/keymaps.lua | 4 +- nvim/lua/lsp.lua | 6 +- nvim/lua/options.lua | 11 +++- nvim/lua/plugins.lua | 9 +-- nvim/lua/plugins/autosave.lua | 10 +--- nvim/lua/plugins/cmp.lua | 103 +++++++++------------------------- nvim/lua/plugins/snippets.lua | 21 ------- nvim/lua/plugins/todo.lua | 69 +++++++++++++++++++++++ nvim/lua/snippets/json.lua | 44 --------------- nvim/lua/syntax/hjson.lua | 61 ++++++++++++++++++++ nvim/lua/syntax/init.lua | 1 + nvim/snippets/package.json | 27 --------- 15 files changed, 190 insertions(+), 205 deletions(-) delete mode 100644 nvim/lua/plugins/snippets.lua create mode 100644 nvim/lua/plugins/todo.lua delete mode 100644 nvim/lua/snippets/json.lua create mode 100644 nvim/lua/syntax/hjson.lua create mode 100644 nvim/lua/syntax/init.lua diff --git a/nvim/init.lua b/nvim/init.lua index 613641b..e495d97 100644 --- a/nvim/init.lua +++ b/nvim/init.lua @@ -33,4 +33,5 @@ require("keymaps") require("commands") require("autocommands") require("lsp") +require("syntax") -- require("dap") diff --git a/nvim/lazy-lock.json b/nvim/lazy-lock.json index 931dabf..d0ab947 100644 --- a/nvim/lazy-lock.json +++ b/nvim/lazy-lock.json @@ -1,14 +1,12 @@ { "LuaSnip": { "branch": "master", "commit": "458560534a73f7f8d7a11a146c801db00b081df0" }, "auto-save.nvim": { "branch": "main", "commit": "37c82fd548e3f5ffc2d9d020a65dac1044584f44" }, - "cmp-buffer": { "branch": "main", "commit": "b74fab3656eea9de20a9b8116afa3cfc4ec09657" }, - "cmp-nvim-lsp": { "branch": "main", "commit": "a8912b88ce488f411177fc8aed358b04dc246d7b" }, - "cmp-path": { "branch": "main", "commit": "c6635aae33a50d6010bf1aa756ac2398a2d54c32" }, - "cmp_luasnip": { "branch": "master", "commit": "98d9cb5c2c38532bd9bdb481067b20fea8f32e90" }, + "blink.cmp": { "branch": "main", "commit": "022521a8910a5543b0251b21c9e1a1e989745796" }, "codecompanion.nvim": { "branch": "main", "commit": "9edf22cb71711cd7fab7671a25ed5424011a379d" }, - "conform.nvim": { "branch": "master", "commit": "6feb2f28f9a9385e401857b21eeac3c1b66dd628" }, + "conform.nvim": { "branch": "master", "commit": "f643d1b51d1d3d14c8641a46ce44f6bce73c2697" }, "friendly-snippets": { "branch": "main", "commit": "572f5660cf05f8cd8834e096d7b4c921ba18e175" }, "go.nvim": { "branch": "master", "commit": "a3455f48cff718a86275115523dcc735535a13aa" }, + "goerr-nvim": { "branch": "main", "commit": "d30ba1cab652e78dbf6a644eb4823be57e9af203" }, "goimpl.nvim": { "branch": "main", "commit": "2548d42c4db0645dea14f27e67c4b19b7030f1cf" }, "guihua.lua": { "branch": "master", "commit": "87bea7b98429405caf2a0ce4d029b027bb017c70" }, "headlines.nvim": { "branch": "master", "commit": "bf17c96a836ea27c0a7a2650ba385a7783ed322e" }, @@ -17,16 +15,14 @@ "lsp_signature.nvim": { "branch": "master", "commit": "a4e3c15dfdce8783c074539b1835edae75fa63d5" }, "lspsaga.nvim": { "branch": "main", "commit": "920b1253e1a26732e53fac78412f6da7f674671d" }, "lualine.nvim": { "branch": "master", "commit": "0c6cca9f2c63dadeb9225c45bc92bb95a151d4af" }, - "nui.nvim": { "branch": "main", "commit": "7cd18e73cfbd70e1546931b7268b3eebaeff9391" }, - "nvim-cmp": { "branch": "main", "commit": "b5311ab3ed9c846b585c0c15b7559be131ec4be9" }, "nvim-dap": { "branch": "master", "commit": "b0f983507e3702f073bfe1516846e58b56d4e42f" }, "nvim-dap-go": { "branch": "main", "commit": "8763ced35b19c8dc526e04a70ab07c34e11ad064" }, "nvim-dap-ui": { "branch": "master", "commit": "73a26abf4941aa27da59820fd6b028ebcdbcf932" }, - "nvim-lspconfig": { "branch": "master", "commit": "b8e7957bde4cbb3cb25a13a62548f7c273b026e9" }, + "nvim-lspconfig": { "branch": "master", "commit": "8adb3b5938f6074a1bcc36d3c3916f497d2e8ec4" }, "nvim-nio": { "branch": "master", "commit": "21f5324bfac14e22ba26553caf69ec76ae8a7662" }, - "nvim-tree.lua": { "branch": "master", "commit": "ebcaccda1c575fa19a8087445276e6671e2b9b37" }, + "nvim-tree.lua": { "branch": "master", "commit": "1c733e8c1957dc67f47580fe9c458a13b5612d5b" }, "nvim-treesitter": { "branch": "master", "commit": "42fc28ba918343ebfd5565147a42a26580579482" }, - "nvim-treesitter-context": { "branch": "master", "commit": "ed1cf48d5af252248c55f50b9427e8ce883a2c6b" }, + "nvim-treesitter-context": { "branch": "master", "commit": "464a443b5a6657f39772b20baa95d02ffe97b268" }, "nvim-treesitter-textobjects": { "branch": "master", "commit": "0f051e9813a36481f48ca1f833897210dbcfffde" }, "nvim-ts-autotag": { "branch": "main", "commit": "a1d526af391f6aebb25a8795cbc05351ed3620b5" }, "nvim-web-devicons": { "branch": "master", "commit": "1fb58cca9aebbc4fd32b086cb413548ce132c127" }, @@ -34,5 +30,5 @@ "popup.nvim": { "branch": "master", "commit": "b7404d35d5d3548a82149238289fa71f7f6de4ac" }, "smartcolumn.nvim": { "branch": "main", "commit": "92f3773af80d674f1eb61e112dca79e2fa449fd1" }, "telescope.nvim": { "branch": "master", "commit": "b4da76be54691e854d3e0e02c36b0245f945c2c7" }, - "todotxt.nvim": { "branch": "main", "commit": "1c5a9fe131c31846844870cf9bcaada6b65e5e59" } + "todotxt.nvim": { "branch": "main", "commit": "225ac77fea10a9ad9a48d0247a8d3c23f33cb2ba" } } diff --git a/nvim/lua/autocommands.lua b/nvim/lua/autocommands.lua index 2cb9ad4..802d9e9 100644 --- a/nvim/lua/autocommands.lua +++ b/nvim/lua/autocommands.lua @@ -88,9 +88,7 @@ vim.api.nvim_create_autocmd("BufEnter", { vim.api.nvim_create_autocmd({ "BufEnter", "BufAdd", "BufNew", "BufNewFile", "BufWinEnter" }, { group = vim.api.nvim_create_augroup("TS_FOLD_WORKAROUND", {}), callback = function() - vim.opt.foldlevelstart = 99 - vim.opt.foldmethod = "expr" - vim.opt.foldexpr = "nvim_treesitter#foldexpr()" + -- vim.cmd([[normal zR]]) end, }) vim.api.nvim_create_autocmd("FileType", { @@ -142,7 +140,11 @@ vim.api.nvim_create_autocmd("FileType", { vim.opt_local.cindent = false end, }) - +vim.filetype.add({ + extension = { + hjson = "hjson", + }, +}) vim.api.nvim_create_autocmd("VimResized", { pattern = "*", callback = function() diff --git a/nvim/lua/keymaps.lua b/nvim/lua/keymaps.lua index 3c1a989..76919a8 100644 --- a/nvim/lua/keymaps.lua +++ b/nvim/lua/keymaps.lua @@ -31,8 +31,8 @@ kmap("n", "vs", "vsplit", { noremap = true, silent = true, desc -- {{{ Управление вкладками -- kmap("n", "", ":tabnext", { noremap = true, silent = true, desc = "Next tab" }) kmap("n", "", ":tabprevious", { noremap = true, silent = true, desc = "Previous tab" }) -kmap("n", "tn", ":tabnew", { noremap = true, silent = true, desc = "New tab" }) -kmap("n", "tc", ":tabclose", { noremap = true, silent = true, desc = "Close tab" }) +kmap("n", "", ":tabnew", { noremap = true, silent = true, desc = "New tab" }) +kmap("n", "", ":tabclose", { noremap = true, silent = true, desc = "Close tab" }) -- Быстрый переход по вкладкам -- for i = 1, 9 do diff --git a/nvim/lua/lsp.lua b/nvim/lua/lsp.lua index 73b92f2..f12ecae 100644 --- a/nvim/lua/lsp.lua +++ b/nvim/lua/lsp.lua @@ -4,7 +4,7 @@ local util = require("lspconfig/util") local function config(_config) return vim.tbl_deep_extend("force", { - capabilities = require("cmp_nvim_lsp").default_capabilities(vim.lsp.protocol.make_client_capabilities()), + -- capabilities = require("cmp_nvim_lsp").default_capabilities(vim.lsp.protocol.make_client_capabilities()), }, _config or {}) end -- иницализация gopls LSP для Go @@ -25,7 +25,7 @@ lspconfig.gopls.setup(config({ })) lspconfig.templ.setup(config({ - cmd = {"templ", "lsp"}, - filetypes = {"templ"}, + cmd = { "templ", "lsp" }, + filetypes = { "templ" }, root_markers = { "go.work", "go.mod", ".git" }, })) diff --git a/nvim/lua/options.lua b/nvim/lua/options.lua index 20d8c78..a0b7dbb 100644 --- a/nvim/lua/options.lua +++ b/nvim/lua/options.lua @@ -32,7 +32,12 @@ local options = { scrolloff = 8, sidescrolloff = 8, syntax = "on", - foldenable = false, + foldmethod = "expr", + foldexpr = "v:lua.vim.treesitter.foldexpr()", + -- foldexpr = "nvim_treesitter#foldexpr()" + foldnestmax = 10, + foldlevel = 9, + -- foldlevelstart = 99, scrolloff = 999, so = vim.fn.floor(vim.fn.winheight(0) / 2), guicursor = "n-v-c:block,i-ci-ve:hor10,r-cr:hor20,o:hor50,a:blinkwait700-blinkoff400-blinkon250-Cursor/lCursor,sm:block-blinkwait175-blinkoff150-blinkon175", @@ -53,6 +58,8 @@ vim.filetype.add({ extension = { templ = "templ", }, + pattern = { + [".*/todo.txt"] = "todotxt", + }, }) - vim.cmd([[colorscheme neonxp]]) diff --git a/nvim/lua/plugins.lua b/nvim/lua/plugins.lua index 415aaf3..4ef30d4 100644 --- a/nvim/lua/plugins.lua +++ b/nvim/lua/plugins.lua @@ -5,13 +5,8 @@ require("lazy").setup({ build = "cd lua/fzy && make", }, { "neovim/nvim-lspconfig" }, - { - "arnarg/todotxt.nvim", - dependencies = { "MunifTanjim/nui.nvim" }, - opts = { - todo_file = "~/Документы/todo.txt", - }, - }, + { "Snyssfx/goerr-nvim" }, + require("plugins.todo"), require("plugins.codecompanion"), require("plugins.resize"), require("plugins.blankline"), diff --git a/nvim/lua/plugins/autosave.lua b/nvim/lua/plugins/autosave.lua index 9cbcd83..069afbf 100644 --- a/nvim/lua/plugins/autosave.lua +++ b/nvim/lua/plugins/autosave.lua @@ -56,17 +56,9 @@ return { return false end - -- Skip autosave if you're in an active snippet - if require("luasnip").in_snippet() then - return false - end - return true end, - write_all_buffers = false, -- write all buffers when the current one meets `condition` - -- Do not execute autocmds when saving - -- If you set noautocmd = true, autosave won't trigger an auto format - -- https://github.com/okuuva/auto-save.nvim/issues/55 + write_all_buffers = true, -- write all buffers when the current one meets `condition` noautocmd = false, lockmarks = false, -- lock marks when saving, see `:h lockmarks` for more details -- delay after which a pending save is executed (default 1000) diff --git a/nvim/lua/plugins/cmp.lua b/nvim/lua/plugins/cmp.lua index c5669e5..43d911a 100644 --- a/nvim/lua/plugins/cmp.lua +++ b/nvim/lua/plugins/cmp.lua @@ -6,91 +6,44 @@ local source_mapping = { path = "[Path]", } return { - "hrsh7th/nvim-cmp", + "saghen/blink.cmp", + lazy = false, + version = "1.*", dependencies = { - "hrsh7th/cmp-nvim-lsp", - "hrsh7th/cmp-buffer", - "hrsh7th/cmp-path", - "saadparwaiz1/cmp_luasnip", { "L3MON4D3/LuaSnip", - lazy = true, version = "v2.*", build = "make install_jsregexp", - opts = { - history = true, - delete_check_events = "TextChanged", - }, dependencies = { "rafamadriz/friendly-snippets" }, config = function() - require("plugins.snippets") + require("luasnip.loaders.from_vscode").lazy_load() + require("luasnip.loaders.from_vscode").lazy_load("./snippets") end, - keys = { - { - "", - function() - require("luasnip").expand() - end, - silent = true, - }, - { - "", - function() - require("luasnip").jump(1) - end, - silent = true, - }, - { - "", - function() - require("luasnip").jump(-1) - end, - silent = true, - }, - }, }, }, - config = function() - require("cmp").setup({ - preselect = require("cmp").PreselectMode.None, - experimental = { - ghost_text = false, + opts = { + keymap = { + preset = "enter", + }, + completion = { + list = { + selection = { + preselect = false, + auto_insert = false, + }, }, - - confirmation = { - default_behavior = require("cmp").ConfirmBehavior.Replace, + ghost_text = { + enabled = true, }, - completion = { - completeopt = "menu,menuone,noinsert,noselect", - keyword_length = 2, - }, - mapping = require("cmp").mapping.preset.insert({ - [""] = require("cmp").mapping.scroll_docs(-4), - [""] = require("cmp").mapping.scroll_docs(4), - [""] = require("cmp").mapping.complete(), - [""] = require("cmp").mapping.abort(), - [""] = require("cmp").mapping.confirm({ select = false }), - [""] = require("cmp").mapping.confirm({ select = true }), - }), - snippet = { - expand = function(args) - require("luasnip").lsp_expand(args.body) - end, - }, - formatting = { - format = function(entry, vim_item) - vim_item.menu = source_mapping[entry.source.name] or "[Unknown]" - return vim_item - end, - }, - sources = require("cmp").config.sources({ - { name = "nvim_lsp", priority = 1000 }, - { name = "codecompanion", priority = 800 }, - { name = "luasnip", priority = 750 }, - { name = "path", priority = 500 }, - }, { - { name = "buffer" }, - }), - }) - end, + }, + cmdline = { + keymap = { preset = "inherit" }, + completion = { menu = { auto_show = true } }, + sources = { "cmdline" }, + }, + snippets = { preset = "luasnip" }, + sources = { + default = { "lsp", "path", "snippets", "buffer", "codecompanion" }, + }, + }, } diff --git a/nvim/lua/plugins/snippets.lua b/nvim/lua/plugins/snippets.lua deleted file mode 100644 index f1f0f62..0000000 --- a/nvim/lua/plugins/snippets.lua +++ /dev/null @@ -1,21 +0,0 @@ -local ls = require("luasnip") -local s = ls.snippet -local sn = ls.snippet_node -local t = ls.text_node -local i = ls.insert_node -local f = ls.function_node -local c = ls.choice_node -local d = ls.dynamic_node -local r = ls.restore_node -local fmt = require("luasnip.extras.fmt").fmt -local rep = require("luasnip.extras").rep - -ls.config.setup({ - history = true, - update_events = "TextChanged,TextChangedI", -}) -require("luasnip.loaders.from_vscode").lazy_load() -require("luasnip.loaders.from_vscode").lazy_load({ - paths = { vim.fn.stdpath("config") .. "/snippets" }, -}) -ls.add_snippets("json", require("snippets.json")) diff --git a/nvim/lua/plugins/todo.lua b/nvim/lua/plugins/todo.lua new file mode 100644 index 0000000..ee672ab --- /dev/null +++ b/nvim/lua/plugins/todo.lua @@ -0,0 +1,69 @@ +return { + "phrmendes/todotxt.nvim", + cmd = { "TodoTxt", "DoneTxt" }, + opts = { + todotxt = "/home/neonxp/Документы/todo.txt", + donetxt = "/home/neonxp/Документы/done.txt", + }, + -- suggested keybindings + keys = { + { + "tp", + function() require("todotxt").cycle_priority() end, + desc = "todo.txt: cycle priority", + ft = "todotxt", + }, + { + "", + function() require("todotxt").toggle_todo_state() end, + desc = "todo.txt: toggle task state", + ft = "todotxt", + }, + { + "tn", + function() require("todotxt").capture_todo() end, + desc = "New entry", + }, + { + "tt", + function() require("todotxt").toggle_todotxt() end, + desc = "Open", + }, + { + "tr", + function() require("todotxt").move_done_tasks() end, + desc = "Move to done.txt", + ft = "todotxt", + }, + { + "tss", + function() require("todotxt").sort_tasks() end, + desc = "Sort", + ft = "todotxt", + }, + { + "tsd", + function() require("todotxt").sort_tasks_by_due_date() end, + desc = "Sort by due:date", + ft = "todotxt", + }, + { + "tsP", + function() require("todotxt").sort_tasks_by_priority() end, + desc = "Sort by (priority)", + ft = "todotxt", + }, + { + "tsc", + function() require("todotxt").sort_tasks_by_context() end, + desc = "Sort by @context", + ft = "todotxt", + }, + { + "tsp", + function() require("todotxt").sort_tasks_by_project() end, + desc = "Sort by +project", + ft = "todotxt", + }, + }, +} diff --git a/nvim/lua/snippets/json.lua b/nvim/lua/snippets/json.lua deleted file mode 100644 index fc58fff..0000000 --- a/nvim/lua/snippets/json.lua +++ /dev/null @@ -1,44 +0,0 @@ -local ls = require("luasnip") --- some shorthands... -local s = ls.snippet -local sn = ls.snippet_node -local t = ls.text_node -local i = ls.insert_node -local f = ls.function_node -local c = ls.choice_node -local d = ls.dynamic_node -local r = ls.restore_node -local l = require("luasnip.extras").lambda -local rep = require("luasnip.extras").rep -local p = require("luasnip.extras").partial -local m = require("luasnip.extras").match -local n = require("luasnip.extras").nonempty -local dl = require("luasnip.extras").dynamic_lambda -local fmt = require("luasnip.extras.fmt").fmt -local fmta = require("luasnip.extras.fmt").fmta -local types = require("luasnip.util.types") -local conds = require("luasnip.extras.conditions") -local conds_expand = require("luasnip.extras.conditions.expand") - -return { - s( - "launch", - fmt( - [[ -{{ - "name": "Launch {1}", - "type": "go", - "request": "launch", - "program": "${{workspaceFolder}}/cmd/{2}", - "args": [{3}], - "outputMode": "remote" -}}{4}]], - { - i(1), - rep(1), - i(2), - i(0), - } - ) - ), -} diff --git a/nvim/lua/syntax/hjson.lua b/nvim/lua/syntax/hjson.lua new file mode 100644 index 0000000..a2e01ed --- /dev/null +++ b/nvim/lua/syntax/hjson.lua @@ -0,0 +1,61 @@ +-- ~/.config/nvim/after/syntax/hjson.lua +-- Или путь плагина: ~/.config/nvim/plugin/hjson.lua + +vim.api.nvim_create_autocmd({ "BufRead", "BufNewFile" }, { + pattern = "*.hjson", + callback = function() + vim.b.current_syntax = "hjson" + + -- Очистка предыдущих правил + vim.cmd("syntax clear") + + -- Комментарии (высший приоритет) + vim.cmd([[ syntax match hjsonLineComment "\/\/.*" ]]) + vim.cmd([[ syntax match hjsonLineComment "#.*" ]]) + vim.cmd([[ syntax region hjsonComment start="/\*" end="\*/" ]]) + + -- Строки + vim.cmd([[ syntax region hjsonString matchgroup=hjsonQuote start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=hjsonEscape ]]) + vim.cmd([[ syntax region hjsonString matchgroup=hjsonQuote start=+'+ skip=+\\\\\|\\'+ end=+'+ contains=hjsonEscape ]]) + vim.cmd([[ syntax region hjsonMLString matchgroup=hjsonQuote start=/'''/ end=/'''/ ]]) + + -- Числа + vim.cmd([[ syntax match hjsonNumber "-\=\<\%(0\|[1-9]\d*\)\%(\.\d\+\)\=\%([eE][-+]\=\d\+\)\=\>" ]]) + + -- Булевы значения и null + vim.cmd([[ syntax keyword hjsonBoolean true false ]]) + vim.cmd([[ syntax keyword hjsonNull null ]]) + + -- Ключи объектов + vim.cmd([[ syntax match hjsonKey "[^][{}:,\"'\s]\+" contained ]]) + vim.cmd([[ syntax match hjsonKeyUnquoted "[^][{}:,\"'\s]\+:"he=e-1 contains=hjsonKey,hjsonNoise ]]) + + -- Пунктуация + vim.cmd([[ syntax match hjsonNoise "[{}\[\],:]" ]]) + + -- Escape-последовательности + vim.cmd([[ syntax match hjsonEscape "\\[\\\"'/bfnrt]" contained ]]) + vim.cmd([[ syntax match hjsonEscape "\\u\x\{4}" contained ]]) + + -- Строки без кавычек (низший приоритет) + vim.cmd([[ syntax match hjsonStringUQ "[^][{}:,\"'\s]\+" contains=@NoSpell ]]) + + -- Сворачивание структур + vim.cmd([[ syntax region hjsonObject matchgroup=hjsonBraces start="{" end="}" transparent fold ]]) + vim.cmd([[ syntax region hjsonArray matchgroup=hjsonBraces start="\[" end="\]" transparent fold ]]) + + -- Подсветка + vim.cmd([[ highlight default link hjsonComment Comment ]]) + vim.cmd([[ highlight default link hjsonLineComment Comment ]]) + vim.cmd([[ highlight default link hjsonString String ]]) + vim.cmd([[ highlight default link hjsonMLString String ]]) + vim.cmd([[ highlight default link hjsonStringUQ String ]]) + vim.cmd([[ highlight default link hjsonEscape SpecialChar ]]) + vim.cmd([[ highlight default link hjsonNumber Number ]]) + vim.cmd([[ highlight default link hjsonBoolean Boolean ]]) + vim.cmd([[ highlight default link hjsonNull Constant ]]) + vim.cmd([[ highlight default link hjsonKey Label ]]) + vim.cmd([[ highlight default link hjsonNoise Delimiter ]]) + vim.cmd([[ highlight default link hjsonBraces Delimiter ]]) + end +}) diff --git a/nvim/lua/syntax/init.lua b/nvim/lua/syntax/init.lua new file mode 100644 index 0000000..d9f4dcb --- /dev/null +++ b/nvim/lua/syntax/init.lua @@ -0,0 +1 @@ +require("syntax.hjson") diff --git a/nvim/snippets/package.json b/nvim/snippets/package.json index efb2b49..7c7e94a 100644 --- a/nvim/snippets/package.json +++ b/nvim/snippets/package.json @@ -1,32 +1,5 @@ { "name": "gotools", - "displayName": "Golang Tools", - "description": "Tools for productive work", - "version": "0.1.5", - "engines": { - "vscode": "^1.80.0" - }, - "publisher": "neonxp", - "license": "GPL-3.0-or-later", - "author": { - "name": "Alexander NeonXP Kiryukhin", - "email": "a.kiryukhin@mail.ru", - "url": "https://neonxp.ru/" - }, - "repository": { - "type": "git", - "url": "https://github.com/neonxp/GoTools" - }, - "icon": "icon.png", - "categories": [ - "Programming Languages", - "Snippets", - "Other" - ], - "keywords": [ - "go", - "golang" - ], "contributes": { "snippets": [ {