├── snippets ├── global.json ├── package.json ├── clojure.json ├── markdown.json └── friendly-copy.json ├── neovim.yml ├── selene.toml ├── .stylua.toml ├── .neoconf.json ├── lua ├── plugins │ ├── treesitter.lua │ ├── telescope.lua │ ├── snippets.lua │ ├── none-ls.lua │ ├── mason.lua │ ├── plantuml.lua │ ├── neo-tree.lua │ ├── astroui.lua │ ├── user-termux.lua │ ├── example-config.lua │ ├── astrocore.lua │ ├── user.lua │ ├── astrolsp.lua │ ├── github.lua │ ├── clojure.lua │ └── user-practicalli.lua ├── polish.lua ├── lazy_setup.lua └── community.lua ├── .gitignore ├── init.lua ├── after └── ftplugin │ └── clojure.lua ├── README.md └── CHANGELOG.md /snippets/global.json: -------------------------------------------------------------------------------- 1 | {} 2 | 3 | -------------------------------------------------------------------------------- /neovim.yml: -------------------------------------------------------------------------------- 1 | --- 2 | base: lua51 3 | 4 | globals: 5 | vim: 6 | any: true 7 | -------------------------------------------------------------------------------- /selene.toml: -------------------------------------------------------------------------------- 1 | std = "neovim" 2 | 3 | [rules] 4 | global_usage = "allow" 5 | if_same_then_else = "allow" 6 | incorrect_standard_library_use = "allow" 7 | mixed_table = "allow" 8 | multiple_statements = "allow" 9 | -------------------------------------------------------------------------------- /.stylua.toml: -------------------------------------------------------------------------------- 1 | column_width = 120 2 | line_endings = "Unix" 3 | indent_type = "Spaces" 4 | indent_width = 2 5 | quote_style = "AutoPreferDouble" 6 | call_parentheses = "None" 7 | collapse_simple_statement = "Always" 8 | -------------------------------------------------------------------------------- /.neoconf.json: -------------------------------------------------------------------------------- 1 | { 2 | "neodev": { 3 | "library": { 4 | "enabled": true, 5 | "plugins": true 6 | } 7 | }, 8 | "neoconf": { 9 | "plugins": { 10 | "lua_ls": { 11 | "enabled": true 12 | } 13 | } 14 | }, 15 | "lspconfig": { 16 | "lua_ls": { 17 | "Lua.format.enable": false 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /lua/plugins/treesitter.lua: -------------------------------------------------------------------------------- 1 | if true then return {} end -- WARN: REMOVE THIS LINE TO ACTIVATE THIS FILE 2 | 3 | -- Customize Treesitter 4 | 5 | ---@type LazySpec 6 | return { 7 | "nvim-treesitter/nvim-treesitter", 8 | opts = { 9 | ensure_installed = { 10 | "lua", 11 | "vim", 12 | -- add more arguments for adding more treesitter parsers 13 | }, 14 | }, 15 | } 16 | -------------------------------------------------------------------------------- /lua/polish.lua: -------------------------------------------------------------------------------- 1 | if true then return end -- WARN: REMOVE THIS LINE TO ACTIVATE THIS FILE 2 | 3 | -- This will run last in the setup process and is a good place to configure 4 | -- things like custom filetypes. This is just pure lua so anything that doesn't 5 | -- fit in the normal config locations above can go here 6 | 7 | -- Set up custom filetypes 8 | vim.filetype.add { 9 | extension = { 10 | foo = "fooscript", 11 | }, 12 | filename = { 13 | ["Foofile"] = "fooscript", 14 | }, 15 | pattern = { 16 | ["~/%.config/foo/.*"] = "fooscript", 17 | }, 18 | } 19 | -------------------------------------------------------------------------------- /snippets/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "practicalli-snippets", 3 | "engines": { 4 | "vscode": "^1.11.0" 5 | }, 6 | "contributes": { 7 | "snippets": [ 8 | { 9 | "language": [ 10 | "markdown", 11 | "global", 12 | "all" 13 | ], 14 | "comment": "snippets accross several languages", 15 | "path": "./global.json" 16 | }, 17 | { 18 | "language": "clojure", 19 | "path": "./clojure.json" 20 | }, 21 | { 22 | "language": "markdown", 23 | "path": "./markdown.json" 24 | } 25 | ] 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /snippets/clojure.json: -------------------------------------------------------------------------------- 1 | { 2 | "comment header": { 3 | "prefix": "comment-header", 4 | "body": [ 5 | ";; ---------------------------------------------------------\n;; ${1:Heading summary title}\n;;\n;; ${2:Brief description}\n;; ---------------------------------------------------------\n\n$0" 6 | ], 7 | "description": "Comment Header" 8 | }, 9 | "comment section": { 10 | "prefix": "comment-section", 11 | "body": [ 12 | ";; ---------------------------------------------------------\n;; ${1:Section title}\n\n$0\n\n\n;; End of $1\n;; ---------------------------------------------------------\n\n" 13 | ], 14 | "description": "Comment Header" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /lua/plugins/telescope.lua: -------------------------------------------------------------------------------- 1 | -- ------------------------------------------ 2 | -- Additional Telescope plugins 3 | -- 4 | -- AstroNvim provides telescope and many plugins 5 | -- Include extra telescope plugins within the `return` map 6 | -- 7 | -- https://github.com/nvim-telescope/telescope.nvim 8 | -- ------------------------------------------ 9 | 10 | -- if true then return {} end -- WARN: COMMENT THIS LINE TO ACTIVATE THIS FILE 11 | 12 | return { 13 | { 14 | -- Browse directory structure & create files 15 | "nvim-telescope/telescope-file-browser.nvim", 16 | dependencies = { "nvim-telescope/telescope.nvim", "nvim-lua/plenary.nvim" }, 17 | config = function() require("telescope").load_extension "file_browser" end, 18 | event = "User AstroFile", 19 | }, 20 | } 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # ------------------------ 2 | # Git Ignore file patterns 3 | # 4 | # Ignore all except patterns starting with ! 5 | # Add comments on separate lines, not same line as pattern 6 | # ------------------------ 7 | 8 | # ------------------------ 9 | # Ignore everything in root directory 10 | /* 11 | # ------------------------ 12 | 13 | # ------------------------ 14 | # Common 15 | !CHANGELOG.md 16 | !README.md 17 | !LICENSE 18 | # ------------------------ 19 | 20 | # ------------------------ 21 | # AstroNvim 22 | !after/ 23 | !lua/ 24 | !snippets/ 25 | !init.lua 26 | !neovim.yml 27 | !selene.toml 28 | !.neoconf.json 29 | !.stylua.toml 30 | # ------------------------ 31 | 32 | # ------------------------ 33 | # Include Git & CI workflow 34 | !.gitattributes 35 | !.gitignore 36 | !.github/ 37 | # ------------------------ 38 | -------------------------------------------------------------------------------- /init.lua: -------------------------------------------------------------------------------- 1 | -- This file simply bootstraps the installation of Lazy.nvim and then calls other files for execution 2 | -- This file doesn't necessarily need to be touched, BE CAUTIOUS editing this file and proceed at your own risk. 3 | local lazypath = vim.env.LAZY or vim.fn.stdpath "data" .. "/lazy/lazy.nvim" 4 | if not (vim.env.LAZY or (vim.uv or vim.loop).fs_stat(lazypath)) then 5 | -- stylua: ignore 6 | vim.fn.system({ "git", "clone", "--filter=blob:none", "https://github.com/folke/lazy.nvim.git", "--branch=stable", lazypath }) 7 | end 8 | vim.opt.rtp:prepend(lazypath) 9 | 10 | -- validate that lazy is available 11 | if not pcall(require, "lazy") then 12 | -- stylua: ignore 13 | vim.api.nvim_echo({ { ("Unable to load lazy from: %s\n"):format(lazypath), "ErrorMsg" }, { "Press any key to exit...", "MoreMsg" } }, true, {}) 14 | vim.fn.getchar() 15 | vim.cmd.quit() 16 | end 17 | 18 | require "lazy_setup" 19 | require "polish" 20 | -------------------------------------------------------------------------------- /lua/plugins/snippets.lua: -------------------------------------------------------------------------------- 1 | -- ------------------------------------------ 2 | -- Snippets plugins 3 | -- 4 | -- Override or add snippet related plugins & configuration here 5 | -- ------------------------------------------ 6 | 7 | -- if true then return {} end -- WARN: REMOVE THIS LINE TO ACTIVATE THIS FILE 8 | 9 | ---@type LazySpec 10 | return { 11 | --LuaSnip with json format snippets in `snippets/` directory 12 | { 13 | "L3MON4D3/LuaSnip", 14 | config = function(plugin, opts) 15 | require "astronvim.plugins.configs.luasnip"(plugin, opts) -- include the default astronvim config that calls the setup call 16 | -- add more custom luasnip configuration such as filetype extend or custom snippets 17 | require("luasnip.loaders.from_vscode").lazy_load { paths = { "./snippets" } } -- include JSON style snippets 18 | local luasnip = require "luasnip" 19 | luasnip.filetype_extend("javascript", { "javascriptreact" }) 20 | end, 21 | }, 22 | } 23 | -------------------------------------------------------------------------------- /after/ftplugin/clojure.lua: -------------------------------------------------------------------------------- 1 | -- Configure loaded after clojure filetype set 2 | 3 | local whichkey = require "which-key" 4 | 5 | return { 6 | { 7 | "folke/which-key.nvim", 8 | -- Load Conjure Groups only for Clojure filetypes 9 | whichkey.add { 10 | -- Conjure sub-menus 11 | { "c", group = "Connect" }, 12 | { "e", group = "Evaluate" }, 13 | { "ec", group = "Comment" }, 14 | { "g", group = "Go" }, 15 | { "l", group = "REPl Log" }, 16 | { "r", group = "Refresh" }, 17 | { "s", group = "Session" }, 18 | { "t", group = "Test" }, 19 | { "v", group = "Values" }, 20 | { "x", group = "macroXpand" }, 21 | -- Structural Editing 22 | { "p", group = "Paredit" }, 23 | { "pt", "ParinferToggle", desc = "Toggle", mode = "n" }, 24 | }, 25 | }, 26 | } 27 | -------------------------------------------------------------------------------- /lua/plugins/none-ls.lua: -------------------------------------------------------------------------------- 1 | if true then return {} end -- WARN: REMOVE THIS LINE TO ACTIVATE THIS FILE 2 | 3 | -- Customize None-ls sources 4 | 5 | ---@type LazySpec 6 | return { 7 | "nvimtools/none-ls.nvim", 8 | opts = function(_, opts) 9 | -- opts variable is the default configuration table for the setup function call 10 | -- local null_ls = require "null-ls" 11 | 12 | -- Check supported formatters and linters 13 | -- https://github.com/nvimtools/none-ls.nvim/tree/main/lua/null-ls/builtins/formatting 14 | -- https://github.com/nvimtools/none-ls.nvim/tree/main/lua/null-ls/builtins/diagnostics 15 | 16 | -- Only insert new sources, do not replace the existing ones 17 | -- (If you wish to replace, use `opts.sources = {}` instead of the `list_insert_unique` function) 18 | opts.sources = require("astrocore").list_insert_unique(opts.sources, { 19 | -- Set a formatter 20 | -- null_ls.builtins.formatting.stylua, 21 | -- null_ls.builtins.formatting.prettier, 22 | }) 23 | end, 24 | } 25 | -------------------------------------------------------------------------------- /lua/plugins/mason.lua: -------------------------------------------------------------------------------- 1 | if true then return {} end -- WARN: REMOVE THIS LINE TO ACTIVATE THIS FILE 2 | 3 | -- Customize Mason plugins 4 | 5 | ---@type LazySpec 6 | return { 7 | -- use mason-lspconfig to configure LSP installations 8 | { 9 | "williamboman/mason-lspconfig.nvim", 10 | -- overrides `require("mason-lspconfig").setup(...)` 11 | opts = { 12 | ensure_installed = { 13 | "lua_ls", 14 | -- add more arguments for adding more language servers 15 | }, 16 | }, 17 | }, 18 | -- use mason-null-ls to configure Formatters/Linter installation for null-ls sources 19 | { 20 | "jay-babu/mason-null-ls.nvim", 21 | -- overrides `require("mason-null-ls").setup(...)` 22 | opts = { 23 | ensure_installed = { 24 | "stylua", 25 | -- add more arguments for adding more null-ls sources 26 | }, 27 | }, 28 | }, 29 | { 30 | "jay-babu/mason-nvim-dap.nvim", 31 | -- overrides `require("mason-nvim-dap").setup(...)` 32 | opts = { 33 | ensure_installed = { 34 | "python", 35 | -- add more arguments for adding more debuggers 36 | }, 37 | }, 38 | }, 39 | } 40 | -------------------------------------------------------------------------------- /lua/plugins/plantuml.lua: -------------------------------------------------------------------------------- 1 | -- ------------------------------------------ 2 | -- Generate UML diagrams from PlantUML code 3 | -- 4 | -- Shows image using OS image viewer 5 | -- ------------------------------------------ 6 | 7 | if true then return {} end -- WARN: REMOVE THIS LINE TO ACTIVATE THIS FILE 8 | 9 | ---@type LazySpec 10 | return { 11 | -- PlantUMl via external tool - key mapping 12 | { 13 | "AstroNvim/astrocore", 14 | opts = { 15 | options = { 16 | -- configure general options: vim.opt. 17 | }, 18 | g = { 19 | -- configure global vim variables: vim.g 20 | }, 21 | mappings = { 22 | n = { 23 | -- ["lu"] = { desc = "UML" }, 24 | -- shell to plantuml binary 25 | -- ["lu"] = { ':silent exec "!plantuml % && open %:s,clj,png,"', desc = "UML diagram" }, 26 | -- shell to java and plantuml jar 27 | ["lu"] = { 28 | ':silent exec "!/usr/bin/java -jar ~/.local/share/plantuml/current.jar % && open %:s,clj,png,"', 29 | desc = "UML diagram", 30 | }, 31 | }, 32 | }, 33 | }, 34 | }, 35 | } 36 | -------------------------------------------------------------------------------- /lua/plugins/neo-tree.lua: -------------------------------------------------------------------------------- 1 | -- Neo-tree Overrides 2 | 3 | if true then return {} end -- WARN: REMOVE THIS LINE TO ACTIVATE THIS FILE 4 | 5 | ---@type LazySpec 6 | return { 7 | "nvim-neo-tree/neo-tree.nvim", 8 | config = function() 9 | require("neo-tree").setup { 10 | filesystem = { 11 | filtered_items = { 12 | visible = true, -- show hidden files in alternate style 13 | hide_dotfiles = true, 14 | hide_gitignored = true, 15 | hide_hidden = true, -- only works on Windows for hidden files/directories 16 | hide_by_name = { 17 | --"node_modules" 18 | }, 19 | hide_by_pattern = { -- uses glob style patterns 20 | --"*.meta", 21 | --"*/src/*/tsconfig.json", 22 | }, 23 | always_show = { -- remains visible even if other settings would normally hide it 24 | --".gitignored", 25 | }, 26 | never_show = { -- remains hidden even if visible is toggled to true, this overrides always_show 27 | --".DS_Store", 28 | --"thumbs.db" 29 | }, 30 | never_show_by_pattern = { -- uses glob style patterns 31 | --".null-ls_*", 32 | }, 33 | }, 34 | }, 35 | } 36 | end, 37 | } 38 | -------------------------------------------------------------------------------- /lua/plugins/astroui.lua: -------------------------------------------------------------------------------- 1 | if true then return {} end -- WARN: REMOVE THIS LINE TO ACTIVATE THIS FILE 2 | 3 | -- AstroUI provides the basis for configuring the AstroNvim User Interface 4 | -- Configuration documentation can be found with `:h astroui` 5 | -- NOTE: We highly recommend setting up the Lua Language Server (`:LspInstall lua_ls`) 6 | -- as this provides autocomplete and documentation while editing 7 | 8 | ---@type LazySpec 9 | return { 10 | "AstroNvim/astroui", 11 | ---@type AstroUIOpts 12 | opts = { 13 | -- change colorscheme 14 | colorscheme = "astrodark", 15 | -- AstroUI allows you to easily modify highlight groups easily for any and all colorschemes 16 | highlights = { 17 | init = { -- this table overrides highlights in all themes 18 | -- Normal = { bg = "#000000" }, 19 | }, 20 | astrodark = { -- a table of overrides/changes when applying the astrotheme theme 21 | -- Normal = { bg = "#000000" }, 22 | }, 23 | }, 24 | -- Icons can be configured throughout the interface 25 | icons = { 26 | -- configure the loading of the lsp in the status line 27 | LSPLoading1 = "⠋", 28 | LSPLoading2 = "⠙", 29 | LSPLoading3 = "⠹", 30 | LSPLoading4 = "⠸", 31 | LSPLoading5 = "⠼", 32 | LSPLoading6 = "⠴", 33 | LSPLoading7 = "⠦", 34 | LSPLoading8 = "⠧", 35 | LSPLoading9 = "⠇", 36 | LSPLoading10 = "⠏", 37 | }, 38 | }, 39 | } 40 | -------------------------------------------------------------------------------- /lua/lazy_setup.lua: -------------------------------------------------------------------------------- 1 | require("lazy").setup({ 2 | { 3 | "AstroNvim/AstroNvim", 4 | version = "^4", -- Remove version tracking to elect for nightly AstroNvim 5 | import = "astronvim.plugins", 6 | opts = { -- AstroNvim options must be set here with the `import` key 7 | mapleader = " ", -- This ensures the leader key must be configured before Lazy is set up 8 | maplocalleader = ",", -- This ensures the localleader key must be configured before Lazy is set up 9 | icons_enabled = true, -- Set to false to disable icons (if no Nerd Font is available) 10 | pin_plugins = nil, -- Default will pin plugins when tracking `version` of AstroNvim, set to true/false to override 11 | update_notifications = true, -- Enable/disable notification about running `:Lazy update` twice to update pinned plugins 12 | }, 13 | }, 14 | { import = "community" }, 15 | { import = "plugins" }, 16 | } --[[@as LazySpec]], { 17 | -- Configure any other `lazy.nvim` configuration options here 18 | install = { colorscheme = { "astrotheme", "habamax" } }, 19 | ui = { backdrop = 100 }, 20 | performance = { 21 | rtp = { 22 | -- disable some rtp plugins, add more to your liking 23 | disabled_plugins = { 24 | "gzip", 25 | "netrwPlugin", 26 | "tarPlugin", 27 | "tohtml", 28 | -- "zipPlugin", -- removing supports Clojure LSP jar analysis 29 | }, 30 | }, 31 | }, 32 | } --[[@as LazyConfig]]) 33 | -------------------------------------------------------------------------------- /lua/plugins/user-termux.lua: -------------------------------------------------------------------------------- 1 | -- Practicalli Termux User Overrides 2 | -- 3 | -- Configure local LSP language servers to be run locally 4 | -- as mason install fails on termux 5 | -- Clojure LSP server 6 | -- Lua Language server 7 | 8 | -- INFO: conditional only loads config if 9 | -- `OS_TERMUX` is true 10 | -- 11 | local termux = vim.env.OS_TERMUX 12 | if not termux then return {} end 13 | 14 | ---@type LazySpec 15 | return { 16 | -- INFO: prevent Mason loading Clojure & Lua LSP servers 17 | { 18 | "williamboman/mason-lspconfig.nvim", 19 | opts = function(_, opts) 20 | opts.ensure_installed = vim.tbl_filter(function(s) return s ~= "lua_ls" end, opts.ensure_installed) 21 | opts.ensure_installed = vim.tbl_filter(function(s) return s ~= "clojure_lsp" end, opts.ensure_installed) 22 | end, 23 | }, 24 | 25 | -- INFO: Use local Clojure & Lua LSP servers 26 | { 27 | "AstroNvim/astrolsp", 28 | ---@type AstroLSPOpts 29 | opts = { 30 | -- Configuration table of features provided by AstroLSP 31 | features = { 32 | autoformat = true, -- enable or disable auto formatting on start 33 | codelens = true, -- enable/disable codelens refresh on start 34 | inlay_hints = false, -- enable/disable inlay hints on start 35 | semantic_tokens = true, -- enable/disable semantic token highlighting 36 | }, 37 | -- enable servers that you already have installed without mason 38 | servers = { 39 | -- "pyright" 40 | "clojure_lsp", 41 | "lua_ls", 42 | }, 43 | }, 44 | }, 45 | 46 | -- INFO: Pin Neogit for Neovim 0.9.x 47 | -- { 48 | -- "NeogitOrg/neogit", 49 | -- tag = "v0.0.1", 50 | -- }, 51 | 52 | -- Commenting for Neovim 0.9.0 53 | { "numToStr/Comment.nvim", enabled = true }, 54 | { "JoosepAlviste/nvim-ts-context-commentstring", enabled = true }, 55 | } 56 | -------------------------------------------------------------------------------- /lua/plugins/example-config.lua: -------------------------------------------------------------------------------- 1 | -- ------------------------------------------ 2 | -- Example AstroNvim Plugin Configuration 3 | -- 4 | -- Examples showing how to add plugins and configuration 5 | -- ------------------------------------------ 6 | 7 | if true then return {} end -- WARN: REMOVE THIS LINE TO ACTIVATE THIS FILE 8 | 9 | -- Local variables 10 | -- local variable_name = { "common", "values" } 11 | 12 | ---@type LazySpec 13 | return { 14 | -- == Add or Override Plugins == 15 | { 16 | "domain/project-name", 17 | -- lazy = true, -- true: load at startup, false: load on filetype 18 | filetype = { "language", "*.fileextension" }, 19 | dependencies = { 20 | "AstroNvim/astrocore", 21 | opts = { 22 | options = { 23 | -- configure general options: vim.opt. 24 | g = { 25 | -- configure global vim variables: vim.g 26 | }, 27 | }, 28 | mappings = { 29 | n = { 30 | -- normal mode key bindings 31 | -- setting a mapping to false will disable it 32 | -- [""] = false, 33 | }, 34 | t = { 35 | -- terminal? mode key bindings 36 | }, 37 | v = { 38 | -- visual mode key bindings 39 | }, 40 | }, 41 | }, 42 | }, 43 | }, 44 | 45 | -- == AstroNvim Core - Add or Override config without additional plugin == 46 | { 47 | "AstroNvim/astrocore", 48 | opts = { 49 | options = { 50 | -- configure general options: vim.opt. 51 | g = { 52 | -- configure global vim variables: vim.g 53 | }, 54 | }, 55 | mappings = { 56 | n = { 57 | -- normal mode key bindings 58 | -- setting a mapping to false will disable it 59 | -- [""] = false, 60 | }, 61 | t = { 62 | -- terminal? mode key bindings 63 | }, 64 | v = { 65 | -- visual mode key bindings 66 | }, 67 | }, 68 | }, 69 | }, 70 | } 71 | -------------------------------------------------------------------------------- /lua/plugins/astrocore.lua: -------------------------------------------------------------------------------- 1 | if true then return {} end -- WARN: REMOVE THIS LINE TO ACTIVATE THIS FILE 2 | 3 | -- AstroCore provides a central place to modify mappings, vim options, autocommands, and more! 4 | -- Configuration documentation can be found with `:h astrocore` 5 | -- NOTE: We highly recommend setting up the Lua Language Server (`:LspInstall lua_ls`) 6 | -- as this provides autocomplete and documentation while editing 7 | 8 | ---@type LazySpec 9 | return { 10 | "AstroNvim/astrocore", 11 | ---@type AstroCoreOpts 12 | opts = { 13 | -- Configure core features of AstroNvim 14 | features = { 15 | large_buf = { size = 1024 * 256, lines = 10000 }, -- set global limits for large files for disabling features like treesitter 16 | autopairs = true, -- enable autopairs at start 17 | cmp = true, -- enable completion at start 18 | diagnostics_mode = 3, -- diagnostic mode on start (0 = off, 1 = no signs/virtual text, 2 = no virtual text, 3 = on) 19 | highlighturl = true, -- highlight URLs at start 20 | notifications = true, -- enable notifications at start 21 | }, 22 | -- Diagnostics configuration (for vim.diagnostics.config({...})) when diagnostics are on 23 | diagnostics = { 24 | virtual_text = true, 25 | underline = true, 26 | }, 27 | -- vim options can be configured here 28 | options = { 29 | opt = { -- vim.opt. 30 | relativenumber = true, -- sets vim.opt.relativenumber 31 | number = true, -- sets vim.opt.number 32 | spell = false, -- sets vim.opt.spell 33 | signcolumn = "yes", -- sets vim.opt.signcolumn to yes 34 | wrap = false, -- sets vim.opt.wrap 35 | }, 36 | g = { -- vim.g. 37 | -- configure global vim variables (vim.g) 38 | -- NOTE: `mapleader` and `maplocalleader` must be set in the AstroNvim opts or before `lazy.setup` 39 | -- This can be found in the `lua/lazy_setup.lua` file 40 | }, 41 | }, 42 | -- Mappings can be configured through AstroCore as well. 43 | -- NOTE: keycodes follow the casing in the vimdocs. For example, `` must be capitalized 44 | mappings = { 45 | -- first key is the mode 46 | n = { 47 | -- second key is the lefthand side of the map 48 | 49 | -- navigate buffer tabs 50 | ["]b"] = { function() require("astrocore.buffer").nav(vim.v.count1) end, desc = "Next buffer" }, 51 | ["[b"] = { function() require("astrocore.buffer").nav(-vim.v.count1) end, desc = "Previous buffer" }, 52 | 53 | -- mappings seen under group name "Buffer" 54 | ["bd"] = { 55 | function() 56 | require("astroui.status.heirline").buffer_picker( 57 | function(bufnr) require("astrocore.buffer").close(bufnr) end 58 | ) 59 | end, 60 | desc = "Close buffer from tabline", 61 | }, 62 | 63 | -- tables with just a `desc` key will be registered with which-key if it's installed 64 | -- this is useful for naming menus 65 | -- ["b"] = { desc = "Buffers" }, 66 | 67 | -- setting a mapping to false will disable it 68 | -- [""] = false, 69 | }, 70 | }, 71 | }, 72 | } 73 | -------------------------------------------------------------------------------- /lua/plugins/user.lua: -------------------------------------------------------------------------------- 1 | if true then return {} end -- WARN: REMOVE THIS LINE TO ACTIVATE THIS FILE 2 | 3 | -- You can also add or configure plugins by creating files in this `plugins/` folder 4 | -- Here are some examples: 5 | 6 | ---@type LazySpec 7 | return { 8 | 9 | -- == Examples of Adding Plugins == 10 | 11 | "andweeb/presence.nvim", 12 | { 13 | "ray-x/lsp_signature.nvim", 14 | event = "BufRead", 15 | config = function() require("lsp_signature").setup() end, 16 | }, 17 | 18 | -- == Examples of Overriding Plugins == 19 | 20 | -- customize alpha options 21 | { 22 | "goolord/alpha-nvim", 23 | opts = function(_, opts) 24 | -- customize the dashboard header 25 | opts.section.header.val = { 26 | " █████ ███████ ████████ ██████ ██████", 27 | "██ ██ ██ ██ ██ ██ ██ ██", 28 | "███████ ███████ ██ ██████ ██ ██", 29 | "██ ██ ██ ██ ██ ██ ██ ██", 30 | "██ ██ ███████ ██ ██ ██ ██████", 31 | " ", 32 | " ███  ██ ██  ██ ██ ███  ███", 33 | " ████  ██ ██  ██ ██ ████  ████", 34 | " ██ ██  ██ ██  ██ ██ ██ ████ ██", 35 | " ██  ██ ██  ██  ██  ██ ██  ██  ██", 36 | " ██   ████   ████   ██ ██      ██", 37 | } 38 | return opts 39 | end, 40 | }, 41 | 42 | -- You can disable default plugins as follows: 43 | { "max397574/better-escape.nvim", enabled = false }, 44 | 45 | -- You can also easily customize additional setup of plugins that is outside of the plugin's setup call 46 | { 47 | "L3MON4D3/LuaSnip", 48 | config = function(plugin, opts) 49 | require "astronvim.plugins.configs.luasnip"(plugin, opts) -- include the default astronvim config that calls the setup call 50 | -- add more custom luasnip configuration such as filetype extend or custom snippets 51 | local luasnip = require "luasnip" 52 | luasnip.filetype_extend("javascript", { "javascriptreact" }) 53 | end, 54 | }, 55 | 56 | { 57 | "windwp/nvim-autopairs", 58 | config = function(plugin, opts) 59 | require "astronvim.plugins.configs.nvim-autopairs"(plugin, opts) -- include the default astronvim config that calls the setup call 60 | -- add more custom autopairs configuration such as custom rules 61 | local npairs = require "nvim-autopairs" 62 | local Rule = require "nvim-autopairs.rule" 63 | local cond = require "nvim-autopairs.conds" 64 | npairs.add_rules( 65 | { 66 | Rule("$", "$", { "tex", "latex" }) 67 | -- don't add a pair if the next character is % 68 | :with_pair(cond.not_after_regex "%%") 69 | -- don't add a pair if the previous character is xxx 70 | :with_pair( 71 | cond.not_before_regex("xxx", 3) 72 | ) 73 | -- don't move right when repeat character 74 | :with_move(cond.none()) 75 | -- don't delete if the next character is xx 76 | :with_del(cond.not_after_regex "xx") 77 | -- disable adding a newline when you press 78 | :with_cr(cond.none()), 79 | }, 80 | -- disable for .vim files, but it work for another filetypes 81 | Rule("a", "a", "-vim") 82 | ) 83 | end, 84 | }, 85 | } 86 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Practicalli Astro Configuration 2 | 3 | Clojure development and more with [Neovim 0.10.x](https://neovim.org/) and [AstroNvim version 4](https://github.com/AstroNvim/AstroNvim) 4 | 5 | [Practicalli Neovim](https://practical.li/neovim/) describes the Clojure REPL workflow, rich Git and GitHub clients and easy management of plugins and tools using this configuration. 6 | 7 | > NOTE: Neovim 0.11 not recommended. Paredit (nvim-treesitter-sexp) is disabled for Neovim 0.11 and you may experience other errors & deprecation warnings. 8 | 9 | ## Neovim 0.11 10 | 11 | For Neovim 0.11, use [Practicalli nvim-astro5](https://github.com/practicalli/nvim-astro5) which supports Neovim 0.11 and is based on AstroNvim v5 template. 12 | 13 | 14 | 15 | ## 🛠️ Installation 16 | 17 | - [Kitty Terminal](https://practical.li/engineering-playbook/command-line/kitty-terminal/) 18 | - [Install Neovim and supporting tools](https://practical.li/neovim/install/neovim/) 19 | - [Clojure install](https://practical.li/clojure/install/) 20 | 21 | Clone the Practicalli Astro repository (create a fork if customisation desired) 22 | 23 | ```shell 24 | git clone git@github.com:practicalli/astro $HOME/.config/nvim 25 | ``` 26 | 27 | Run `nvim` command and wait for all plugins to update 28 | 29 | ```shell 30 | nvim 31 | ``` 32 | 33 | ### Multiple Neovim configs 34 | 35 | Clone to `$HOME/.config/astronvim` if there is an existing neovim configuration and use the `NVIM_APPNAME=astronvim nvim` command to start Neovim with AstroNvim configuration 36 | 37 | ```shell 38 | git clone git@github.com:practicalli/astro $HOME/.config/nvim-astro 39 | ``` 40 | 41 | Create a shell alias to run the new configuration, e.g. in `.bashrc` or `.zshrc` (or a `shell-aliases` file that each shell rc file sources) 42 | 43 | ```config 44 | alias astro="NVIM_APPNAME=nvim-astro nvim" 45 | ``` 46 | 47 | Load the alias into the current shell (or open a new shell) 48 | 49 | ```shell 50 | source shell-aliases 51 | ``` 52 | 53 | Run `astro` and allow neovim packages to be installed and Treesitter language parsers to compile. 54 | 55 | ```shell 56 | astro 57 | ``` 58 | 59 | ## Configuration 60 | 61 | The configuration is based on the AstroNvim template config. Changes to existing file have been kept to a minimum, except for `lua/community.lua` which has additional plugins from the AstroNvim Community repository. 62 | 63 | `lua/plugins/example-config.lua` shows how to modify and extend the AstroNvim configuration. This config is not loaded by defult. 64 | 65 | Create your own `lua/plugins/user-name.lua` file to: 66 | 67 | - override default plugin configuration 68 | - add new plugins (or create a new file for a plugin to make them easier to be optional) or by customising the `lua/plugins/user.lua` file. 69 | 70 | `lua/plugins/user-practicalli.lua` is an example of a user configuration that adds plugins and overrides plugin options. 71 | 72 | > Lua files in the `lua/plugins` directory are loaded in alphabetical order so plugin overrides should be the last file to load, e.g `lua/plugins/user-*` 73 | 74 | 75 | ### Clojure LSP 76 | 77 | Mason is used to install LSP servers, format & lint tools. [Mason Registry](https://mason-registry.dev/registry/list) maintains a list of the latest release for each tool (automatically updated). 78 | 79 | Practicalli Astro can be configured to use a locally installed Clojure LSP server (using the [instructions for your operating system](https://clojure-lsp.io/installation/)). A commented configuration example is included in [lua/plugins/user-practicalli.lua](https://github.com/practicalli/astro/blob/main/lua/plugins/user-practicalli.lua). 80 | 81 | 82 | ## Sponsor Practicalli 83 | 84 | [![Sponsor Practicalli via GitHub](https://raw.githubusercontent.com/practicalli/graphic-design/live/buttons/practicalli-github-sponsors-button.png)](https://github.com/sponsors/practicalli-johnny/) 85 | 86 | All sponsorship funds are used to support the continued development of [Practicalli series of books and videos](https://practical.li/), although most work is done at personal cost and time. 87 | 88 | Thanks to [Cognitect](https://www.cognitect.com/), [Nubank](https://nubank.com.br/) and a wide range of other [sponsors](https://github.com/sponsors/practicalli-johnny#sponsors) for your continued support 89 | -------------------------------------------------------------------------------- /lua/community.lua: -------------------------------------------------------------------------------- 1 | -- if true then return {} end -- WARN: REMOVE THIS LINE TO ACTIVATE THIS FILE 2 | 3 | -- AstroCommunity: import any community modules here 4 | -- We import this file in `lazy_setup.lua` before the `plugins/` folder. 5 | -- This guarantees that the specs are processed before any user plugins. 6 | 7 | -- Plugin config overrides should be in a `lua/plugins/*.lua` of a matching name 8 | -- or in a user config, e.g. `lua/plugins/user-practicalli.lua` 9 | 10 | ---@type LazySpec 11 | return { 12 | "AstroNvim/astrocommunity", 13 | 14 | -- Test changes in local fork of astrocommunity in ~/project/astrocommunity 15 | -- { "AstroNvim/astrocommunity", dev = true }, 16 | -- Or specify path to Astrocommunity fork 17 | -- { dir = "~/projects/community/neovim/astrocommunity" }, 18 | 19 | -- Include Lua language pack 20 | { import = "astrocommunity.pack.lua" }, 21 | -- 22 | -- ---------------------------------------------- 23 | -- themes and color 24 | { import = "astrocommunity.colorscheme.everforest" }, 25 | -- color picker and highlighter 26 | { import = "astrocommunity.color.ccc-nvim" }, 27 | -- ---------------------------------------------- 28 | 29 | -- ---------------------------------------------- 30 | -- Motion plugins 31 | -- :help nvim-surround.usage. 32 | { import = "astrocommunity.motion.nvim-surround" }, 33 | -- ---------------------------------------------- 34 | 35 | -- ---------------------------------------------- 36 | -- Editor support 37 | -- Rainbow parens 38 | { import = "astrocommunity.editing-support.rainbow-delimiters-nvim" }, 39 | -- Regular Expressions explained 40 | { import = "astrocommunity.editing-support.nvim-regexplainer" }, 41 | 42 | -- Multiple Cursors 43 | -- `gm` VM_Leader set in astrocore plugin 44 | { import = "astrocommunity.editing-support.vim-visual-multi" }, 45 | 46 | -- Distraction free editing 47 | { import = "astrocommunity.editing-support.zen-mode-nvim" }, 48 | -- ---------------------------------------------- 49 | 50 | -- ---------------------------------------------- 51 | -- Packs 52 | -- Treesitter: clojure , Lsp: clojure-lsp, Lint/format: 53 | { import = "astrocommunity.pack.clojure" }, 54 | -- Disable plugins contained in the clojure pack 55 | -- { "nvim-parinfer", enabled = false }, 56 | -- { "nvim-treesitter-sexp", enabled = false }, 57 | { "nvim-treesitter-sexp", enabled = vim.fn.has "nvim-0.11" == 0 }, 58 | 59 | { import = "astrocommunity.pack.json" }, 60 | -- ---------------------------------------------- 61 | 62 | -- ---------------------------------------------- 63 | -- Project 64 | 65 | -- switch between projects (AstroNvim provides router) 66 | -- { import = "astrocommunity.project.project-nvim" }, 67 | 68 | -- Search and replace across projects 69 | { import = "astrocommunity.search.nvim-spectre" }, 70 | -- ---------------------------------------------- 71 | 72 | -- ---------------------------------------------- 73 | -- Source Control 74 | -- Neogit interactive git client 75 | { import = "astrocommunity.git.neogit" }, 76 | 77 | -- Manage GitHub Gists 78 | -- Keymaps defined in `lua/plugins/practicalli.lua` 79 | { import = "astrocommunity.git.gist-nvim" }, 80 | 81 | -- Open in GitHub / GitLab websites 82 | { import = "astrocommunity.git.gitlinker-nvim" }, 83 | 84 | -- GitHub Pull Requests and Issues 85 | -- Octo plugin configured in `lua/plugins/github.lua` 86 | -- ---------------------------------------------- 87 | 88 | -- ---------------------------------------------- 89 | -- Utility 90 | -- rich command prompt 91 | { import = "astrocommunity.utility.noice-nvim" }, 92 | 93 | -- word search in specific file patterns 94 | { import = "astrocommunity.utility.telescope-live-grep-args-nvim" }, 95 | -- ---------------------------------------------- 96 | 97 | -- ---------------------------------------------- 98 | -- Terminal Integration 99 | { import = "astrocommunity.terminal-integration.flatten-nvim" }, 100 | -- ---------------------------------------------- 101 | 102 | -- ---------------------------------------------- 103 | -- GUI 104 | -- Neovide GUI - scaling functions & key mappings 105 | { import = "astrocommunity.recipes.neovide" }, 106 | -- ---------------------------------------------- 107 | } 108 | -------------------------------------------------------------------------------- /lua/plugins/astrolsp.lua: -------------------------------------------------------------------------------- 1 | if true then return {} end -- WARN: REMOVE THIS LINE TO ACTIVATE THIS FILE 2 | 3 | -- AstroLSP allows you to customize the features in AstroNvim's LSP configuration engine 4 | -- Configuration documentation can be found with `:h astrolsp` 5 | -- NOTE: We highly recommend setting up the Lua Language Server (`:LspInstall lua_ls`) 6 | -- as this provides autocomplete and documentation while editing 7 | 8 | ---@type LazySpec 9 | return { 10 | "AstroNvim/astrolsp", 11 | ---@type AstroLSPOpts 12 | opts = { 13 | -- Configuration table of features provided by AstroLSP 14 | features = { 15 | codelens = true, -- enable/disable codelens refresh on start 16 | inlay_hints = false, -- enable/disable inlay hints on start 17 | semantic_tokens = true, -- enable/disable semantic token highlighting 18 | }, 19 | -- customize lsp formatting options 20 | formatting = { 21 | -- control auto formatting on save 22 | format_on_save = { 23 | enabled = true, -- enable or disable format on save globally 24 | allow_filetypes = { -- enable format on save for specified filetypes only 25 | -- "go", 26 | }, 27 | ignore_filetypes = { -- disable format on save for specified filetypes 28 | -- "python", 29 | }, 30 | }, 31 | disabled = { -- disable formatting capabilities for the listed language servers 32 | -- disable lua_ls formatting capability if you want to use StyLua to format your lua code 33 | -- "lua_ls", 34 | }, 35 | timeout_ms = 1000, -- default format timeout 36 | -- filter = function(client) -- fully override the default formatting function 37 | -- return true 38 | -- end 39 | }, 40 | -- enable servers that you already have installed without mason 41 | servers = { 42 | -- "pyright" 43 | }, 44 | -- customize language server configuration options passed to `lspconfig` 45 | ---@diagnostic disable: missing-fields 46 | config = { 47 | -- clangd = { capabilities = { offsetEncoding = "utf-8" } }, 48 | }, 49 | -- customize how language servers are attached 50 | handlers = { 51 | -- a function without a key is simply the default handler, functions take two parameters, the server name and the configured options table for that server 52 | -- function(server, opts) require("lspconfig")[server].setup(opts) end 53 | 54 | -- the key is the server that is being setup with `lspconfig` 55 | -- rust_analyzer = false, -- setting a handler to false will disable the set up of that language server 56 | -- pyright = function(_, opts) require("lspconfig").pyright.setup(opts) end -- or a custom handler function can be passed 57 | }, 58 | -- Configure buffer local auto commands to add when attaching a language server 59 | autocmds = { 60 | -- first key is the `augroup` to add the auto commands to (:h augroup) 61 | lsp_codelens_refresh = { 62 | -- Optional condition to create/delete auto command group 63 | -- can either be a string of a client capability or a function of `fun(client, bufnr): boolean` 64 | -- condition will be resolved for each client on each execution and if it ever fails for all clients, 65 | -- the auto commands will be deleted for that buffer 66 | cond = "textDocument/codeLens", 67 | -- cond = function(client, bufnr) return client.name == "lua_ls" end, 68 | -- list of auto commands to set 69 | { 70 | -- events to trigger 71 | event = { "InsertLeave", "BufEnter" }, 72 | -- the rest of the autocmd options (:h nvim_create_autocmd) 73 | desc = "Refresh codelens (buffer)", 74 | callback = function(args) 75 | if require("astrolsp").config.features.codelens then vim.lsp.codelens.refresh { bufnr = args.buf } end 76 | end, 77 | }, 78 | }, 79 | }, 80 | -- mappings to be set up on attaching of a language server 81 | mappings = { 82 | n = { 83 | -- a `cond` key can provided as the string of a server capability to be required to attach, or a function with `client` and `bufnr` parameters from the `on_attach` that returns a boolean 84 | gD = { 85 | function() vim.lsp.buf.declaration() end, 86 | desc = "Declaration of current symbol", 87 | cond = "textDocument/declaration", 88 | }, 89 | ["uY"] = { 90 | function() require("astrolsp.toggles").buffer_semantic_tokens() end, 91 | desc = "Toggle LSP semantic highlight (buffer)", 92 | cond = function(client) 93 | return client.supports_method "textDocument/semanticTokens/full" and vim.lsp.semantic_tokens ~= nil 94 | end, 95 | }, 96 | }, 97 | }, 98 | -- A custom `on_attach` function to be run after the default `on_attach` function 99 | -- takes two parameters `client` and `bufnr` (`:h lspconfig-setup`) 100 | on_attach = function(client, bufnr) 101 | -- this would disable semanticTokensProvider for all clients 102 | -- client.server_capabilities.semanticTokensProvider = nil 103 | end, 104 | }, 105 | } 106 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Unreleased 2 | 3 | # 2025-05-13 4 | ## Changes 5 | - clojure: enable nvim-treesitter-sexp if not running neovim 0.11 6 | - snippets: common markdown syntax 7 | - practicalli: disable default better-escape keys due to conflict 8 | 9 | ## Added 10 | - practicalli: showkeys plugin and key binding (#30) 11 | 12 | # 2025-03-12 13 | ## Added 14 | - clojure: parinfer group and toggle key map 15 | - practicalli: which-key sub-menu for Visual-Multi Cursors (Multiple Cursors) 16 | 17 | ## Changes 18 | - lsp: revert to using mason install of Clojure LSP (Mason Registry updated) 19 | - practicalli: simplify conditional config expressions, remove local whichkey (redundant) 20 | - clojure: update names for conjure sub-menus 21 | - readme: revert to using mason for clojure lsp, link to local server config example 22 | 23 | # 2024-12-17 Local install of Clojure LSP 24 | 25 | ## Added 26 | - snippets: markdown embedded code example - 4clojure 27 | - community: json pack to format api responses, etc. 28 | - practicalli: conjure lsp and treesitter log configs 29 | - community: gitlinker-nvim open git files & lines in GitHub/GitLab 30 | - snippet: mkdocs embed external code link for markdown 31 | - practicalli: example transparent background for everforest theme 32 | 33 | ## Changed 34 | - practicalli: disable neovim providers for node, perl, python, ruby 35 | - snippets: fixed placeholder syntax without labels 36 | - practicalli: kitty style graph for neogit 37 | - update: changes from astronvim/template 38 | - lsp: use local clojure lsp server and prevent mason install 39 | 40 | 41 | # 2024-08-24 Refactor Clojure Which-key mappings 42 | 43 | ## Added 44 | - after: conjure menu group names for clojure filetype plugin 45 | - dev: dont ignore `after` directory pattern in .gitignore 46 | 47 | # 2024-07-26 Initial release 48 | 49 | ## Added 50 | - community: enable and import clojure pack 51 | - readme: basic install instructions 52 | - readme: use astronvim4 as the config location 53 | - dev: gitignore inclusive patterns 54 | - lazy: include zipPlugin to support Clojure LSP jar analysis 55 | - plugin: astrocore enable spell & wrap options, set guifont for neovide 56 | - community: add everforest theme and set as default 57 | - community: ccc-nvim color picker and highlighter 58 | - mappings: additional buffer key mappings 59 | - mappings: additional telescope key mappings, project & file browser plugin 60 | - mappings: additional telescope key mappings & file browser plugin 61 | - community: nvim-surround motion plugin to support surrounding text 62 | - community: rainbow-delimiters regexexplainer visual-multi editor support plugins 63 | - community: spectre search and replace plugin 64 | - community: neogit interactive git client & key mapping overrides 65 | - mapping: set VM_leader for visual-multi plugin for multiple cursors 66 | - community: noice UI replacement for messages, popups & command line 67 | - mapping: add `SPC W` save as key binding prompting for file name 68 | - snippets: luasnip plugin and json format snippets 69 | - plugin: practicalli `fd` binding for `ESC` and startup banner 70 | - plugin: example plugin file 71 | - plugin: Octo github issues and pull requests 72 | - mapping: add `Z z` to enable Zen mode distraction free editing 73 | - clojure: conjure, paredit, parinfer, parpar & nvim-treesitter-sexp plugins 74 | - neo-tree: override examples, show hidden in alternate style 75 | - plantuml: key mapping to call out to plantuml jar or binary 76 | - example-config: add new plugins & override existing plugin config 77 | - clojure: which-key mappings for nvim-treesitter-sexp structural editing 78 | - practicalli: move neovim options and key mappings from astrocore.lua 79 | - practicalli: set everforest theme, remove from astroui.lua 80 | - community: local fork to test clojure pack changes 81 | - community: import clojure pack, add practicalli config overrides 82 | - github: Octo plugin with gh keymaps 83 | - community: `lsp_doc_border = true` adds border to hover docs & signature help 84 | - readme: refactor install details & multiple config setup 85 | - neogit: disable_signs = true otherwise fold signs duplicated 86 | - community: disable project.nvim in favor of AstroNvim router 87 | - github: Gists plugin and key maps 88 | - practicalli: conjure eval comment & hightlight options 89 | - community: neovide recipes for scaling functions & key mappings 90 | - termux: use local lsp language servers when mason install not supported 91 | - termux: disable mason from installing the lua_ls language server 92 | - termux: neogit v0.0.1 for nvim 0.9.x support 93 | - termux: conditional check for OS_TERMUX to load config 94 | - practicalli: move to `user-practicalli.lua` to load config last 95 | - practicalli: add conditional using `PRACTICALLI_ASTRO` environment variable 96 | - termux: `clojure_lsp` server excluded from mason install 97 | - termux: comment support for neovim 0.9.x 98 | - community: flatten-nvm to open files and command output in existing neovim instance 99 | - practicalli: add trim plugin to automatically remove whitespace 100 | - community: example disable of plugins from an astro community pack 101 | - practicalli: which-key vertical `helix` menu layout option 102 | - practicalli: conjure sub-menus for which-key 103 | - community: telescope live grep args search via file name pattern 104 | 105 | ## Changed 106 | - readme: expand on description and use 107 | - practicalli: conjure global options for practicalli workflow 108 | - astrocore: reset file to original config from template 109 | - clojure: add nvim-treesitter-sexp and comment paredit plugins 110 | - community: 2 second navigation message timeout (nvim-notify) 111 | - practicalli: include AstroCommunity options for neogit, noice & zen-mode 112 | - practicalli: neogit key works consistently when set in plugin config 113 | - termux: comment neogit plugin pin, neovim 0.10.0 released for termux 114 | - practicalli: neogit key works consistently when set in plugin config 115 | - practicalli: updated config for better-escape.nvim plugin rewrite 116 | - community: import spectre from search category (was project) 117 | - astro: capitalise Leader and LocalLeader within key mapping configuration. 118 | -------------------------------------------------------------------------------- /lua/plugins/github.lua: -------------------------------------------------------------------------------- 1 | -- ------------------------------------------ 2 | -- GitHub related plugins 3 | -- 4 | -- Octo manages issues and pull requests from Neovim 5 | -- Requires GitHub CLI install 6 | -- https://practical.li/neovim/source-control/octo/ 7 | -- ------------------------------------------ 8 | 9 | -- if true then return {} end -- WARN: REMOVE THIS LINE TO ACTIVATE THIS FILE 10 | 11 | ---@type LazySpec 12 | return { 13 | { 14 | "pwntester/octo.nvim", 15 | dependencies = { 16 | "nvim-lua/plenary.nvim", 17 | "nvim-telescope/telescope.nvim", 18 | "nvim-tree/nvim-web-devicons", 19 | { "AstroNvim/astroui", opts = { icons = { Octo = "" } } }, 20 | { 21 | "AstroNvim/astrocore", 22 | opts = function(_, opts) 23 | local maps = opts.mappings 24 | local prefix = "gh" 25 | maps.n[prefix] = { desc = require("astroui").get_icon("Octo", 1, true) .. "Octo" } 26 | maps.n[prefix .. "a"] = { desc = "Assignee/Reviewer" } 27 | maps.n[prefix .. "aa"] = { "Octo assignee add", desc = "Assign a user" } 28 | maps.n[prefix .. "ap"] = { "Octo reviewer add", desc = "Assign a PR reviewer" } 29 | maps.n[prefix .. "ar"] = { "Octo assignee remove", desc = "Remove a user" } 30 | maps.n[prefix .. "c"] = { desc = "Comments" } 31 | maps.n[prefix .. "ca"] = { "Octo comment add", desc = "Add a new comment" } 32 | maps.n[prefix .. "cd"] = { "Octo comment delete", desc = "Delete a comment" } 33 | maps.n[prefix .. "e"] = { desc = "Reaction" } 34 | maps.n[prefix .. "e1"] = { "Octo reaction thumbs_up", desc = "Add 👍 reaction" } 35 | maps.n[prefix .. "e2"] = { "Octo reaction thumbs_down", desc = "Add 👎 reaction" } 36 | maps.n[prefix .. "e3"] = { "Octo reaction eyes", desc = "Add 👀 reaction" } 37 | maps.n[prefix .. "e4"] = { "Octo reaction laugh", desc = "Add 😄 reaction" } 38 | maps.n[prefix .. "e5"] = { "Octo reaction confused", desc = "Add 😕 reaction" } 39 | maps.n[prefix .. "e6"] = { "Octo reaction rocket", desc = "Add 🚀 reaction" } 40 | maps.n[prefix .. "e7"] = { "Octo reaction heart", desc = "Add ❤️ reaction" } 41 | maps.n[prefix .. "e8"] = { "Octo reaction party", desc = "Add 🎉 reaction" } 42 | maps.n[prefix .. "i"] = { desc = "Issues" } 43 | maps.n[prefix .. "ic"] = { "Octo issue close", desc = "Close current issue" } 44 | maps.n[prefix .. "il"] = { "Octo issue list", desc = "List open issues" } 45 | maps.n[prefix .. "io"] = { "Octo issue browser", desc = "Open current issue in browser" } 46 | maps.n[prefix .. "ir"] = { "Octo issue reopen", desc = "Reopen current issue" } 47 | maps.n[prefix .. "iu"] = { "Octo issue url", desc = "Copies URL of current issue" } 48 | maps.n[prefix .. "l"] = { desc = "Label" } 49 | maps.n[prefix .. "la"] = { "Octo label add", desc = "Assign a label" } 50 | maps.n[prefix .. "lc"] = { "Octo label create", desc = "Create a label" } 51 | maps.n[prefix .. "lr"] = { "Octo label remove", desc = "Remove a label" } 52 | maps.n[prefix .. "p"] = { desc = "Pull requests" } 53 | maps.n[prefix .. "pc"] = { "Octo pr close", desc = "Close current PR" } 54 | maps.n[prefix .. "pd"] = { "Octo pr diff", desc = "Show PR diff" } 55 | maps.n[prefix .. "pl"] = { "Octo pr commits", desc = "List changed files in PR" } 56 | maps.n[prefix .. "pm"] = { desc = "Merge current PR" } 57 | maps.n[prefix .. "pmd"] = { "Octo pr merge delete", desc = "Delete merge PR" } 58 | maps.n[prefix .. "pmm"] = { "Octo pr merge commit", desc = "Merge commit PR" } 59 | maps.n[prefix .. "pmr"] = { "Octo pr merge rebase", desc = "Rebase merge PR" } 60 | maps.n[prefix .. "pms"] = { "Octo pr merge squash", desc = "Squash merge PR" } 61 | maps.n[prefix .. "pn"] = { "Octo pr create", desc = "Create PR for current branch" } 62 | maps.n[prefix .. "po"] = { "Octo pr browser", desc = "Open current PR in browser" } 63 | maps.n[prefix .. "pp"] = { "Octo pr checkout", desc = "Checkout PR" } 64 | maps.n[prefix .. "pr"] = { "Octo pr ready", desc = "Mark draft as ready for review" } 65 | maps.n[prefix .. "ps"] = { "Octo pr list", desc = "List open PRs" } 66 | maps.n[prefix .. "pt"] = { "Octo pr commits", desc = "List PR commits" } 67 | maps.n[prefix .. "pu"] = { "Octo pr url", desc = "Copies URL of current PR" } 68 | maps.n[prefix .. "r"] = { desc = "Repo" } 69 | maps.n[prefix .. "rf"] = { "Octo repo fork", desc = "Fork repo" } 70 | maps.n[prefix .. "rl"] = { "Octo repo list", desc = "List repo user stats" } 71 | maps.n[prefix .. "ro"] = { "Octo repo open", desc = "Open current repo in browser" } 72 | maps.n[prefix .. "ru"] = { "Octo repo url", desc = "Copies URL of current repo" } 73 | maps.n[prefix .. "s"] = { desc = "Review" } 74 | maps.n[prefix .. "sc"] = { "Octo review close", desc = "Return to PR" } 75 | maps.n[prefix .. "sc"] = { "Octo review comments", desc = "View pending comments" } 76 | maps.n[prefix .. "sd"] = { "Octo review discard", desc = "Delete pending review" } 77 | maps.n[prefix .. "sf"] = { "Octo review submit", desc = "Submit review" } 78 | maps.n[prefix .. "sp"] = { "Octo review commit", desc = "Select commit to review" } 79 | maps.n[prefix .. "sr"] = { "Octo review resume", desc = "Resume review" } 80 | maps.n[prefix .. "ss"] = { "Octo review start", desc = "Start review" } 81 | maps.n[prefix .. "t"] = { desc = "Threads" } 82 | maps.n[prefix .. "ta"] = { "Octo thread resolve", desc = "Mark thread as resolved" } 83 | maps.n[prefix .. "td"] = { "Octo thread unresolve", desc = "Mark thread as unresolved" } 84 | maps.n[prefix .. "x"] = { "Octo actions", desc = "Run an action" } 85 | end, 86 | }, 87 | }, 88 | cmd = { "Octo" }, 89 | opts = { 90 | use_diagnostic_signs = true, 91 | default_remote = { "practicalli", "practicalli-johnny", "upstream", "origin" }, 92 | mappings = {}, 93 | }, 94 | }, 95 | } 96 | -------------------------------------------------------------------------------- /snippets/markdown.json: -------------------------------------------------------------------------------- 1 | { 2 | "mkdocs admonition warning": { 3 | "prefix": "mkdocs-admonition-warning-draft", 4 | "body": [ 5 | "!!! WARNING \"Initial draft - feedback welcome\"" 6 | ], 7 | "description": "MkDocs Admonition Warning Draft" 8 | }, 9 | "mkdocs button tag": { 10 | "prefix": "mkdocs-button", 11 | "body": [ 12 | "{.md-button} $0" 13 | ], 14 | "description": "MkDocs Button tag" 15 | }, 16 | "mkdocs button target tag": { 17 | "prefix": "mkdocs-button-target-tag", 18 | "body": [ 19 | "{target=_blank .md-button} $0" 20 | ], 21 | "description": "MkDocs Button target blank tag" 22 | }, 23 | "mkdocs button form": { 24 | "prefix": "mkdocs-button-form", 25 | "body": [ 26 | "[${1:linktext}](${2:URL}){target=_blank .md-button} $0" 27 | ], 28 | "description": "MkDocs Button form" 29 | }, 30 | "mkdocs link target blank tag": { 31 | "prefix": "mkdocs-link-target-blank-tag", 32 | "body": [ 33 | "{target=_blank} $0" 34 | ], 35 | "description": "MkDocs Link target blank tag" 36 | }, 37 | "mkdocs link form": { 38 | "prefix": "mkdocs-link-form", 39 | "body": [ 40 | "[${1:linktext}](${2:URL}){target=_blank .md-button} $0" 41 | ], 42 | "description": "MkDocs Link form" 43 | }, 44 | "mkdocs youtube embed": { 45 | "prefix": "mkdocs-youtube-embed", 46 | "body": [ 47 | "

\n \n

$0" 48 | ], 49 | "description": "MkDocs YouTube Embed" 50 | }, 51 | "mkdocs icon book": { 52 | "prefix": "mkdocs-icon-book", 53 | "body": [ 54 | ":fontawesome-solid-book-open:$0" 55 | ], 56 | "description": "MkDocs link book icon" 57 | }, 58 | "mkdocs icon github": { 59 | "prefix": "mkdocs-icon-github", 60 | "body": [ 61 | ":fontawesome-brands-github:$0" 62 | ], 63 | "description": "MkDocs link github icon" 64 | }, 65 | "mkdocs icon globe": { 66 | "prefix": "mkdocs-icon-globe", 67 | "body": [ 68 | ":globe_with_meridians:$0" 69 | ], 70 | "description": "MkDocs link globe icon" 71 | }, 72 | "mkdocs icon mastodon": { 73 | "prefix": "mkdocs-icon-mastodon", 74 | "body": [ 75 | ":fontawesome-brands-mastodon:$0" 76 | ], 77 | "description": "MkDocs link mastodon icon" 78 | }, 79 | "mkdocs icon youtube": { 80 | "prefix": "mkdocs-icon-youtube", 81 | "body": [ 82 | ":fontawesome-brands-youtube:$0" 83 | ], 84 | "description": "MkDocs link youtube icon" 85 | }, 86 | "mkdocs image github base url": { 87 | "prefix": "mkdocs-image-github-base-url", 88 | "body": [ 89 | "https://raw.githubusercontent.com/practicalli/graphic-design/live/$0" 90 | ], 91 | "description": "MkDocs image GitHub base URL" 92 | }, 93 | "mkdocs image form": { 94 | "prefix": "mkdocs-image-form", 95 | "body": [ 96 | "![${1:alternative-text}](${2:url}#only-dark#$3){align=left$4 loading=lazy style=\"height:150px;width:150px\"}$0" 97 | ], 98 | "description": "MkDocs Image form" 99 | }, 100 | "mkdocs image GitHub form": { 101 | "prefix": "mkdocs-image-github-form", 102 | "body": [ 103 | "![${1:alternative text}](https://raw.githubusercontent.com/practicalli/graphic-design/live/${2:URL}#only-dark$3){align=left$4 loading=lazy style=\"height:150px;width:150px\"}" 104 | ], 105 | "description": "MkDocs Image GitHub form" 106 | }, 107 | "post header": { 108 | "prefix": "post-header", 109 | "body": [ 110 | "--- 111 | title: ${1:meaningful title} 112 | date: 113 | created: 2025-0${2}-${3} 114 | updated: 2025-0${2}-${3} 115 | authors: 116 | - practicalli 117 | categories: 118 | - practicalli 119 | tags: 120 | - clojure 121 | draft: true 122 | --- 123 | 124 | $0 125 | 126 | 127 | 128 | 129 | --- 130 | Thank you. 131 | 132 | [:globe_with_meridians: Practical.li Website](https://practical.li){target=_blank .md-button} 133 | 134 | [:fontawesome-brands-github: Practical.li GitHub Org](https://github.com/practicalli){target=_blank .md-button} 135 | [:fontawesome-brands-github: practicalli-johnny profile](https://github.com/practicalli-johnny){target=_blank .md-button} 136 | 137 | [:fontawesome-brands-mastodon: @practicalli@clj.social](https://clj.social/@practicalli){target=_blank .md-button} 138 | [:fontawesome-brands-twitter: @practical_li](https://twitter.com/practcial_li){target=_blank .md-button} 139 | " 140 | ], 141 | "description": "post-header" 142 | }, 143 | "mkdocs key form": { 144 | "prefix": "mkdocs-key-form", 145 | "body": [ 146 | "++$0++" 147 | ], 148 | "description": "MkDocs Key form" 149 | }, 150 | "mkdocs code block embeded": { 151 | "prefix": "mkdocs-code-embed", 152 | "body": [ 153 | "!!! EXAMPLE \"${1:title}\" 154 | ```${2:title} 155 | --8<-- \"${2:url}?raw=true\" 156 | ```" 157 | ] 158 | }, 159 | "mkdocs code block fourclojure": { 160 | "prefix": "mkdocs-code-embed-4clojure", 161 | "body": [ 162 | "!!! EXAMPLE \"Design Journal - 4Clojure #${1:number}\" 163 | ```clojure 164 | --8<-- \"https://github.com/practicalli/four-clojure/blob/master/src/four_clojure/${2:filename}?raw=true\" 165 | ```" 166 | ] 167 | }, 168 | "link": { 169 | "prefix": "link", 170 | "body": "[$1]($2)$0", 171 | "description": "Add link" 172 | }, 173 | "image": { 174 | "prefix": "img", 175 | "body": "![$1]($2)$0", 176 | "description": "Add image" 177 | }, 178 | "strikethrough": { 179 | "prefix": "strikethrough", 180 | "body": "~~$1~~$0", 181 | "description": "Insert strikethrough" 182 | }, 183 | "insert bold text": { 184 | "prefix": "bold", 185 | "body": "**$1**$0", 186 | "description": "Insert bold text" 187 | }, 188 | "insert italic text": { 189 | "prefix": "italic", 190 | "body": "*$1*$0", 191 | "description": "Insert italic text" 192 | }, 193 | "insert bold and italic text": { 194 | "prefix": "bolditalic", 195 | "body": "***$1***$0", 196 | "description": "Insert bold and italic text" 197 | }, 198 | "insert quoted text": { 199 | "prefix": "quote", 200 | "body": "> $1", 201 | "description": "Insert quoted text" 202 | }, 203 | "insert code block": { 204 | "prefix": "codeblocky", 205 | "body": "```${1:language}\n\t$2\n```$0", 206 | "description": "Insert fenced code block" 207 | }, 208 | "insert horizontal rule": { 209 | "prefix": "rule", 210 | "body": "----------\n", 211 | "description": "Insert horizontal rule" 212 | }, 213 | "collapsed detail": { 214 | "prefix": "collapsed", 215 | "body": "
\n\t$1\n\t$2\n
$0", 216 | "description": "Collapse text section" 217 | } 218 | } 219 | -------------------------------------------------------------------------------- /lua/plugins/clojure.lua: -------------------------------------------------------------------------------- 1 | -- ------------------------------------------ 2 | -- Clojure Development support - manual configuration 3 | -- 4 | -- Example plugin configurations to create a customised Clojure workflow 5 | -- clojure-lsp server via mason 6 | -- treesitter clojure parser 7 | -- ts-comment.nvim with `;;` and `;` support 8 | -- structured editing with parinfer and treesitter-sexp plugins 9 | -- REPL connected editor with Conjure plugin (log HUD hidden by default) 10 | -- 11 | -- NOTE: disable AstroCommunity Clojure Pack in `community.lua` 12 | -- before using this configuration 13 | -- ------------------------------------------ 14 | 15 | if true then return {} end -- WARN: REMOVE THIS LINE TO ACTIVATE THIS FILE 16 | 17 | -- Local variables 18 | -- Language filetypes for plugins 19 | local lisp_dialects = { "clojure", "fennel" } 20 | 21 | ---@type LazySpec 22 | return { 23 | -- Ensure Language Server installed 24 | { 25 | "williamboman/mason-lspconfig.nvim", 26 | optional = true, 27 | opts = function(_, opts) 28 | opts.ensure_installed = require("astrocore").list_insert_unique(opts.ensure_installed, { "clojure_lsp" }) 29 | end, 30 | }, 31 | { 32 | "WhoIsSethDaniel/mason-tool-installer.nvim", 33 | optional = true, 34 | opts = function(_, opts) 35 | opts.ensure_installed = require("astrocore").list_insert_unique(opts.ensure_installed, { "clojure-lsp" }) 36 | end, 37 | }, 38 | -- Treesitter Clojure parser 39 | { 40 | "nvim-treesitter/nvim-treesitter", 41 | optional = true, 42 | opts = function(_, opts) 43 | if opts.ensure_installed ~= "all" then 44 | opts.ensure_installed = require("astrocore").list_insert_unique(opts.ensure_installed, { "clojure" }) 45 | end 46 | end, 47 | }, 48 | 49 | -- Comments 50 | { "numToStr/Comment.nvim", enabled = false }, 51 | { "JoosepAlviste/nvim-ts-context-commentstring", enabled = false }, 52 | { 53 | "folke/ts-comments.nvim", 54 | opts = {}, 55 | event = "VeryLazy", 56 | enabled = vim.fn.has "nvim-0.10.0" == 1, 57 | }, 58 | 59 | -- Structural Editing 60 | -- Parinfer Alignment driven structured editing for Clojure and more 61 | -- ["clojure", "scheme", "lisp", "racket", "hy", "fennel", "janet", "carp", "wast", "yuck"] 62 | { 63 | "gpanders/nvim-parinfer", 64 | filetype = lisp_dialects, 65 | dependencies = { 66 | "AstroNvim/astrocore", 67 | opts = { 68 | indent = { 69 | -- fix indentation of nodes operated upon 70 | -- enabled = false, 71 | -- custom indentation function called after a slurp/barf 72 | -- indentor = require("nvim-paredit.indentation.native").indentor, 73 | }, 74 | options = { 75 | g = { 76 | parinfer_force_balance = true, 77 | parinfer_comment_chars = { ";", ";;" }, 78 | -- "smart", "indent" or "paren" mode - https://shaunlebron.github.io/parinfer/#writing-with-parinfer 79 | parinfer_mode = "smart", 80 | }, 81 | }, 82 | keys = { 83 | -- Toggle Parinfer on/off (globally) 84 | { "TP", "ParinferOn! ", desc = "Toggle Parinfer" }, 85 | }, 86 | }, 87 | }, 88 | }, 89 | { 90 | "PaterJason/nvim-treesitter-sexp", 91 | dependencies = { "nvim-treesitter/nvim-treesitter" }, 92 | ft = { "clojure", "fennel", "janet", "query" }, 93 | cmd = "TSSexp", 94 | opts = {}, 95 | }, 96 | 97 | -- Paredit paren wrangling 98 | -- { 99 | -- "julienvincent/nvim-paredit", 100 | -- filetype = lisp_dialects, 101 | -- dependencies = { 102 | -- "AstroNvim/astrocore", 103 | -- opts = { 104 | -- options = { 105 | -- g = {}, 106 | -- }, 107 | -- mappings = { 108 | -- n = { 109 | -- -- normal mode key bindings 110 | -- -- setting a mapping to false will disable it 111 | -- -- [""] = false, 112 | -- }, 113 | -- t = { 114 | -- -- terminal? mode key bindings 115 | -- }, 116 | -- v = { 117 | -- -- visual mode key bindings 118 | -- }, 119 | -- }, 120 | -- }, 121 | -- }, 122 | -- }, 123 | -- Paredit & Parinfer together 124 | -- { 125 | -- "dundalek/parpar.nvim", 126 | -- filetype = lisp_dialects, 127 | -- dependencies = { 128 | -- "AstroNvim/astrocore", 129 | -- "gpanders/nvim-parinfer", 130 | -- "julienvincent/nvim-paredit", 131 | -- opts = { 132 | -- options = { 133 | -- g = {}, 134 | -- }, 135 | -- mappings = { 136 | -- n = { 137 | -- -- normal mode key bindings 138 | -- -- setting a mapping to false will disable it 139 | -- -- [""] = false, 140 | -- }, 141 | -- t = { 142 | -- -- terminal? mode key bindings 143 | -- }, 144 | -- v = { 145 | -- -- visual mode key bindings 146 | -- }, 147 | -- }, 148 | -- }, 149 | -- }, 150 | -- }, 151 | -- REPL workflow with Conjure 152 | { 153 | "Olical/conjure", 154 | -- load plugin on filetypes 155 | filetype = lisp_dialects, 156 | dependencies = { 157 | "AstroNvim/astrocore", 158 | opts = { 159 | options = { 160 | g = { 161 | -- INFO: `:help conjure-client-clojure-nrepl-configuration` for Conjure Clojure options 162 | 163 | -- Width of HUD as percentage of the editor width between 0.0 and 1.0. Default: `0.42` 164 | ["conjure#log#hud#width"] = 1, 165 | -- Display HUD (REPL log). Default: `true` 166 | ["conjure#log#hud#enabled"] = false, 167 | -- HUD corner position (over-ridden by HUD cursor detection). Default: `"NE"` 168 | -- Example: Set to `"SE"` and HUD width to `1.0` for full width HUD at bottom of screen 169 | ["conjure#log#hud#anchor"] = "SE", 170 | -- Open log at bottom or far right of editor, using full width or height. Default: `false` 171 | ["conjure#log#botright"] = true, 172 | -- Lines from top of file to check for `ns` form, to sett evaluation context Default: `24` 173 | -- `b:conjure#context` to override a specific buffer that isn't finding the context 174 | ["conjure#extract#context_header_lines"] = 100, 175 | -- comment pattern for eval to comment command 176 | ["conjure#eval#comment_prefix"] = ";; ", 177 | -- Hightlight evaluated forms 178 | ["conjure#highlight#enabled"] = true, 179 | -- Start "auto-repl" process when nREPL connection not found, e.g. babashka. ;; Default: `true` 180 | ["conjure#client#clojure#nrepl#connection#auto_repl#enabled"] = false, 181 | -- Hide auto-repl buffer when triggered. Default: `false` 182 | ["conjure#client#clojure#nrepl#connection#auto_repl#hidden"] = true, 183 | -- Command to start the auto-repl. Default: `"bb nrepl-server localhost:8794"` 184 | ["conjure#client#clojure#nrepl#connection#auto_repl#cmd"] = nil, 185 | -- Ensure namespace required after REPL connection. Default: `true` 186 | ["conjure#client#clojure#nrepl#eval#auto_require"] = false, 187 | -- suppress `; (out)` prefix in log evaluation results 188 | ["conjure#client#clojure#nrepl#eval#raw_out"] = true, 189 | -- test runner "clojure" (clojure.test) "clojurescript" (cljs.test) "kaocha" 190 | ["conjure#client#clojure#nrepl#test#runner"] = "clojure", 191 | }, 192 | }, 193 | }, 194 | }, 195 | }, 196 | } 197 | -------------------------------------------------------------------------------- /lua/plugins/user-practicalli.lua: -------------------------------------------------------------------------------- 1 | -- ------------------------------------------ 2 | -- Practicalli specific customisations 3 | -- 4 | -- Startup dashboard banner 5 | -- `fd` as alternate `ESC` key mapping (better-escape.nvim) 6 | -- Everforest colorscheme 7 | -- Custom global options & key mpapings (via astrocore) 8 | -- ------------------------------------------ 9 | 10 | -- INFO: Create a `lua/plugins/your-name.lua` for significant changes 11 | 12 | -- INFO: Files under `lua/plugins/*.lua` load in alphabetical order, 13 | -- so plugin overrides should be the last file to load 14 | 15 | -- INFO: Skip this config if `PRACTICALLI_ASTRO` environment variable set to false 16 | local practicalli = vim.env.PRACTICALLI_ASTRO 17 | if practicalli == "false" then return {} end 18 | 19 | ---@type LazySpec 20 | return { 21 | 22 | -- ------------------------------------------ 23 | -- Startup Dashboard 24 | { 25 | "goolord/alpha-nvim", 26 | opts = function(_, opts) 27 | -- customize the dashboard header 28 | opts.section.header.val = { 29 | " ██████╗ ██████╗ █████╗ ██████╗████████╗██╗ ██████╗ █████╗ ██╗ ██╗ ██╗", 30 | " ██╔══██╗██╔══██╗██╔══██╗██╔════╝╚══██╔══╝██║██╔════╝██╔══██╗██║ ██║ ██║", 31 | " ██████╔╝██████╔╝███████║██║ ██║ ██║██║ ███████║██║ ██║ ██║", 32 | " ██╔═══╝ ██╔══██╗██╔══██║██║ ██║ ██║██║ ██╔══██║██║ ██║ ██║", 33 | " ██║ ██║ ██║██║ ██║╚██████╗ ██║ ██║╚██████╗██║ ██║███████╗███████╗██║", 34 | " ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚══════╝╚══════╝╚═╝", 35 | } 36 | return opts 37 | end, 38 | }, 39 | -- ------------------------------------------ 40 | 41 | -- ------------------------------------------ 42 | -- `fd` alternative to the `ESC` key 43 | { 44 | "max397574/better-escape.nvim", 45 | event = "InsertCharPre", 46 | opts = { 47 | timeout = vim.o.timeoutlen, 48 | default_mappings = false, 49 | mappings = { 50 | i = { f = { d = "" } }, 51 | c = { f = { d = "" } }, 52 | t = { f = { d = "" } }, 53 | v = { f = { d = "" } }, 54 | s = { f = { d = "" } }, 55 | }, 56 | }, 57 | }, 58 | -- ------------------------------------------ 59 | 60 | -- ------------------------------------------ 61 | -- Editor tools 62 | -- 63 | { 64 | "cappyzawa/trim.nvim", 65 | opts = { 66 | -- override default config 67 | -- ft_blocklist = {"markdown"}, -- filetype not to trim 68 | -- highlight = true, 69 | -- highlight_bg = "#800080", -- or 'purple' 70 | }, 71 | }, 72 | { -- Show key presses in Neovim window 73 | "nvzone/showkeys", 74 | lazy = false, 75 | cmd = "ShowkeysToggle", 76 | opts = { 77 | excluded_modes = { "i", "t" }, -- skip insert and terminal 78 | position = "bottom-center", 79 | show_count = true, 80 | maxkeys = 4, 81 | timeout = 4, 82 | }, 83 | }, 84 | -- ------------------------------------------ 85 | 86 | -- ------------------------------------------ 87 | -- AstroCommunity Plugin Options: 88 | -- 89 | -- Neogit: astrocommunity.git.neogit 90 | { 91 | "neogit", 92 | dependencies = { 93 | { "nvim-lua/plenary.nvim", "sindrets/diffview.nvim" }, 94 | }, 95 | opts = { 96 | disable_signs = true, -- duplicate signs if enabled 97 | -- graph_style = "unicode", -- elegant commit graph 98 | graph_style = "kitty", -- elegant commit graph 99 | integrations = { diffview = true }, 100 | }, 101 | keys = { 102 | -- Neogit status - overrides stage hunk astronvim mapping 103 | { "gs", "Neogit", desc = "Status (Neogit)" }, 104 | }, 105 | }, 106 | 107 | -- Noice: astrocommunity.utility.noice-nvim 108 | { 109 | "noice.nvim", 110 | opts = function(_, opts) 111 | local utils = require "astrocore" 112 | return utils.extend_tbl(opts, { 113 | presets = { 114 | lsp_doc_border = true, -- add a border to hover docs and signature help 115 | }, 116 | }) 117 | end, 118 | }, 119 | -- nvim-notify controls how messages are displayed 120 | { 121 | "rcarriga/nvim-notify", 122 | opts = { 123 | top_down = false, 124 | timeout = 2000, -- shorter display duration, default 3000 125 | -- log messages level - default 5 (everything), 1 (minimum) 126 | level = 3, 127 | -- background_color = "#000000", 128 | }, 129 | }, 130 | 131 | -- Zen-Mode: astrocommunity.editing-support.zen-mode-nvim 132 | -- https://github.com/folke/zen-mode.nvim#%EF%B8%8F-configuration 133 | { 134 | "folke/zen-mode.nvim", 135 | opts = { 136 | plugins = { 137 | options = { 138 | enabled = true, 139 | }, 140 | -- Kitty Terminal 141 | kitty = { 142 | enabled = true, 143 | font = "+4", -- font size increment 144 | }, 145 | }, 146 | }, 147 | }, 148 | -- ------------------------------------------ 149 | 150 | -- ------------------------------------------ 151 | -- Vertically aligned menu list 152 | { 153 | "folke/which-key.nvim", 154 | opts = { 155 | ---@type false | "classic" | "modern" | "helix" 156 | preset = "helix", 157 | }, 158 | }, 159 | -- ------------------------------------------ 160 | 161 | -- ------------------------------------------ 162 | -- AstroNvim UI Plugin Options 163 | { 164 | -- AstroUI provides the basis for configuring the AstroNvim User Interface 165 | -- Configuration documentation can be found with `:h astroui` 166 | "AstroNvim/astroui", 167 | ---@type AstroUIOpts 168 | opts = { 169 | colorscheme = "everforest", 170 | }, 171 | }, 172 | -- Configure Everforest theme 173 | -- { 174 | -- "neanias/everforest-nvim", 175 | -- config = function() 176 | -- require("everforest").setup { 177 | -- transparent_background_level = 1, 178 | -- } 179 | -- end, 180 | -- }, 181 | -- ------------------------------------------ 182 | 183 | -- ------------------------------------------ 184 | -- AstroNvim LSP Configuration 185 | -- INFO: Remove to use Mason install of Clojure LSP rather than local install 186 | -- INFO: Not required once PR merged: https://github.com/mason-org/mason-registry/pull/7896 187 | -- { 188 | -- "AstroNvim/astrolsp", 189 | -- ---@type AstroLSPOpts 190 | -- opts = { 191 | -- servers = { "clojure_lsp" }, -- use locally installed Clojure LSP server 192 | -- }, 193 | -- }, 194 | -- { 195 | -- "williamboman/mason-lspconfig.nvim", 196 | -- opts = function(_, opts) 197 | -- -- Remove clojure_lsp from mason install (added by clojure pack) 198 | -- opts.ensure_installed = vim.tbl_filter(function(s) return s ~= "clojure_lsp" end, opts.ensure_installed) 199 | -- end, 200 | -- }, 201 | -- ------------------------------------------ 202 | 203 | -- ------------------------------------------ 204 | -- AstroNvim Core Plugin Options and Key Mappings 205 | { 206 | "AstroNvim/astrocore", 207 | ---@type AstroCoreOpts 208 | opts = { 209 | options = { 210 | -- configure general options: vim.opt. 211 | opt = { 212 | spell = true, -- sets vim.opt.spell 213 | wrap = true, -- sets vim.opt.wrap 214 | guifont = "Fira Code:h16", -- neovide font family & size 215 | }, 216 | -- configure global vim variables: vim.g 217 | g = { 218 | -- Neovim lanaguage provides - disable language integration not required 219 | loaded_node_provider = 0, 220 | loaded_perl_provider = 0, 221 | loaded_python3_provider = 0, 222 | loaded_ruby_provider = 0, 223 | 224 | -- Leader key for Visual-Multi Cursors (Multiple Cursors) 225 | VM_leader = "gm", -- Visual Multi Leader (multiple cursors - user plugin) 226 | 227 | -- Conjure plugin overrides 228 | -- comment pattern for eval to comment command 229 | ["conjure#eval#comment_prefix"] = ";; ", 230 | -- Hightlight evaluated forms 231 | ["conjure#highlight#enabled"] = true, 232 | 233 | -- show HUD REPL log at startup 234 | ["conjure#log#hud#enabled"] = false, 235 | 236 | -- auto repl (babashka) 237 | ["conjure#client#clojure#nrepl#connection#auto_repl#enabled"] = false, 238 | ["conjure#client#clojure#nrepl#connection#auto_repl#hidden"] = true, 239 | ["conjure#client#clojure#nrepl#connection#auto_repl#cmd"] = nil, 240 | ["conjure#client#clojure#nrepl#eval#auto_require"] = false, 241 | 242 | -- Test runner: "clojure", "clojuresCRipt", "kaocha" 243 | ["conjure#client#clojure#nrepl#test#runner"] = "kaocha", 244 | 245 | -- Minimise very long lines slow down: 246 | -- `g:conjure#log#treesitter` false (true by default) 247 | -- ["conjure#log##treesitter"] = false, 248 | -- `g:conjure#log#disable_diagnostics` true (disabled) by default 249 | }, 250 | }, 251 | mappings = { 252 | n = { 253 | -- normal mode key bindings 254 | -- setting a mapping to false will disable it 255 | -- [""] = false, 256 | 257 | -- whick-key sub-menu for Visual-Multi Cursors (Multiple Cursors) 258 | ["gm"] = { name = "Multiple Cursors" }, 259 | 260 | -- Toggle last open buffer 261 | [""] = { "b#", desc = "Last tab" }, 262 | 263 | -- Save prompting for file name 264 | ["W"] = { ":write ", desc = "Save as file" }, 265 | 266 | -- mappings seen under group name "Buffer" 267 | ["b"] = { name = "Buffers" }, 268 | ["bt"] = { name = "Tabs" }, 269 | ["bn"] = { "tabnew", desc = "New tab" }, 270 | ["btn"] = { "tabNext", desc = "Next tab" }, 271 | ["bt"] = { "tabprevious", desc = "Previous tab" }, 272 | -- ["bD"] = { "Bdelete", desc = "Delete buffer" }, 273 | 274 | -- Find Menu 275 | -- browse via directory structure, create and modify paths 276 | ["fe"] = { "Telescope file_browser", desc = "Explorer" }, 277 | -- find word for specific file patterns 278 | ["fg"] = { 279 | "lua require('telescope').extensions.live_grep_args.live_grep_args()", 280 | desc = "Grep Word", 281 | }, 282 | 283 | -- Editing 284 | ["zZ"] = { "ZenMode", desc = " Zen mode" }, 285 | 286 | -- Git Menu 287 | -- ["gs"] = { "Neogit", desc = " Status (Neogit)" }, 288 | -- ["gs"] = false, -- disable git status 289 | -- ["gs"] = { function() require("neogit").open { kind = "tab" } end, desc = " Status (Neogit)" }, 290 | ["gH"] = { function() require("gitsigns").stage_hunk() end, desc = "Stage Git hunk" }, 291 | -- Gits.nvim key maps 292 | ["ghg"] = { name = "Gist" }, 293 | ["ghgr"] = { "GistCreate", desc = "Gist Region" }, 294 | ["ghgg"] = { "GistCreateFromFile", desc = "Gist File" }, 295 | ["ghgl"] = { "GistsList", desc = "List Gists" }, 296 | 297 | -- Showkeys plugin (visualise key presses in Neovim window) 298 | ["uk"] = { "ShowkeysToggle", desc = "Toggle Showkeys" }, 299 | }, 300 | t = { 301 | -- terminal mode key bindings 302 | }, 303 | v = { 304 | -- visual mode key bindings 305 | }, 306 | }, 307 | }, 308 | }, 309 | -- ------------------------------------------ 310 | } 311 | -------------------------------------------------------------------------------- /snippets/friendly-copy.json: -------------------------------------------------------------------------------- 1 | { 2 | "header 1": { 3 | "prefix": "h1", 4 | "body": ["# ${0}"], 5 | "description": "Add header level 1" 6 | }, 7 | "header 2": { 8 | "prefix": "h2", 9 | "body": ["## ${0}"], 10 | "description": "Add header level 2" 11 | }, 12 | "header 3": { 13 | "prefix": "h3", 14 | "body": ["### ${0}"], 15 | "description": "Add header level 3" 16 | }, 17 | "header 4": { 18 | "prefix": "h4", 19 | "body": ["#### ${0}"], 20 | "description": "Add header level 4" 21 | }, 22 | "header 5": { 23 | "prefix": "h5", 24 | "body": ["##### ${0}"], 25 | "description": "Add header level 5" 26 | }, 27 | "header 6": { 28 | "prefix": "h6", 29 | "body": ["###### ${0}"], 30 | "description": "Add header level 6" 31 | }, 32 | "Links": { 33 | "prefix": ["l", "link"], 34 | "body": ["[${1}](${2}) ${0}"], 35 | "description": "Add links" 36 | }, 37 | "URLS": { 38 | "prefix": ["u", "url"], 39 | "body": ["<${1}> ${0}"], 40 | "description": "Add urls" 41 | }, 42 | "Images": { 43 | "prefix": "img", 44 | "body": ["![${1}](${2}) ${0}"], 45 | "description": "Add images" 46 | }, 47 | "Insert strikethrough": { 48 | "prefix": "strikethrough", 49 | "body": "~~${1}~~ ${0}", 50 | "description": "Insert strikethrough" 51 | }, 52 | "Insert bold text": { 53 | "prefix": ["bold", "b"], 54 | "body": "**${1}** $0", 55 | "description": "Insert bold text" 56 | }, 57 | "Insert italic text": { 58 | "prefix": ["i", "italic"], 59 | "body": "*${1}* $0", 60 | "description": "Insert italic text" 61 | }, 62 | "Insert bold and italic text": { 63 | "prefix": ["bold and italic", "bi"], 64 | "body": "***${1}*** $0", 65 | "description": "Insert bold and italic text" 66 | }, 67 | "Insert quoted text": { 68 | "prefix": "quote", 69 | "body": "> ${1}", 70 | "description": "Insert quoted text" 71 | }, 72 | "Insert code": { 73 | "prefix": "code", 74 | "body": "`${1}` $0", 75 | "description": "Insert code" 76 | }, 77 | "Insert code block": { 78 | "prefix": "codeblock", 79 | "body": ["```${1:language}", "$0", "```"], 80 | "description": "Insert fenced code block" 81 | }, 82 | "Insert unordered list": { 83 | "prefix": "unordered list", 84 | "body": ["- ${1:first}", "- ${2:second}", "- ${3:third}", "$0"], 85 | "description": "Insert unordered list" 86 | }, 87 | "Insert ordered list": { 88 | "prefix": "ordered list", 89 | "body": ["1. ${1:first}", "2. ${2:second}", "3. ${3:third}", "$0"], 90 | "description": "Insert ordered list" 91 | }, 92 | "Insert horizontal rule": { 93 | "prefix": "horizontal rule", 94 | "body": "----------\n", 95 | "description": "Insert horizontal rule" 96 | }, 97 | "Insert task list": { 98 | "prefix": "task", 99 | "body": ["- [${1| ,x|}] ${2:text}", "${0}"], 100 | "description": "Insert task list" 101 | }, 102 | "Insert task list 2": { 103 | "prefix": "task2", 104 | "body": ["- [${1| ,x|}] ${2:text}", "- [${3| ,x|}] ${4:text}", "${0}"], 105 | "description": "Insert task list with 2 tasks" 106 | }, 107 | "Insert task list 3": { 108 | "prefix": "task3", 109 | "body": [ 110 | "- [${1| ,x|}] ${2:text}", 111 | "- [${3| ,x|}] ${4:text}", 112 | "- [${5| ,x|}] ${6:text}", 113 | "${0}" 114 | ], 115 | "description": "Insert task list with 3 tasks" 116 | }, 117 | "Insert task list 4": { 118 | "prefix": "task4", 119 | "body": [ 120 | "- [${1| ,x|}] ${2:text}", 121 | "- [${3| ,x|}] ${4:text}", 122 | "- [${5| ,x|}] ${6:text}", 123 | "- [${7| ,x|}] ${8:text}", 124 | "${0}" 125 | ], 126 | "description": "Insert task list with 4 tasks" 127 | }, 128 | "Insert task list 5": { 129 | "prefix": "task5", 130 | "body": [ 131 | "- [${1| ,x|}] ${2:text}", 132 | "- [${3| ,x|}] ${4:text}", 133 | "- [${5| ,x|}] ${6:text}", 134 | "- [${7| ,x|}] ${8:text}", 135 | "- [${9| ,x|}] ${10:text}", 136 | "${0}" 137 | ], 138 | "description": "Insert task list with 5 tasks" 139 | }, 140 | "Insert table": { 141 | "prefix": "table", 142 | "body": [ 143 | "| ${1:Column1} | ${2:Column2} | ${3:Column3} |", 144 | "|-------------- | -------------- | -------------- |", 145 | "| ${4:Item1} | ${5:Item1} | ${6:Item1} |", 146 | "${0}" 147 | ], 148 | "description": "Insert table with 2 rows and 3 columns. First row is heading." 149 | }, 150 | "Insert 2x1 table": { 151 | "prefix": "2x1table", 152 | "body": [ 153 | "| ${1:Column1} |", 154 | "|-------------- |", 155 | "| ${2:Item1} |", 156 | "${0}" 157 | ], 158 | "description": "Insert table with 2 rows and 1 column. First row is heading." 159 | }, 160 | "Insert 3x1 table": { 161 | "prefix": "3x1table", 162 | "body": [ 163 | "| ${1:Column1} |", 164 | "|-------------- |", 165 | "| ${2:Item1} |", 166 | "| ${3:Item2} |", 167 | "${0}" 168 | ], 169 | "description": "Insert table with 3 rows and 1 column. First row is heading." 170 | }, 171 | "Insert 4x1 table": { 172 | "prefix": "4x1table", 173 | "body": [ 174 | "| ${1:Column1} |", 175 | "|-------------- |", 176 | "| ${2:Item1} |", 177 | "| ${3:Item2} |", 178 | "| ${4:Item3} |", 179 | "${0}" 180 | ], 181 | "description": "Insert table with 4 rows and 1 column. First row is heading." 182 | }, 183 | "Insert 5x1 table": { 184 | "prefix": "5x1table", 185 | "body": [ 186 | "| ${1:Column1} |", 187 | "|-------------- |", 188 | "| ${2:Item1} |", 189 | "| ${3:Item2} |", 190 | "| ${4:Item3} |", 191 | "| ${5:Item4} |", 192 | "${0}" 193 | ], 194 | "description": "Insert table with 5 rows and 1 column. First row is heading." 195 | }, 196 | "Insert 2x2 table": { 197 | "prefix": "2x2table", 198 | "body": [ 199 | "| ${1:Column1} | ${2:Column2} |", 200 | "|--------------- | --------------- |", 201 | "| ${3:Item1.1} | ${4:Item2.1} |", 202 | "${0}" 203 | ], 204 | "description": "Insert table with 2 rows and 2 columns. First row is heading." 205 | }, 206 | "Insert 3x2 table": { 207 | "prefix": "3x2table", 208 | "body": [ 209 | "| ${1:Column1} | ${2:Column2} |", 210 | "|--------------- | --------------- |", 211 | "| ${3:Item1.1} | ${4:Item2.1} |", 212 | "| ${5:Item1.2} | ${6:Item2.2} |", 213 | "${0}" 214 | ], 215 | "description": "Insert table with 3 rows and 2 columns. First row is heading." 216 | }, 217 | "Insert 4x2 table": { 218 | "prefix": "4x2table", 219 | "body": [ 220 | "| ${1:Column1} | ${2:Column2} |", 221 | "|--------------- | --------------- |", 222 | "| ${3:Item1.1} | ${4:Item2.1} |", 223 | "| ${5:Item1.2} | ${6:Item2.2} |", 224 | "| ${7:Item1.3} | ${8:Item2.3} |", 225 | "${0}" 226 | ], 227 | "description": "Insert table with 4 rows and 2 columns. First row is heading." 228 | }, 229 | "Insert 5x2 table": { 230 | "prefix": "5x2table", 231 | "body": [ 232 | "| ${1:Column1} | ${2:Column2} |", 233 | "|--------------- | --------------- |", 234 | "| ${3:Item1.1} | ${4:Item2.1} |", 235 | "| ${4:Item1.2} | ${5:Item2.2} |", 236 | "| ${6:Item1.3} | ${7:Item2.3} |", 237 | "| ${8:Item1.4} | ${9:Item2.4} |", 238 | "${0}" 239 | ], 240 | "description": "Insert table with 5 rows and 2 columns. First row is heading." 241 | }, 242 | "Insert 2x3 table": { 243 | "prefix": "2x3table", 244 | "body": [ 245 | "| ${1:Column1} | ${2:Column2} | ${3:Column3} |", 246 | "|---------------- | --------------- | --------------- |", 247 | "| ${4:Item1.1} | ${5:Item2.1} | ${6:Item3.1} |", 248 | "${0}" 249 | ], 250 | "description": "Insert table with 2 rows and 3 columns. First row is heading." 251 | }, 252 | "Insert 3x3 table": { 253 | "prefix": "3x3table", 254 | "body": [ 255 | "| ${1:Column1} | ${2:Column2} | ${3:Column3} |", 256 | "|---------------- | --------------- | --------------- |", 257 | "| ${4:Item1.1} | ${5:Item2.1} | ${6:Item3.1} |", 258 | "| ${7:Item1.2} | ${8:Item2.2} | ${9:Item3.2} |", 259 | "${0}" 260 | ], 261 | "description": "Insert table with 3 rows and 3 columns. First row is heading." 262 | }, 263 | "Insert 4x3 table": { 264 | "prefix": "4x3table", 265 | "body": [ 266 | "| ${1:Column1} | ${2:Column2} | ${3:Column3} |", 267 | "|---------------- | --------------- | --------------- |", 268 | "| ${4:Item1.1} | ${5:Item2.1} | ${6:Item3.1} |", 269 | "| ${7:Item1.2} | ${8:Item2.2} | ${9:Item3.2} |", 270 | "| ${10:Item1.3} | ${11:Item2.3} | ${12:Item3.3} |", 271 | "${0}" 272 | ], 273 | "description": "Insert table with 4 rows and 3 columns. First row is heading." 274 | }, 275 | "Insert 5x3 table": { 276 | "prefix": "5x3table", 277 | "body": [ 278 | "| ${1:Column1} | ${2:Column2} | ${3:Column3} |", 279 | "|---------------- | --------------- | --------------- |", 280 | "| ${4:Item1.1} | ${5:Item2.1} | ${6:Item3.1} |", 281 | "| ${7:Item1.2} | ${8:Item2.2} | ${9:Item3.2} |", 282 | "| ${10:Item1.3} | ${11:Item2.3} | ${12:Item3.3} |", 283 | "| ${13:Item1.4} | ${14:Item2.4} | ${15:Item3.4} |", 284 | "${0}" 285 | ], 286 | "description": "Insert table with 5 rows and 3 columns. First row is heading." 287 | }, 288 | "Insert 2x4 table": { 289 | "prefix": "2x4table", 290 | "body": [ 291 | "| ${1:Column1} | ${2:Column2} | ${3:Column3} | ${4:Column4} |", 292 | "|---------------- | --------------- | --------------- | --------------- |", 293 | "| ${5:Item1.1} | ${6:Item2.1} | ${7:Item3.1} | ${8:Item4.1} |", 294 | "${0}" 295 | ], 296 | "description": "Insert table with 2 rows and 4 columns. First row is heading." 297 | }, 298 | "Insert 3x4 table": { 299 | "prefix": "3x4table", 300 | "body": [ 301 | "| ${1:Column1} | ${2:Column2} | ${3:Column3} | ${4:Column4} |", 302 | "|---------------- | --------------- | --------------- | --------------- |", 303 | "| ${5:Item1.1} | ${6:Item2.1} | ${7:Item3.1} | ${8:Item4.1} |", 304 | "| ${9:Item1.2} | ${10:Item2.2} | ${11:Item3.2} | ${12:Item4.2} |", 305 | "${0}" 306 | ], 307 | "description": "Insert table with 3 rows and 4 columns. First row is heading." 308 | }, 309 | "Insert 4x4 table": { 310 | "prefix": "4x4table", 311 | "body": [ 312 | "| ${1:Column1} | ${2:Column2} | ${3:Column3} | ${4:Column4} |", 313 | "|---------------- | --------------- | --------------- | --------------- |", 314 | "| ${5:Item1.1} | ${6:Item2.1} | ${7:Item3.1} | ${8:Item4.1} |", 315 | "| ${9:Item1.2} | ${10:Item2.2} | ${11:Item3.2} | ${12:Item4.2} |", 316 | "| ${13:Item1.3} | ${14:Item2.3} | ${15:Item3.3} | ${16:Item4.3} |", 317 | "${0}" 318 | ], 319 | "description": "Insert table with 4 rows and 4 columns. First row is heading." 320 | }, 321 | "Insert 5x4 table": { 322 | "prefix": "5x4table", 323 | "body": [ 324 | "| ${1:Column1} | ${2:Column2} | ${3:Column3} | ${4:Column4} |", 325 | "|---------------- | --------------- | --------------- | --------------- |", 326 | "| ${5:Item1.1} | ${6:Item2.1} | ${7:Item3.1} | ${8:Item4.1} |", 327 | "| ${9:Item1.2} | ${10:Item2.2} | ${11:Item3.2} | ${12:Item4.2} |", 328 | "| ${13:Item1.3} | ${14:Item2.3} | ${15:Item3.3} | ${16:Item4.3} |", 329 | "| ${17:Item1.4} | ${18:Item2.4} | ${19:Item3.4} | ${20:Item4.4} |", 330 | "${0}" 331 | ], 332 | "description": "Insert table with 5 rows and 4 columns. First row is heading." 333 | }, 334 | "Insert 2x5 table": { 335 | "prefix": "2x5table", 336 | "body": [ 337 | "| ${1:Column1} | ${2:Column2} | ${3:Column3} | ${4:Column4} | ${5:Column5} |", 338 | "|---------------- | --------------- | --------------- | --------------- | --------------- |", 339 | "| ${6:Item1.1} | ${7:Item2.1} | ${8:Item3.1} | ${9:Item4.1} | ${10:Item5.1} |", 340 | "${0}" 341 | ], 342 | "description": "Insert table with 2 rows and 5 columns. First row is heading." 343 | }, 344 | "Insert 3x5 table": { 345 | "prefix": "3x5table", 346 | "body": [ 347 | "| ${1:Column1} | ${2:Column2} | ${3:Column3} | ${4:Column4} | ${5:Column5} |", 348 | "|---------------- | --------------- | --------------- | --------------- | --------------- |", 349 | "| ${6:Item1.1} | ${7:Item2.1} | ${8:Item3.1} | ${9:Item4.1} | ${10:Item5.1} |", 350 | "| ${11:Item1.2} | ${12:Item2.2} | ${13:Item3.2} | ${14:Item4.2} | ${15:Item5.2} |", 351 | "${0}" 352 | ], 353 | "description": "Insert table with 3 rows and 5 columns. First row is heading." 354 | }, 355 | "Insert 4x5 table": { 356 | "prefix": "4x5table", 357 | "body": [ 358 | "| ${1:Column1} | ${2:Column2} | ${3:Column3} | ${4:Column4} | ${5:Column5} |", 359 | "|---------------- | --------------- | --------------- | --------------- | --------------- |", 360 | "| ${6:Item1.1} | ${7:Item2.1} | ${8:Item3.1} | ${9:Item4.1} | ${10:Item5.1} |", 361 | "| ${11:Item1.2} | ${12:Item2.2} | ${13:Item3.2} | ${14:Item4.2} | ${15:Item5.2} |", 362 | "| ${16:Item1.3} | ${17:Item2.3} | ${18:Item3.3} | ${19:Item4.3} | ${20:Item5.3} |", 363 | "${0}" 364 | ], 365 | "description": "Insert table with 4 rows and 5 columns. First row is heading." 366 | }, 367 | "Insert 5x5 table": { 368 | "prefix": "5x5table", 369 | "body": [ 370 | "| ${1:Column1} | ${2:Column2} | ${3:Column3} | ${4:Column4} | ${5:Column5} |", 371 | "|---------------- | --------------- | --------------- | --------------- | --------------- |", 372 | "| ${6:Item1.1} | ${7:Item2.1} | ${8:Item3.1} | ${9:Item4.1} | ${10:Item5.1} |", 373 | "| ${11:Item1.2} | ${12:Item2.2} | ${13:Item3.2} | ${14:Item4.2} | ${15:Item5.2} |", 374 | "| ${16:Item1.3} | ${17:Item2.3} | ${18:Item3.3} | ${19:Item4.3} | ${20:Item5.3} |", 375 | "| ${21:Item1.4} | ${22:Item2.4} | ${23:Item3.4} | ${24:Item4.4} | ${25:Item5.4} |", 376 | "${0}" 377 | ], 378 | "description": "Insert table with 5 rows and 5 columns. First row is heading." 379 | } 380 | } 381 | --------------------------------------------------------------------------------