summaryrefslogtreecommitdiff
path: root/mac/.config/LunarVim
diff options
context:
space:
mode:
Diffstat (limited to 'mac/.config/LunarVim')
-rw-r--r--mac/.config/LunarVim/.gitignore31
-rw-r--r--mac/.config/LunarVim/.luacheckrc45
-rw-r--r--mac/.config/LunarVim/.pre-commit-config.yaml34
-rw-r--r--mac/.config/LunarVim/.stylua.toml6
-rw-r--r--mac/.config/LunarVim/CHANGELOG.md704
-rw-r--r--mac/.config/LunarVim/CONTRIBUTING.md116
-rw-r--r--mac/.config/LunarVim/LICENSE674
-rw-r--r--mac/.config/LunarVim/Makefile42
-rw-r--r--mac/.config/LunarVim/README.md68
-rw-r--r--mac/.config/LunarVim/init.lua25
-rw-r--r--mac/.config/LunarVim/lua/lvim/bootstrap.lua123
-rw-r--r--mac/.config/LunarVim/lua/lvim/config/_deprecated.lua215
-rw-r--r--mac/.config/LunarVim/lua/lvim/config/defaults.lua75
-rw-r--r--mac/.config/LunarVim/lua/lvim/config/init.lua108
-rw-r--r--mac/.config/LunarVim/lua/lvim/config/settings.lua120
-rw-r--r--mac/.config/LunarVim/lua/lvim/core/alpha.lua85
-rw-r--r--mac/.config/LunarVim/lua/lvim/core/alpha/dashboard.lua148
-rw-r--r--mac/.config/LunarVim/lua/lvim/core/alpha/startify.lua45
-rw-r--r--mac/.config/LunarVim/lua/lvim/core/autocmds.lua281
-rw-r--r--mac/.config/LunarVim/lua/lvim/core/autopairs.lua91
-rw-r--r--mac/.config/LunarVim/lua/lvim/core/breadcrumbs.lua236
-rw-r--r--mac/.config/LunarVim/lua/lvim/core/bufferline.lua256
-rw-r--r--mac/.config/LunarVim/lua/lvim/core/builtins/init.lua34
-rw-r--r--mac/.config/LunarVim/lua/lvim/core/cmp.lua390
-rw-r--r--mac/.config/LunarVim/lua/lvim/core/commands.lua99
-rw-r--r--mac/.config/LunarVim/lua/lvim/core/comment.lua86
-rw-r--r--mac/.config/LunarVim/lua/lvim/core/dap.lua177
-rw-r--r--mac/.config/LunarVim/lua/lvim/core/gitsigns.lua83
-rw-r--r--mac/.config/LunarVim/lua/lvim/core/illuminate.lua72
-rw-r--r--mac/.config/LunarVim/lua/lvim/core/indentlines.lua43
-rw-r--r--mac/.config/LunarVim/lua/lvim/core/info.lua222
-rw-r--r--mac/.config/LunarVim/lua/lvim/core/lir.lua120
-rw-r--r--mac/.config/LunarVim/lua/lvim/core/log.lua203
-rw-r--r--mac/.config/LunarVim/lua/lvim/core/lualine/colors.lua16
-rw-r--r--mac/.config/LunarVim/lua/lvim/core/lualine/components.lua174
-rw-r--r--mac/.config/LunarVim/lua/lvim/core/lualine/conditions.lua17
-rw-r--r--mac/.config/LunarVim/lua/lvim/core/lualine/init.lua57
-rw-r--r--mac/.config/LunarVim/lua/lvim/core/lualine/styles.lua165
-rw-r--r--mac/.config/LunarVim/lua/lvim/core/lualine/utils.lua14
-rw-r--r--mac/.config/LunarVim/lua/lvim/core/mason.lua120
-rw-r--r--mac/.config/LunarVim/lua/lvim/core/nvimtree.lua344
-rw-r--r--mac/.config/LunarVim/lua/lvim/core/project.lua67
-rw-r--r--mac/.config/LunarVim/lua/lvim/core/telescope.lua150
-rw-r--r--mac/.config/LunarVim/lua/lvim/core/telescope/custom-finders.lua98
-rw-r--r--mac/.config/LunarVim/lua/lvim/core/terminal.lua174
-rw-r--r--mac/.config/LunarVim/lua/lvim/core/theme.lua96
-rw-r--r--mac/.config/LunarVim/lua/lvim/core/treesitter.lua135
-rw-r--r--mac/.config/LunarVim/lua/lvim/core/which-key.lua333
-rw-r--r--mac/.config/LunarVim/lua/lvim/icons.lua154
-rw-r--r--mac/.config/LunarVim/lua/lvim/interface/popup.lua64
-rw-r--r--mac/.config/LunarVim/lua/lvim/interface/text.lua95
-rw-r--r--mac/.config/LunarVim/lua/lvim/keymappings.lua177
-rw-r--r--mac/.config/LunarVim/lua/lvim/lsp/config.lua164
-rw-r--r--mac/.config/LunarVim/lua/lvim/lsp/init.lua128
-rw-r--r--mac/.config/LunarVim/lua/lvim/lsp/manager.lua141
-rw-r--r--mac/.config/LunarVim/lua/lvim/lsp/null-ls/code_actions.lua26
-rw-r--r--mac/.config/LunarVim/lua/lvim/lsp/null-ls/formatters.lua33
-rw-r--r--mac/.config/LunarVim/lua/lvim/lsp/null-ls/init.lua16
-rw-r--r--mac/.config/LunarVim/lua/lvim/lsp/null-ls/linters.lua43
-rw-r--r--mac/.config/LunarVim/lua/lvim/lsp/null-ls/services.lua104
-rw-r--r--mac/.config/LunarVim/lua/lvim/lsp/providers/jsonls.lua18
-rw-r--r--mac/.config/LunarVim/lua/lvim/lsp/providers/lua_ls.lua64
-rw-r--r--mac/.config/LunarVim/lua/lvim/lsp/providers/tailwindcss.lua15
-rw-r--r--mac/.config/LunarVim/lua/lvim/lsp/providers/vuels.lua26
-rw-r--r--mac/.config/LunarVim/lua/lvim/lsp/providers/yamlls.lua16
-rw-r--r--mac/.config/LunarVim/lua/lvim/lsp/templates.lua76
-rw-r--r--mac/.config/LunarVim/lua/lvim/lsp/utils.lua185
-rw-r--r--mac/.config/LunarVim/lua/lvim/plugin-loader.lua138
-rw-r--r--mac/.config/LunarVim/lua/lvim/plugins.lua385
-rw-r--r--mac/.config/LunarVim/lua/lvim/utils.lua132
-rw-r--r--mac/.config/LunarVim/lua/lvim/utils/git.lua152
-rw-r--r--mac/.config/LunarVim/lua/lvim/utils/hooks.lua76
-rw-r--r--mac/.config/LunarVim/lua/lvim/utils/modules.lua122
-rw-r--r--mac/.config/LunarVim/lua/lvim/utils/table.lua24
-rw-r--r--mac/.config/LunarVim/snapshots/default.json131
-rw-r--r--mac/.config/LunarVim/tests/lvim/helpers.lua32
-rw-r--r--mac/.config/LunarVim/tests/minimal_init.lua12
-rw-r--r--mac/.config/LunarVim/tests/minimal_lsp.lua112
-rw-r--r--mac/.config/LunarVim/tests/specs/bootstrap_spec.lua57
-rw-r--r--mac/.config/LunarVim/tests/specs/config_loader_spec.lua54
-rw-r--r--mac/.config/LunarVim/tests/specs/lsp_spec.lua94
-rw-r--r--mac/.config/LunarVim/tests/specs/plugins_load_spec.lua37
-rwxr-xr-xmac/.config/LunarVim/utils/bin/jdtls62
-rw-r--r--mac/.config/LunarVim/utils/bin/lvim.ps113
-rw-r--r--mac/.config/LunarVim/utils/bin/lvim.template11
-rw-r--r--mac/.config/LunarVim/utils/ci/generate_new_lockfile.lua125
-rw-r--r--mac/.config/LunarVim/utils/ci/generate_new_lockfile.sh19
-rw-r--r--mac/.config/LunarVim/utils/ci/run_commitlint.sh10
-rw-r--r--mac/.config/LunarVim/utils/ci/run_test.sh25
-rw-r--r--mac/.config/LunarVim/utils/ci/update_changelog.sh15
-rw-r--r--mac/.config/LunarVim/utils/ci/verify_plugins.lua147
-rw-r--r--mac/.config/LunarVim/utils/ci/verify_plugins.sh10
-rw-r--r--mac/.config/LunarVim/utils/desktop/16x16/lvim.svg10
-rw-r--r--mac/.config/LunarVim/utils/desktop/22x22/lvim.svg16
-rw-r--r--mac/.config/LunarVim/utils/desktop/24x24/lvim.svg16
-rw-r--r--mac/.config/LunarVim/utils/desktop/32x32/lvim.svg16
-rw-r--r--mac/.config/LunarVim/utils/desktop/48x48/lvim.svg16
-rw-r--r--mac/.config/LunarVim/utils/desktop/64x64/lvim.svg16
-rw-r--r--mac/.config/LunarVim/utils/desktop/lvim.desktop13
-rw-r--r--mac/.config/LunarVim/utils/docker/Dockerfile.local27
-rw-r--r--mac/.config/LunarVim/utils/docker/Dockerfile.remote27
-rw-r--r--mac/.config/LunarVim/utils/installer/config.example.lua5
-rw-r--r--mac/.config/LunarVim/utils/installer/config_win.example.lua27
-rwxr-xr-xmac/.config/LunarVim/utils/installer/install-neovim-from-release83
-rw-r--r--mac/.config/LunarVim/utils/installer/install.ps1305
-rwxr-xr-xmac/.config/LunarVim/utils/installer/install.sh461
-rwxr-xr-xmac/.config/LunarVim/utils/installer/install_bin.sh40
-rwxr-xr-xmac/.config/LunarVim/utils/installer/install_stylua.sh63
-rw-r--r--mac/.config/LunarVim/utils/installer/uninstall.ps163
-rwxr-xr-xmac/.config/LunarVim/utils/installer/uninstall.sh89
110 files changed, 11850 insertions, 0 deletions
diff --git a/mac/.config/LunarVim/.gitignore b/mac/.config/LunarVim/.gitignore
new file mode 100644
index 0000000..4a0cb4c
--- /dev/null
+++ b/mac/.config/LunarVim/.gitignore
@@ -0,0 +1,31 @@
+dein
+tags*
+.netrwhist
+pythonpath.vim
+nodepath.vim
+autoload/plugged/*
+vimspector-config/gadgets/*
+paths.vim
+session
+wiki/
+pack/
+utils/java/*
+lv-config.lua
+lua-language-server/
+eclipse.jdt.ls/
+.language-servers/
+.debuggers/
+spell/
+nv-settings.lua
+lv-settings.lua
+lua/lv-user/
+lua/lv-user-config/
+
+*.tmp
+*.temp
+*.bak
+*.backup
+*.old
+
+.luarc.json
+.luacheckcache
diff --git a/mac/.config/LunarVim/.luacheckrc b/mac/.config/LunarVim/.luacheckrc
new file mode 100644
index 0000000..5330708
--- /dev/null
+++ b/mac/.config/LunarVim/.luacheckrc
@@ -0,0 +1,45 @@
+---@diagnostic disable
+-- vim: ft=lua tw=80
+
+stds.nvim = {
+ globals = {
+ "lvim",
+ "reload",
+ vim = { fields = { "g" } },
+ "TERMINAL",
+ "USER",
+ "C",
+ "Config",
+ "WORKSPACE_PATH",
+ "JAVA_LS_EXECUTABLE",
+ "MUtils",
+ "USER_CONFIG_PATH",
+ os = { fields = { "capture" } },
+ },
+ read_globals = {
+ "jit",
+ "os",
+ "vim",
+ "join_paths",
+ "get_runtime_dir",
+ "get_config_dir",
+ "get_cache_dir",
+ "get_lvim_base_dir",
+ "require_clean",
+ },
+}
+std = "lua51+nvim"
+
+files["tests/*_spec.lua"].std = "lua51+nvim+busted"
+files["lua/lvim/impatient*"].ignore = {"121"}
+
+-- Don't report unused self arguments of methods.
+self = false
+
+-- Rerun tests only if their modification time changed.
+cache = true
+
+ignore = {
+ "631", -- max_line_length
+ "212/_.*", -- unused argument, for vars with "_" prefix
+}
diff --git a/mac/.config/LunarVim/.pre-commit-config.yaml b/mac/.config/LunarVim/.pre-commit-config.yaml
new file mode 100644
index 0000000..2c4921e
--- /dev/null
+++ b/mac/.config/LunarVim/.pre-commit-config.yaml
@@ -0,0 +1,34 @@
+repos:
+ - repo: local
+ hooks:
+ - id: shfmt
+ name: shfmt
+ minimum_pre_commit_version: 2.4.0
+ language: system
+ types: [shell]
+ entry: bash
+ args: [-c, make lint-sh]
+ - id: shellcheck
+ name: shellcheck
+ language: system
+ types: [shell]
+ entry: bash
+ args: [-c, make style-sh]
+ - id: stylua
+ name: StyLua
+ language: rust
+ entry: stylua
+ types: [lua]
+ args: ["-"]
+ - id: luacheck
+ name: luacheck
+ language: system
+ entry: luacheck
+ types: [lua]
+ args: [.]
+ - id: commitlint
+ name: commitlint
+ language: system
+ entry: bash
+ args: [./utils/ci/run_commitlint.sh]
+ stages: [commit-msg]
diff --git a/mac/.config/LunarVim/.stylua.toml b/mac/.config/LunarVim/.stylua.toml
new file mode 100644
index 0000000..df96b7b
--- /dev/null
+++ b/mac/.config/LunarVim/.stylua.toml
@@ -0,0 +1,6 @@
+column_width = 120
+line_endings = "Unix"
+indent_type = "Spaces"
+indent_width = 2
+quote_style = "AutoPreferDouble"
+no_call_parentheses = true
diff --git a/mac/.config/LunarVim/CHANGELOG.md b/mac/.config/LunarVim/CHANGELOG.md
new file mode 100644
index 0000000..48180c7
--- /dev/null
+++ b/mac/.config/LunarVim/CHANGELOG.md
@@ -0,0 +1,704 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+## [1.4.0]
+
+### <!-- 1 --> Features
+
+- _(installer)_ added bun as a js package manager ([#4362](https://github.com/lunarvim/lunarvim/pull/4362))
+- _(lspconfig)_ add rounded borders to :LspInfo window ([#4208](https://github.com/lunarvim/lunarvim/pull/4208))
+- _(nvimtree)_ centralize selection ([#4160](https://github.com/lunarvim/lunarvim/pull/4160))
+- _(plugins)_ migrate from `null-ls` to `none-ls` ([#4392](https://github.com/lunarvim/lunarvim/pull/4392))
+- simplify example config, add links for user instead ([#4128](https://github.com/lunarvim/lunarvim/pull/4128))
+- don't move config on install ([#4129](https://github.com/lunarvim/lunarvim/pull/4129))
+- rounded border for hover and signatureHelp ([#4131](https://github.com/lunarvim/lunarvim/pull/4131))
+- lock new installations to nvim 0.9+ ([#3858](https://github.com/lunarvim/lunarvim/pull/3858))
+- use code chevrons ([#4184](https://github.com/lunarvim/lunarvim/pull/4184))
+- ignore missing keys for whichkey ([#4185](https://github.com/lunarvim/lunarvim/pull/4185))
+- [**breaking**] use prompts similar to `:confirm` in `buf_kill` ([#4186](https://github.com/lunarvim/lunarvim/pull/4186))
+- add starter.lvim link to config.example.lua ([#4200](https://github.com/lunarvim/lunarvim/pull/4200))
+- add example to the packer deprecation message ([#4201](https://github.com/lunarvim/lunarvim/pull/4201))
+
+### <!-- 2 --> Bugfix
+
+- _(alpha)_ account for different icon byte sizes ([#4130](https://github.com/lunarvim/lunarvim/pull/4130))
+- _(dap)_ ui opens when debugging ([#4116](https://github.com/lunarvim/lunarvim/pull/4116))
+- _(default-options)_ remove invalid guifont option ([#4447](https://github.com/lunarvim/lunarvim/pull/4447))
+- _(deprecation)_ only deprecate `tag == "*"` in lvim.plugins ([#4297](https://github.com/lunarvim/lunarvim/pull/4297))
+- _(icons)_ add some whitespace to the boolean icon ([#4163](https://github.com/lunarvim/lunarvim/pull/4163))
+- _(install)_ add newline after setup message ([#4533](https://github.com/lunarvim/lunarvim/pull/4533))
+- _(installer)_ dependency installation for Windows ([#4486](https://github.com/lunarvim/lunarvim/pull/4486))
+- _(lsp)_ add luv library by default to lua_ls ([#4067](https://github.com/lunarvim/lunarvim/pull/4067))
+- _(lsp)_ diagnostic codes already show by default ([#4070](https://github.com/lunarvim/lunarvim/pull/4070))
+- [**breaking**] _(lsp)_ switch to csharp_ls to avoid startup errors ([#4079](https://github.com/lunarvim/lunarvim/pull/4079))
+- _(lsp)_ lazy load mason on FileOpened ([#4100](https://github.com/lunarvim/lunarvim/pull/4100))
+- _(lsp)_ skip auto config server even if it's ensure installed ([#4243](https://github.com/lunarvim/lunarvim/pull/4243))
+- _(lsp)_ restore float border ([#4274](https://github.com/lunarvim/lunarvim/pull/4274))
+- _(lsp)_ adapt recent changes in `nvim-lspconfig` ([#4348](https://github.com/lunarvim/lunarvim/pull/4348))
+- _(lualine)_ use get_active_clients instead of deprecated function ([#4136](https://github.com/lunarvim/lunarvim/pull/4136))
+- _(nvim-tree)_ use local buffer keymaps ([#4090](https://github.com/lunarvim/lunarvim/pull/4090))
+- _(terminal)_ show lazygit bottom line ([#4548](https://github.com/lunarvim/lunarvim/pull/4548))
+- _(tests)_ set up lazy.nvim in the lsp test ([#4088](https://github.com/lunarvim/lunarvim/pull/4088))
+- _(treesitter)_ add a few parsers to `ensure_installed` ([#4121](https://github.com/lunarvim/lunarvim/pull/4121))
+- _(typo)_ `form` to `from` ([#4295](https://github.com/lunarvim/lunarvim/pull/4295))
+- _(user_command)_ update url in `LvimDocs` command ([#4081](https://github.com/lunarvim/lunarvim/pull/4081))
+- _(win)_ remove '-NoLogo' from vim.opt.shell ([#4232](https://github.com/lunarvim/lunarvim/pull/4232))
+- add missing LF to install script ([#4075](https://github.com/lunarvim/lunarvim/pull/4075))
+- replace obsolete icons ([#4111](https://github.com/lunarvim/lunarvim/pull/4111))
+- correct runtimepath order ([#4124](https://github.com/lunarvim/lunarvim/pull/4124))
+- support text if marksman lang server ([#4144](https://github.com/lunarvim/lunarvim/pull/4144))
+- circle icons was being cut off for some fonts
+- handle context-commentstring setup ([#4451](https://github.com/lunarvim/lunarvim/pull/4451))
+
+### <!-- 3 --> Refactor
+
+- [**breaking**] _(lsp)_ deprecate `lvim.lsp.diagnostics` ([#3916](https://github.com/lunarvim/lunarvim/pull/3916))
+- _(lualine)_ use `string.format` to return unique names ([#4193](https://github.com/lunarvim/lunarvim/pull/4193))
+
+### <!-- 4 --> Documentation
+
+- add code_actions to example config ([#4029](https://github.com/lunarvim/lunarvim/pull/4029))
+- update broken links in example configs ([#4097](https://github.com/lunarvim/lunarvim/pull/4097))
+- use `master` instead of `rolling` in contributing.md ([#4115](https://github.com/lunarvim/lunarvim/pull/4115))
+- use `master` instead of `rolling` in contributing.md ([#4115](https://github.com/lunarvim/lunarvim/pull/4115))
+
+### <!-- 6 --> Performance
+
+- _(installer)_ use a shallow clone of lunarvim ([#4197](https://github.com/lunarvim/lunarvim/pull/4197))
+
+## [1.3.0]
+
+### <!-- 1 --> Features
+
+- _(alpha)_ allow configuring highlight groups ([#3532](https://github.com/lunarvim/lunarvim/pull/3532))
+- _(alpha)_ add quit button to dashboard ([#3767](https://github.com/lunarvim/lunarvim/pull/3767))
+- _(autocmds)_ add `NvimTreeNormalNC` to transparent mode ([#3850](https://github.com/lunarvim/lunarvim/pull/3850))
+- _(cmp)_ add on_config_done callback ([#3589](https://github.com/lunarvim/lunarvim/pull/3589))
+- _(dap)_ update dap ui to resize when toggled ([#3606](https://github.com/lunarvim/lunarvim/pull/3606))
+- _(dap-ui)_ update setup table ([#3724](https://github.com/lunarvim/lunarvim/pull/3724))
+- _(installer)_ list dependencies that will be installed ([#3523](https://github.com/lunarvim/lunarvim/pull/3523))
+- _(installer)_ allow customizing NVIM_APPNAME ([#3896](https://github.com/lunarvim/lunarvim/pull/3896))
+- _(keybindings)_ operator pending mode ([#3626](https://github.com/lunarvim/lunarvim/pull/3626))
+- _(keybindings)_ add code action to visual mode ([#4022](https://github.com/lunarvim/lunarvim/pull/4022))
+- _(lang)_ yaml use schemastore ([#3953](https://github.com/lunarvim/lunarvim/pull/3953))
+- _(lazy)_ lazy.nvim settings can be customized ([#4010](https://github.com/lunarvim/lunarvim/pull/4010))
+- _(lsp)_ focusable line diagnostics ([#3622](https://github.com/lunarvim/lunarvim/pull/3622))
+- _(mason)_ add support for mason-registry ([#3994](https://github.com/lunarvim/lunarvim/pull/3994))
+- _(mason)_ add on_config_done option to lvim.builtin.mason ([#3991](https://github.com/lunarvim/lunarvim/pull/3991))
+- _(reload)_ add all conf files to aupat ([#3644](https://github.com/lunarvim/lunarvim/pull/3644))
+- _(tailwind)_ add .ts options to tailwind.config root_pattern ([#4016](https://github.com/lunarvim/lunarvim/pull/4016))
+- _(telescope)_ add `lvim.builtin.telescope.theme` ([#3548](https://github.com/lunarvim/lunarvim/pull/3548))
+- _(ts)_ enable indent for c and cpp ([#3783](https://github.com/lunarvim/lunarvim/pull/3783))
+- _(which-key)_ keybind for `:Telescope resume` ([#3826](https://github.com/lunarvim/lunarvim/pull/3826))
+- _(wich-key)_ binding to save without formatting ([#3165](https://github.com/lunarvim/lunarvim/pull/3165))
+- add command & keybind to view docs ([#3426](https://github.com/lunarvim/lunarvim/pull/3426))
+- configure dap logging ([#3454](https://github.com/lunarvim/lunarvim/pull/3454))
+- support 'hrsh7th/cmp-cmdline' by default ([#3545](https://github.com/lunarvim/lunarvim/pull/3545))
+- don't prompt smart quit when buffer open in another window ([#3636](https://github.com/lunarvim/lunarvim/pull/3636))
+- use codicons that are available for nerdfonts now ([#3646](https://github.com/lunarvim/lunarvim/pull/3646))
+- update setup tables ([#3693](https://github.com/lunarvim/lunarvim/pull/3693))
+- enable auto preview colorscheme by default ([#3701](https://github.com/lunarvim/lunarvim/pull/3701))
+- cmdline config option enables cmp-cmdline plugin ([#3719](https://github.com/lunarvim/lunarvim/pull/3719))
+- add crystal filetype ([#3762](https://github.com/lunarvim/lunarvim/pull/3762))
+- include git status in LvimVersion ([#3774](https://github.com/lunarvim/lunarvim/pull/3774))
+- regenerate lsp templates after LvimUpdate ([#3864](https://github.com/lunarvim/lunarvim/pull/3864))
+
+### <!-- 2 --> Bugfix
+
+- _(alpha)_ make dashboard responsive ([#3505](https://github.com/lunarvim/lunarvim/pull/3505))
+- _(alpha)_ check height of the aplha window ([#3585](https://github.com/lunarvim/lunarvim/pull/3585))
+- _(alpha)_ rollback to older commit ([#3832](https://github.com/lunarvim/lunarvim/pull/3832))
+- _(autocmds)_ add separate autoreload config group ([#3436](https://github.com/lunarvim/lunarvim/pull/3436))
+- _(autocmds)_ remove spell autocmd ([#3487](https://github.com/lunarvim/lunarvim/pull/3487))
+- _(autopairs)_ attach confirm_done only once ([#3430](https://github.com/lunarvim/lunarvim/pull/3430))
+- _(bootstrap)_ delay lsp setup until LazyDone ([#4041](https://github.com/lunarvim/lunarvim/pull/4041))
+- _(breadcrumbs)_ `E36 Not enough space` when using dap-ui `Eval` ([#3533](https://github.com/lunarvim/lunarvim/pull/3533))
+- _(breadcrumbs)_ use hlgroup from web devicons in breadcrumbs ([#3342](https://github.com/lunarvim/lunarvim/pull/3342))
+- _(breadcrumbs)_ refresh on TabEnter ([#3727](https://github.com/lunarvim/lunarvim/pull/3727))
+- _(breadcrumbs)_ disable for neotest ([#3921](https://github.com/lunarvim/lunarvim/pull/3921))
+- _(bufferline)_ fallback to empty table if `buf_nums` is nil ([#3473](https://github.com/lunarvim/lunarvim/pull/3473))
+- _(bufkill)_ wrap around correctly ([#3461](https://github.com/lunarvim/lunarvim/pull/3461))
+- _(bufkill)_ wait for user's input ([#3535](https://github.com/lunarvim/lunarvim/pull/3535))
+- _(cmp)_ handle deprecated tree-sitter api ([#3853](https://github.com/lunarvim/lunarvim/pull/3853))
+- _(config)_ use a minimal bootstrap for mason ([#3427](https://github.com/lunarvim/lunarvim/pull/3427))
+- _(config)_ fix typo in example configs ([#3611](https://github.com/lunarvim/lunarvim/pull/3611))
+- _(config)_ copy the correct example config ([#3722](https://github.com/lunarvim/lunarvim/pull/3722))
+- _(config-loader)_ defer invalid configuration warning ([#3869](https://github.com/lunarvim/lunarvim/pull/3869))
+- _(dap)_ invalid border value ([#3951](https://github.com/lunarvim/lunarvim/pull/3951))
+- _(dashboard)_ remove feedkeys ([#3558](https://github.com/lunarvim/lunarvim/pull/3558))
+- _(icons)_ make devicons optional ([#3616](https://github.com/lunarvim/lunarvim/pull/3616))
+- _(indentlines)_ set indent_char to LineLeft ([#3741](https://github.com/lunarvim/lunarvim/pull/3741))
+- _(indentlines)_ typo ([#3743](https://github.com/lunarvim/lunarvim/pull/3743))
+- _(installer)_ fix syntax error with powershell installer ([#2875](https://github.com/lunarvim/lunarvim/pull/2875))
+- _(installer)_ only install treesitter-cli if it's missing ([#3740](https://github.com/lunarvim/lunarvim/pull/3740))
+- _(installer)_ validation step was failing on windows ([#4008](https://github.com/lunarvim/lunarvim/pull/4008))
+- _(lir)_ nil check, simpler logic ([#3725](https://github.com/lunarvim/lunarvim/pull/3725))
+- _(logger)_ fix errors with older structlog versions ([#3755](https://github.com/lunarvim/lunarvim/pull/3755))
+- _(lsp)_ disable annoying popup for sumneko-lua ([#3445](https://github.com/lunarvim/lunarvim/pull/3445))
+- _(lsp)_ some servers have dynamic commands ([#3471](https://github.com/lunarvim/lunarvim/pull/3471))
+- _(lsp)_ sumneko-lua library scanning ([#3484](https://github.com/lunarvim/lunarvim/pull/3484))
+- _(lsp)_ add neocmake to skipped_servers ([#3597](https://github.com/lunarvim/lunarvim/pull/3597))
+- _(lsp)_ don't remove mason-lspconfig's hook ([#3739](https://github.com/lunarvim/lunarvim/pull/3739))
+- _(lsp)_ info diagnostic icon not showing ([#3756](https://github.com/lunarvim/lunarvim/pull/3756))
+- _(lsp)_ lazy loading ([#3824](https://github.com/lunarvim/lunarvim/pull/3824))
+- _(lsp)_ template generation for filetypes with dots ([#3833](https://github.com/lunarvim/lunarvim/pull/3833))
+- _(lsp)_ incorrect `g` goto capitalization ([#3950](https://github.com/lunarvim/lunarvim/pull/3950))
+- _(lsp)_ add luv library by default to lua_ls ([#4067](https://github.com/lunarvim/lunarvim/pull/4067))
+- _(nvim-tree)_ remove deprecated option (nvim-tree/nvim-tree.lua#2122) ([#4033](https://github.com/lunarvim/lunarvim/pull/4033))
+- _(nvimtree)_ avoid hard-coded mapping ([#3492](https://github.com/lunarvim/lunarvim/pull/3492))
+- _(nvimtree)_ don't overwrite update_focused_file.ignore_list ([#3986](https://github.com/lunarvim/lunarvim/pull/3986))
+- _(packer)_ increase clone timeout in headless ([#3470](https://github.com/lunarvim/lunarvim/pull/3470))
+- _(plugin-loader)_ don't clean lazy.nvim in sync_core_plugins ([#3731](https://github.com/lunarvim/lunarvim/pull/3731))
+- _(plugin-loader)_ don't clean plugins on LvimUpdate ([#3747](https://github.com/lunarvim/lunarvim/pull/3747))
+- _(plugin-loader)_ support older git versions ([#3769](https://github.com/lunarvim/lunarvim/pull/3769))
+- _(snapshots)_ correct tokyonight commit sha ([#3620](https://github.com/lunarvim/lunarvim/pull/3620))
+- _(telescope)_ backwards compability ([#3596](https://github.com/lunarvim/lunarvim/pull/3596))
+- _(terminal)_ use user's shell in execs ([#3531](https://github.com/lunarvim/lunarvim/pull/3531))
+- _(terminal)_ don't set the shell by default ([#3867](https://github.com/lunarvim/lunarvim/pull/3867))
+- _(tree-sitter)_ force update bundled parsers ([#3475](https://github.com/lunarvim/lunarvim/pull/3475))
+- _(treesitter)_ prepend to rtp ([#3708](https://github.com/lunarvim/lunarvim/pull/3708))
+- _(ts)_ disable indent for c and cpp ([#3687](https://github.com/lunarvim/lunarvim/pull/3687))
+- _(uninstaller)_ add separate flag to remove user config ([#3508](https://github.com/lunarvim/lunarvim/pull/3508))
+- _(uninstaller)_ correct a sentence in help ([#3511](https://github.com/lunarvim/lunarvim/pull/3511))
+- _(which-key)_ typo ([#3963](https://github.com/lunarvim/lunarvim/pull/3963))
+- add dap-ui config to lvim.builtin.dap ([#3386](https://github.com/lunarvim/lunarvim/pull/3386))
+- cmp will behave closer to how people expect
+- discard invalid choice when closing buffers ([#3488](https://github.com/lunarvim/lunarvim/pull/3488))
+- startify theme button bugfix ([#3557](https://github.com/lunarvim/lunarvim/pull/3557))
+- only call theme's setup if it's selected ([#3586](https://github.com/lunarvim/lunarvim/pull/3586))
+- bash installer errors ([#3686](https://github.com/lunarvim/lunarvim/pull/3686))
+- remove deprecated nvim-tree options ([#3810](https://github.com/lunarvim/lunarvim/pull/3810))
+- win installer syntax error ([#3635](https://github.com/lunarvim/lunarvim/pull/3635))
+- lazy cache ([#3892](https://github.com/lunarvim/lunarvim/pull/3892))
+- copilot indent reset ([#3343](https://github.com/lunarvim/lunarvim/pull/3343)) ([#3960](https://github.com/lunarvim/lunarvim/pull/3960))
+- typo ([#4023](https://github.com/lunarvim/lunarvim/pull/4023))
+- use `require` instead of `reload` in pcalls ([#4038](https://github.com/lunarvim/lunarvim/pull/4038))
+- make FileOpened autocmd work with quickfix ([#4040](https://github.com/lunarvim/lunarvim/pull/4040))
+
+### <!-- 3 --> Refactor
+
+- _(alpha)_ remove laststatus and tabline autocmds ([#3809](https://github.com/lunarvim/lunarvim/pull/3809))
+- _(autocmds)_ clean up filetype detection rules ([#3625](https://github.com/lunarvim/lunarvim/pull/3625))
+- _(logger)_ adapt to new changes upstream ([#3695](https://github.com/lunarvim/lunarvim/pull/3695))
+- [**breaking**] _(quit)_ use native quit confirm ([#3721](https://github.com/lunarvim/lunarvim/pull/3721))
+- [**breaking**] _(treesitter)_ use auto-install by default ([#3677](https://github.com/lunarvim/lunarvim/pull/3677))
+- move dap keybindings to which key ([#3459](https://github.com/lunarvim/lunarvim/pull/3459))
+- simplify example config ([#3519](https://github.com/lunarvim/lunarvim/pull/3519))
+- use lir fork in the org ([#3694](https://github.com/lunarvim/lunarvim/pull/3694))
+- move to upstream lir ([#3711](https://github.com/lunarvim/lunarvim/pull/3711))
+- [**breaking**] remove `%` and `$` autopairs rules ([#3759](https://github.com/lunarvim/lunarvim/pull/3759))
+
+### <!-- 4 --> Documentation
+
+- _(contributing)_ make it clear how to title PRs ([#3463](https://github.com/lunarvim/lunarvim/pull/3463))
+- _(ts)_ add hint about `ensure_installed` ([#3827](https://github.com/lunarvim/lunarvim/pull/3827))
+- github pull request template update ([#3512](https://github.com/lunarvim/lunarvim/pull/3512))
+
+### <!-- 6 --> Performance
+
+- _(toggleterm)_ on-demand lazy load ([#3811](https://github.com/lunarvim/lunarvim/pull/3811))
+- handle big files better ([#3449](https://github.com/lunarvim/lunarvim/pull/3449))
+- lazy load most plugins ([#3750](https://github.com/lunarvim/lunarvim/pull/3750))
+
+## [1.2.0]
+
+### <!-- 1 --> Features
+
+- _(autocmds)_ make sure all autocmds are modifiable ([#3087](https://github.com/lunarvim/lunarvim/pull/3087))
+- _(cmp)_ add configs for cmp.setup.cmdline ([#3180](https://github.com/lunarvim/lunarvim/pull/3180))
+- _(config)_ allow disabling reload-on-save ([#3261](https://github.com/lunarvim/lunarvim/pull/3261))
+- _(dap)_ red bugs and other highlight improvements
+- _(dap)_ buffernames for elements, icons, hide dap-repl by default ([#3156](https://github.com/lunarvim/lunarvim/pull/3156))
+- _(document highlight)_ use illuminate rather than autocommand to avoid flashing ([#3029](https://github.com/lunarvim/lunarvim/pull/3029))
+- _(indentblankline)_ show first indent level
+- _(installer)_ handle INSTALL_PREFIX not on PATH ([#2912](https://github.com/lunarvim/lunarvim/pull/2912))
+- _(installer)_ desktop entry ([#3187](https://github.com/lunarvim/lunarvim/pull/3187))
+- _(logger)_ hot-reload logger level ([#3159](https://github.com/lunarvim/lunarvim/pull/3159))
+- _(lualine)_ update statusline
+- _(lualine)_ improvements
+- _(lvim/lsp)_ enable tailwindcss by default ([#2870](https://github.com/lunarvim/lunarvim/pull/2870))
+- _(telecope)_ set show_untracked by default ([#2984](https://github.com/lunarvim/lunarvim/pull/2984))
+- _(terminal)_ better mappings ([#3104](https://github.com/lunarvim/lunarvim/pull/3104))
+- _(uninstaller)_ desktop entry
+- _(whichkey)_ add default keybindings to cycle to next buffer ([#2873](https://github.com/lunarvim/lunarvim/pull/2873))
+- add lir.nvim ([#3031](https://github.com/lunarvim/lunarvim/pull/3031))
+- add lir.nvim again ([#3038](https://github.com/lunarvim/lunarvim/pull/3038))
+- new colorscheme tokyonight ([#3041](https://github.com/lunarvim/lunarvim/pull/3041))
+- a less noisy tree ([#3042](https://github.com/lunarvim/lunarvim/pull/3042))
+- breadcrumbs ([#3043](https://github.com/lunarvim/lunarvim/pull/3043))
+- use a shorter dashboard banner when needed ([#3047](https://github.com/lunarvim/lunarvim/pull/3047))
+- illuminate works again
+- breadcrumbs work again
+- new dashboard logo
+- set options to remove some noise
+- laststatus=3 global statusline
+- better telescopic experience ([#3052](https://github.com/lunarvim/lunarvim/pull/3052))
+- pickers ([#3053](https://github.com/lunarvim/lunarvim/pull/3053))
+- add indentlines ([#3056](https://github.com/lunarvim/lunarvim/pull/3056))
+- only show reloaded config on debug log level to decrease noise
+- add border for mason ([#3080](https://github.com/lunarvim/lunarvim/pull/3080))
+- colorscheme tweaks
+- reload and lir color update ([#3123](https://github.com/lunarvim/lunarvim/pull/3123))
+- now, when you're hovering over a require('a.b.c'), you can type gf, and go to the 'c.lua' file ([#3122](https://github.com/lunarvim/lunarvim/pull/3122))
+- move icons to a single icons file ([#3115](https://github.com/lunarvim/lunarvim/pull/3115))
+- add some more reloads ([#3126](https://github.com/lunarvim/lunarvim/pull/3126))
+- add space after breadcrumb icons ([#3128](https://github.com/lunarvim/lunarvim/pull/3128))
+- add missing nvimtree setting ([#3138](https://github.com/lunarvim/lunarvim/pull/3138))
+- added dap ui and relative config ([#3131](https://github.com/lunarvim/lunarvim/pull/3131))
+- terminal, dap, and notify active by default
+- all features active by default ([#3157](https://github.com/lunarvim/lunarvim/pull/3157))
+- lock new installations to nvim 0.8+ ([#3111](https://github.com/lunarvim/lunarvim/pull/3111))
+- enable global installation ([#3161](https://github.com/lunarvim/lunarvim/pull/3161))
+- add new copilot and other sources ([#3171](https://github.com/lunarvim/lunarvim/pull/3171))
+- use icon for copilot in statusline ([#3173](https://github.com/lunarvim/lunarvim/pull/3173))
+- buffer cmp for search, and path for command mode ([#3147](https://github.com/lunarvim/lunarvim/pull/3147))
+- reduce noise from LSP text comes from buffer source anyway
+- warn user when setting un-installed colorscheme ([#2982](https://github.com/lunarvim/lunarvim/pull/2982))
+- latest impatient updates from upstream ([#3236](https://github.com/lunarvim/lunarvim/pull/3236))
+- dynamic or fixed toggle terminal size ([#3110](https://github.com/lunarvim/lunarvim/pull/3110))
+- toggle cmp active ([#3398](https://github.com/lunarvim/lunarvim/pull/3398))
+- breadcrumbs autocommand only runs when active ([#3399](https://github.com/lunarvim/lunarvim/pull/3399))
+- Add chevron to breadcrumbs (with matching highlight group) ([#3380](https://github.com/lunarvim/lunarvim/pull/3380))
+- use our own colorscheme, decouple from tokyonight ([#3378](https://github.com/lunarvim/lunarvim/pull/3378))
+- only use orange branch for lunar colorscheme
+
+### <!-- 2 --> Bugfix
+
+- _(alpha)_ can't set button hl without doing this
+- _(alpha)_ check alpha module ([#3233](https://github.com/lunarvim/lunarvim/pull/3233))
+- _(alpha)_ make startify sections always appear ([#3371](https://github.com/lunarvim/lunarvim/pull/3371))
+- _(autocmds)_ remove _format_options group ([#3278](https://github.com/lunarvim/lunarvim/pull/3278))
+- _(breadcrumbs)_ make sure winbar_filetype_exclude is customizable ([#3221](https://github.com/lunarvim/lunarvim/pull/3221))
+- _(bufferline)_ use buf kill on close ([#3422](https://github.com/lunarvim/lunarvim/pull/3422))
+- _(ci)_ resolve stylua ci rare error ([#3065](https://github.com/lunarvim/lunarvim/pull/3065))
+- _(cmp)_ do not mutate the original confirm_opts on CR ([#2979](https://github.com/lunarvim/lunarvim/pull/2979))
+- _(cmp)_ fix cmp select on CR ([#2980](https://github.com/lunarvim/lunarvim/pull/2980))
+- _(config)_ more comprehensive cache reset ([#3416](https://github.com/lunarvim/lunarvim/pull/3416))
+- _(core/autocmds)_ do not check for existence on clear_augroup ([#2963](https://github.com/lunarvim/lunarvim/pull/2963))
+- _(dashboard)_ add missing space ([#3063](https://github.com/lunarvim/lunarvim/pull/3063))
+- _(defaults)_ don't use smartindent ([#3363](https://github.com/lunarvim/lunarvim/pull/3363))
+- _(example config)_ fix config for treesitter ([#3016](https://github.com/lunarvim/lunarvim/pull/3016))
+- _(finders)_ use lunarvim basedir ([#3332](https://github.com/lunarvim/lunarvim/pull/3332))
+- _(icons)_ do not reload `nvim-web-devicons` module ([#3344](https://github.com/lunarvim/lunarvim/pull/3344))
+- _(indentblankline)_ make sure to use the new syntax for all options ([#3058](https://github.com/lunarvim/lunarvim/pull/3058))
+- _(installer)_ create profile.ps1 if nonexistent ([#2810](https://github.com/lunarvim/lunarvim/pull/2810))
+- _(installer)_ small fix in help message of install.sh ([#3032](https://github.com/lunarvim/lunarvim/pull/3032))
+- _(installer)_ don't overwrite previous config ([#3154](https://github.com/lunarvim/lunarvim/pull/3154))
+- _(installer)_ don't set log level
+- _(installer)_ Use master in windows installer ([#3421](https://github.com/lunarvim/lunarvim/pull/3421))
+- _(installer)_ use quotes in set-alias ([#3408](https://github.com/lunarvim/lunarvim/pull/3408))
+- _(log)_ correct add_entry code documentation ([#3081](https://github.com/lunarvim/lunarvim/pull/3081))
+- _(logger)_ set console logging to sync ([#3379](https://github.com/lunarvim/lunarvim/pull/3379))
+- _(lsp)_ return the actual resolved mason-config ([#2889](https://github.com/lunarvim/lunarvim/pull/2889))
+- _(lsp)_ pass name arg to should_auto_install ([#2958](https://github.com/lunarvim/lunarvim/pull/2958))
+- _(lsp)_ enforce lvim completion for lua-server ([#3035](https://github.com/lunarvim/lunarvim/pull/3035))
+- _(lsp)_ don't start servers multiple times ([#3347](https://github.com/lunarvim/lunarvim/pull/3347))
+- _(lsp)_ do a nil check before string matching autocmd desc ([#3354](https://github.com/lunarvim/lunarvim/pull/3354))
+- _(lsp)_ only launch installed servers ([#3366](https://github.com/lunarvim/lunarvim/pull/3366))
+- _(lsp/utils)_ do not register duplicate autocommands ([#3004](https://github.com/lunarvim/lunarvim/pull/3004))
+- _(lua-dev)_ make sure we are loading the correct types ([#3208](https://github.com/lunarvim/lunarvim/pull/3208))
+- _(luadev)_ this plugin has been renamed ([#3235](https://github.com/lunarvim/lunarvim/pull/3235))
+- _(lualine)_ set icon color according to the status of treesitter ([#2754](https://github.com/lunarvim/lunarvim/pull/2754))
+- _(lualine)_ little more padding
+- _(lualine)_ guard setup on install ([#3185](https://github.com/lunarvim/lunarvim/pull/3185))
+- _(lualine)_ globalstatus=true by default
+- _(nvim-cmp-lsp)_ update_capabilities has been deprecated ([#3245](https://github.com/lunarvim/lunarvim/pull/3245))
+- _(nvimtree)_ remove view height
+- _(plugins)_ bring back original folke repos ([#2992](https://github.com/lunarvim/lunarvim/pull/2992))
+- _(plugins)_ handle deprecated options ([#3014](https://github.com/lunarvim/lunarvim/pull/3014))
+- _(plugins)_ set max jobs to 50 on mac
+- _(statusline)_ display null-ls linters properly ([#2921](https://github.com/lunarvim/lunarvim/pull/2921))
+- _(terminal)_ slightly bigger vertical terminal
+- _(theme)_ do not fallback to tokyonight if no user's theme found ([#3327](https://github.com/lunarvim/lunarvim/pull/3327))
+- _(ts_context_commentstring)_ block comment match new api ([#2948](https://github.com/lunarvim/lunarvim/pull/2948))
+- _(typo)_ fix language server name typo in config example ([#3176](https://github.com/lunarvim/lunarvim/pull/3176))
+- _(typo)_ fix language server name typo in config example #3176 ([#3183](https://github.com/lunarvim/lunarvim/pull/3183))
+- handle deprecated telescope.builtin.internal ([#2885](https://github.com/lunarvim/lunarvim/pull/2885))
+- update key bindings for comment.nvim to use new api ([#2926](https://github.com/lunarvim/lunarvim/pull/2926))
+- remove warning message
+- make sure latest plugins are customizable ([#3044](https://github.com/lunarvim/lunarvim/pull/3044))
+- quick and dirty fix for global statusline
+- add branch export for rolling installation ([#3054](https://github.com/lunarvim/lunarvim/pull/3054))
+- lag in space when in terminal insert
+- fixing laststatus harder
+- make sure to use global in lualine
+- more consistent dashboard description ([#3055](https://github.com/lunarvim/lunarvim/pull/3055))
+- always load base theme
+- plain tokyonight
+- lualine filetype padding
+- lualine git signs padding
+- improve lualine inactive
+- lualine slightly better
+- use columns instead of winwidth
+- lualine laststatus nuclear option
+- pcall for dashboard
+- small fixes on telescope pickers & breadcrumbs ([#3060](https://github.com/lunarvim/lunarvim/pull/3060))
+- supertab should tab if menu is not available ([#3079](https://github.com/lunarvim/lunarvim/pull/3079))
+- update minimal_lsp.lua ([#3090](https://github.com/lunarvim/lunarvim/pull/3090))
+- set `lua-dev.nvim` to a valid commit version ([#3096](https://github.com/lunarvim/lunarvim/pull/3096))
+- add lunarvim/lvim/after to rtp
+- correct typos ([#3117](https://github.com/lunarvim/lunarvim/pull/3117))
+- idk why it has an issue here but we can't use reload in the plugins file for now
+- don't ignore plugin this way ([#3125](https://github.com/lunarvim/lunarvim/pull/3125))
+- esc exit autocommand
+- always use border for lsp hover ([#3160](https://github.com/lunarvim/lunarvim/pull/3160))
+- nvim_dap has an issue with setting winbar for dapui_console filetype
+- formatting
+- telescope delete_buffer binds correct scope
+- move telescope.actions pcall to the top
+- use function for pickers
+- Remove J and K key mappings for move ([#3206](https://github.com/lunarvim/lunarvim/pull/3206))
+- typo in git.lua
+- name treesitter source in cmp ([#3223](https://github.com/lunarvim/lunarvim/pull/3223))
+- don't install desktop file w/o xdg-desktop-menu ([#3229](https://github.com/lunarvim/lunarvim/pull/3229))
+- disable gitsigns hunk navigation message ([#3244](https://github.com/lunarvim/lunarvim/pull/3244))
+- copilot background should matcha statusline
+- disable unsupported asian characters spellchecking ([#3259](https://github.com/lunarvim/lunarvim/pull/3259))
+- nil table in breadcrumbs in autocommand ([#3267](https://github.com/lunarvim/lunarvim/pull/3267))
+- Remove notify which key mapping ([#3335](https://github.com/lunarvim/lunarvim/pull/3335))
+- call proper log function in notify override ([#3337](https://github.com/lunarvim/lunarvim/pull/3337))
+- statusline and breadcrumbs hls reload with config reload ([#3376](https://github.com/lunarvim/lunarvim/pull/3376))
+- revert ColorScheme autocmd execution ([#3397](https://github.com/lunarvim/lunarvim/pull/3397))
+- don't complete in prompt ft
+- rollback plugin loader changes ([#3402](https://github.com/lunarvim/lunarvim/pull/3402))
+
+### <!-- 3 --> Refactor
+
+- [**breaking**] _(cmp)_ adapt new recommendations ([#2913](https://github.com/lunarvim/lunarvim/pull/2913))
+- _(config)_ better deprecation handling ([#3419](https://github.com/lunarvim/lunarvim/pull/3419))
+- _(hooks)_ use colorscheme event after reload ([#3375](https://github.com/lunarvim/lunarvim/pull/3375))
+- _(installer)_ skip unstable headless update ([#3338](https://github.com/lunarvim/lunarvim/pull/3338))
+- [**breaking**] _(keymaps)_ don't hijack H/L by default ([#2874](https://github.com/lunarvim/lunarvim/pull/2874))
+- [**breaking**] _(plugins)_ remove nvim-notify from core ([#3300](https://github.com/lunarvim/lunarvim/pull/3300))
+- [**breaking**] _(theme)_ decouple tokyonight options ([#3384](https://github.com/lunarvim/lunarvim/pull/3384))
+- [**breaking**] migrate to mason.nvim ([#2880](https://github.com/lunarvim/lunarvim/pull/2880))
+- small improvements ([#3021](https://github.com/lunarvim/lunarvim/pull/3021))
+- smaller timeout for packer ([#2910](https://github.com/lunarvim/lunarvim/pull/2910))
+- more deliberate reload ([#3133](https://github.com/lunarvim/lunarvim/pull/3133))
+- clean up test env paths ([#3318](https://github.com/lunarvim/lunarvim/pull/3318))
+
+### <!-- 4 --> Documentation
+
+- _(lsp)_ fix the way of removing items from skipped_servers ([#2887](https://github.com/lunarvim/lunarvim/pull/2887))
+- _(readme)_ recommend rolling for 0.8, remove old breaking changes ([#3028](https://github.com/lunarvim/lunarvim/pull/3028))
+- _(windows)_ update example config for nvim-tree ([#2766](https://github.com/lunarvim/lunarvim/pull/2766))
+- _(windows)_ update example config ([#2919](https://github.com/lunarvim/lunarvim/pull/2919))
+- fix some typos and enhance readability ([#2917](https://github.com/lunarvim/lunarvim/pull/2917))
+- fix automatic_servers_installation example ([#2918](https://github.com/lunarvim/lunarvim/pull/2918))
+- update images
+- Replace Tree-sitter `maintained` with `all` in README ([#3088](https://github.com/lunarvim/lunarvim/pull/3088))
+- Update contributing readme with new url for install docs. ([#3254](https://github.com/lunarvim/lunarvim/pull/3254))
+- Update Readme ([#3282](https://github.com/lunarvim/lunarvim/pull/3282))
+- remove and reorganize images ([#3302](https://github.com/lunarvim/lunarvim/pull/3302))
+- update readme ([#3303](https://github.com/lunarvim/lunarvim/pull/3303))
+- update colors for links in readme
+
+### <!-- 5 --> Revert
+
+- remove incomplete lir integration ([#3030](https://github.com/lunarvim/lunarvim/pull/3030))
+- lir.nvim is still broken ([#3036](https://github.com/lunarvim/lunarvim/pull/3036))
+- fix Packer instead of hard-coding config ([#3049](https://github.com/lunarvim/lunarvim/pull/3049))
+
+### <!-- 6 --> Performance
+
+- _(plugins)_ move assert `vim.env.LVIM_DEV_MODE` logic ([#3238](https://github.com/lunarvim/lunarvim/pull/3238))
+- _(treesitter)_ disable in big files ([#3268](https://github.com/lunarvim/lunarvim/pull/3268))
+
+## [1.1.4]
+
+### <!-- 1 --> Features
+
+- _(cmp)_ documentation is deprecated in favor of window.documentation ([#2461](https://github.com/lunarvim/lunarvim/pull/2461))
+- _(cmp)_ add option to disable friendly-snippets ([#2660](https://github.com/lunarvim/lunarvim/pull/2660))
+- _(codelens)_ cursorhold is too much intrusive for codelens ([#2600](https://github.com/lunarvim/lunarvim/pull/2600))
+- _(icons)_ make it possible to disable icons ([#2529](https://github.com/lunarvim/lunarvim/pull/2529))
+- _(installer)_ ensure correct responses when prompting user ([#2506](https://github.com/lunarvim/lunarvim/pull/2506))
+- _(installer)_ add verify-plugins hook ([#2751](https://github.com/lunarvim/lunarvim/pull/2751))
+- _(lsp)_ add option to override default `nvim-lsp-installer` settings ([#2698](https://github.com/lunarvim/lunarvim/pull/2698))
+- _(lsp)_ add option to override nlsp-settings ([#2769](https://github.com/lunarvim/lunarvim/pull/2769))
+- _(lsp)_ bind formatexpr and omnifunc by default ([#2865](https://github.com/lunarvim/lunarvim/pull/2865))
+- _(lua-dev)_ use the newer lua-dev branch till folke comes back ([#2538](https://github.com/lunarvim/lunarvim/pull/2538))
+- _(neovim)_ neovim 0.8 compatibility ([#2544](https://github.com/lunarvim/lunarvim/pull/2544))
+- _(peek)_ make sure max width and height are customizable ([#2492](https://github.com/lunarvim/lunarvim/pull/2492))
+- _(plugins)_ add support for packer snapshots ([#2351](https://github.com/lunarvim/lunarvim/pull/2351))
+- _(quit)_ make sure to ask before discarding changes ([#2554](https://github.com/lunarvim/lunarvim/pull/2554))
+- _(which-key)_ added search command for colour highlights ([#2693](https://github.com/lunarvim/lunarvim/pull/2693))
+- lock nvim <0.7 to a specific tag ([#2491](https://github.com/lunarvim/lunarvim/pull/2491))
+- gitsigns yadm support ([#2535](https://github.com/lunarvim/lunarvim/pull/2535))
+- add cmp-tmux to the list of sources ([#2542](https://github.com/lunarvim/lunarvim/pull/2542))
+- prompt when closing modified/term buffers ([#2658](https://github.com/lunarvim/lunarvim/pull/2658))
+- fix a couple of issues ([#2750](https://github.com/lunarvim/lunarvim/pull/2750))
+- add commands to open/edit lvim logs ([#2709](https://github.com/lunarvim/lunarvim/pull/2709))
+
+### <!-- 2 --> Bugfix
+
+- _(autocmd)_ actually use the format wrapper ([#2560](https://github.com/lunarvim/lunarvim/pull/2560))
+- _(autocmds)_ make sure we are using codelens correctly ([#2576](https://github.com/lunarvim/lunarvim/pull/2576))
+- _(autocmds)_ disable commentstring_calc on cursor-hold ([#2581](https://github.com/lunarvim/lunarvim/pull/2581))
+- _(autocmds)_ toggle format-on-save properly ([#2659](https://github.com/lunarvim/lunarvim/pull/2659))
+- _(cmp)_ update nvim-cmp to the latest version ([#2467](https://github.com/lunarvim/lunarvim/pull/2467))
+- _(cmp)_ hotfix nvim-cmp version
+- _(cmp)_ bring back default keybindings ([#2470](https://github.com/lunarvim/lunarvim/pull/2470))
+- _(cmp)_ update nvim-cmp to the latest version ([#2467](https://github.com/lunarvim/lunarvim/pull/2467)) ([#2469](https://github.com/lunarvim/lunarvim/pull/2469))
+- _(core.comment)_ fix default extra mappings ([#2768](https://github.com/lunarvim/lunarvim/pull/2768))
+- _(dap)_ temporarily use dap-buddy dev branch which has older code ([#2567](https://github.com/lunarvim/lunarvim/pull/2567))
+- _(dap)_ pause key binding commmand ([#2573](https://github.com/lunarvim/lunarvim/pull/2573))
+- _(impatient)_ avoid get_options in fast handler ([#2451](https://github.com/lunarvim/lunarvim/pull/2451))
+- _(installer)_ latest and specified release version for neovim have different urls ([#2484](https://github.com/lunarvim/lunarvim/pull/2484))
+- _(installer)_ use full path to verify_plugins.lua ([#2755](https://github.com/lunarvim/lunarvim/pull/2755))
+- _(installer)_ always use check shallow clones ([#2763](https://github.com/lunarvim/lunarvim/pull/2763))
+- _(installer/pwsh)_ fixes some details on installer and uninstaller ([#2404](https://github.com/lunarvim/lunarvim/pull/2404))
+- _(log)_ add date to the timestamp of logs ([#2669](https://github.com/lunarvim/lunarvim/pull/2669))
+- _(lsp)_ undo stdpath overload to avoid datarace ([#2540](https://github.com/lunarvim/lunarvim/pull/2540))
+- _(lsp)_ update format filter for nightly ([#2773](https://github.com/lunarvim/lunarvim/pull/2773))
+- _(lualine)_ color theme gaps in some components ([#2465](https://github.com/lunarvim/lunarvim/pull/2465))
+- _(lualine)_ unique buf client names ([#2683](https://github.com/lunarvim/lunarvim/pull/2683))
+- _(luasnip)_ make sure all snippets are loaded ([#2447](https://github.com/lunarvim/lunarvim/pull/2447))
+- _(luasnip)_ only use user snippets if the folder exists ([#2481](https://github.com/lunarvim/lunarvim/pull/2481))
+- _(lvim/lsp/manager)_ make client_is_configured more reliable ([#2851](https://github.com/lunarvim/lunarvim/pull/2851))
+- _(nvimtree)_ escape the dot character in custom filter ([#2493](https://github.com/lunarvim/lunarvim/pull/2493))
+- _(nvimtree)_ make sure on_config_done is using the correct require ([#2509](https://github.com/lunarvim/lunarvim/pull/2509))
+- _(nvimtree)_ add latest changes from nvimtree ([#2537](https://github.com/lunarvim/lunarvim/pull/2537))
+- _(nvimtree)_ update nvim-tree setup ([#2681](https://github.com/lunarvim/lunarvim/pull/2681))
+- _(nvimtree)_ remove `indent_markers` icons trailing space ([#2854](https://github.com/lunarvim/lunarvim/pull/2854))
+- _(packer)_ add max_jobs = 40 ([#2781](https://github.com/lunarvim/lunarvim/pull/2781))
+- _(readme)_ update lsp server ignore syntax
+- _(readme)_ remove black as linter ([#2510](https://github.com/lunarvim/lunarvim/pull/2510))
+- _(telescope)_ set <cr> binding to actions.select_default only ([#2395](https://github.com/lunarvim/lunarvim/pull/2395))
+- _(theme)_ make sure the new theme is fully loaded ([#2392](https://github.com/lunarvim/lunarvim/pull/2392))
+- _(windows)_ specify required powershell version for the installation script ([#2376](https://github.com/lunarvim/lunarvim/pull/2376))
+- update deprecated methods in example configuration for trouble.nvim ([#2416](https://github.com/lunarvim/lunarvim/pull/2416))
+- use correct cache path ([#2593](https://github.com/lunarvim/lunarvim/pull/2593))
+- load notify's telescope extension properly ([#2586](https://github.com/lunarvim/lunarvim/pull/2586))
+- skip calling nvim-tree.setup() more than once ([#2707](https://github.com/lunarvim/lunarvim/pull/2707))
+- typo in utils/installer/install.sh ([#2776](https://github.com/lunarvim/lunarvim/pull/2776))
+- use pcall for setting up project.nvim ([#2762](https://github.com/lunarvim/lunarvim/pull/2762))
+
+### <!-- 3 --> Refactor
+
+- _(lsp)_ replace deprecated ocamllsp with ocamlls ([#2402](https://github.com/lunarvim/lunarvim/pull/2402))
+- _(lsp)_ cleanup servers' override configuration ([#2243](https://github.com/lunarvim/lunarvim/pull/2243))
+- _(lsp)_ decouple the installer setup-hook ([#2536](https://github.com/lunarvim/lunarvim/pull/2536))
+- _(telescope)_ don't overwrite default cmd to show hidden files
+- _(whichkey)_ use vim.keymap.set directly ([#2786](https://github.com/lunarvim/lunarvim/pull/2786))
+- re-enable packer.sync() in LvimReload ([#2410](https://github.com/lunarvim/lunarvim/pull/2410))
+- update impatient ([#2477](https://github.com/lunarvim/lunarvim/pull/2477))
+- lock new installations to nvim v0.7+ ([#2526](https://github.com/lunarvim/lunarvim/pull/2526))
+- use api-autocmds for lsp functions ([#2549](https://github.com/lunarvim/lunarvim/pull/2549))
+- [**breaking**] load the default options once ([#2592](https://github.com/lunarvim/lunarvim/pull/2592))
+- remove redundant ftdetects ([#2651](https://github.com/lunarvim/lunarvim/pull/2651))
+
+### <!-- 4 --> Documentation
+
+- _(README)_ change forgotten breaking change in example ([#2377](https://github.com/lunarvim/lunarvim/pull/2377))
+- _(windows)_ use alpha in config_win.example.lua ([#2452](https://github.com/lunarvim/lunarvim/pull/2452))
+
+### <!-- 5 --> Revert
+
+- do not run packer.sync() on every reload ([#2548](https://github.com/lunarvim/lunarvim/pull/2548))
+
+### <!-- 6 --> Performance
+
+- _(cmp)_ remove redundant check for emmet-ls ([#2830](https://github.com/lunarvim/lunarvim/pull/2830))
+
+## [1.1.3]
+
+### <!-- 1 --> Features
+
+- add alpha.nvim integration (#1906)
+
+### <!-- 2 --> Bugfix
+
+- _(alpha)_ globalstatus after openning files from dashboard (#2366)
+- _(bufferline)_ add an additional space before diagnostics (#2367)
+- _(lualine)_ conditional theme loading (#2363)
+- _(peek)_ make sure popup_options are positive (#2373)
+- _(peek)_ print error if lsp is unable to get file contents (#2379)
+- _(terminal)_ whichkey -> which-key (#2380)
+- _(terminal)_ weird lazygit commit message bug (#2382)
+- _(windows)_ use correct validation for the alias (#2371)
+- nvim-tree taking half the window on open (#2357)
+- correct typo in backup function (#2358)
+- automatically set colorscheme (#2370)
+
+### <!-- 3 --> Refactor
+
+- load onedarker theme externally (#2359)
+
+### <!-- 4 --> Documentation
+
+- update demo images on the main readme (#2386)
+
+## [1.1.2]
+
+### <!-- 1 --> Features
+
+- _(installer)_ Use pnpm to install nodejs dependencies(#2279) (#2280)
+- _(windows)_ Add custom config_win.example.lua (#2330)
+- Add option to automatically answer 'yes' for sh install script (#2306)
+- Enable nlsp-settings schemas (#2322)
+
+### <!-- 2 --> Bugfix
+
+- _(nlsp-settings)_ Cross platform issue (#2335)
+- _(timeoutlen)_ This has caused way too many issues in the past (#2287)
+- Disable the default intro message (#2340)
+
+### <!-- 3 --> Refactor
+
+- _(nvim-tree)_ Update settings structure (#2304)
+
+### <!-- 4 --> Documentation
+
+- _(readme)_ Fix typo in example config (#2333)
+
+## [1.1.1]
+
+### <!-- 2 --> Bugfix
+
+- Add tsx to treesitter ensure_installed list (#2268)
+- Correct a path to bufferline module (#2270)
+
+## [1.1.0]
+
+### <!-- 1 --> Features
+
+- _(vue)_ Set volar as default language server instead of vuels (#2230)
+- Use schemastore.nvim to provide extended json schema support (#2239)
+- Use bufferline instead of barbar (#2254)
+- Add a minimal implementation of bbye (#2267)
+
+### <!-- 2 --> Bugfix
+
+- _(autopairs)_ Remove weird tex rules from autopairs (#2206)
+- _(diag)_ Show lsp-diag code in open_float (#2180)
+- _(installer)_ Usernames can contain @ symbol (#2167)
+- _(installer)_ Universal bash (#2241)
+- _(logging)_ Disable insane amount of logging inside lvim.log (#2205)
+- _(lsp)_ No need to stop clients on LvimReload (#2160)
+- _(lsp)_ Use temporary fork of lua-dev (#2187)
+- _(lsp)_ Avoid accessing undefined user_data (#2216)
+- _(lualine)_ Add space to diff components (#1897)
+- _(lualine)_ Compacter size for treesitter icon (#2247)
+- _(lualine)_ Use 1-char width symbol for changed (#2246)
+- _(which-key)_ The PR has been merged to the original repo (#2172)
+- _(zsh)_ Don't set filetype to sh (#2035)
+- Added -ScriptBlock to run commands ```install.ps1``` (#2188)
+
+### <!-- 3 --> Refactor
+
+- _(nvim-tree)_ Cleanup and update settings (#2182)
+- _(nvim-tree)_ Remove unused code (#2266)
+- Remove unused outdated files (#2184)
+
+### <!-- 4 --> Documentation
+
+- _(readme)_ Add powershell installer script for Windows (#2208)
+
+## [1.0.0]
+
+### <!-- 1 --> Features
+
+- _(info)_ Display overridden servers for filetype (#2155)
+- _(luadev)_ Better vim api completion (#2043)
+- Add lualine config for darkplus
+- Last updates before 1.0.0 (#1953)
+- Use Telescope's git_files with fallback (#2089)
+- Plugin version bump (#2120)
+- Lazyload notify's configuration (#1855)
+- Plugin version bump (#2131)
+
+### <!-- 2 --> Bugfix
+
+- _(gitsigns)_ Rounded border (#2142)
+- _(install)_ Avoid data-races for `on_packer_complete` (#2157)
+- _(installer)_ Backup linked files with rsync (#2081)
+- _(installer)_ Check if npm-prefix is writable (#2091)
+- _(installer)_ More robust yarn validation (#2113)
+- _(lsp)_ Set the handlers opts for v0.6 as well (#2109)
+- _(lsp)_ Formatter now use new null-ls api function (#2135)
+- _(lsp)_ Formatter now use new null-ls api function (#2135)
+- _(null-ls)_ Avoid sending invalid opts.args (#2154)
+- _(which-key)_ Temporary solution for which-key (#2150)
+- Remove autopairs cmp completion (#2083)
+- Remove "error" message from git tag (#2141)
+
+### <!-- 3 --> Refactor
+
+- _(bootstrap)_ More robust git module (#2127)
+- _(info)_ Use new null-ls api for sources (#2125)
+- _(install.sh)_ Fix typo in node error message (#2107)
+- _(null-ls)_ Allow passing full list of options for sources (#2137)
+- _(settings)_ Add headless-mode settings (#2134)
+- _(term)_ Leave the first few ids unassigned (#2156)
+- _(test)_ Cleanup test utilities (#2132)
+- Deprecate lvim.lang.FOO (#1913) (#1914)
+- Remove unused old language configs (#2094)
+- Uplift neovim's minimum version requirement to 0.6.0 (#2093)
+- Avoid running ts.setup in headless (#2119)
+- More consistent autocmds (#2133)
+- Use a static lvim binary template (#1444)
+
+## [1.0.0-rc]
+
+### <!-- 1 --> Features
+
+- _(installer)_ Nicer rsync output (#2067)
+- _(terminal)_ Lazygit can now be toggled (#2039)
+- Add lualine config for darkplus
+- Last updates before 1.0.0 (#1953)
+- Support new null-ls (#1955)
+- Empty for empty buffers instead of Buffer <#>
+- Improved LSP grouping in lualine
+- Decrease hide in width limit for lualine
+- Add support for fsharp (#2021)
+- Add some messages in uninstall.sh (#1945)
+- Null-ls code_actions interface (#2008)
+- Full compatibility with neovim v0.6 (#2037)
+- Multiple enhancements to lvim-reload (#2054)
+- Bump plugin versions (#2064)
+- Update lsp-installer and lspconfig hashes to enable solidity_ls language server (#2072)
+
+### <!-- 2 --> Bugfix
+
+- _(autopairs)_ Add missing configuration entries (#2030)
+- _(bootstrap)_ Remove hard-coded spellfile option (#2061)
+- _(cmp)_ Revert broken sequential loading (#2002)
+- _(installer)_ Better handling of existing files (#2066)
+- _(lsp)_ Avoid installing an overridden server (#1981)
+- _(lsp)_ Prevent repeated setup call (#2048)
+- _(lsp)_ Correct client_id parsing in lvim-info (#2071)
+- _(lsp)_ Allow overriding servers with custom providers (#2070)
+- _(lualine)_ Change `fg` of section `a` in onedarker (#1909)
+- _(null-ls)_ Allow the same linter and formatter (#1968)
+- _(nvimtree)_ Update settings (#2001)
+- _(nvimtree)_ Restore default mappings + make them customizable (#2007)
+- _(nvimtree)_ Handle paths containing spaces (#2027)
+- _(plugins)_ Typo of pin commit of `treesitter` (#2046)
+- _(terminal)_ Allow disabling the open binding for toggleterm
+- _(windows)_ Autocmd requires forward slashes (#1967)
+- _(windows)_ Remove redundant `resolve` call (#1974)
+- Bump nvim-tree version
+- Formatting
+- Remove duplicate lint messages
+- Allow LunarVim changelog to work outside the lvim directory (#1952)
+- Use an indepdent shadafile from neovim (#1910)
+- Packersync issue when you have large number of plugins (#1922)
+- No idea why this breaks barbar
+- Lsp root can get very annoying when working with multiple languages. User is still able to turn it on.
+- Update jdtls script
+- Correct order for cmp's setup (#1999)
+- Dont close if next char is a close pair and no pairs in same line (#2017)
+- More accessible changelog (#2019)
+- Better default, ignore `.git` in `live_grep` (#2020)
+- No restart required when changing colorscheme (#2026)
+- No longer treat lazygit missing as an error (#2051)
+
+### <!-- 3 --> Refactor
+
+- Deprecate lvim.lang.FOO (#1913) (#1914)
+- More configurable format-on-save (#1937)
+- Load the default keymaps once (#1965)
+
+<!-- generated by git-cliff -->
diff --git a/mac/.config/LunarVim/CONTRIBUTING.md b/mac/.config/LunarVim/CONTRIBUTING.md
new file mode 100644
index 0000000..d7ab961
--- /dev/null
+++ b/mac/.config/LunarVim/CONTRIBUTING.md
@@ -0,0 +1,116 @@
+# Contributing to LunarVim
+
+Welcome to the LunarVim contributing guide. We are excited about the prospect of you joining our [community](https://github.com/lunarvim/LunarVim/graphs/contributors)!
+
+There are many opportunities to contributing to the project at any level. Every contribution is highly valued and no contribution is too small.
+
+You do not need to write code to contribute to this project. Documentation, demos, and feature design advancements are a key part of this project's growth.
+
+One of the best ways to begin contributing in a meaningful way is by helping find bugs and filing issues for them.
+
+## Getting Started
+
+1. Follow the [Installation](https://www.lunarvim.org/docs/installation) guide
+2. Link your fork with the repository `git remote add upstream https://github.com/lunarvim/LunarVim.git`, or use `gh fork`
+3. That's it! You can now `git fetch upstream` and `git rebase [-i] upstream/master` to update your branches with the latest contributions.
+
+<br />
+
+## Setting up development tools
+
+### For editing Lua files
+
+1. Formatter: [stylua](https://github.com/johnnymorganz/stylua#installation).
+2. Linter: [luacheck](https://github.com/luarocks/luacheck).
+
+### For editing shell scripts
+
+1. Formatter: [shfmt](https://github.com/mvdan/sh#shfmt).
+2. Linter: [shellcheck](https://github.com/koalaman/shellcheck).
+
+### (Optional)
+
+Install [pre-commit](https://github.com/pre-commit/pre-commit) which will run all linters and formatters for you as a pre-commit-hook.
+
+<br />
+
+## Code Conventions
+
+All lua code is formatted with [Stylua](https://github.com/JohnnyMorganz/StyLua).
+```bash
+# configurations are already stored in .stylua.toml
+stylua -c .
+```
+
+All shell code is formatted according to [Google Shell Style Guide](https://google.github.io/styleguide/shellguide.html)
+* use two spaces instead of tabs
+```bash
+shfmt -i 2 -ci -bn -l -d .
+```
+
+<br />
+
+## Pull Requests (PRs)
+
+- To avoid duplicate work, create a draft pull request.
+- Your PR must pass all the [automated-ci-tests](https://github.com/neovim/neovim/actions).
+- Use a [git-feature-branch](https://www.atlassian.com/git/tutorials/comparing-workflows) instead of the master/rolling branch.
+- Use a [rebase-workflow](http://git-scm.com/book/en/v2/Git-Branching-Rebasing).
+- Title the PR the same way as commit headers
+
+### Commit Messages
+* Commit header is limited to 72 characters.
+* Commit body and footer is limited to 100 characters per line.
+
+**Commit header format:**
+```
+<type>(<scope>?): <summary>
+ │ │ │
+ │ │ └─> Present tense. 'add something...'(O) vs 'added something...'(X)
+ │ │ Imperative mood. 'move cursor to...'(O) vs 'moves cursor to...'(X)
+ │ │ Not capitalized.
+ │ │ No period at the end.
+ │ │
+ │ └─> Commit Scope is optional, but strongly recommended.
+ │ Use lower case.
+ │ 'plugin', 'file', or 'directory' name is suggested, but not limited.
+ │
+ └─> Commit Type: build|ci|docs|feat|fix|perf|refactor|test
+```
+
+##### Commit Type Guideline
+
+* **build**: changes that affect the build system or external dependencies (example scopes: npm, pip, rg)
+* **ci**: changes to CI configuration files and scripts (example scopes: format, lint, issue_templates)
+* **docs**: changes to the documentation only
+* **feat**: new feature for the user
+* **fix**: bug fix
+* **perf**: performance improvement
+* **refactor**: code change that neither fixes a bug nor adds a feature
+* **test**: adding missing tests or correcting existing tests
+* **chore**: all the rest, including version bump for plugins
+
+**Real world examples:**
+```
+feat(quickfix): add 'q' binding to quit quickfix window when focused
+```
+```
+fix(installer): add missing "HOME" variable
+```
+
+
+### Branch Naming
+
+Name your branches meaningfully.
+
+ex)
+```(feature|bugfix|hotfix)/what-my-pr-does```
+
+<br />
+
+## Communication
+
+Members of the community have multiple ways to collaborate on the project.
+We encourage you to join the community:
+- [Discord server](https://discord.gg/Xb9B4Ny)
+- [Matrix server](https://matrix.to/#/#atmachine-neovim:matrix.org)
diff --git a/mac/.config/LunarVim/LICENSE b/mac/.config/LunarVim/LICENSE
new file mode 100644
index 0000000..f288702
--- /dev/null
+++ b/mac/.config/LunarVim/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<https://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<https://www.gnu.org/licenses/why-not-lgpl.html>.
diff --git a/mac/.config/LunarVim/Makefile b/mac/.config/LunarVim/Makefile
new file mode 100644
index 0000000..1f6844c
--- /dev/null
+++ b/mac/.config/LunarVim/Makefile
@@ -0,0 +1,42 @@
+SHELL := /usr/bin/env bash
+
+install:
+ @echo starting LunarVim installer
+ bash ./utils/installer/install.sh
+
+install-bin:
+ @echo starting LunarVim bin-installer
+ bash ./utils/installer/install_bin.sh
+
+install-neovim-binary:
+ @echo installing Neovim from github releases
+ bash ./utils/installer/install-neovim-from-release
+
+uninstall:
+ @echo starting LunarVim uninstaller
+ bash ./utils/installer/uninstall.sh
+
+generate_new_lockfile:
+ @echo generating core-plugins latest lockfile
+ bash ./utils/ci/generate_new_lockfile.sh
+
+lint: lint-lua lint-sh
+
+lint-lua:
+ luacheck *.lua lua/* tests/*
+
+lint-sh:
+ shfmt -f . | grep -v jdtls | xargs shellcheck
+
+style: style-lua style-sh
+
+style-lua:
+ stylua --config-path .stylua.toml --check .
+
+style-sh:
+ shfmt -f . | grep -v jdtls | xargs shfmt -i 2 -ci -bn -l -d
+
+test:
+ bash ./utils/ci/run_test.sh "$(TEST)"
+
+.PHONY: install install-neovim-binary uninstall lint style test
diff --git a/mac/.config/LunarVim/README.md b/mac/.config/LunarVim/README.md
new file mode 100644
index 0000000..28992d4
--- /dev/null
+++ b/mac/.config/LunarVim/README.md
@@ -0,0 +1,68 @@
+![lunarvim_logo_dark](https://user-images.githubusercontent.com/59826753/159940098-54284f26-f1da-4481-8b03-1deb34c57533.png)
+
+<div align="center"><p>
+ <a href="https://github.com/lunarvim/LunarVim/releases/latest">
+ <img alt="Latest release" src="https://img.shields.io/github/v/release/LunarVim/LunarVim?style=for-the-badge&logo=starship&color=C9CBFF&logoColor=D9E0EE&labelColor=302D41" />
+ </a>
+ <a href="https://github.com/lunarvim/LunarVim/pulse">
+ <img alt="Last commit" src="https://img.shields.io/github/last-commit/lunarvim/LunarVim?style=for-the-badge&logo=starship&color=8bd5ca&logoColor=D9E0EE&labelColor=302D41"/>
+ </a>
+ <a href="https://github.com/lunarvim/LunarVim/blob/main/LICENSE">
+ <img alt="License" src="https://img.shields.io/github/license/lunarvim/lunarvim?style=for-the-badge&logo=starship&color=ee999f&logoColor=D9E0EE&labelColor=302D41" />
+ </a>
+ <a href="https://github.com/LunarVim/LunarVim/stargazers">
+ <img alt="Stars" src="https://img.shields.io/github/stars/LunarVim/LunarVim?style=for-the-badge&logo=starship&color=c69ff5&logoColor=D9E0EE&labelColor=302D41" />
+ </a>
+ <a href="https://github.com/LunarVim/LunarVim/issues">
+ <img alt="Issues" src="https://img.shields.io/github/issues/LunarVim/LunarVim?style=for-the-badge&logo=bilibili&color=F5E0DC&logoColor=D9E0EE&labelColor=302D41" />
+ </a>
+ <a href="https://github.com/LunarVim/LunarVim">
+ <img alt="Repo Size" src="https://img.shields.io/github/repo-size/LunarVim/LunarVim?color=%23DDB6F2&label=SIZE&logo=codesandbox&style=for-the-badge&logoColor=D9E0EE&labelColor=302D41" />
+ </a>
+ <a href="https://patreon.com/chrisatmachine" title="Donate to this project using Patreon">
+ <img alt="Patreon donate button" src="https://img.shields.io/badge/patreon-donate-yellow.svg?style=for-the-badge&logo=starship&color=f5a97f&logoColor=D9E0EE&labelColor=302D41" />
+ </a>
+ <a href="https://twitter.com/intent/follow?screen_name=chrisatmachine">
+ <img alt="follow on Twitter" src="https://img.shields.io/twitter/follow/chrisatmachine?style=for-the-badge&logo=twitter&color=8aadf3&logoColor=D9E0EE&labelColor=302D41" />
+ </a>
+
+ <p align="center">
+ <img src="https://stars.medv.io/LunarVim/LunarVim.svg", title="commits"/>
+ </p>
+
+An IDE layer for Neovim with sane defaults. Completely free and community driven.
+
+---
+
+**[<kbd> <br> Install <br> </kbd>][Install]** 
+**[<kbd> <br> Configure <br> </kbd>][Configure]** 
+**[<kbd> <br> Troubleshooting <br> </kbd>][Troubleshoot]** 
+**[<kbd> <br> Contribute <br> </kbd>][Contribute]**
+
+---
+
+## Showcase
+
+![demo3](https://user-images.githubusercontent.com/29136904/191626246-ce0cc0c5-4b41-49e3-9cb7-4b1867ab0dcb.png)
+![info](https://user-images.githubusercontent.com/29136904/191624942-3d75ef87-35cf-434d-850e-3e7cd5ce2ad0.png)
+
+<!----------------------------------------------------------------------------->
+
+## Socials
+
+<p align="center">
+<a href="https://github.com/Lunarvim"><img src="https://user-images.githubusercontent.com/696094/196835284-c52d4bd1-7034-439e-848b-47d4f2933dff.svg" width="64" height="64" alt="Github Logo"/></a> <img src="assets/misc/transparent.png" height="1" width="5"/> <a href="https://discord.gg/Xb9B4Ny"><img src="https://user-images.githubusercontent.com/696094/196835282-f5c47d66-29b7-4210-9ee0-d9cdecde3559.svg" width="64" height="64" alt="Discord Logo"/></a> <img src="assets/misc/transparent.png" height="1" width="5"/> <a href="https://twitter.com/chrisatmachine"><img src="https://user-images.githubusercontent.com/696094/196835281-52617611-ede6-40da-a4bc-8c5025622bbf.svg" width="64" height="64" alt="Twitter Logo"/></a> <img src="assets/misc/transparent.png" height="1" width="5"/> <a href="https://reddit.com/r/Lunarvim"><img src="https://user-images.githubusercontent.com/696094/196835278-041a4f99-28e1-4a93-8e35-c8912f1089fc.svg" width="64" height="64" alt="Reddit Logo"/></a>
+</p>
+
+[Contribute]: https://github.com/LunarVim/LunarVim/blob/master/CONTRIBUTING.md
+[Install]: https://www.lunarvim.org/docs/installation
+[Troubleshoot]: https://www.lunarvim.org/docs/troubleshooting
+[Configure]: https://www.lunarvim.org/docs/configuration
+
+## Thanks to all contributors
+
+<a href="https://github.com/Lunarvim/Lunarvim/graphs/contributors">
+ <img src="https://contrib.rocks/image?repo=Lunarvim/Lunarvim" />
+</a>
+
+</div>
diff --git a/mac/.config/LunarVim/init.lua b/mac/.config/LunarVim/init.lua
new file mode 100644
index 0000000..f794b16
--- /dev/null
+++ b/mac/.config/LunarVim/init.lua
@@ -0,0 +1,25 @@
+local base_dir = vim.env.LUNARVIM_BASE_DIR
+ or (function()
+ local init_path = debug.getinfo(1, "S").source
+ return init_path:sub(2):match("(.*[/\\])"):sub(1, -2)
+ end)()
+
+if not vim.tbl_contains(vim.opt.rtp:get(), base_dir) then
+ vim.opt.rtp:prepend(base_dir)
+end
+
+require("lvim.bootstrap"):init(base_dir)
+
+require("lvim.config"):load()
+
+local plugins = require "lvim.plugins"
+
+require("lvim.plugin-loader").load { plugins, lvim.plugins }
+
+require("lvim.core.theme").setup()
+
+local Log = require "lvim.core.log"
+Log:debug "Starting LunarVim"
+
+local commands = require "lvim.core.commands"
+commands.load(commands.defaults)
diff --git a/mac/.config/LunarVim/lua/lvim/bootstrap.lua b/mac/.config/LunarVim/lua/lvim/bootstrap.lua
new file mode 100644
index 0000000..2a2ac1d
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/bootstrap.lua
@@ -0,0 +1,123 @@
+local M = {}
+
+if vim.fn.has "nvim-0.10" ~= 1 then
+ vim.notify("Please upgrade your Neovim base installation. Lunarvim requires v0.10+", vim.log.levels.WARN)
+ vim.wait(5000, function()
+ ---@diagnostic disable-next-line: redundant-return-value
+ return false
+ end)
+ vim.cmd "cquit"
+end
+
+local uv = vim.loop
+local path_sep = uv.os_uname().version:match "Windows" and "\\" or "/"
+
+---Join path segments that were passed as input
+---@return string
+function _G.join_paths(...)
+ local result = table.concat({ ... }, path_sep)
+ return result
+end
+
+_G.require_clean = require("lvim.utils.modules").require_clean
+_G.require_safe = require("lvim.utils.modules").require_safe
+_G.reload = require("lvim.utils.modules").reload
+
+---Get the full path to `$LUNARVIM_RUNTIME_DIR`
+---@return string|nil
+function _G.get_runtime_dir()
+ local lvim_runtime_dir = os.getenv "LUNARVIM_RUNTIME_DIR"
+ if not lvim_runtime_dir then
+ -- when nvim is used directly
+ return vim.call("stdpath", "data")
+ end
+ return lvim_runtime_dir
+end
+
+---Get the full path to `$LUNARVIM_CONFIG_DIR`
+---@return string|nil
+function _G.get_config_dir()
+ local lvim_config_dir = os.getenv "LUNARVIM_CONFIG_DIR"
+ if not lvim_config_dir then
+ return vim.call("stdpath", "config")
+ end
+ return lvim_config_dir
+end
+
+---Get the full path to `$LUNARVIM_CACHE_DIR`
+---@return string|nil
+function _G.get_cache_dir()
+ local lvim_cache_dir = os.getenv "LUNARVIM_CACHE_DIR"
+ if not lvim_cache_dir then
+ return vim.call("stdpath", "cache")
+ end
+ return lvim_cache_dir
+end
+
+---Initialize the `&runtimepath` variables and prepare for startup
+---@return table
+function M:init(base_dir)
+ self.runtime_dir = get_runtime_dir()
+ self.config_dir = get_config_dir()
+ self.cache_dir = get_cache_dir()
+ self.pack_dir = join_paths(self.runtime_dir, "site", "pack")
+ self.lazy_install_dir = join_paths(self.pack_dir, "lazy", "opt", "lazy.nvim")
+
+ ---@meta overridden to use LUNARVIM_CACHE_DIR instead, since a lot of plugins call this function internally
+ ---NOTE: changes to "data" are currently unstable, see #2507
+ ---@diagnostic disable-next-line: duplicate-set-field
+ vim.fn.stdpath = function(what)
+ if what == "cache" then
+ return _G.get_cache_dir()
+ end
+ return vim.call("stdpath", what)
+ end
+
+ ---Get the full path to LunarVim's base directory
+ ---@return string
+ function _G.get_lvim_base_dir()
+ return base_dir
+ end
+
+ if os.getenv "LUNARVIM_RUNTIME_DIR" then
+ vim.opt.rtp:remove(join_paths(vim.call("stdpath", "data"), "site"))
+ vim.opt.rtp:remove(join_paths(vim.call("stdpath", "data"), "site", "after"))
+ -- vim.opt.rtp:prepend(join_paths(self.runtime_dir, "site"))
+ vim.opt.rtp:append(join_paths(self.runtime_dir, "lvim", "after"))
+ vim.opt.rtp:append(join_paths(self.runtime_dir, "site", "after"))
+
+ vim.opt.rtp:remove(vim.call("stdpath", "config"))
+ vim.opt.rtp:remove(join_paths(vim.call("stdpath", "config"), "after"))
+ vim.opt.rtp:prepend(self.config_dir)
+ vim.opt.rtp:append(join_paths(self.config_dir, "after"))
+
+ vim.opt.packpath = vim.opt.rtp:get()
+ end
+
+ require("lvim.plugin-loader").init {
+ package_root = self.pack_dir,
+ install_path = self.lazy_install_dir,
+ }
+
+ require("lvim.config"):init()
+
+ require("lvim.core.mason").bootstrap()
+
+ return self
+end
+
+---Update LunarVim
+---pulls the latest changes from github and, resets the startup cache
+function M:update()
+ require("lvim.core.log"):info "Trying to update LunarVim..."
+
+ vim.schedule(function()
+ reload("lvim.utils.hooks").run_pre_update()
+ local ret = reload("lvim.utils.git").update_base_lvim()
+ if ret then
+ reload("lvim.utils.hooks").run_post_update()
+ end
+ end)
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/config/_deprecated.lua b/mac/.config/LunarVim/lua/lvim/config/_deprecated.lua
new file mode 100644
index 0000000..ebcdbe9
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/config/_deprecated.lua
@@ -0,0 +1,215 @@
+---@diagnostic disable: deprecated
+local M = {}
+
+local function deprecate(name, alternative)
+ local in_headless = #vim.api.nvim_list_uis() == 0
+ if in_headless then
+ return
+ end
+
+ alternative = alternative or "See https://github.com/LunarVim/LunarVim#breaking-changes"
+
+ local trace = debug.getinfo(3, "Sl")
+ local shorter_src = trace.short_src
+ local t = shorter_src .. ":" .. (trace.currentline or trace.lastlinedefined)
+ vim.schedule(function()
+ vim.notify_once(string.format("%s: `%s` is deprecated.\n %s.", t, name, alternative), vim.log.levels.WARN)
+ end)
+end
+
+function M.handle()
+ local mt = {
+ __newindex = function(_, k, _)
+ deprecate(k)
+ end,
+ }
+
+ ---@deprecated
+ lvim.builtin.theme.options = {}
+ setmetatable(lvim.builtin.theme.options, {
+ __newindex = function(_, k, v)
+ deprecate("lvim.builtin.theme.options." .. k, "Use `lvim.builtin.theme.<theme>.options` instead")
+ lvim.builtin.theme.tokyonight.options[k] = v
+ end,
+ })
+
+ ---@deprecated
+ lvim.builtin.notify = {}
+ setmetatable(lvim.builtin.notify, {
+ __newindex = function(_, k, _)
+ deprecate("lvim.builtin.notify." .. k, "See LunarVim#3294")
+ end,
+ })
+
+ ---@deprecated
+ lvim.builtin.dashboard = {}
+ setmetatable(lvim.builtin.dashboard, {
+ __newindex = function(_, k, _)
+ deprecate("lvim.builtin.dashboard." .. k, "Use `lvim.builtin.alpha` instead. See LunarVim#1906")
+ end,
+ })
+
+ ---@deprecated
+ lvim.lsp.popup_border = {}
+ setmetatable(lvim.lsp.popup_border, mt)
+
+ ---@deprecated
+ lvim.lsp.float = {}
+ setmetatable(lvim.lsp.float, {
+ __newindex = function(_, k, _)
+ deprecate("lvim.lsp.float." .. k, "Use options provided by the handler instead")
+ end,
+ })
+
+ ---@deprecated
+ lvim.lsp.diagnostics = {}
+ setmetatable(lvim.lsp.diagnostics, {
+ __newindex = function(table, k, v)
+ deprecate("lvim.lsp.diagnostics." .. k, string.format("Use `vim.diagnostic.config({ %s = %s })` instead", k, v))
+ rawset(table, k, v)
+ end,
+ })
+
+ ---@deprecated
+ lvim.lang = {}
+ setmetatable(lvim.lang, mt)
+end
+
+function M.post_load()
+ if lvim.lsp.diagnostics and not vim.tbl_isempty(lvim.lsp.diagnostics) then
+ vim.diagnostic.config(lvim.lsp.diagnostics)
+ end
+
+ if lvim.lsp.override and not vim.tbl_isempty(lvim.lsp.override) then
+ deprecate("lvim.lsp.override", "Use `lvim.lsp.automatic_configuration.skipped_servers` instead")
+ vim.tbl_map(function(c)
+ if not vim.tbl_contains(lvim.lsp.automatic_configuration.skipped_servers, c) then
+ table.insert(lvim.lsp.automatic_configuration.skipped_servers, c)
+ end
+ end, lvim.lsp.override)
+ end
+
+ if lvim.autocommands.custom_groups then
+ deprecate(
+ "lvim.autocommands.custom_groups",
+ "Use vim.api.nvim_create_autocmd instead or check LunarVim#2592 to learn about the new syntax"
+ )
+ end
+
+ if lvim.lsp.automatic_servers_installation then
+ deprecate(
+ "lvim.lsp.automatic_servers_installation",
+ "Use `lvim.lsp.installer.setup.automatic_installation` instead"
+ )
+ end
+
+ local function convert_spec_to_lazy(spec)
+ local alternatives = {
+ setup = "init",
+ as = "name",
+ opt = "lazy",
+ run = "build",
+ lock = "pin",
+ requires = "dependencies",
+ }
+
+ alternatives.tag = function()
+ if spec.tag == "*" then
+ spec.version = "*"
+ return [[version = "*"]]
+ end
+ end
+
+ alternatives.disable = function()
+ if type(spec.disabled) == "function" then
+ spec.enabled = function()
+ return not spec.disabled()
+ end
+ else
+ spec.enabled = not spec.disabled
+ end
+ return "enabled = " .. vim.inspect(spec.enabled)
+ end
+
+ alternatives.wants = function()
+ return "dependencies = [value]"
+ end
+ alternatives.needs = alternatives.wants
+
+ alternatives.module = function()
+ spec.lazy = true
+ return "lazy = true"
+ end
+
+ for old_key, alternative in pairs(alternatives) do
+ if spec[old_key] ~= nil then
+ local message
+ local old_value = vim.inspect(spec[old_key]) or "value"
+
+ if type(alternative) == "function" then
+ message = alternative()
+ else
+ spec[alternative] = spec[old_key]
+ end
+
+ -- not every function in alternatives returns a message (e.g. tag)
+ if type(alternative) ~= "function" or message then
+ spec[old_key] = nil
+
+ local new_value = vim.inspect(spec[alternative] or "[value]")
+ message = message or string.format("%s = %s", alternative, new_value)
+ vim.schedule(function()
+ vim.notify_once(
+ string.format(
+ [[`%s = %s` in `lvim.plugins` has been deprecated since the migration to lazy.nvim. Use `%s` instead.
+Example:
+`lvim.plugins = {... {... %s = %s ...} ...}`
+->
+`lvim.plugins = {... {... %s ...} ...}`
+See https://github.com/folke/lazy.nvim#-migration-guide"]],
+ old_key,
+ old_value,
+ message,
+ old_key,
+ old_value,
+ message
+ ),
+ vim.log.levels.WARN
+ )
+ end)
+ end
+ end
+ end
+
+ if spec[1] and spec[1]:match "^http" then
+ spec.url = spec[1]
+ spec[1] = nil
+
+ vim.schedule(function()
+ vim.notify_once(
+
+ string.format(
+ [[`"http..."` in `lvim.plugins` has been deprecated since the migration to lazy.nvim. Use `url = "http..."` instead.
+Example:
+`lvim.plugins = {... { "%s" ...} ...}`
+->
+`lvim.plugins = {... { url = "%s" ...} ...}`
+See https://github.com/folke/lazy.nvim#-migration-guide"]],
+ spec.url,
+ spec.url
+ ),
+
+ vim.log.levels.WARN
+ )
+ end)
+ end
+ end
+
+ for _, plugin in ipairs(lvim.plugins) do
+ if type(plugin) == "table" then
+ convert_spec_to_lazy(plugin)
+ end
+ end
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/config/defaults.lua b/mac/.config/LunarVim/lua/lvim/config/defaults.lua
new file mode 100644
index 0000000..5fa8a91
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/config/defaults.lua
@@ -0,0 +1,75 @@
+return {
+ leader = "space",
+ reload_config_on_save = true,
+ colorscheme = "lunar",
+ transparent_window = false,
+ format_on_save = {
+ ---@usage boolean: format on save (Default: false)
+ enabled = false,
+ ---@usage pattern string pattern used for the autocommand (Default: '*')
+ pattern = "*",
+ ---@usage timeout number timeout in ms for the format request (Default: 1000)
+ timeout = 1000,
+ ---@usage filter func to select client
+ filter = require("lvim.lsp.utils").format_filter,
+ },
+ keys = {},
+
+ use_icons = true,
+ icons = require "lvim.icons",
+
+ builtin = {},
+
+ plugins = {
+ -- use config.lua for this not put here
+ },
+
+ lazy = {
+ opts = {
+ install = {
+ missing = true,
+ colorscheme = { "lunar", "habamax" },
+ },
+ ui = {
+ border = "rounded",
+ },
+ root = require("lvim.utils").join_paths(get_runtime_dir(), "site", "pack", "lazy", "opt"),
+ git = {
+ timeout = 120,
+ },
+ lockfile = require("lvim.utils").join_paths(get_config_dir(), "lazy-lock.json"),
+ performance = {
+ rtp = {
+ reset = false,
+ },
+ },
+ defaults = {
+ lazy = false,
+ version = nil,
+ },
+ readme = {
+ root = require("lvim.utils").join_paths(get_runtime_dir(), "lazy", "readme"),
+ },
+ },
+ },
+
+ autocommands = {},
+ lang = {},
+ log = {
+ ---@usage can be { "trace", "debug", "info", "warn", "error", "fatal" },
+ level = "info",
+ viewer = {
+ ---@usage this will fallback on "less +F" if not found
+ cmd = "lnav",
+ layout_config = {
+ ---@usage direction = 'vertical' | 'horizontal' | 'window' | 'float',
+ direction = "horizontal",
+ open_mapping = "",
+ size = 40,
+ float_opts = {},
+ },
+ },
+ -- currently disabled due to instabilities
+ override_notify = false,
+ },
+}
diff --git a/mac/.config/LunarVim/lua/lvim/config/init.lua b/mac/.config/LunarVim/lua/lvim/config/init.lua
new file mode 100644
index 0000000..90c1788
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/config/init.lua
@@ -0,0 +1,108 @@
+local utils = require "lvim.utils"
+local Log = require "lvim.core.log"
+
+local M = {}
+local user_config_dir = get_config_dir()
+local user_config_file = utils.join_paths(user_config_dir, "config.lua")
+
+---Get the full path to the user configuration file
+---@return string
+function M:get_user_config_path()
+ return user_config_file
+end
+
+--- Initialize lvim default configuration and variables
+function M:init()
+ lvim = vim.deepcopy(require "lvim.config.defaults")
+
+ require("lvim.keymappings").load_defaults()
+
+ local builtins = require "lvim.core.builtins"
+ builtins.config { user_config_file = user_config_file }
+
+ local settings = require "lvim.config.settings"
+ settings.load_defaults()
+
+ local autocmds = require "lvim.core.autocmds"
+ autocmds.load_defaults()
+
+ local lvim_lsp_config = require "lvim.lsp.config"
+ lvim.lsp = vim.deepcopy(lvim_lsp_config)
+
+ lvim.builtin.luasnip = {
+ sources = {
+ friendly_snippets = true,
+ },
+ }
+
+ lvim.builtin.bigfile = {
+ active = true,
+ config = {},
+ }
+
+ require("lvim.config._deprecated").handle()
+end
+
+--- Override the configuration with a user provided one
+-- @param config_path The path to the configuration overrides
+function M:load(config_path)
+ local autocmds = reload "lvim.core.autocmds"
+ config_path = config_path or self:get_user_config_path()
+ local ok, err = pcall(dofile, config_path)
+ if not ok then
+ if utils.is_file(user_config_file) then
+ vim.schedule(function()
+ Log:warn("Invalid configuration: " .. err)
+ end)
+ else
+ vim.schedule(function()
+ vim.notify_once(
+ string.format("User-configuration not found. Creating an example configuration in %s", config_path)
+ )
+ end)
+ local config_name = vim.loop.os_uname().version:match "Windows" and "config_win" or "config"
+ local example_config = join_paths(get_lvim_base_dir(), "utils", "installer", config_name .. ".example.lua")
+ vim.fn.mkdir(user_config_dir, "p")
+ vim.loop.fs_copyfile(example_config, config_path)
+ end
+ end
+
+ Log:set_level(lvim.log.level)
+
+ require("lvim.config._deprecated").post_load()
+
+ autocmds.define_autocmds(lvim.autocommands)
+
+ vim.g.mapleader = (lvim.leader == "space" and " ") or lvim.leader
+
+ reload("lvim.keymappings").load(lvim.keys)
+
+ if lvim.transparent_window then
+ autocmds.enable_transparent_mode()
+ end
+
+ if lvim.reload_config_on_save then
+ autocmds.enable_reload_config_on_save()
+ end
+end
+
+--- Override the configuration with a user provided one
+-- @param config_path The path to the configuration overrides
+function M:reload()
+ vim.schedule(function()
+ reload("lvim.utils.hooks").run_pre_reload()
+
+ M:load()
+
+ reload("lvim.core.autocmds").configure_format_on_save()
+
+ local plugins = reload "lvim.plugins"
+ local plugin_loader = reload "lvim.plugin-loader"
+
+ plugin_loader.reload { plugins, lvim.plugins }
+ reload("lvim.core.theme").setup()
+ reload("lvim.utils.hooks").run_post_reload()
+ end)
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/config/settings.lua b/mac/.config/LunarVim/lua/lvim/config/settings.lua
new file mode 100644
index 0000000..2492f1d
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/config/settings.lua
@@ -0,0 +1,120 @@
+local M = {}
+
+M.load_default_options = function()
+ local utils = require "lvim.utils"
+ local join_paths = utils.join_paths
+
+ local undodir = join_paths(get_cache_dir(), "undo")
+
+ if not utils.is_directory(undodir) then
+ vim.fn.mkdir(undodir, "p")
+ end
+
+ local default_options = {
+ backup = false, -- creates a backup file
+ clipboard = "unnamedplus", -- allows neovim to access the system clipboard
+ cmdheight = 1, -- more space in the neovim command line for displaying messages
+ completeopt = { "menuone", "noselect" },
+ conceallevel = 0, -- so that `` is visible in markdown files
+ fileencoding = "utf-8", -- the encoding written to a file
+ foldmethod = "manual", -- folding, set to "expr" for treesitter based folding
+ foldexpr = "", -- set to "nvim_treesitter#foldexpr()" for treesitter based folding
+ hidden = true, -- required to keep multiple buffers and open multiple buffers
+ hlsearch = true, -- highlight all matches on previous search pattern
+ ignorecase = true, -- ignore case in search patterns
+ mouse = "a", -- allow the mouse to be used in neovim
+ pumheight = 10, -- pop up menu height
+ showmode = false, -- we don't need to see things like -- INSERT -- anymore
+ smartcase = true, -- smart case
+ splitbelow = true, -- force all horizontal splits to go below current window
+ splitright = true, -- force all vertical splits to go to the right of current window
+ swapfile = false, -- creates a swapfile
+ termguicolors = true, -- set term gui colors (most terminals support this)
+ timeoutlen = 1000, -- time to wait for a mapped sequence to complete (in milliseconds)
+ title = true, -- set the title of window to the value of the titlestring
+ -- opt.titlestring = "%<%F%=%l/%L - nvim" -- what the title of the window will be set to
+ undodir = undodir, -- set an undo directory
+ undofile = true, -- enable persistent undo
+ updatetime = 100, -- faster completion
+ writebackup = false, -- if a file is being edited by another program (or was written to file while editing with another program), it is not allowed to be edited
+ expandtab = true, -- convert tabs to spaces
+ shiftwidth = 2, -- the number of spaces inserted for each indentation
+ tabstop = 2, -- insert 2 spaces for a tab
+ cursorline = true, -- highlight the current line
+ number = true, -- set numbered lines
+ numberwidth = 4, -- set number column width to 2 {default 4}
+ signcolumn = "yes", -- always show the sign column, otherwise it would shift the text each time
+ wrap = false, -- display lines as one long line
+ shadafile = join_paths(get_cache_dir(), "lvim.shada"),
+ scrolloff = 8, -- minimal number of screen lines to keep above and below the cursor.
+ sidescrolloff = 8, -- minimal number of screen lines to keep left and right of the cursor.
+ showcmd = false,
+ ruler = false,
+ laststatus = 3,
+ }
+
+ --- SETTINGS ---
+ vim.opt.spelllang:append "cjk" -- disable spellchecking for asian characters (VIM algorithm does not support it)
+ vim.opt.shortmess:append "c" -- don't show redundant messages from ins-completion-menu
+ vim.opt.shortmess:append "I" -- don't show the default intro message
+ vim.opt.whichwrap:append "<,>,[,],h,l"
+
+ for k, v in pairs(default_options) do
+ vim.opt[k] = v
+ end
+
+ vim.filetype.add {
+ extension = {
+ tex = "tex",
+ zir = "zir",
+ cr = "crystal",
+ },
+ pattern = {
+ ["[jt]sconfig.*.json"] = "jsonc",
+ },
+ }
+
+ local default_diagnostic_config = {
+ signs = {
+ active = true,
+ values = {
+ { name = "DiagnosticSignError", text = lvim.icons.diagnostics.Error },
+ { name = "DiagnosticSignWarn", text = lvim.icons.diagnostics.Warning },
+ { name = "DiagnosticSignHint", text = lvim.icons.diagnostics.Hint },
+ { name = "DiagnosticSignInfo", text = lvim.icons.diagnostics.Information },
+ },
+ },
+ virtual_text = true,
+ update_in_insert = false,
+ underline = true,
+ severity_sort = true,
+ float = {
+ focusable = true,
+ style = "minimal",
+ border = "rounded",
+ source = "always",
+ header = "",
+ prefix = "",
+ },
+ }
+
+ vim.diagnostic.config(default_diagnostic_config)
+end
+
+M.load_headless_options = function()
+ vim.opt.shortmess = "" -- try to prevent echom from cutting messages off or prompting
+ vim.opt.more = false -- don't pause listing when screen is filled
+ vim.opt.cmdheight = 9999 -- helps avoiding |hit-enter| prompts.
+ vim.opt.columns = 9999 -- set the widest screen possible
+ vim.opt.swapfile = false -- don't use a swap file
+end
+
+M.load_defaults = function()
+ if #vim.api.nvim_list_uis() == 0 then
+ M.load_headless_options()
+ return
+ end
+ M.load_default_options()
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/core/alpha.lua b/mac/.config/LunarVim/lua/lvim/core/alpha.lua
new file mode 100644
index 0000000..13642c2
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/core/alpha.lua
@@ -0,0 +1,85 @@
+local M = {}
+
+function M.config()
+ local lvim_dashboard = require "lvim.core.alpha.dashboard"
+ local lvim_startify = require "lvim.core.alpha.startify"
+ lvim.builtin.alpha = {
+ dashboard = {
+ config = {},
+ section = lvim_dashboard.get_sections(),
+ opts = { autostart = true },
+ },
+ startify = {
+ config = {},
+ section = lvim_startify.get_sections(),
+ opts = { autostart = true },
+ },
+ active = true,
+ mode = "dashboard",
+ }
+end
+
+local function resolve_buttons(theme_name, button_section)
+ if button_section.val and #button_section.val > 0 then
+ return button_section.val
+ end
+
+ local selected_theme = require("alpha.themes." .. theme_name)
+ local val = {}
+ for _, entry in pairs(button_section.entries) do
+ local on_press = function()
+ local sc_ = entry[1]:gsub("%s", ""):gsub("SPC", "<leader>")
+ local key = vim.api.nvim_replace_termcodes(sc_, true, false, true)
+ vim.api.nvim_feedkeys(key, "normal", false)
+ end
+ local button_element = selected_theme.button(entry[1], entry[2], entry[3])
+ -- this became necessary after recent changes in alpha.nvim (06ade3a20ca9e79a7038b98d05a23d7b6c016174)
+ button_element.on_press = on_press
+
+ button_element.opts = vim.tbl_extend("force", button_element.opts, entry[4] or button_section.opts or {})
+
+ table.insert(val, button_element)
+ end
+ return val
+end
+
+local function resolve_config(theme_name)
+ local selected_theme = require("alpha.themes." .. theme_name)
+ local resolved_section = selected_theme.section
+ local section = lvim.builtin.alpha[theme_name].section
+
+ for name, el in pairs(section) do
+ for k, v in pairs(el) do
+ if name:match "buttons" and k == "entries" then
+ resolved_section[name].val = resolve_buttons(theme_name, el)
+ elseif v then
+ resolved_section[name][k] = v
+ end
+ end
+
+ resolved_section[name].opts = el.opts or {}
+ end
+
+ local opts = lvim.builtin.alpha[theme_name].opts or {}
+ selected_theme.config.opts = vim.tbl_extend("force", selected_theme.config.opts, opts)
+
+ return selected_theme.config
+end
+
+function M.setup()
+ local status_ok, alpha = pcall(require, "alpha")
+ if not status_ok then
+ return
+ end
+ local mode = lvim.builtin.alpha.mode
+ local config = lvim.builtin.alpha[mode].config
+
+ -- this makes it easier to use a completely custom configuration
+ if vim.tbl_isempty(config) then
+ config = resolve_config(mode)
+ end
+
+ alpha.setup(config)
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/core/alpha/dashboard.lua b/mac/.config/LunarVim/lua/lvim/core/alpha/dashboard.lua
new file mode 100644
index 0000000..07a5ecc
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/core/alpha/dashboard.lua
@@ -0,0 +1,148 @@
+local M = {}
+
+local banner = {
+ " ⢀⣀⣤⣤⣤⣶⣶⣶⣶⣶⣶⣤⣤⣤⣀⡀ ",
+ " ⣀⣤⣶⣿⠿⠟⠛⠉⠉⠉⠁⠈⠉⠉⠉⠛⠛⠿⣿⣷⣦⣀ ",
+ " ⢀⣤⣾⡿⠛⠉ ⠉⠛⢿⣷⣤⡀ ",
+ " ⣴⣿⡿⠃ ⠙⠻⣿⣦ ",
+ " ⢀⣠⣤⣤⣤⣤⣤⣾⣿⣉⣀⡀ ⠙⢻⣷⡄ ",
+ "⣼⠋⠁ ⢠⣿⡟ ⠉⠉⠉⠛⠛⠶⠶⣤⣄⣀ ⣀⣀ ⢠⣤⣤⡄ ⢻⣿⣆ ",
+ "⢻⡄ ⢰⣿⡟ ⢠⣿⣿⣿⠉⠛⠲⣾⣿⣿⣷ ⢀⣾⣿⣿⠁ ⢻⣿⡆ ",
+ " ⠹⣦⡀ ⣿⣿⠁ ⢸⣿⣿⡇ ⠻⣿⣿⠟⠳⠶⣤⣀⣸⣿⣿⠇ ⣿⣷ ",
+ " ⠙⢷⣿⡇ ⣸⣿⣿⠃ ⢸⣿⣿⢷⣤⡀ ⢸⣿⡆ ",
+ " ⢸⣿⠇ ⣿⣿⣿ ⣿⣿⣷ ⢠⣿⣿⡏ ⠈⠙⠳⢦⣄ ⠈⣿⡇ ",
+ " ⢸⣿⡆ ⢸⣿⣿⡇ ⣿⣿⣿ ⢀⣿⣿⡟ ⠈⠙⠷⣤⣿⡇ ",
+ " ⠘⣿⡇ ⣼⣿⣿⠁ ⣿⣿⣿ ⣼⣿⣿⠃ ⢸⣿⠷⣄⡀ ",
+ " ⣿⣿ ⣿⣿⡿ ⣿⣿⣿⢸⣿⣿⠃ ⣾⡿ ⠈⠻⣆ ",
+ " ⠸⣿⣧ ⢸⣿⣿⣇⣀⣀⣀⣀⣀⣀⣸⣿⣿⣿⣿⠇ ⣼⣿⠇ ⠘⣧",
+ " ⠹⣿⣧ ⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠏ ⣼⣿⠏ ⣠⡿",
+ " ⠘⢿⣷⣄ ⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉ ⢠⣼⡿⠛⠛⠛⠛⠛⠛⠉ ",
+ " ⠻⣿⣦⣄ ⣀⣴⣿⠟ ",
+ " ⠈⠛⢿⣶⣤⣀ ⣀⣤⣶⡿⠛⠁ ",
+ " ⠉⠻⢿⣿⣶⣤⣤⣀⣀⡀ ⢀⣀⣀⣠⣤⣶⣿⡿⠟⠋ ",
+ " ⠈⠉⠙⠛⠻⠿⠿⠿⠿⠿⠿⠟⠛⠋⠉⠁ ",
+}
+
+M.banner_small = {
+ " ⢀⣀ ⣰⣶ ⢀⣤⣄ ",
+ " ⢸⣿ ⣀⡀ ⣰⣿⠏ ⠘⠿⠟ ",
+ " ⣿⡟ ⣤⡄ ⣠⣤ ⢠⣤⣀⣤⣤⣤⡀ ⢀⣤⣤⣤⣤⡀ ⢠⣤⢀⣤⣤⣄ ⣿⣿ ⢰⣿⠏ ⣶⣶⣶⣶⡦ ⢠⣶⣦⣴⣦⣠⣴⣦⡀ ",
+ " ⢠⣿⡇ ⢠⣿⠇ ⣿⡇ ⣿⡿⠉ ⠈⣿⣧ ⠰⠿⠋ ⢹⣿ ⣿⡿⠋ ⠹⠿ ⢻⣿⡇⢠⣿⡟ ⠈⠉⢹⣿⡇ ⢸⣿⡏⢹⣿⡏⢹⣿⡇ ",
+ " ⢸⣿ ⢸⣿ ⢰⣿⠃ ⢠⣿⡇ ⣿⡇ ⣠⣴⡶⠶⠶⣿⣿ ⢠⣿⡇ ⢸⣿⣇⣿⡿ ⣿⣿⠁ ⣿⣿ ⣾⣿ ⣾⣿⠁ ",
+ " ⣿⣟ ⢻⣿⡀ ⢀⣼⣿ ⢸⣿ ⢰⣿⠇ ⢰⣿⣇ ⣠⣿⡏ ⢸⣿ ⢸⣿⣿⣿⠁ ⣀⣀⣠⣿⣿⣀⡀ ⢠⣿⡟⢠⣿⡟⢀⣿⡿ ",
+ " ⠛⠛⠛⠛⠛⠛⠁ ⠈⠛⠿⠟⠋⠛⠃ ⠛⠛ ⠘⠛ ⠙⠿⠿⠛⠙⠛⠃ ⠚⠛ ⠘⠿⠿⠃ ⠿⠿⠿⠿⠿⠿⠿ ⠸⠿⠇⠸⠿⠇⠸⠿⠇ ",
+}
+
+M.banner_alt_1 = {
+ "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
+ "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
+ "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣤⣤⣶⣶⣶⣶⣶⣶⣶⣦⣤⣄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
+ "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣴⣾⣿⠿⠛⠛⠉⠉⠉⠉⠉⠉⠉⠙⠛⠻⢿⣿⣶⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
+ "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⠿⠛⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠻⢿⣷⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
+ "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣿⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
+ "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡠⠒⠈⠉⠉⠉⠉⠉⣹⣿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣷⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
+ "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⡀⠀⠀⠀⠀⠀⠀⣰⣿⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢿⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
+ "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠑⢄⠀⠀⠀⠀⢰⣿⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢿⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
+ "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠑⢄⡀⠀⣿⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
+ "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢺⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
+ "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⠉⠑⠢⢄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
+ "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⡇⠀⠀⠀⠈⠑⠢⠄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⠢⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
+ "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⣇⠀⠀⠀⠀⠀⠀⠀⠀⠉⠐⠢⠄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⣿⡟⠀⠈⠑⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
+ "⠀⠀⠀⠀⠀⠀⢀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠁⠒⠠⠤⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⣿⠁⠀⠀⢀⣼⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
+ "⠀⠀⠀⠀⠀⠀⢸⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠁⠒⠂⠤⠤⠀⣀⡀⠀⠀⠀⣼⣿⠇⠀⠀⢀⣸⣿⡿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
+ "⠀⠀⠀⠀⠀⠀⣿⡟⠀⠀⠀⠀⠀⠀⣤⡄⠀⠀⠀⣠⣤⠀⠀⢠⣭⣀⣤⣤⣤⡀⠀⠀⠀⢀⣤⣤⣤⣤⡀⠀⠀⠀⢠⣤⢀⣤⣤⣄⠀⠀⣿⣿⠀⠉⣹⣿⠏⠉⠉⢱⣶⣶⣶⡦⠀⠀⠀⢠⣶⣦⣴⣦⣠⣴⣦⡀⠀⠀⠀⠀",
+ "⠀⠀⠀⠀⠀⢠⣿⡇⠀⠀⠀⠀⠀⢠⣿⠇⠀⠀⠀⣿⡇⠀⠀⣿⡿⠉⠀⠈⣿⣧⠀⠀⠰⠿⠋⠀⠀⢹⣿⠀⠀⠀⣿⡿⠋⠀⠹⠿⠀⠀⢻⣿⡇⢠⣿⡟⠀⠀⠀⠈⠉⢹⣿⡇⠀⠀⠀⢸⣿⡏⢹⣿⡏⢹⣿⡇⠀⠀⠀⠀",
+ "⠀⠀⠀⠀⠀⢸⣿⠀⠀⠀⠀⠀⠀⢸⣿⠀⠀⠀⢰⣿⠃⠀⢠⣿⡇⠀⠀⠀⣿⡇⠀⠀⣠⣴⡶⠶⠶⣿⣿⠀⠀⢠⣿⡇⠀⠀⠀⠀⠀⠀⢸⣿⣇⣿⡿⠀⠀⠀⠀⠀⠀⣿⣿⠁⠀⠀⠀⣿⣿⠀⣾⣿⠀⣾⣿⠁⠀⠀⠀⠀",
+ "⠀⠀⠀⠀⠀⣿⣟⠀⠀⠀⠀⠀⠀⢻⣿⡀⠀⢀⣼⣿⠀⠀⢸⣿⠀⠀⠀⢰⣿⠇⠀⢰⣿⣇⠀⠀⣠⣿⡏⠀⠀⢸⣿⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⠁⠀⠀⠀⣀⣀⣠⣿⣿⣀⡀⠀⢠⣿⡟⢠⣿⡟⢀⣿⡿⠀⠀⠀⠀⠀",
+ "⠀⠀⠀⠀⠀⠛⠛⠛⠛⠛⠛⠁⠀⠈⠛⠿⠟⠋⠛⠃⠀⠀⠛⠛⠀⠀⠀⠘⠛⠀⠀⠀⠙⠿⠿⠛⠙⠛⠃⠀⠀⠚⠛⠀⠀⠀⠀⠀⠀⠀⠘⠿⠿⠃⠀⠀⠀⠀⠿⠿⠿⠿⠿⠿⠿⠀⠸⠿⠇⠸⠿⠇⠸⠿⠇⠀⠀⠀⠀⠀",
+ " ",
+}
+
+M.banner_alt_2 = {
+ "⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿",
+ "⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠟⠛⠛⠉⠉⠉⠉⠉⠉⠛⠛⠻⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿",
+ "⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠛⠉⠀⣀⣤⣴⣶⣶⣾⣿⣿⣷⣶⣶⣦⣤⣀⠀⠉⠛⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿",
+ "⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠟⠁⢀⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣦⡀⠈⠻⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿",
+ "⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠏⠀⣠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄⠀⠹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿",
+ "⣿⣿⠿⠟⠛⠛⠛⠛⠛⠁⠀⠾⠿⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡀⠈⢻⣿⣿⣿⣿⣿⣿⣿⣿",
+ "⣿⠁⣴⣾⣿⣿⣿⡟⠀⣰⣿⣶⣶⣶⣤⣤⣉⣉⠛⠛⠿⠿⣿⣿⡿⠿⠿⣿⣿⣿⣿⣿⣿⡟⠛⠛⢛⣿⣿⣿⣆⠀⢻⣿⣿⣿⣿⣿⣿⣿",
+ "⣿⡄⠻⣿⣿⣿⡟⠀⢠⣿⣿⣿⣿⣿⣿⣿⣿⡟⠀⠀⠀⣦⣤⡈⠀⠀⠀⠈⣿⣿⣿⣿⡿⠁⠀⠀⣾⣿⣿⣿⣿⡄⠀⢻⣿⣿⣿⣿⣿⣿",
+ "⣿⣿⣄⠙⠿⣿⠁⢀⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⢸⣿⣿⣿⣄⠀⠀⣠⣄⣉⠛⠻⠃⠀⠀⣼⣿⣿⣿⣿⣿⣿⡀⠈⣿⣿⣿⣿⣿⣿",
+ "⣿⣿⣿⣷⣦⡈⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠆⠀⠀⡀⠛⠿⣿⣿⣿⣿⣿⡇⠀⢻⣿⣿⣿⣿⣿",
+ "⣿⣿⣿⣿⣿⡇⠀⣾⣿⣿⣿⣿⣿⣿⣿⣿⡟⠀⠀⢀⣿⣿⣿⣿⡇⠀⠀⠘⣿⣿⡟⠀⠀⢰⣿⣷⣦⣌⡙⠻⢿⣿⣷⠀⢸⣿⣿⣿⣿⣿",
+ "⣿⣿⣿⣿⣿⡇⠀⢿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⢸⣿⣿⣿⣿⣿⠀⠀⠀⣿⡿⠀⠀⢀⣿⣿⣿⣿⣿⣿⣷⣤⣈⠛⠀⢸⣿⣿⣿⣿⣿",
+ "⣿⣿⣿⣿⣿⣧⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⠁⠀⠀⣾⣿⣿⣿⣿⣿⠀⠀⠀⣿⠁⠀⠀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⡈⠻⢿⣿⣿⣿",
+ "⣿⣿⣿⣿⣿⣿⡀⠈⣿⣿⣿⣿⣿⣿⣿⡿⠀⠀⢀⣿⣿⣿⣿⣿⣿⠀⠀⠀⠃⠀⠀⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠁⢀⣿⣶⣄⠙⣿⣿",
+ "⣿⣿⣿⣿⣿⣿⣧⠀⠘⣿⣿⣿⣿⣿⣿⡇⠀⠀⠸⠿⠿⠿⠿⠿⠿⠇⠀⠀⠀⠀⣸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠃⠀⣼⣿⣿⣿⣦⠘⣿",
+ "⣿⣿⣿⣿⣿⣿⣿⣧⠀⠹⣿⣿⣿⣿⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠏⠀⣼⣿⣿⣿⡿⠟⢀⣿",
+ "⣿⣿⣿⣿⣿⣿⣿⣿⣧⡀⠈⢿⣿⣿⣿⣶⣶⣶⣶⣶⣶⣶⣶⣶⣶⣶⣶⣶⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠁⢀⣤⣤⣤⣤⣤⣴⣶⣿⣿",
+ "⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣆⠀⠙⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠋⠀⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿",
+ "⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣦⡀⠈⠻⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠟⠁⢀⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿",
+ "⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣤⣀⠀⠉⠛⠻⠿⠿⢿⣿⣿⡿⠿⠿⠟⠛⠉⠀⣀⣤⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿",
+ "⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣦⣤⣤⣀⣀⣀⣀⣀⣀⣤⣤⣴⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿",
+ "⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿",
+}
+
+function M.get_sections()
+ local header = {
+ type = "text",
+ val = function()
+ local alpha_wins = vim.tbl_filter(function(win)
+ local buf = vim.api.nvim_win_get_buf(win)
+ return vim.api.nvim_get_option_value("filetype", { buf = buf }) == "alpha"
+ end, vim.api.nvim_list_wins())
+
+ if vim.api.nvim_win_get_height(alpha_wins[#alpha_wins]) < 36 then
+ return M.banner_small
+ end
+ return banner
+ end,
+ opts = {
+ position = "center",
+ hl = "Label",
+ },
+ }
+
+ local text = require "lvim.interface.text"
+ local lvim_version = require("lvim.utils.git").get_lvim_version()
+
+ local footer = {
+ type = "text",
+ val = text.align_center({ width = 0 }, {
+ "",
+ "lunarvim.org",
+ lvim_version,
+ }, 0.5),
+ opts = {
+ position = "center",
+ hl = "Number",
+ },
+ }
+
+ local buttons = {
+ opts = {
+ hl_shortcut = "Include",
+ spacing = 1,
+ },
+ entries = {
+ { "f", lvim.icons.ui.FindFile .. " Find File", "<CMD>Telescope find_files<CR>" },
+ { "n", lvim.icons.ui.NewFile .. " New File", "<CMD>ene!<CR>" },
+ { "p", lvim.icons.ui.Project .. " Projects ", "<CMD>Telescope projects<CR>" },
+ { "r", lvim.icons.ui.History .. " Recent files", ":Telescope oldfiles <CR>" },
+ { "t", lvim.icons.ui.FindText .. " Find Text", "<CMD>Telescope live_grep<CR>" },
+ {
+ "c",
+ lvim.icons.ui.Gear .. " Configuration",
+ "<CMD>edit " .. require("lvim.config"):get_user_config_path() .. " <CR>",
+ },
+ { "q", lvim.icons.ui.Close .. " Quit", "<CMD>quit<CR>" },
+ },
+ }
+ return {
+ header = header,
+ buttons = buttons,
+ footer = footer,
+ }
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/core/alpha/startify.lua b/mac/.config/LunarVim/lua/lvim/core/alpha/startify.lua
new file mode 100644
index 0000000..e9d10a0
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/core/alpha/startify.lua
@@ -0,0 +1,45 @@
+local M = {}
+
+function M.get_sections()
+ local header = {
+ type = "text",
+ val = {
+ [[ __ _ ___ ]],
+ [[ / / __ ______ ____ _____| | / (_)___ ___ ]],
+ [[ / / / / / / __ \/ __ `/ ___/ | / / / __ `__ \]],
+ [[ / /___/ /_/ / / / / /_/ / / | |/ / / / / / / /]],
+ [[/_____/\__,_/_/ /_/\__,_/_/ |___/_/_/ /_/ /_/ ]],
+ },
+ opts = {
+ hl = "Label",
+ shrink_margin = false,
+ -- wrap = "overflow";
+ },
+ }
+
+ local top_buttons = {
+ entries = {
+ { "e", lvim.icons.ui.NewFile .. " New File", "<CMD>ene!<CR>" },
+ },
+ }
+
+ local bottom_buttons = {
+ entries = {
+ { "q", "Quit", "<CMD>quit<CR>" },
+ },
+ }
+
+ local footer = {
+ type = "group",
+ }
+
+ return {
+ header = header,
+ top_buttons = top_buttons,
+ bottom_buttons = bottom_buttons,
+ -- this is probably broken
+ footer = footer,
+ }
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/core/autocmds.lua b/mac/.config/LunarVim/lua/lvim/core/autocmds.lua
new file mode 100644
index 0000000..f7ec7eb
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/core/autocmds.lua
@@ -0,0 +1,281 @@
+local M = {}
+local Log = require "lvim.core.log"
+
+--- Load the default set of autogroups and autocommands.
+function M.load_defaults()
+ local definitions = {
+ {
+ "TextYankPost",
+ {
+ group = "_general_settings",
+ pattern = "*",
+ desc = "Highlight text on yank",
+ callback = function()
+ vim.highlight.on_yank { higroup = "Search", timeout = 100 }
+ end,
+ },
+ },
+ {
+ "FileType",
+ {
+ group = "_hide_dap_repl",
+ pattern = "dap-repl",
+ command = "set nobuflisted",
+ },
+ },
+ {
+ "FileType",
+ {
+ group = "_filetype_settings",
+ pattern = { "lua" },
+ desc = "fix gf functionality inside .lua files",
+ callback = function()
+ ---@diagnostic disable: assign-type-mismatch
+ -- credit: https://github.com/sam4llis/nvim-lua-gf
+ vim.opt_local.include = [[\v<((do|load)file|require|reload)[^''"]*[''"]\zs[^''"]+]]
+ vim.opt_local.includeexpr = "substitute(v:fname,'\\.','/','g')"
+ vim.opt_local.suffixesadd:prepend ".lua"
+ vim.opt_local.suffixesadd:prepend "init.lua"
+
+ for _, path in pairs(vim.api.nvim_list_runtime_paths()) do
+ vim.opt_local.path:append(path .. "/lua")
+ end
+ end,
+ },
+ },
+ {
+ "FileType",
+ {
+ group = "_buffer_mappings",
+ pattern = {
+ "qf",
+ "help",
+ "man",
+ "floaterm",
+ "lspinfo",
+ "lir",
+ "lsp-installer",
+ "null-ls-info",
+ "tsplayground",
+ "DressingSelect",
+ "Jaq",
+ },
+ callback = function()
+ vim.keymap.set("n", "q", "<cmd>close<cr>", { buffer = true })
+ vim.opt_local.buflisted = false
+ end,
+ },
+ },
+ {
+ "VimResized",
+ {
+ group = "_auto_resize",
+ pattern = "*",
+ command = [[
+ let _auto_resize_current_tab = tabpagenr()
+ tabdo wincmd =
+ execute 'tabnext' _auto_resize_current_tab
+ ]],
+ },
+ },
+ {
+ "FileType",
+ {
+ group = "_filetype_settings",
+ pattern = "alpha",
+ callback = function()
+ vim.cmd [[
+ set nobuflisted
+ ]]
+ end,
+ },
+ },
+ {
+ "FileType",
+ {
+ group = "_filetype_settings",
+ pattern = "lir",
+ callback = function()
+ vim.opt_local.number = false
+ vim.opt_local.relativenumber = false
+ end,
+ },
+ },
+ {
+ "ColorScheme",
+ {
+ group = "_lvim_colorscheme",
+ callback = function()
+ if lvim.builtin.breadcrumbs.active then
+ require("lvim.core.breadcrumbs").get_winbar()
+ end
+ local statusline_hl = vim.api.nvim_get_hl(0, { name = "StatusLine" })
+ local cursorline_hl = vim.api.nvim_get_hl(0, { name = "CursorLine" })
+ local normal_hl = vim.api.nvim_get_hl(0, { name = "Normal" })
+ vim.api.nvim_set_hl(0, "CmpItemKindCopilot", { fg = "#6CC644" })
+ vim.api.nvim_set_hl(0, "CmpItemKindTabnine", { fg = "#CA42F0" })
+ vim.api.nvim_set_hl(0, "CmpItemKindCrate", { fg = "#F64D00" })
+ vim.api.nvim_set_hl(0, "CmpItemKindEmoji", { fg = "#FDE030" })
+ vim.api.nvim_set_hl(0, "SLCopilot", { fg = "#6CC644", bg = statusline_hl.bg })
+ vim.api.nvim_set_hl(0, "SLGitIcon", { fg = "#E8AB53", bg = cursorline_hl.bg })
+ vim.api.nvim_set_hl(0, "SLBranchName", { fg = normal_hl.fg, bg = cursorline_hl.bg })
+ vim.api.nvim_set_hl(0, "SLSeparator", { fg = cursorline_hl.fg, bg = statusline_hl.bg })
+ end,
+ },
+ },
+ { -- taken from AstroNvim
+ "BufEnter",
+ {
+ group = "_dir_opened",
+ nested = true,
+ callback = function(args)
+ local bufname = vim.api.nvim_buf_get_name(args.buf)
+ if require("lvim.utils").is_directory(bufname) then
+ vim.api.nvim_del_augroup_by_name "_dir_opened"
+ vim.cmd "do User DirOpened"
+ vim.api.nvim_exec_autocmds(args.event, { buffer = args.buf, data = args.data })
+ end
+ end,
+ },
+ },
+ { -- taken from AstroNvim
+ { "BufRead", "BufWinEnter", "BufNewFile" },
+ {
+ group = "_file_opened",
+ nested = true,
+ callback = function(args)
+ local buftype = vim.api.nvim_get_option_value("buftype", { buf = args.buf })
+ if not (vim.fn.expand "%" == "" or buftype == "nofile") then
+ vim.api.nvim_del_augroup_by_name "_file_opened"
+ vim.api.nvim_exec_autocmds("User", { pattern = "FileOpened" })
+ require("lvim.lsp").setup()
+ end
+ end,
+ },
+ },
+ }
+
+ M.define_autocmds(definitions)
+end
+
+local get_format_on_save_opts = function()
+ local defaults = require("lvim.config.defaults").format_on_save
+ -- accept a basic boolean `lvim.format_on_save=true`
+ if type(lvim.format_on_save) ~= "table" then
+ return defaults
+ end
+
+ return {
+ pattern = lvim.format_on_save.pattern or defaults.pattern,
+ timeout = lvim.format_on_save.timeout or defaults.timeout,
+ }
+end
+
+function M.enable_format_on_save()
+ local opts = get_format_on_save_opts()
+ vim.api.nvim_create_augroup("lsp_format_on_save", {})
+ vim.api.nvim_create_autocmd("BufWritePre", {
+ group = "lsp_format_on_save",
+ pattern = opts.pattern,
+ callback = function()
+ require("lvim.lsp.utils").format { timeout_ms = opts.timeout, filter = opts.filter }
+ end,
+ })
+ Log:debug "enabled format-on-save"
+end
+
+function M.disable_format_on_save()
+ M.clear_augroup "lsp_format_on_save"
+ Log:debug "disabled format-on-save"
+end
+
+function M.configure_format_on_save()
+ if type(lvim.format_on_save) == "table" and lvim.format_on_save.enabled then
+ M.enable_format_on_save()
+ elseif lvim.format_on_save == true then
+ M.enable_format_on_save()
+ else
+ M.disable_format_on_save()
+ end
+end
+
+function M.toggle_format_on_save()
+ local exists, autocmds = pcall(vim.api.nvim_get_autocmds, {
+ group = "lsp_format_on_save",
+ event = "BufWritePre",
+ })
+ if not exists or #autocmds == 0 then
+ M.enable_format_on_save()
+ else
+ M.disable_format_on_save()
+ end
+end
+
+function M.enable_reload_config_on_save()
+ -- autocmds require forward slashes (even on windows)
+ local pattern = get_config_dir():gsub("\\", "/") .. "/*.lua"
+
+ vim.api.nvim_create_augroup("lvim_reload_config_on_save", {})
+ vim.api.nvim_create_autocmd("BufWritePost", {
+ group = "lvim_reload_config_on_save",
+ pattern = pattern,
+ desc = "Trigger LvimReload on saving config.lua",
+ callback = function()
+ require("lvim.config"):reload()
+ end,
+ })
+end
+
+function M.enable_transparent_mode()
+ vim.api.nvim_create_autocmd("ColorScheme", {
+ pattern = "*",
+ callback = function()
+ local hl_groups = {
+ "Normal",
+ "SignColumn",
+ "NormalNC",
+ "TelescopeBorder",
+ "NvimTreeNormal",
+ "NvimTreeNormalNC",
+ "EndOfBuffer",
+ "MsgArea",
+ }
+ for _, name in ipairs(hl_groups) do
+ vim.cmd(string.format("highlight %s ctermbg=none guibg=none", name))
+ end
+ end,
+ })
+ vim.opt.fillchars = "eob: "
+end
+
+--- Clean autocommand in a group if it exists
+--- This is safer than trying to delete the augroup itself
+---@param name string the augroup name
+function M.clear_augroup(name)
+ -- defer the function in case the autocommand is still in-use
+ Log:debug("request to clear autocmds " .. name)
+ vim.schedule(function()
+ pcall(function()
+ vim.api.nvim_clear_autocmds { group = name }
+ end)
+ end)
+end
+
+--- Create autocommand groups based on the passed definitions
+--- Also creates the augroup automatically if it doesn't exist
+---@param definitions table contains a tuple of event, opts, see `:h nvim_create_autocmd`
+function M.define_autocmds(definitions)
+ for _, entry in ipairs(definitions) do
+ local event = entry[1]
+ local opts = entry[2]
+ if type(opts.group) == "string" and opts.group ~= "" then
+ local exists, _ = pcall(vim.api.nvim_get_autocmds, { group = opts.group })
+ if not exists then
+ vim.api.nvim_create_augroup(opts.group, {})
+ end
+ end
+ vim.api.nvim_create_autocmd(event, opts)
+ end
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/core/autopairs.lua b/mac/.config/LunarVim/lua/lvim/core/autopairs.lua
new file mode 100644
index 0000000..439de09
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/core/autopairs.lua
@@ -0,0 +1,91 @@
+local M = {}
+
+function M.config()
+ lvim.builtin.autopairs = {
+ active = true,
+ on_config_done = nil,
+ ---@usage modifies the function or method delimiter by filetypes
+ map_char = {
+ all = "(",
+ tex = "{",
+ },
+ ---@usage check bracket in same line
+ enable_check_bracket_line = false,
+ ---@usage check treesitter
+ check_ts = true,
+ ts_config = {
+ lua = { "string", "source" },
+ javascript = { "string", "template_string" },
+ java = false,
+ },
+ disable_filetype = { "TelescopePrompt", "spectre_panel" },
+ ---@usage disable when recording or executing a macro
+ disable_in_macro = false,
+ ---@usage disable when insert after visual block mode
+ disable_in_visualblock = false,
+ disable_in_replace_mode = true,
+ ignored_next_char = string.gsub([[ [%w%%%'%[%"%.] ]], "%s+", ""),
+ enable_moveright = true,
+ ---@usage add bracket pairs after quote
+ enable_afterquote = true,
+ ---@usage trigger abbreviation
+ enable_abbr = false,
+ ---@usage switch for basic rule break undo sequence
+ break_undo = true,
+ map_cr = true,
+ ---@usage map the <BS> key
+ map_bs = true,
+ ---@usage map <c-w> to delete a pair if possible
+ map_c_w = false,
+ ---@usage Map the <C-h> key to delete a pair
+ map_c_h = false,
+ ---@usage change default fast_wrap
+ fast_wrap = {
+ map = "<M-e>",
+ chars = { "{", "[", "(", '"', "'" },
+ pattern = string.gsub([[ [%'%"%)%>%]%)%}%,] ]], "%s+", ""),
+ offset = 0, -- Offset from pattern match
+ end_key = "$",
+ keys = "qwertyuiopzxcvbnmasdfghjkl",
+ check_comma = true,
+ highlight = "Search",
+ highlight_grey = "Comment",
+ },
+ }
+end
+
+M.setup = function()
+ local status_ok, autopairs = pcall(require, "nvim-autopairs")
+ if not status_ok then
+ return
+ end
+
+ autopairs.setup {
+ check_ts = lvim.builtin.autopairs.check_ts,
+ enable_check_bracket_line = lvim.builtin.autopairs.enable_check_bracket_line,
+ ts_config = lvim.builtin.autopairs.ts_config,
+ disable_filetype = lvim.builtin.autopairs.disable_filetype,
+ disable_in_macro = lvim.builtin.autopairs.disable_in_macro,
+ ignored_next_char = lvim.builtin.autopairs.ignored_next_char,
+ enable_moveright = lvim.builtin.autopairs.enable_moveright,
+ enable_afterquote = lvim.builtin.autopairs.enable_afterquote,
+ map_c_w = lvim.builtin.autopairs.map_c_w,
+ map_bs = lvim.builtin.autopairs.map_bs,
+ disable_in_visualblock = lvim.builtin.autopairs.disable_in_visualblock,
+ fast_wrap = lvim.builtin.autopairs.fast_wrap,
+ }
+
+ if lvim.builtin.autopairs.on_config_done then
+ lvim.builtin.autopairs.on_config_done(autopairs)
+ end
+
+ pcall(function()
+ local function on_confirm_done(...)
+ require("nvim-autopairs.completion.cmp").on_confirm_done()(...)
+ end
+ require("cmp").event:off("confirm_done", on_confirm_done)
+ require("cmp").event:on("confirm_done", on_confirm_done)
+ end)
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/core/breadcrumbs.lua b/mac/.config/LunarVim/lua/lvim/core/breadcrumbs.lua
new file mode 100644
index 0000000..485458f
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/core/breadcrumbs.lua
@@ -0,0 +1,236 @@
+local M = {}
+
+-- local Log = require "lvim.core.log"
+local icons = lvim.icons.kind
+
+M.config = function()
+ lvim.builtin.breadcrumbs = {
+ active = true,
+ on_config_done = nil,
+ winbar_filetype_exclude = {
+ "help",
+ "startify",
+ "dashboard",
+ "lazy",
+ "neo-tree",
+ "neogitstatus",
+ "NvimTree",
+ "Trouble",
+ "alpha",
+ "lir",
+ "Outline",
+ "spectre_panel",
+ "toggleterm",
+ "DressingSelect",
+ "Jaq",
+ "harpoon",
+ "dap-repl",
+ "dap-terminal",
+ "dapui_console",
+ "dapui_hover",
+ "lab",
+ "notify",
+ "noice",
+ "neotest-summary",
+ "",
+ },
+ options = {
+ icons = {
+ Array = icons.Array .. " ",
+ Boolean = icons.Boolean .. " ",
+ Class = icons.Class .. " ",
+ Color = icons.Color .. " ",
+ Constant = icons.Constant .. " ",
+ Constructor = icons.Constructor .. " ",
+ Enum = icons.Enum .. " ",
+ EnumMember = icons.EnumMember .. " ",
+ Event = icons.Event .. " ",
+ Field = icons.Field .. " ",
+ File = icons.File .. " ",
+ Folder = icons.Folder .. " ",
+ Function = icons.Function .. " ",
+ Interface = icons.Interface .. " ",
+ Key = icons.Key .. " ",
+ Keyword = icons.Keyword .. " ",
+ Method = icons.Method .. " ",
+ Module = icons.Module .. " ",
+ Namespace = icons.Namespace .. " ",
+ Null = icons.Null .. " ",
+ Number = icons.Number .. " ",
+ Object = icons.Object .. " ",
+ Operator = icons.Operator .. " ",
+ Package = icons.Package .. " ",
+ Property = icons.Property .. " ",
+ Reference = icons.Reference .. " ",
+ Snippet = icons.Snippet .. " ",
+ String = icons.String .. " ",
+ Struct = icons.Struct .. " ",
+ Text = icons.Text .. " ",
+ TypeParameter = icons.TypeParameter .. " ",
+ Unit = icons.Unit .. " ",
+ Value = icons.Value .. " ",
+ Variable = icons.Variable .. " ",
+ },
+ highlight = true,
+ separator = " " .. lvim.icons.ui.ChevronRight .. " ",
+ depth_limit = 0,
+ depth_limit_indicator = "..",
+ },
+ }
+end
+
+M.setup = function()
+ local status_ok, navic = pcall(require, "nvim-navic")
+ if not status_ok then
+ return
+ end
+
+ M.create_winbar()
+ navic.setup(lvim.builtin.breadcrumbs.options)
+
+ if lvim.builtin.breadcrumbs.on_config_done then
+ lvim.builtin.breadcrumbs.on_config_done()
+ end
+end
+
+local function isempty(s)
+ return s == nil or s == ""
+end
+
+M.get_filename = function()
+ local filename = vim.fn.expand "%:t"
+ local extension = vim.fn.expand "%:e"
+
+ if not isempty(filename) then
+ local file_icon, hl_group
+ local devicons_ok, devicons = pcall(require, "nvim-web-devicons")
+ if lvim.use_icons and devicons_ok then
+ file_icon, hl_group = devicons.get_icon(filename, extension, { default = true })
+
+ if isempty(file_icon) then
+ file_icon = lvim.icons.kind.File
+ end
+ else
+ file_icon = ""
+ hl_group = "Normal"
+ end
+
+ local buf_ft = vim.bo.filetype
+
+ if buf_ft == "dapui_breakpoints" then
+ file_icon = lvim.icons.ui.Bug
+ end
+
+ if buf_ft == "dapui_stacks" then
+ file_icon = lvim.icons.ui.Stacks
+ end
+
+ if buf_ft == "dapui_scopes" then
+ file_icon = lvim.icons.ui.Scopes
+ end
+
+ if buf_ft == "dapui_watches" then
+ file_icon = lvim.icons.ui.Watches
+ end
+
+ -- if buf_ft == "dapui_console" then
+ -- file_icon = lvim.icons.ui.DebugConsole
+ -- end
+
+ local navic_text_hl = vim.api.nvim_get_hl(0, { name = "Normal" })
+ vim.api.nvim_set_hl(0, "Winbar", { fg = navic_text_hl.fg })
+
+ return " " .. "%#" .. hl_group .. "#" .. file_icon .. "%*" .. " " .. "%#Winbar#" .. filename .. "%*"
+ end
+end
+
+local get_gps = function()
+ local status_gps_ok, gps = pcall(require, "nvim-navic")
+ if not status_gps_ok then
+ return ""
+ end
+
+ local status_ok, gps_location = pcall(gps.get_location, {})
+ if not status_ok then
+ return ""
+ end
+
+ if not gps.is_available() or gps_location == "error" then
+ return ""
+ end
+
+ if not isempty(gps_location) then
+ return "%#NavicSeparator#" .. lvim.icons.ui.ChevronRight .. "%* " .. gps_location
+ else
+ return ""
+ end
+end
+
+local excludes = function()
+ return vim.tbl_contains(lvim.builtin.breadcrumbs.winbar_filetype_exclude or {}, vim.bo.filetype)
+end
+
+M.get_winbar = function()
+ if excludes() then
+ return
+ end
+ local value = M.get_filename()
+
+ local gps_added = false
+ if not isempty(value) then
+ local gps_value = get_gps()
+ value = value .. " " .. gps_value
+ if not isempty(gps_value) then
+ gps_added = true
+ end
+ end
+
+ if not isempty(value) and vim.api.nvim_get_option_value("mod", { buf = 0 }) then
+ -- TODO: replace with circle
+ local mod = "%#LspCodeLens#" .. lvim.icons.ui.Circle .. "%*"
+ if gps_added then
+ value = value .. " " .. mod
+ else
+ value = value .. mod
+ end
+ end
+
+ local num_tabs = #vim.api.nvim_list_tabpages()
+
+ if num_tabs > 1 and not isempty(value) then
+ local tabpage_number = tostring(vim.api.nvim_tabpage_get_number(0))
+ value = value .. "%=" .. tabpage_number .. "/" .. tostring(num_tabs)
+ end
+
+ local status_ok, _ = pcall(vim.api.nvim_set_option_value, "winbar", value, { scope = "local" })
+ if not status_ok then
+ return
+ end
+end
+
+M.create_winbar = function()
+ vim.api.nvim_create_augroup("_winbar", {})
+ vim.api.nvim_create_autocmd({
+ "CursorHoldI",
+ "CursorHold",
+ "BufWinEnter",
+ "BufFilePost",
+ "InsertEnter",
+ "BufWritePost",
+ "TabClosed",
+ "TabEnter",
+ }, {
+ group = "_winbar",
+ callback = function()
+ if lvim.builtin.breadcrumbs.active then
+ local status_ok, _ = pcall(vim.api.nvim_buf_get_var, 0, "lsp_floating_window")
+ if not status_ok then
+ -- TODO:
+ require("lvim.core.breadcrumbs").get_winbar()
+ end
+ end
+ end,
+ })
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/core/bufferline.lua b/mac/.config/LunarVim/lua/lvim/core/bufferline.lua
new file mode 100644
index 0000000..057e7ca
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/core/bufferline.lua
@@ -0,0 +1,256 @@
+local M = {}
+
+local function is_ft(b, ft)
+ return vim.bo[b].filetype == ft
+end
+
+local function diagnostics_indicator(num, _, diagnostics, _)
+ local result = {}
+ local symbols = {
+ error = lvim.icons.diagnostics.Error,
+ warning = lvim.icons.diagnostics.Warning,
+ info = lvim.icons.diagnostics.Information,
+ }
+ if not lvim.use_icons then
+ return "(" .. num .. ")"
+ end
+ for name, count in pairs(diagnostics) do
+ if symbols[name] and count > 0 then
+ table.insert(result, symbols[name] .. " " .. count)
+ end
+ end
+ result = table.concat(result, " ")
+ return #result > 0 and result or ""
+end
+
+local function custom_filter(buf, buf_nums)
+ local logs = vim.tbl_filter(function(b)
+ return is_ft(b, "log")
+ end, buf_nums or {})
+ if vim.tbl_isempty(logs) then
+ return true
+ end
+ local tab_num = vim.fn.tabpagenr()
+ local last_tab = vim.fn.tabpagenr "$"
+ local is_log = is_ft(buf, "log")
+ if last_tab == 1 then
+ return true
+ end
+ -- only show log buffers in secondary tabs
+ return (tab_num == last_tab and is_log) or (tab_num ~= last_tab and not is_log)
+end
+
+M.config = function()
+ lvim.builtin.bufferline = {
+ active = true,
+ on_config_done = nil,
+ keymap = {
+ normal_mode = {},
+ },
+ highlights = {
+ background = {
+ italic = true,
+ },
+ buffer_selected = {
+ bold = true,
+ },
+ },
+ options = {
+ themable = true, -- whether or not bufferline highlights can be overridden externally
+ -- style_preset = preset,
+ get_element_icon = nil,
+ show_duplicate_prefix = true,
+ duplicates_across_groups = true,
+ auto_toggle_bufferline = true,
+ move_wraps_at_ends = false,
+ groups = { items = {}, options = { toggle_hidden_on_enter = true } },
+ mode = "buffers", -- set to "tabs" to only show tabpages instead
+ numbers = "none", -- can be "none" | "ordinal" | "buffer_id" | "both" | function
+ close_command = function(bufnr) -- can be a string | function, see "Mouse actions"
+ M.buf_kill("bd", bufnr, false)
+ end,
+ right_mouse_command = "vert sbuffer %d", -- can be a string | function, see "Mouse actions"
+ left_mouse_command = "buffer %d", -- can be a string | function, see "Mouse actions"
+ middle_mouse_command = nil, -- can be a string | function, see "Mouse actions"
+ indicator = {
+ icon = lvim.icons.ui.BoldLineLeft, -- this should be omitted if indicator style is not 'icon'
+ style = "icon", -- can also be 'underline'|'none',
+ },
+ buffer_close_icon = lvim.icons.ui.Close,
+ modified_icon = lvim.icons.ui.Circle,
+ close_icon = lvim.icons.ui.BoldClose,
+ left_trunc_marker = lvim.icons.ui.ArrowCircleLeft,
+ right_trunc_marker = lvim.icons.ui.ArrowCircleRight,
+ --- name_formatter can be used to change the buffer's label in the bufferline.
+ --- Please note some names can/will break the
+ --- bufferline so use this at your discretion knowing that it has
+ --- some limitations that will *NOT* be fixed.
+ name_formatter = function(buf) -- buf contains a "name", "path" and "bufnr"
+ -- remove extension from markdown files for example
+ if buf.name:match "%.md" then
+ return vim.fn.fnamemodify(buf.name, ":t:r")
+ end
+ end,
+ max_name_length = 18,
+ max_prefix_length = 15, -- prefix used when a buffer is de-duplicated
+ truncate_names = true, -- whether or not tab names should be truncated
+ tab_size = 18,
+ diagnostics = "nvim_lsp",
+ diagnostics_update_in_insert = false,
+ diagnostics_indicator = diagnostics_indicator,
+ -- NOTE: this will be called a lot so don't do any heavy processing here
+ custom_filter = custom_filter,
+ offsets = {
+ {
+ filetype = "undotree",
+ text = "Undotree",
+ highlight = "PanelHeading",
+ padding = 1,
+ },
+ {
+ filetype = "NvimTree",
+ text = "Explorer",
+ highlight = "PanelHeading",
+ padding = 1,
+ },
+ {
+ filetype = "DiffviewFiles",
+ text = "Diff View",
+ highlight = "PanelHeading",
+ padding = 1,
+ },
+ {
+ filetype = "flutterToolsOutline",
+ text = "Flutter Outline",
+ highlight = "PanelHeading",
+ },
+ {
+ filetype = "lazy",
+ text = "Lazy",
+ highlight = "PanelHeading",
+ padding = 1,
+ },
+ },
+ color_icons = true, -- whether or not to add the filetype icon highlights
+ show_buffer_icons = lvim.use_icons, -- disable filetype icons for buffers
+ show_buffer_close_icons = lvim.use_icons,
+ show_close_icon = false,
+ show_tab_indicators = true,
+ persist_buffer_sort = true, -- whether or not custom sorted buffers should persist
+ -- can also be a table containing 2 custom separators
+ -- [focused and unfocused]. eg: { '|', '|' }
+ separator_style = "thin",
+ enforce_regular_tabs = false,
+ always_show_bufferline = false,
+ hover = {
+ enabled = false, -- requires nvim 0.8+
+ delay = 200,
+ reveal = { "close" },
+ },
+ sort_by = "id",
+ debug = { logging = false },
+ },
+ }
+end
+
+M.setup = function()
+ require("lvim.keymappings").load(lvim.builtin.bufferline.keymap)
+
+ local status_ok, bufferline = pcall(require, "bufferline")
+ if not status_ok then
+ return
+ end
+
+ -- can't be set in settings.lua because default tabline would flash before bufferline is loaded
+ vim.opt.showtabline = 2
+
+ bufferline.setup {
+ options = lvim.builtin.bufferline.options,
+ highlights = lvim.builtin.bufferline.highlights,
+ }
+
+ if lvim.builtin.bufferline.on_config_done then
+ lvim.builtin.bufferline.on_config_done()
+ end
+end
+
+--stylua: ignore
+
+-- Common kill function for bdelete and bwipeout
+-- credits: based on bbye and nvim-bufdel
+---@param kill_command? string defaults to "bd"
+---@param bufnr? number defaults to the current buffer
+---@param force? boolean defaults to false
+function M.buf_kill(kill_command, bufnr, force)
+ kill_command = kill_command or "bd"
+
+ local bo = vim.bo
+ local api = vim.api
+ local fmt = string.format
+ local fn = vim.fn
+
+ if bufnr == 0 or bufnr == nil then
+ bufnr = api.nvim_get_current_buf()
+ end
+
+ local bufname = api.nvim_buf_get_name(bufnr)
+
+ if not force then
+ local choice
+ if bo[bufnr].modified then
+ choice = fn.confirm(fmt([[Save changes to "%s"?]], bufname), "&Yes\n&No\n&Cancel")
+ if choice == 1 then
+ vim.api.nvim_buf_call(bufnr, function()
+ vim.cmd("w")
+ end)
+ elseif choice == 2 then
+ force = true
+ else return
+ end
+ elseif api.nvim_get_option_value("buftype", { buf = 0 }) == "terminal" then
+ choice = fn.confirm(fmt([[Close "%s"?]], bufname), "&Yes\n&No\n&Cancel")
+ if choice == 1 then
+ force = true
+ else
+ return
+ end
+ end
+ end
+
+ -- Get list of windows IDs with the buffer to close
+ local windows = vim.tbl_filter(function(win)
+ return api.nvim_win_get_buf(win) == bufnr
+ end, api.nvim_list_wins())
+
+ if force then
+ kill_command = kill_command .. "!"
+ end
+
+ -- Get list of active buffers
+ local buffers = vim.tbl_filter(function(buf)
+ return api.nvim_buf_is_valid(buf) and bo[buf].buflisted
+ end, api.nvim_list_bufs())
+
+ -- If there is only one buffer (which has to be the current one), vim will
+ -- create a new buffer on :bd.
+ -- For more than one buffer, pick the previous buffer (wrapping around if necessary)
+ if #buffers > 1 and #windows > 0 then
+ for i, v in ipairs(buffers) do
+ if v == bufnr then
+ local prev_buf_idx = i == 1 and #buffers or (i - 1)
+ local prev_buffer = buffers[prev_buf_idx]
+ for _, win in ipairs(windows) do
+ api.nvim_win_set_buf(win, prev_buffer)
+ end
+ end
+ end
+ end
+
+ -- Check if buffer still exists, to ensure the target buffer wasn't killed
+ -- due to options like bufhidden=wipe.
+ if api.nvim_buf_is_valid(bufnr) and bo[bufnr].buflisted then
+ vim.cmd(string.format("%s %d", kill_command, bufnr))
+ end
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/core/builtins/init.lua b/mac/.config/LunarVim/lua/lvim/core/builtins/init.lua
new file mode 100644
index 0000000..4764ff7
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/core/builtins/init.lua
@@ -0,0 +1,34 @@
+local M = {}
+
+local builtins = {
+ "lvim.core.theme",
+ "lvim.core.which-key",
+ "lvim.core.gitsigns",
+ "lvim.core.cmp",
+ "lvim.core.dap",
+ "lvim.core.terminal",
+ "lvim.core.telescope",
+ "lvim.core.treesitter",
+ "lvim.core.nvimtree",
+ "lvim.core.lir",
+ "lvim.core.illuminate",
+ "lvim.core.indentlines",
+ "lvim.core.breadcrumbs",
+ "lvim.core.project",
+ "lvim.core.bufferline",
+ "lvim.core.autopairs",
+ "lvim.core.comment",
+ "lvim.core.lualine",
+ "lvim.core.alpha",
+ "lvim.core.mason",
+}
+
+function M.config(config)
+ for _, builtin_path in ipairs(builtins) do
+ local builtin = reload(builtin_path)
+
+ builtin.config(config)
+ end
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/core/cmp.lua b/mac/.config/LunarVim/lua/lvim/core/cmp.lua
new file mode 100644
index 0000000..38da87a
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/core/cmp.lua
@@ -0,0 +1,390 @@
+local M = {}
+M.methods = {}
+
+local has_words_before = function()
+ local line, col = unpack(vim.api.nvim_win_get_cursor(0))
+ return col ~= 0 and vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:sub(col, col):match "%s" == nil
+end
+M.methods.has_words_before = has_words_before
+
+---@deprecated use M.methods.has_words_before instead
+M.methods.check_backspace = function()
+ return not has_words_before()
+end
+
+local T = function(str)
+ return vim.api.nvim_replace_termcodes(str, true, true, true)
+end
+
+local function feedkeys(key, mode)
+ vim.api.nvim_feedkeys(T(key), mode, true)
+end
+
+M.methods.feedkeys = feedkeys
+
+---when inside a snippet, seeks to the nearest luasnip field if possible, and checks if it is jumpable
+---@param dir number 1 for forward, -1 for backward; defaults to 1
+---@return boolean true if a jumpable luasnip field is found while inside a snippet
+local function jumpable(dir)
+ local luasnip_ok, luasnip = pcall(require, "luasnip")
+ if not luasnip_ok then
+ return false
+ end
+
+ local win_get_cursor = vim.api.nvim_win_get_cursor
+ local get_current_buf = vim.api.nvim_get_current_buf
+
+ ---sets the current buffer's luasnip to the one nearest the cursor
+ ---@return boolean true if a node is found, false otherwise
+ local function seek_luasnip_cursor_node()
+ -- TODO(kylo252): upstream this
+ -- for outdated versions of luasnip
+ if not luasnip.session.current_nodes then
+ return false
+ end
+
+ local node = luasnip.session.current_nodes[get_current_buf()]
+ if not node then
+ return false
+ end
+
+ local snippet = node.parent.snippet
+ local exit_node = snippet.insert_nodes[0]
+
+ local pos = win_get_cursor(0)
+ pos[1] = pos[1] - 1
+
+ -- exit early if we're past the exit node
+ if exit_node then
+ local exit_pos_end = exit_node.mark:pos_end()
+ if (pos[1] > exit_pos_end[1]) or (pos[1] == exit_pos_end[1] and pos[2] > exit_pos_end[2]) then
+ snippet:remove_from_jumplist()
+ luasnip.session.current_nodes[get_current_buf()] = nil
+
+ return false
+ end
+ end
+
+ node = snippet.inner_first:jump_into(1, true)
+ while node ~= nil and node.next ~= nil and node ~= snippet do
+ local n_next = node.next
+ local next_pos = n_next and n_next.mark:pos_begin()
+ local candidate = n_next ~= snippet and next_pos and (pos[1] < next_pos[1])
+ or (pos[1] == next_pos[1] and pos[2] < next_pos[2])
+
+ -- Past unmarked exit node, exit early
+ if n_next == nil or n_next == snippet.next then
+ snippet:remove_from_jumplist()
+ luasnip.session.current_nodes[get_current_buf()] = nil
+
+ return false
+ end
+
+ if candidate then
+ luasnip.session.current_nodes[get_current_buf()] = node
+ return true
+ end
+
+ local ok
+ ok, node = pcall(node.jump_from, node, 1, true) -- no_move until last stop
+ if not ok then
+ snippet:remove_from_jumplist()
+ luasnip.session.current_nodes[get_current_buf()] = nil
+
+ return false
+ end
+ end
+
+ -- No candidate, but have an exit node
+ if exit_node then
+ -- to jump to the exit node, seek to snippet
+ luasnip.session.current_nodes[get_current_buf()] = snippet
+ return true
+ end
+
+ -- No exit node, exit from snippet
+ snippet:remove_from_jumplist()
+ luasnip.session.current_nodes[get_current_buf()] = nil
+ return false
+ end
+
+ if dir == -1 then
+ return luasnip.in_snippet() and luasnip.jumpable(-1)
+ else
+ return luasnip.in_snippet() and seek_luasnip_cursor_node() and luasnip.jumpable(1)
+ end
+end
+
+M.methods.jumpable = jumpable
+
+M.config = function()
+ local status_cmp_ok, cmp_types = pcall(require, "cmp.types.cmp")
+ if not status_cmp_ok then
+ return
+ end
+ local ConfirmBehavior = cmp_types.ConfirmBehavior
+ local SelectBehavior = cmp_types.SelectBehavior
+
+ local cmp = require("lvim.utils.modules").require_on_index "cmp"
+ local luasnip = require("lvim.utils.modules").require_on_index "luasnip"
+ local cmp_window = require "cmp.config.window"
+ local cmp_mapping = require "cmp.config.mapping"
+
+ lvim.builtin.cmp = {
+ active = true,
+ on_config_done = nil,
+ enabled = function()
+ local buftype = vim.api.nvim_get_option_value("buftype", { buf = 0 })
+ if buftype == "prompt" then
+ return false
+ end
+ return lvim.builtin.cmp.active
+ end,
+ confirm_opts = {
+ behavior = ConfirmBehavior.Replace,
+ select = false,
+ },
+ completion = {
+ ---@usage The minimum length of a word to complete on.
+ keyword_length = 1,
+ },
+ experimental = {
+ ghost_text = false,
+ native_menu = false,
+ },
+ formatting = {
+ fields = { "kind", "abbr", "menu" },
+ max_width = 0,
+ kind_icons = lvim.icons.kind,
+ source_names = {
+ nvim_lsp = "(LSP)",
+ emoji = "(Emoji)",
+ path = "(Path)",
+ calc = "(Calc)",
+ cmp_tabnine = "(Tabnine)",
+ vsnip = "(Snippet)",
+ luasnip = "(Snippet)",
+ buffer = "(Buffer)",
+ tmux = "(TMUX)",
+ copilot = "(Copilot)",
+ codeium = "(Codeium)",
+ treesitter = "(TreeSitter)",
+ },
+ duplicates = {
+ buffer = 1,
+ path = 1,
+ nvim_lsp = 0,
+ luasnip = 1,
+ },
+ duplicates_default = 0,
+ format = function(entry, vim_item)
+ local max_width = lvim.builtin.cmp.formatting.max_width
+ if max_width ~= 0 and #vim_item.abbr > max_width then
+ vim_item.abbr = string.sub(vim_item.abbr, 1, max_width - 1) .. lvim.icons.ui.Ellipsis
+ end
+ if lvim.use_icons then
+ vim_item.kind = lvim.builtin.cmp.formatting.kind_icons[vim_item.kind]
+
+ if entry.source.name == "copilot" then
+ vim_item.kind = lvim.icons.git.Octoface
+ vim_item.kind_hl_group = "CmpItemKindCopilot"
+ end
+
+ if entry.source.name == "codeium" then
+ vim_item.kind = lvim.icons.misc.Watch
+ vim_item.kind_hl_group = "CmpItemKindCopilot"
+ end
+
+ if entry.source.name == "cmp_tabnine" then
+ vim_item.kind = lvim.icons.misc.Robot
+ vim_item.kind_hl_group = "CmpItemKindTabnine"
+ end
+
+ if entry.source.name == "crates" then
+ vim_item.kind = lvim.icons.misc.Package
+ vim_item.kind_hl_group = "CmpItemKindCrate"
+ end
+
+ if entry.source.name == "lab.quick_data" then
+ vim_item.kind = lvim.icons.misc.CircuitBoard
+ vim_item.kind_hl_group = "CmpItemKindConstant"
+ end
+
+ if entry.source.name == "emoji" then
+ vim_item.kind = lvim.icons.misc.Smiley
+ vim_item.kind_hl_group = "CmpItemKindEmoji"
+ end
+ end
+ vim_item.menu = lvim.builtin.cmp.formatting.source_names[entry.source.name]
+ vim_item.dup = lvim.builtin.cmp.formatting.duplicates[entry.source.name]
+ or lvim.builtin.cmp.formatting.duplicates_default
+ return vim_item
+ end,
+ },
+ snippet = {
+ expand = function(args)
+ luasnip.lsp_expand(args.body)
+ end,
+ },
+ window = {
+ completion = cmp_window.bordered(),
+ documentation = cmp_window.bordered(),
+ },
+ sources = {
+ {
+ name = "copilot",
+ -- keyword_length = 0,
+ max_item_count = 3,
+ trigger_characters = {
+ {
+ ".",
+ ":",
+ "(",
+ "'",
+ '"',
+ "[",
+ ",",
+ "#",
+ "*",
+ "@",
+ "|",
+ "=",
+ "-",
+ "{",
+ "/",
+ "\\",
+ "+",
+ "?",
+ " ",
+ -- "\t",
+ -- "\n",
+ },
+ },
+ },
+ {
+ name = "nvim_lsp",
+ entry_filter = function(entry, ctx)
+ local kind = require("cmp.types.lsp").CompletionItemKind[entry:get_kind()]
+ if kind == "Snippet" and ctx.prev_context.filetype == "java" then
+ return false
+ end
+ return true
+ end,
+ },
+
+ { name = "codeium" }, -- for codeium completion
+ { name = "path" },
+ { name = "luasnip" },
+ { name = "cmp_tabnine" },
+ { name = "nvim_lua" },
+ { name = "buffer" },
+ { name = "calc" },
+ { name = "emoji" },
+ { name = "treesitter" },
+ { name = "crates" },
+ { name = "tmux" },
+ },
+ mapping = cmp_mapping.preset.insert {
+ ["<C-k>"] = cmp_mapping(cmp_mapping.select_prev_item(), { "i", "c" }),
+ ["<C-j>"] = cmp_mapping(cmp_mapping.select_next_item(), { "i", "c" }),
+ ["<Down>"] = cmp_mapping(cmp_mapping.select_next_item { behavior = SelectBehavior.Select }, { "i" }),
+ ["<Up>"] = cmp_mapping(cmp_mapping.select_prev_item { behavior = SelectBehavior.Select }, { "i" }),
+ ["<C-d>"] = cmp_mapping.scroll_docs(-4),
+ ["<C-f>"] = cmp_mapping.scroll_docs(4),
+ ["<C-y>"] = cmp_mapping {
+ i = cmp_mapping.confirm { behavior = ConfirmBehavior.Replace, select = false },
+ c = function(fallback)
+ if cmp.visible() then
+ cmp.confirm { behavior = ConfirmBehavior.Replace, select = false }
+ else
+ fallback()
+ end
+ end,
+ },
+ ["<Tab>"] = cmp_mapping(function(fallback)
+ if cmp.visible() then
+ cmp.select_next_item()
+ elseif luasnip.expand_or_locally_jumpable() then
+ luasnip.expand_or_jump()
+ elseif jumpable(1) then
+ luasnip.jump(1)
+ elseif has_words_before() then
+ -- cmp.complete()
+ fallback()
+ else
+ fallback()
+ end
+ end, { "i", "s" }),
+ ["<S-Tab>"] = cmp_mapping(function(fallback)
+ if cmp.visible() then
+ cmp.select_prev_item()
+ elseif luasnip.jumpable(-1) then
+ luasnip.jump(-1)
+ else
+ fallback()
+ end
+ end, { "i", "s" }),
+ ["<C-Space>"] = cmp_mapping.complete(),
+ ["<C-e>"] = cmp_mapping.abort(),
+ ["<CR>"] = cmp_mapping(function(fallback)
+ if cmp.visible() then
+ local confirm_opts = vim.deepcopy(lvim.builtin.cmp.confirm_opts) -- avoid mutating the original opts below
+ local is_insert_mode = function()
+ return vim.api.nvim_get_mode().mode:sub(1, 1) == "i"
+ end
+ if is_insert_mode() then -- prevent overwriting brackets
+ confirm_opts.behavior = ConfirmBehavior.Insert
+ end
+ local entry = cmp.get_selected_entry()
+ local is_copilot = entry and entry.source.name == "copilot"
+ if is_copilot then
+ confirm_opts.behavior = ConfirmBehavior.Replace
+ confirm_opts.select = true
+ end
+ if cmp.confirm(confirm_opts) then
+ return -- success, exit early
+ end
+ end
+ fallback() -- if not exited early, always fallback
+ end),
+ },
+ cmdline = {
+ enable = false,
+ options = {
+ {
+ type = ":",
+ sources = {
+ { name = "path" },
+ { name = "cmdline" },
+ },
+ },
+ {
+ type = { "/", "?" },
+ sources = {
+ { name = "buffer" },
+ },
+ },
+ },
+ },
+ }
+end
+
+function M.setup()
+ local cmp = require "cmp"
+ cmp.setup(lvim.builtin.cmp)
+
+ if lvim.builtin.cmp.cmdline.enable then
+ for _, option in ipairs(lvim.builtin.cmp.cmdline.options) do
+ cmp.setup.cmdline(option.type, {
+ mapping = cmp.mapping.preset.cmdline(),
+ sources = option.sources,
+ })
+ end
+ end
+
+ if lvim.builtin.cmp.on_config_done then
+ lvim.builtin.cmp.on_config_done(cmp)
+ end
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/core/commands.lua b/mac/.config/LunarVim/lua/lvim/core/commands.lua
new file mode 100644
index 0000000..9f5d004
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/core/commands.lua
@@ -0,0 +1,99 @@
+local M = {}
+
+vim.cmd [[
+ function! QuickFixToggle()
+ if empty(filter(getwininfo(), 'v:val.quickfix'))
+ copen
+ else
+ cclose
+ endif
+ endfunction
+]]
+
+M.defaults = {
+ {
+ name = "BufferKill",
+ fn = function()
+ require("lvim.core.bufferline").buf_kill "bd"
+ end,
+ },
+ {
+ name = "LvimToggleFormatOnSave",
+ fn = function()
+ require("lvim.core.autocmds").toggle_format_on_save()
+ end,
+ },
+ {
+ name = "LvimInfo",
+ fn = function()
+ require("lvim.core.info").toggle_popup(vim.bo.filetype)
+ end,
+ },
+ {
+ name = "LvimDocs",
+ fn = function()
+ local documentation_url = "https://www.lunarvim.org/docs/beginners-guide"
+ if vim.fn.has "mac" == 1 or vim.fn.has "macunix" == 1 then
+ vim.fn.execute("!open " .. documentation_url)
+ elseif vim.fn.has "win32" == 1 or vim.fn.has "win64" == 1 then
+ vim.fn.execute("!start " .. documentation_url)
+ elseif vim.fn.has "unix" == 1 then
+ vim.fn.execute("!xdg-open " .. documentation_url)
+ else
+ vim.notify "Opening docs in a browser is not supported on your OS"
+ end
+ end,
+ },
+ {
+ name = "LvimCacheReset",
+ fn = function()
+ require("lvim.utils.hooks").reset_cache()
+ end,
+ },
+ {
+ name = "LvimReload",
+ fn = function()
+ require("lvim.config"):reload()
+ end,
+ },
+ {
+ name = "LvimUpdate",
+ fn = function()
+ require("lvim.bootstrap"):update()
+ end,
+ },
+ {
+ name = "LvimSyncCorePlugins",
+ fn = function()
+ require("lvim.plugin-loader").sync_core_plugins()
+ end,
+ },
+ {
+ name = "LvimChangelog",
+ fn = function()
+ require("lvim.core.telescope.custom-finders").view_lunarvim_changelog()
+ end,
+ },
+ {
+ name = "LvimVersion",
+ fn = function()
+ print(require("lvim.utils.git").get_lvim_version())
+ end,
+ },
+ {
+ name = "LvimOpenlog",
+ fn = function()
+ vim.fn.execute("edit " .. require("lvim.core.log").get_path())
+ end,
+ },
+}
+
+function M.load(collection)
+ local common_opts = { force = true }
+ for _, cmd in pairs(collection) do
+ local opts = vim.tbl_deep_extend("force", common_opts, cmd.opts or {})
+ vim.api.nvim_create_user_command(cmd.name, cmd.fn, opts)
+ end
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/core/comment.lua b/mac/.config/LunarVim/lua/lvim/core/comment.lua
new file mode 100644
index 0000000..f07929c
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/core/comment.lua
@@ -0,0 +1,86 @@
+local M = {}
+
+function M.config()
+ lvim.builtin.comment = {
+ active = true,
+ on_config_done = nil,
+ ---Add a space b/w comment and the line
+ ---@type boolean
+ padding = true,
+
+ ---Whether cursor should stay at the
+ ---same position. Only works in NORMAL
+ ---mode mappings
+ sticky = true,
+
+ ---Lines to be ignored while comment/uncomment.
+ ---Could be a regex string or a function that returns a regex string.
+ ---Example: Use '^$' to ignore empty lines
+ ---@type string|function
+ ignore = "^$",
+
+ ---Whether to create basic (operator-pending) and extra mappings for NORMAL/VISUAL mode
+ ---@type table
+ mappings = {
+ ---operator-pending mapping
+ ---Includes `gcc`, `gcb`, `gc[count]{motion}` and `gb[count]{motion}`
+ basic = true,
+ ---Extra mapping
+ ---Includes `gco`, `gcO`, `gcA`
+ extra = true,
+ },
+
+ ---LHS of line and block comment toggle mapping in NORMAL/VISUAL mode
+ ---@type table
+ toggler = {
+ ---line-comment toggle
+ line = "gcc",
+ ---block-comment toggle
+ block = "gbc",
+ },
+
+ ---LHS of line and block comment operator-mode mapping in NORMAL/VISUAL mode
+ ---@type table
+ opleader = {
+ ---line-comment opfunc mapping
+ line = "gc",
+ ---block-comment opfunc mapping
+ block = "gb",
+ },
+
+ ---LHS of extra mappings
+ ---@type table
+ extra = {
+ ---Add comment on the line above
+ above = "gcO",
+ ---Add comment on the line below
+ below = "gco",
+ ---Add comment at the end of line
+ eol = "gcA",
+ },
+
+ ---Pre-hook, called before commenting the line
+ ---@type function|nil
+ pre_hook = function(...)
+ local loaded, ts_comment = pcall(require, "ts_context_commentstring.integrations.comment_nvim")
+ if loaded and ts_comment then
+ return ts_comment.create_pre_hook()(...)
+ end
+ end,
+
+ ---Post-hook, called after commenting is done
+ ---@type function|nil
+ post_hook = nil,
+ }
+end
+
+function M.setup()
+ local nvim_comment = require "Comment"
+
+ nvim_comment.setup(lvim.builtin.comment)
+ if lvim.builtin.comment.on_config_done then
+ lvim.builtin.comment.on_config_done(nvim_comment)
+ end
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/core/dap.lua b/mac/.config/LunarVim/lua/lvim/core/dap.lua
new file mode 100644
index 0000000..1c563e3
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/core/dap.lua
@@ -0,0 +1,177 @@
+local M = {}
+
+M.config = function()
+ lvim.builtin.dap = {
+ active = true,
+ on_config_done = nil,
+ breakpoint = {
+ text = lvim.icons.ui.Bug,
+ texthl = "DiagnosticSignError",
+ linehl = "",
+ numhl = "",
+ },
+ breakpoint_rejected = {
+ text = lvim.icons.ui.Bug,
+ texthl = "DiagnosticSignError",
+ linehl = "",
+ numhl = "",
+ },
+ stopped = {
+ text = lvim.icons.ui.BoldArrowRight,
+ texthl = "DiagnosticSignWarn",
+ linehl = "Visual",
+ numhl = "DiagnosticSignWarn",
+ },
+ log = {
+ level = "info",
+ },
+ ui = {
+ auto_open = true,
+ notify = {
+ threshold = vim.log.levels.INFO,
+ },
+ config = {
+ icons = { expanded = "", collapsed = "", circular = "" },
+ mappings = {
+ -- Use a table to apply multiple mappings
+ expand = { "<CR>", "<2-LeftMouse>" },
+ open = "o",
+ remove = "d",
+ edit = "e",
+ repl = "r",
+ toggle = "t",
+ },
+ -- Use this to override mappings for specific elements
+ element_mappings = {},
+ expand_lines = true,
+ layouts = {
+ {
+ elements = {
+ { id = "scopes", size = 0.33 },
+ { id = "breakpoints", size = 0.17 },
+ { id = "stacks", size = 0.25 },
+ { id = "watches", size = 0.25 },
+ },
+ size = 0.33,
+ position = "right",
+ },
+ {
+ elements = {
+ { id = "repl", size = 0.45 },
+ { id = "console", size = 0.55 },
+ },
+ size = 0.27,
+ position = "bottom",
+ },
+ },
+ controls = {
+ enabled = true,
+ -- Display controls in this element
+ element = "repl",
+ icons = {
+ pause = "",
+ play = "",
+ step_into = "",
+ step_over = "",
+ step_out = "",
+ step_back = "",
+ run_last = "",
+ terminate = "",
+ },
+ },
+ floating = {
+ max_height = 0.9,
+ max_width = 0.5, -- Floats will be treated as percentage of your screen.
+ border = "rounded",
+ mappings = {
+ close = { "q", "<Esc>" },
+ },
+ },
+ windows = { indent = 1 },
+ render = {
+ max_type_length = nil, -- Can be integer or nil.
+ max_value_lines = 100, -- Can be integer or nil.
+ },
+ },
+ },
+ }
+end
+
+M.setup = function()
+ local status_ok, dap = pcall(require, "dap")
+ if not status_ok then
+ return
+ end
+
+ if lvim.use_icons then
+ vim.fn.sign_define("DapBreakpoint", lvim.builtin.dap.breakpoint)
+ vim.fn.sign_define("DapBreakpointRejected", lvim.builtin.dap.breakpoint_rejected)
+ vim.fn.sign_define("DapStopped", lvim.builtin.dap.stopped)
+ end
+
+ dap.set_log_level(lvim.builtin.dap.log.level)
+
+ if lvim.builtin.dap.on_config_done then
+ lvim.builtin.dap.on_config_done(dap)
+ end
+end
+
+M.setup_ui = function()
+ local status_ok, dap = pcall(require, "dap")
+ if not status_ok then
+ return
+ end
+ local dapui = require "dapui"
+ dapui.setup(lvim.builtin.dap.ui.config)
+
+ if lvim.builtin.dap.ui.auto_open then
+ dap.listeners.after.event_initialized["dapui_config"] = function()
+ dapui.open()
+ end
+ -- dap.listeners.before.event_terminated["dapui_config"] = function()
+ -- dapui.close()
+ -- end
+ -- dap.listeners.before.event_exited["dapui_config"] = function()
+ -- dapui.close()
+ -- end
+ end
+
+ local Log = require "lvim.core.log"
+
+ -- until rcarriga/nvim-dap-ui#164 is fixed
+ local function notify_handler(msg, level, opts)
+ if level >= lvim.builtin.dap.ui.notify.threshold then
+ return vim.notify(msg, level, opts)
+ end
+
+ opts = vim.tbl_extend("keep", opts or {}, {
+ title = "dap-ui",
+ icon = "",
+ on_open = function(win)
+ vim.api.nvim_set_option_value("filetype", "markdown", { buf = vim.api.nvim_win_get_buf(win) })
+ end,
+ })
+
+ -- vim_log_level can be omitted
+ if level == nil then
+ level = Log.levels["INFO"]
+ elseif type(level) == "string" then
+ level = Log.levels[(level):upper()] or Log.levels["INFO"]
+ else
+ -- https://github.com/neovim/neovim/blob/685cf398130c61c158401b992a1893c2405cd7d2/runtime/lua/vim/lsp/log.lua#L5
+ level = level + 1
+ end
+
+ msg = string.format("%s: %s", opts.title, msg)
+ Log:add_entry(level, msg)
+ end
+
+ local dapui_ok, _ = xpcall(function()
+ require("dapui.util").notify = notify_handler
+ end, debug.traceback)
+ if not dapui_ok then
+ Log:debug "Unable to override dap-ui logging level"
+ end
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/core/gitsigns.lua b/mac/.config/LunarVim/lua/lvim/core/gitsigns.lua
new file mode 100644
index 0000000..1c8619c
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/core/gitsigns.lua
@@ -0,0 +1,83 @@
+local M = {}
+
+M.config = function()
+ lvim.builtin.gitsigns = {
+ active = true,
+ on_config_done = nil,
+ opts = {
+ signs = {
+ add = {
+ hl = "GitSignsAdd",
+ text = lvim.icons.ui.BoldLineLeft,
+ numhl = "GitSignsAddNr",
+ linehl = "GitSignsAddLn",
+ },
+ change = {
+ hl = "GitSignsChange",
+ text = lvim.icons.ui.BoldLineLeft,
+ numhl = "GitSignsChangeNr",
+ linehl = "GitSignsChangeLn",
+ },
+ delete = {
+ hl = "GitSignsDelete",
+ text = lvim.icons.ui.Triangle,
+ numhl = "GitSignsDeleteNr",
+ linehl = "GitSignsDeleteLn",
+ },
+ topdelete = {
+ hl = "GitSignsDelete",
+ text = lvim.icons.ui.Triangle,
+ numhl = "GitSignsDeleteNr",
+ linehl = "GitSignsDeleteLn",
+ },
+ changedelete = {
+ hl = "GitSignsChange",
+ text = lvim.icons.ui.BoldLineLeft,
+ numhl = "GitSignsChangeNr",
+ linehl = "GitSignsChangeLn",
+ },
+ },
+ signcolumn = true,
+ numhl = false,
+ linehl = false,
+ word_diff = false,
+ watch_gitdir = {
+ interval = 1000,
+ follow_files = true,
+ },
+ attach_to_untracked = true,
+ current_line_blame = false, -- Toggle with `:Gitsigns toggle_current_line_blame`
+ current_line_blame_opts = {
+ virt_text = true,
+ virt_text_pos = "eol", -- 'eol' | 'overlay' | 'right_align'
+ delay = 1000,
+ ignore_whitespace = false,
+ },
+ current_line_blame_formatter = "<author>, <author_time:%Y-%m-%d> - <summary>",
+ sign_priority = 6,
+ status_formatter = nil, -- Use default
+ update_debounce = 200,
+ max_file_length = 40000,
+ preview_config = {
+ -- Options passed to nvim_open_win
+ border = "rounded",
+ style = "minimal",
+ relative = "cursor",
+ row = 0,
+ col = 1,
+ },
+ yadm = { enable = false },
+ },
+ }
+end
+
+M.setup = function()
+ local gitsigns = reload "gitsigns"
+
+ gitsigns.setup(lvim.builtin.gitsigns.opts)
+ if lvim.builtin.gitsigns.on_config_done then
+ lvim.builtin.gitsigns.on_config_done(gitsigns)
+ end
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/core/illuminate.lua b/mac/.config/LunarVim/lua/lvim/core/illuminate.lua
new file mode 100644
index 0000000..7264710
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/core/illuminate.lua
@@ -0,0 +1,72 @@
+local M = {}
+
+M.config = function()
+ lvim.builtin.illuminate = {
+ active = true,
+ on_config_done = nil,
+ options = {
+ -- providers: provider used to get references in the buffer, ordered by priority
+ providers = {
+ "lsp",
+ "treesitter",
+ "regex",
+ },
+ -- delay: delay in milliseconds
+ delay = 120,
+ -- filetype_overrides: filetype specific overrides.
+ -- The keys are strings to represent the filetype while the values are tables that
+ -- supports the same keys passed to .configure except for filetypes_denylist and filetypes_allowlist
+ filetype_overrides = {},
+ -- filetypes_denylist: filetypes to not illuminate, this overrides filetypes_allowlist
+ filetypes_denylist = {
+ "dirvish",
+ "fugitive",
+ "alpha",
+ "NvimTree",
+ "lazy",
+ "neogitstatus",
+ "Trouble",
+ "lir",
+ "Outline",
+ "spectre_panel",
+ "toggleterm",
+ "DressingSelect",
+ "TelescopePrompt",
+ },
+ -- filetypes_allowlist: filetypes to illuminate, this is overridden by filetypes_denylist
+ filetypes_allowlist = {},
+ -- modes_denylist: modes to not illuminate, this overrides modes_allowlist
+ modes_denylist = {},
+ -- modes_allowlist: modes to illuminate, this is overridden by modes_denylist
+ modes_allowlist = {},
+ -- providers_regex_syntax_denylist: syntax to not illuminate, this overrides providers_regex_syntax_allowlist
+ -- Only applies to the 'regex' provider
+ -- Use :echom synIDattr(synIDtrans(synID(line('.'), col('.'), 1)), 'name')
+ providers_regex_syntax_denylist = {},
+ -- providers_regex_syntax_allowlist: syntax to illuminate, this is overridden by providers_regex_syntax_denylist
+ -- Only applies to the 'regex' provider
+ -- Use :echom synIDattr(synIDtrans(synID(line('.'), col('.'), 1)), 'name')
+ providers_regex_syntax_allowlist = {},
+ -- under_cursor: whether or not to illuminate under the cursor
+ under_cursor = true,
+ },
+ }
+end
+
+M.setup = function()
+ local status_ok, illuminate = pcall(require, "illuminate")
+ if not status_ok then
+ return
+ end
+
+ local config_ok, _ = pcall(illuminate.configure, lvim.builtin.illuminate.options)
+ if not config_ok then
+ return
+ end
+
+ if lvim.builtin.illuminate.on_config_done then
+ lvim.builtin.illuminate.on_config_done()
+ end
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/core/indentlines.lua b/mac/.config/LunarVim/lua/lvim/core/indentlines.lua
new file mode 100644
index 0000000..ad82753
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/core/indentlines.lua
@@ -0,0 +1,43 @@
+local M = {}
+
+M.config = function()
+ lvim.builtin.indentlines = {
+ active = true,
+ on_config_done = nil,
+ options = {
+ enabled = true,
+ buftype_exclude = { "terminal", "nofile" },
+ filetype_exclude = {
+ "help",
+ "startify",
+ "dashboard",
+ "lazy",
+ "neogitstatus",
+ "NvimTree",
+ "Trouble",
+ "text",
+ },
+ char = lvim.icons.ui.LineLeft,
+ context_char = lvim.icons.ui.LineLeft,
+ show_trailing_blankline_indent = false,
+ show_first_indent_level = true,
+ use_treesitter = true,
+ show_current_context = true,
+ },
+ }
+end
+
+M.setup = function()
+ local status_ok, indent_blankline = pcall(require, "indent_blankline")
+ if not status_ok then
+ return
+ end
+
+ indent_blankline.setup(lvim.builtin.indentlines.options)
+
+ if lvim.builtin.indentlines.on_config_done then
+ lvim.builtin.indentlines.on_config_done()
+ end
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/core/info.lua b/mac/.config/LunarVim/lua/lvim/core/info.lua
new file mode 100644
index 0000000..c12edc3
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/core/info.lua
@@ -0,0 +1,222 @@
+local M = {
+ banner = {
+ "",
+ [[ __ _ ___ ]],
+ [[ / / __ ______ ____ _____| | / (_)___ ___ ]],
+ [[ / / / / / / __ \/ __ `/ ___/ | / / / __ `__ \]],
+ [[ / /___/ /_/ / / / / /_/ / / | |/ / / / / / / /]],
+ [[/_____/\__,_/_/ /_/\__,_/_/ |___/_/_/ /_/ /_/ ]],
+ },
+}
+
+local fmt = string.format
+local text = require "lvim.interface.text"
+local lsp_utils = require "lvim.lsp.utils"
+
+local function str_list(list)
+ return #list == 1 and list[1] or fmt("[%s]", table.concat(list, ", "))
+end
+
+local function make_formatters_info(ft)
+ local null_formatters = require "lvim.lsp.null-ls.formatters"
+ local registered_formatters = null_formatters.list_registered(ft)
+ local supported_formatters = null_formatters.list_supported(ft)
+ local section = {
+ "Formatters info",
+ fmt(
+ "* Active: %s%s",
+ table.concat(registered_formatters, " " .. lvim.icons.ui.BoxChecked .. " , "),
+ vim.tbl_count(registered_formatters) > 0 and " " .. lvim.icons.ui.BoxChecked .. " " or ""
+ ),
+ fmt("* Supported: %s", str_list(supported_formatters)),
+ }
+
+ return section
+end
+
+local function make_code_actions_info(ft)
+ local null_actions = require "lvim.lsp.null-ls.code_actions"
+ local registered_actions = null_actions.list_registered(ft)
+ local section = {
+ "Code actions info",
+ fmt(
+ "* Active: %s%s",
+ table.concat(registered_actions, " " .. lvim.icons.ui.BoxChecked .. " , "),
+ vim.tbl_count(registered_actions) > 0 and " " .. lvim.icons.ui.BoxChecked .. " " or ""
+ ),
+ }
+
+ return section
+end
+
+local function make_linters_info(ft)
+ local null_linters = require "lvim.lsp.null-ls.linters"
+ local supported_linters = null_linters.list_supported(ft)
+ local registered_linters = null_linters.list_registered(ft)
+ local section = {
+ "Linters info",
+ fmt(
+ "* Active: %s%s",
+ table.concat(registered_linters, " " .. lvim.icons.ui.BoxChecked .. " , "),
+ vim.tbl_count(registered_linters) > 0 and " " .. lvim.icons.ui.BoxChecked .. " " or ""
+ ),
+ fmt("* Supported: %s", str_list(supported_linters)),
+ }
+
+ return section
+end
+
+local function tbl_set_highlight(terms, highlight_group)
+ for _, v in pairs(terms) do
+ vim.cmd('let m=matchadd("' .. highlight_group .. '", "' .. v .. "[ ,│']\")")
+ vim.cmd('let m=matchadd("' .. highlight_group .. '", ", ' .. v .. '")')
+ end
+end
+
+local function make_client_info(client)
+ if client.name == "null-ls" then
+ return
+ end
+ local client_enabled_caps = lsp_utils.get_client_capabilities(client.id)
+ local name = client.name
+ local id = client.id
+ local filetypes = lsp_utils.get_supported_filetypes(name)
+ local attached_buffers_list = str_list(vim.lsp.get_buffers_by_client_id(client.id))
+ local client_info = {
+ fmt("* name: %s", name),
+ fmt("* id: %s", tostring(id)),
+ fmt("* supported filetype(s): %s", str_list(filetypes)),
+ fmt("* attached buffers: %s", tostring(attached_buffers_list)),
+ fmt("* root_dir pattern: %s", tostring(attached_buffers_list)),
+ }
+ if not vim.tbl_isempty(client_enabled_caps) then
+ local caps_text = "* capabilities: "
+ local caps_text_len = caps_text:len()
+ local enabled_caps = text.format_table(client_enabled_caps, 3, " | ")
+ enabled_caps = text.shift_right(enabled_caps, caps_text_len)
+ enabled_caps[1] = fmt("%s%s", caps_text, enabled_caps[1]:sub(caps_text_len + 1))
+ vim.list_extend(client_info, enabled_caps)
+ end
+
+ return client_info
+end
+
+local function make_auto_lsp_info(ft)
+ local skipped_filetypes = lvim.lsp.automatic_configuration.skipped_filetypes
+ local skipped_servers = lvim.lsp.automatic_configuration.skipped_servers
+ local info_lines = { "Automatic LSP info" }
+
+ if vim.tbl_contains(skipped_filetypes, ft) then
+ vim.list_extend(info_lines, { "* Status: disabled for " .. ft })
+ return info_lines
+ end
+
+ local supported = lsp_utils.get_supported_servers(ft)
+ local skipped = vim.tbl_filter(function(name)
+ return vim.tbl_contains(supported, name)
+ end, skipped_servers)
+
+ if #skipped == 0 then
+ return { "" }
+ end
+
+ vim.list_extend(info_lines, { fmt("* Skipped servers: %s", str_list(skipped)) })
+
+ return info_lines
+end
+
+function M.toggle_popup(ft)
+ local clients = vim.lsp.get_clients()
+ local client_names = {}
+ local bufnr = vim.api.nvim_get_current_buf()
+ local ts_active_buffers = vim.tbl_keys(vim.treesitter.highlighter.active)
+ local is_treesitter_active = function()
+ local status = "inactive"
+ if vim.tbl_contains(ts_active_buffers, bufnr) then
+ status = "active"
+ end
+ return status
+ end
+ local header = {
+ "Buffer info",
+ fmt("* filetype: %s", ft),
+ fmt("* bufnr: %s", bufnr),
+ fmt("* treesitter status: %s", is_treesitter_active()),
+ }
+
+ local lsp_info = {
+ "Active client(s)",
+ }
+
+ for _, client in pairs(clients) do
+ local client_info = make_client_info(client)
+ if client_info then
+ vim.list_extend(lsp_info, client_info)
+ end
+ table.insert(client_names, client.name)
+ end
+
+ local auto_lsp_info = make_auto_lsp_info(ft)
+
+ local formatters_info = make_formatters_info(ft)
+
+ local linters_info = make_linters_info(ft)
+
+ local code_actions_info = make_code_actions_info(ft)
+
+ local content_provider = function(popup)
+ local content = {}
+
+ for _, section in ipairs {
+ M.banner,
+ { "" },
+ { "" },
+ header,
+ { "" },
+ lsp_info,
+ { "" },
+ auto_lsp_info,
+ { "" },
+ formatters_info,
+ { "" },
+ linters_info,
+ { "" },
+ code_actions_info,
+ } do
+ vim.list_extend(content, section)
+ end
+
+ return text.align_left(popup, content, 0.5)
+ end
+
+ local function set_syntax_hl()
+ vim.cmd [[highlight LvimInfoIdentifier gui=bold]]
+ vim.cmd [[highlight link LvimInfoHeader Type]]
+ vim.fn.matchadd("LvimInfoHeader", "Buffer info")
+ vim.fn.matchadd("LvimInfoHeader", "Active client(s)")
+ vim.fn.matchadd("LvimInfoHeader", fmt("Overridden %s server(s)", ft))
+ vim.fn.matchadd("LvimInfoHeader", "Formatters info")
+ vim.fn.matchadd("LvimInfoHeader", "Linters info")
+ vim.fn.matchadd("LvimInfoHeader", "Code actions info")
+ vim.fn.matchadd("LvimInfoHeader", "Automatic LSP info")
+ vim.fn.matchadd("LvimInfoIdentifier", " " .. ft .. "$")
+ vim.fn.matchadd("string", "true")
+ vim.fn.matchadd("string", "active")
+ vim.fn.matchadd("string", lvim.icons.ui.BoxChecked)
+ vim.fn.matchadd("boolean", "inactive")
+ vim.fn.matchadd("error", "false")
+ tbl_set_highlight(require("lvim.lsp.null-ls.formatters").list_registered(ft), "LvimInfoIdentifier")
+ tbl_set_highlight(require("lvim.lsp.null-ls.linters").list_registered(ft), "LvimInfoIdentifier")
+ tbl_set_highlight(require("lvim.lsp.null-ls.code_actions").list_registered(ft), "LvimInfoIdentifier")
+ end
+
+ local Popup = require("lvim.interface.popup"):new {
+ win_opts = { number = false },
+ buf_opts = { modifiable = false, filetype = "lspinfo" },
+ }
+ Popup:display(content_provider)
+ set_syntax_hl()
+
+ return Popup
+end
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/core/lir.lua b/mac/.config/LunarVim/lua/lvim/core/lir.lua
new file mode 100644
index 0000000..a8ed42c
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/core/lir.lua
@@ -0,0 +1,120 @@
+local M = {}
+
+M.config = function()
+ local utils = require "lvim.utils.modules"
+ local actions = utils.require_on_exported_call "lir.actions"
+ local clipboard_actions = utils.require_on_exported_call "lir.clipboard.actions"
+
+ lvim.builtin.lir = {
+ active = true,
+ on_config_done = nil,
+ icon = "",
+ show_hidden_files = false,
+ ignore = {}, -- { ".DS_Store" "node_modules" } etc.
+ devicons = {
+ enable = true,
+ highlight_dirname = true,
+ },
+ mappings = {
+ ["l"] = actions.edit,
+ ["<CR>"] = actions.edit,
+ ["<C-s>"] = actions.split,
+ ["v"] = actions.vsplit,
+ ["<C-t>"] = actions.tabedit,
+
+ ["h"] = actions.up,
+ ["q"] = actions.quit,
+
+ ["A"] = actions.mkdir,
+ ["a"] = actions.newfile,
+ ["r"] = actions.rename,
+ ["@"] = actions.cd,
+ ["Y"] = actions.yank_path,
+ ["i"] = actions.toggle_show_hidden,
+ ["d"] = actions.delete,
+
+ ["J"] = function()
+ require("lir.mark.actions").toggle_mark()
+ vim.cmd "normal! j"
+ end,
+ ["c"] = clipboard_actions.copy,
+ ["x"] = clipboard_actions.cut,
+ ["p"] = clipboard_actions.paste,
+ },
+ float = {
+ winblend = 0,
+ curdir_window = {
+ enable = false,
+ highlight_dirname = true,
+ },
+
+ -- You can define a function that returns a table to be passed as the third
+ -- argument of nvim_open_win().
+ win_opts = function()
+ local width = math.floor(vim.o.columns * 0.7)
+ local height = math.floor(vim.o.lines * 0.7)
+ return {
+ border = "rounded",
+ width = width,
+ height = height,
+ }
+ end,
+ },
+ hide_cursor = false,
+ on_init = function()
+ -- use visual mode
+ vim.api.nvim_buf_set_keymap(
+ 0,
+ "x",
+ "J",
+ ':<C-u>lua require"lir.mark.actions".toggle_mark("v")<CR>',
+ { noremap = true, silent = true }
+ )
+ end,
+ }
+end
+
+function M.icon_setup()
+ local devicons_ok, devicons = pcall(require, "nvim-web-devicons")
+ if not devicons_ok then
+ return
+ end
+
+ local function get_hl_by_name(name)
+ local ret = vim.api.nvim_get_hl(0, { name = name.group })
+ return string.format("#%06x", ret[name.property])
+ end
+
+ local found, icon_color = pcall(get_hl_by_name, { group = "NvimTreeFolderIcon", property = "fg" })
+ if not found then
+ icon_color = "#42A5F5"
+ end
+
+ devicons.set_icon {
+ lir_folder_icon = {
+ icon = lvim.builtin.lir.icon,
+ color = icon_color,
+ name = "LirFolderNode",
+ },
+ }
+end
+
+function M.setup()
+ local status_ok, lir = pcall(require, "lir")
+ if not status_ok then
+ return
+ end
+
+ if not lvim.use_icons then
+ lvim.builtin.lir.devicons.enable = false
+ end
+
+ lir.setup(lvim.builtin.lir)
+ M.icon_setup()
+
+ if lvim.builtin.lir.on_config_done then
+ lvim.builtin.lir.on_config_done(lir)
+ end
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/core/log.lua b/mac/.config/LunarVim/lua/lvim/core/log.lua
new file mode 100644
index 0000000..ba92462
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/core/log.lua
@@ -0,0 +1,203 @@
+local Log = {}
+
+Log.levels = {
+ TRACE = 1,
+ DEBUG = 2,
+ INFO = 3,
+ WARN = 4,
+ ERROR = 5,
+}
+
+local notify_opts = {}
+local log_notify_as_notification = false
+
+function Log:set_level(level)
+ if
+ not pcall(function()
+ local logger_ok, logger = pcall(function()
+ return require("structlog").get_logger "lvim"
+ end)
+ local log_level = Log.levels[level:upper()]
+ if logger_ok and logger and log_level then
+ for _, pipeline in ipairs(logger.pipelines) do
+ pipeline.level = log_level
+ end
+ end
+ end)
+ then
+ vim.notify "structlog version too old, run `:Lazy sync`"
+ end
+end
+
+function Log:init()
+ local status_ok, structlog = pcall(require, "structlog")
+ if not status_ok then
+ return nil
+ end
+
+ local log_level = Log.levels[(lvim.log.level):upper() or "WARN"]
+ structlog.configure {
+ lvim = {
+ pipelines = {
+ {
+ level = log_level,
+ processors = {
+ structlog.processors.StackWriter({ "line", "file" }, { max_parents = 0, stack_level = 2 }),
+ structlog.processors.Timestamper "%H:%M:%S",
+ },
+ formatter = structlog.formatters.FormatColorizer(
+ "%s [%-5s] %s: %-30s",
+ { "timestamp", "level", "logger_name", "msg" },
+ { level = structlog.formatters.FormatColorizer.color_level() }
+ ),
+ sink = structlog.sinks.Console(false), -- async=false
+ },
+ {
+ level = log_level,
+ processors = {
+ structlog.processors.StackWriter({ "line", "file" }, { max_parents = 3, stack_level = 2 }),
+ structlog.processors.Timestamper "%F %H:%M:%S",
+ },
+ formatter = structlog.formatters.Format(
+ "%s [%-5s] %s: %-30s",
+ { "timestamp", "level", "logger_name", "msg" }
+ ),
+ sink = structlog.sinks.File(self:get_path()),
+ },
+ },
+ },
+ }
+
+ local logger = structlog.get_logger "lvim"
+
+ -- Overwrite `vim.notify` to use the logger
+ if lvim.log.override_notify then
+ vim.notify = function(msg, vim_log_level, opts)
+ notify_opts = opts or {}
+
+ -- vim_log_level can be omitted
+ if vim_log_level == nil then
+ vim_log_level = Log.levels["INFO"]
+ elseif type(vim_log_level) == "string" then
+ vim_log_level = Log.levels[(vim_log_level):upper()] or Log.levels["INFO"]
+ else
+ -- https://github.com/neovim/neovim/blob/685cf398130c61c158401b992a1893c2405cd7d2/runtime/lua/vim/lsp/log.lua#L5
+ vim_log_level = vim_log_level + 1
+ end
+
+ self:add_entry(vim_log_level, msg)
+ end
+ end
+
+ return logger
+end
+
+--- Configure the sink in charge of logging notifications
+---@param nvim_notify table The nvim-notify instance
+function Log:configure_notifications(nvim_notify)
+ local status_ok, structlog = pcall(require, "structlog")
+ if not status_ok then
+ return
+ end
+
+ local function log_writer(log)
+ local opts = { title = log.logger_name }
+ opts = vim.tbl_deep_extend("force", opts, notify_opts)
+ notify_opts = {}
+
+ if log_notify_as_notification then
+ nvim_notify(log.msg, log.level, opts)
+ end
+ end
+
+ local notif_pipeline = structlog.Pipeline(
+ structlog.level.INFO,
+ {},
+ structlog.formatters.Format("%s", { "msg" }, { blacklist_all = true }),
+ structlog.sinks.Adapter(log_writer)
+ )
+ self.__handle:add_pipeline(notif_pipeline)
+end
+
+--- Adds a log entry using Plenary.log
+---@param level integer [same as vim.log.levels]
+---@param msg any
+---@param event any
+function Log:add_entry(level, msg, event)
+ if
+ not pcall(function()
+ local logger = self:get_logger()
+ if not logger then
+ return
+ end
+ logger:log(level, vim.inspect(msg), event)
+ end)
+ then
+ vim.notify "structlog version too old, run `:Lazy sync`"
+ end
+end
+
+---Retrieves the handle of the logger object
+---@return table|nil logger handle if found
+function Log:get_logger()
+ local logger_ok, logger = pcall(function()
+ return require("structlog").get_logger "lvim"
+ end)
+ if logger_ok and logger then
+ return logger
+ end
+
+ logger = self:init()
+
+ if not logger then
+ return
+ end
+
+ self.__handle = logger
+ return logger
+end
+
+---Retrieves the path of the logfile
+---@return string path of the logfile
+function Log:get_path()
+ return string.format("%s/%s.log", get_cache_dir(), "lvim")
+end
+
+---Add a log entry at TRACE level
+---@param msg any
+---@param event any
+function Log:trace(msg, event)
+ self:add_entry(self.levels.TRACE, msg, event)
+end
+
+---Add a log entry at DEBUG level
+---@param msg any
+---@param event any
+function Log:debug(msg, event)
+ self:add_entry(self.levels.DEBUG, msg, event)
+end
+
+---Add a log entry at INFO level
+---@param msg any
+---@param event any
+function Log:info(msg, event)
+ self:add_entry(self.levels.INFO, msg, event)
+end
+
+---Add a log entry at WARN level
+---@param msg any
+---@param event any
+function Log:warn(msg, event)
+ self:add_entry(self.levels.WARN, msg, event)
+end
+
+---Add a log entry at ERROR level
+---@param msg any
+---@param event any
+function Log:error(msg, event)
+ self:add_entry(self.levels.ERROR, msg, event)
+end
+
+setmetatable({}, Log)
+
+return Log
diff --git a/mac/.config/LunarVim/lua/lvim/core/lualine/colors.lua b/mac/.config/LunarVim/lua/lvim/core/lualine/colors.lua
new file mode 100644
index 0000000..4984cd1
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/core/lualine/colors.lua
@@ -0,0 +1,16 @@
+local colors = {
+ bg = "#202328",
+ fg = "#bbc2cf",
+ yellow = "#ECBE7B",
+ cyan = "#008080",
+ darkblue = "#081633",
+ green = "#98be65",
+ orange = "#FF8800",
+ violet = "#a9a1e1",
+ magenta = "#c678dd",
+ purple = "#c678dd",
+ blue = "#51afef",
+ red = "#ec5f67",
+}
+
+return colors
diff --git a/mac/.config/LunarVim/lua/lvim/core/lualine/components.lua b/mac/.config/LunarVim/lua/lvim/core/lualine/components.lua
new file mode 100644
index 0000000..afcce6b
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/core/lualine/components.lua
@@ -0,0 +1,174 @@
+local conditions = require "lvim.core.lualine.conditions"
+local colors = require "lvim.core.lualine.colors"
+
+local function diff_source()
+ local gitsigns = vim.b.gitsigns_status_dict
+ if gitsigns then
+ return {
+ added = gitsigns.added,
+ modified = gitsigns.changed,
+ removed = gitsigns.removed,
+ }
+ end
+end
+
+local branch = lvim.icons.git.Branch
+
+if lvim.colorscheme == "lunar" then
+ branch = "%#SLGitIcon#" .. lvim.icons.git.Branch .. "%*" .. "%#SLBranchName#"
+end
+
+return {
+ mode = {
+ function()
+ return " " .. lvim.icons.ui.Target .. " "
+ end,
+ padding = { left = 0, right = 0 },
+ color = {},
+ cond = nil,
+ },
+ branch = {
+ "b:gitsigns_head",
+ icon = branch,
+ color = { gui = "bold" },
+ },
+ filename = {
+ "filename",
+ color = {},
+ cond = nil,
+ },
+ diff = {
+ "diff",
+ source = diff_source,
+ symbols = {
+ added = lvim.icons.git.LineAdded .. " ",
+ modified = lvim.icons.git.LineModified .. " ",
+ removed = lvim.icons.git.LineRemoved .. " ",
+ },
+ padding = { left = 2, right = 1 },
+ diff_color = {
+ added = { fg = colors.green },
+ modified = { fg = colors.yellow },
+ removed = { fg = colors.red },
+ },
+ cond = nil,
+ },
+ python_env = {
+ function()
+ local utils = require "lvim.core.lualine.utils"
+ if vim.bo.filetype == "python" then
+ local venv = os.getenv "CONDA_DEFAULT_ENV" or os.getenv "VIRTUAL_ENV"
+ if venv then
+ local icons = require "nvim-web-devicons"
+ local py_icon, _ = icons.get_icon ".py"
+ return string.format(" " .. py_icon .. " (%s)", utils.env_cleanup(venv))
+ end
+ end
+ return ""
+ end,
+ color = { fg = colors.green },
+ cond = conditions.hide_in_width,
+ },
+ diagnostics = {
+ "diagnostics",
+ sources = { "nvim_diagnostic" },
+ symbols = {
+ error = lvim.icons.diagnostics.BoldError .. " ",
+ warn = lvim.icons.diagnostics.BoldWarning .. " ",
+ info = lvim.icons.diagnostics.BoldInformation .. " ",
+ hint = lvim.icons.diagnostics.BoldHint .. " ",
+ },
+ -- cond = conditions.hide_in_width,
+ },
+ treesitter = {
+ function()
+ return lvim.icons.ui.Tree
+ end,
+ color = function()
+ local buf = vim.api.nvim_get_current_buf()
+ local ts = vim.treesitter.highlighter.active[buf]
+ return { fg = ts and not vim.tbl_isempty(ts) and colors.green or colors.red }
+ end,
+ cond = conditions.hide_in_width,
+ },
+ lsp = {
+ function()
+ local buf_clients = vim.lsp.get_clients { bufnr = 0 }
+ if #buf_clients == 0 then
+ return "LSP Inactive"
+ end
+
+ local buf_ft = vim.bo.filetype
+ local buf_client_names = {}
+ local copilot_active = false
+
+ -- add client
+ for _, client in pairs(buf_clients) do
+ if client.name ~= "null-ls" and client.name ~= "copilot" then
+ table.insert(buf_client_names, client.name)
+ end
+
+ if client.name == "copilot" then
+ copilot_active = true
+ end
+ end
+
+ -- add formatter
+ local formatters = require "lvim.lsp.null-ls.formatters"
+ local supported_formatters = formatters.list_registered(buf_ft)
+ vim.list_extend(buf_client_names, supported_formatters)
+
+ -- add linter
+ local linters = require "lvim.lsp.null-ls.linters"
+ local supported_linters = linters.list_registered(buf_ft)
+ vim.list_extend(buf_client_names, supported_linters)
+
+ local unique_client_names = table.concat(buf_client_names, ", ")
+ local language_servers = string.format("[%s]", unique_client_names)
+
+ if copilot_active then
+ language_servers = language_servers .. "%#SLCopilot#" .. " " .. lvim.icons.git.Octoface .. "%*"
+ end
+
+ return language_servers
+ end,
+ color = { gui = "bold" },
+ cond = conditions.hide_in_width,
+ },
+ location = { "location" },
+ progress = {
+ "progress",
+ fmt = function()
+ return "%P/%L"
+ end,
+ color = {},
+ },
+
+ spaces = {
+ function()
+ local shiftwidth = vim.api.nvim_get_option_value("shiftwidth", { buf = 0 })
+ return lvim.icons.ui.Tab .. " " .. shiftwidth
+ end,
+ padding = 1,
+ },
+ encoding = {
+ "o:encoding",
+ fmt = string.upper,
+ color = {},
+ cond = conditions.hide_in_width,
+ },
+ filetype = { "filetype", cond = nil, padding = { left = 1, right = 1 } },
+ scrollbar = {
+ function()
+ local current_line = vim.fn.line "."
+ local total_lines = vim.fn.line "$"
+ local chars = { "__", "▁▁", "▂▂", "▃▃", "▄▄", "▅▅", "▆▆", "▇▇", "██" }
+ local line_ratio = current_line / total_lines
+ local index = math.ceil(line_ratio * #chars)
+ return chars[index]
+ end,
+ padding = { left = 0, right = 0 },
+ color = "SLProgress",
+ cond = nil,
+ },
+}
diff --git a/mac/.config/LunarVim/lua/lvim/core/lualine/conditions.lua b/mac/.config/LunarVim/lua/lvim/core/lualine/conditions.lua
new file mode 100644
index 0000000..42d52a8
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/core/lualine/conditions.lua
@@ -0,0 +1,17 @@
+local window_width_limit = 100
+
+local conditions = {
+ buffer_not_empty = function()
+ return vim.fn.empty(vim.fn.expand "%:t") ~= 1
+ end,
+ hide_in_width = function()
+ return vim.o.columns > window_width_limit
+ end,
+ -- check_git_workspace = function()
+ -- local filepath = vim.fn.expand "%:p:h"
+ -- local gitdir = vim.fn.finddir(".git", filepath .. ";")
+ -- return gitdir and #gitdir > 0 and #gitdir < #filepath
+ -- end,
+}
+
+return conditions
diff --git a/mac/.config/LunarVim/lua/lvim/core/lualine/init.lua b/mac/.config/LunarVim/lua/lvim/core/lualine/init.lua
new file mode 100644
index 0000000..fa4cf82
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/core/lualine/init.lua
@@ -0,0 +1,57 @@
+local M = {}
+M.config = function()
+ lvim.builtin.lualine = {
+ active = true,
+ style = "lvim",
+ options = {
+ icons_enabled = nil,
+ component_separators = nil,
+ section_separators = nil,
+ theme = nil,
+ disabled_filetypes = { statusline = { "alpha" } },
+ globalstatus = true,
+ },
+ sections = {
+ lualine_a = nil,
+ lualine_b = nil,
+ lualine_c = nil,
+ lualine_x = nil,
+ lualine_y = nil,
+ lualine_z = nil,
+ },
+ inactive_sections = {
+ lualine_a = nil,
+ lualine_b = nil,
+ lualine_c = nil,
+ lualine_x = nil,
+ lualine_y = nil,
+ lualine_z = nil,
+ },
+ tabline = nil,
+ extensions = nil,
+ on_config_done = nil,
+ }
+end
+
+M.setup = function()
+ if #vim.api.nvim_list_uis() == 0 then
+ local Log = require "lvim.core.log"
+ Log:debug "headless mode detected, skipping running setup for lualine"
+ return
+ end
+
+ local status_ok, lualine = pcall(require, "lualine")
+ if not status_ok then
+ return
+ end
+
+ require("lvim.core.lualine.styles").update()
+
+ lualine.setup(lvim.builtin.lualine)
+
+ if lvim.builtin.lualine.on_config_done then
+ lvim.builtin.lualine.on_config_done(lualine)
+ end
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/core/lualine/styles.lua b/mac/.config/LunarVim/lua/lvim/core/lualine/styles.lua
new file mode 100644
index 0000000..81dbbab
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/core/lualine/styles.lua
@@ -0,0 +1,165 @@
+local M = {}
+local components = require "lvim.core.lualine.components"
+
+local styles = {
+ lvim = nil,
+ default = nil,
+ none = nil,
+}
+
+styles.none = {
+ style = "none",
+ options = {
+ theme = "auto",
+ globalstatus = true,
+ icons_enabled = lvim.use_icons,
+ component_separators = { left = "", right = "" },
+ section_separators = { left = "", right = "" },
+ disabled_filetypes = {},
+ },
+ sections = {
+ lualine_a = {},
+ lualine_b = {},
+ lualine_c = {},
+ lualine_x = {},
+ lualine_y = {},
+ lualine_z = {},
+ },
+ inactive_sections = {
+ lualine_a = {},
+ lualine_b = {},
+ lualine_c = {},
+ lualine_x = {},
+ lualine_y = {},
+ lualine_z = {},
+ },
+ tabline = {},
+ extensions = {},
+}
+
+styles.default = {
+ style = "default",
+ options = {
+ theme = "auto",
+ globalstatus = true,
+ icons_enabled = lvim.use_icons,
+ component_separators = {
+ left = lvim.icons.ui.DividerRight,
+ right = lvim.icons.ui.DividerLeft,
+ },
+ section_separators = {
+ left = lvim.icons.ui.BoldDividerRight,
+ right = lvim.icons.ui.BoldDividerLeft,
+ },
+ disabled_filetypes = {},
+ },
+ sections = {
+ lualine_a = { "mode" },
+ lualine_b = { "branch" },
+ lualine_c = { "filename" },
+ lualine_x = { "encoding", "fileformat", "filetype" },
+ lualine_y = { "progress" },
+ lualine_z = { "location" },
+ },
+ inactive_sections = {
+ lualine_a = {},
+ lualine_b = {},
+ lualine_c = { "filename" },
+ lualine_x = { "location" },
+ lualine_y = {},
+ lualine_z = {},
+ },
+ tabline = {},
+ extensions = {},
+}
+
+styles.lvim = {
+ style = "lvim",
+ options = {
+ theme = "auto",
+ globalstatus = true,
+ icons_enabled = lvim.use_icons,
+ component_separators = { left = "", right = "" },
+ section_separators = { left = "", right = "" },
+ disabled_filetypes = { "alpha" },
+ },
+ sections = {
+ lualine_a = {
+ components.mode,
+ },
+ lualine_b = {
+ components.branch,
+ },
+ lualine_c = {
+ components.diff,
+ components.python_env,
+ },
+ lualine_x = {
+ components.diagnostics,
+ components.lsp,
+ components.spaces,
+ components.filetype,
+ },
+ lualine_y = { components.location },
+ lualine_z = {
+ components.progress,
+ },
+ },
+ inactive_sections = {
+ lualine_a = {
+ components.mode,
+ },
+ lualine_b = {
+ components.branch,
+ },
+ lualine_c = {
+ components.diff,
+ components.python_env,
+ },
+ lualine_x = {
+ components.diagnostics,
+ components.lsp,
+ components.spaces,
+ components.filetype,
+ },
+ lualine_y = { components.location },
+ lualine_z = {
+ components.progress,
+ },
+ },
+ tabline = {},
+ extensions = {},
+}
+
+function M.get_style(style)
+ local style_keys = vim.tbl_keys(styles)
+ if not vim.tbl_contains(style_keys, style) then
+ local Log = require "lvim.core.log"
+ Log:error(
+ "Invalid lualine style"
+ .. string.format('"%s"', style)
+ .. "options are: "
+ .. string.format('"%s"', table.concat(style_keys, '", "'))
+ )
+ Log:debug '"lvim" style is applied.'
+ style = "lvim"
+ end
+
+ return vim.deepcopy(styles[style])
+end
+
+function M.update()
+ local style = M.get_style(lvim.builtin.lualine.style)
+
+ lvim.builtin.lualine = vim.tbl_deep_extend("keep", lvim.builtin.lualine, style)
+
+ local color_template = vim.g.colors_name or lvim.colorscheme
+ local theme_supported, template = pcall(function()
+ require("lualine.utils.loader").load_theme(color_template)
+ end)
+ if theme_supported and template then
+ lvim.builtin.lualine.options.theme = color_template
+ end
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/core/lualine/utils.lua b/mac/.config/LunarVim/lua/lvim/core/lualine/utils.lua
new file mode 100644
index 0000000..3fd3c2d
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/core/lualine/utils.lua
@@ -0,0 +1,14 @@
+local M = {}
+
+function M.env_cleanup(venv)
+ if string.find(venv, "/") then
+ local final_venv = venv
+ for w in venv:gmatch "([^/]+)" do
+ final_venv = w
+ end
+ venv = final_venv
+ end
+ return venv
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/core/mason.lua b/mac/.config/LunarVim/lua/lvim/core/mason.lua
new file mode 100644
index 0000000..a8816a3
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/core/mason.lua
@@ -0,0 +1,120 @@
+local M = {}
+
+local join_paths = require("lvim.utils").join_paths
+
+function M.config()
+ lvim.builtin.mason = {
+ ui = {
+ check_outdated_packages_on_open = true,
+ width = 0.8,
+ height = 0.9,
+ border = "rounded",
+ keymaps = {
+ toggle_package_expand = "<CR>",
+ install_package = "i",
+ update_package = "u",
+ check_package_version = "c",
+ update_all_packages = "U",
+ check_outdated_packages = "C",
+ uninstall_package = "X",
+ cancel_installation = "<C-c>",
+ apply_language_filter = "<C-f>",
+ },
+ },
+
+ icons = {
+ package_installed = "◍",
+ package_pending = "◍",
+ package_uninstalled = "◍",
+ },
+
+ -- NOTE: should be available in $PATH
+ install_root_dir = join_paths(vim.fn.stdpath "data", "mason"),
+
+ -- NOTE: already handled in the bootstrap stage
+ PATH = "skip",
+
+ pip = {
+ upgrade_pip = false,
+ -- These args will be added to `pip install` calls. Note that setting extra args might impact intended behavior
+ -- and is not recommended.
+ --
+ -- Example: { "--proxy", "https://proxyserver" }
+ install_args = {},
+ },
+
+ -- Controls to which degree logs are written to the log file. It's useful to set this to vim.log.levels.DEBUG when
+ -- debugging issues with package installations.
+ log_level = vim.log.levels.INFO,
+
+ -- Limit for the maximum amount of packages to be installed at the same time. Once this limit is reached, any further
+ -- packages that are requested to be installed will be put in a queue.
+ max_concurrent_installers = 4,
+
+ -- [Advanced setting]
+ -- The registries to source packages from. Accepts multiple entries. Should a package with the same name exist in
+ -- multiple registries, the registry listed first will be used.
+ registries = {
+ "lua:mason-registry.index",
+ "github:mason-org/mason-registry",
+ },
+
+ -- The provider implementations to use for resolving supplementary package metadata (e.g., all available versions).
+ -- Accepts multiple entries, where later entries will be used as fallback should prior providers fail.
+ providers = {
+ "mason.providers.registry-api",
+ "mason.providers.client",
+ },
+
+ github = {
+ -- The template URL to use when downloading assets from GitHub.
+ -- The placeholders are the following (in order):
+ -- 1. The repository (e.g. "rust-lang/rust-analyzer")
+ -- 2. The release version (e.g. "v0.3.0")
+ -- 3. The asset name (e.g. "rust-analyzer-v0.3.0-x86_64-unknown-linux-gnu.tar.gz")
+ download_url_template = "https://github.com/%s/releases/download/%s/%s",
+ },
+
+ on_config_done = nil,
+ }
+end
+
+function M.get_prefix()
+ local default_prefix = join_paths(vim.fn.stdpath "data", "mason")
+ return vim.tbl_get(lvim.builtin, "mason", "install_root_dir") or default_prefix
+end
+
+---@param append boolean|nil whether to append to prepend to PATH
+local function add_to_path(append)
+ local p = join_paths(M.get_prefix(), "bin")
+ if vim.env.PATH:match(p) then
+ return
+ end
+ local string_separator = vim.loop.os_uname().version:match "Windows" and ";" or ":"
+ if append then
+ vim.env.PATH = vim.env.PATH .. string_separator .. p
+ else
+ vim.env.PATH = p .. string_separator .. vim.env.PATH
+ end
+end
+
+function M.bootstrap()
+ add_to_path()
+end
+
+function M.setup()
+ local status_ok, mason = pcall(require, "mason")
+ if not status_ok then
+ return
+ end
+
+ add_to_path(lvim.builtin.mason.PATH == "append")
+
+ mason.setup(lvim.builtin.mason)
+
+ if lvim.builtin.mason.on_config_done then
+ lvim.builtin.mason.on_config_done(mason)
+ end
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/core/nvimtree.lua b/mac/.config/LunarVim/lua/lvim/core/nvimtree.lua
new file mode 100644
index 0000000..d1aaff4
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/core/nvimtree.lua
@@ -0,0 +1,344 @@
+local M = {}
+local Log = require "lvim.core.log"
+
+function M.config()
+ lvim.builtin.nvimtree = {
+ active = true,
+ on_config_done = nil,
+ setup = {
+ experimental = {},
+ auto_reload_on_write = false,
+ disable_netrw = false,
+ hijack_cursor = false,
+ hijack_netrw = true,
+ hijack_unnamed_buffer_when_opening = false,
+ sort = {
+ sorter = "name",
+ folders_first = true,
+ files_first = false,
+ },
+ root_dirs = {},
+ prefer_startup_root = false,
+ sync_root_with_cwd = true,
+ reload_on_bufenter = false,
+ respect_buf_cwd = false,
+ on_attach = "default",
+ select_prompts = false,
+ view = {
+ adaptive_size = false,
+ centralize_selection = true,
+ width = 30,
+ cursorline = true,
+ debounce_delay = 15,
+ side = "left",
+ preserve_window_proportions = false,
+ number = false,
+ relativenumber = false,
+ signcolumn = "yes",
+ float = {
+ enable = false,
+ quit_on_focus_loss = true,
+ open_win_config = {
+ relative = "editor",
+ border = "rounded",
+ width = 30,
+ height = 30,
+ row = 1,
+ col = 1,
+ },
+ },
+ },
+ renderer = {
+ add_trailing = false,
+ group_empty = false,
+ highlight_git = "name",
+ highlight_opened_files = "none",
+ root_folder_label = ":t",
+ full_name = false,
+ indent_width = 2,
+ special_files = { "Cargo.toml", "Makefile", "README.md", "readme.md" },
+ symlink_destination = true,
+ highlight_diagnostics = "none",
+ highlight_modified = "none",
+ highlight_bookmarks = "none",
+ highlight_clipboard = "name",
+ indent_markers = {
+ enable = false,
+ inline_arrows = true,
+ icons = {
+ corner = "└",
+ edge = "│",
+ item = "│",
+ bottom = "─",
+ none = " ",
+ },
+ },
+ icons = {
+ webdev_colors = lvim.use_icons,
+
+ web_devicons = {
+ file = {
+ enable = lvim.use_icons,
+ color = lvim.use_icons,
+ },
+ folder = {
+ enable = false,
+ color = lvim.use_icons,
+ },
+ },
+ git_placement = "before",
+ padding = " ",
+ symlink_arrow = " ➛ ",
+ modified_placement = "after",
+ diagnostics_placement = "signcolumn",
+ bookmarks_placement = "signcolumn",
+ show = {
+ file = lvim.use_icons,
+ folder = lvim.use_icons,
+ folder_arrow = lvim.use_icons,
+ git = lvim.use_icons,
+ modified = lvim.use_icons,
+ diagnostics = lvim.use_icons,
+ bookmarks = lvim.use_icons,
+ },
+ glyphs = {
+ default = lvim.icons.ui.Text,
+ symlink = lvim.icons.ui.FileSymlink,
+ bookmark = lvim.icons.ui.BookMark,
+ modified = lvim.icons.ui.Circle,
+ folder = {
+ arrow_closed = lvim.icons.ui.TriangleShortArrowRight,
+ arrow_open = lvim.icons.ui.TriangleShortArrowDown,
+ default = lvim.icons.ui.Folder,
+ open = lvim.icons.ui.FolderOpen,
+ empty = lvim.icons.ui.EmptyFolder,
+ empty_open = lvim.icons.ui.EmptyFolderOpen,
+ symlink = lvim.icons.ui.FolderSymlink,
+ symlink_open = lvim.icons.ui.FolderOpen,
+ },
+ git = {
+ unstaged = lvim.icons.git.FileUnstaged,
+ staged = lvim.icons.git.FileStaged,
+ unmerged = lvim.icons.git.FileUnmerged,
+ renamed = lvim.icons.git.FileRenamed,
+ untracked = lvim.icons.git.FileUntracked,
+ deleted = lvim.icons.git.FileDeleted,
+ ignored = lvim.icons.git.FileIgnored,
+ },
+ },
+ },
+ },
+ hijack_directories = {
+ enable = false,
+ auto_open = true,
+ },
+ update_focused_file = {
+ enable = true,
+ update_root = {
+ enable = true,
+ ignore_list = {},
+ },
+ exclude = false,
+ },
+ diagnostics = {
+ enable = lvim.use_icons,
+ show_on_dirs = false,
+ show_on_open_dirs = true,
+ debounce_delay = 50,
+ severity = {
+ min = vim.diagnostic.severity.HINT,
+ max = vim.diagnostic.severity.ERROR,
+ },
+ icons = {
+ hint = lvim.icons.diagnostics.BoldHint,
+ info = lvim.icons.diagnostics.BoldInformation,
+ warning = lvim.icons.diagnostics.BoldWarning,
+ error = lvim.icons.diagnostics.BoldError,
+ },
+ },
+ filters = {
+ enable = true,
+ dotfiles = false,
+ git_clean = false,
+ git_ignored = false,
+ no_bookmark = false,
+ no_buffer = false,
+ custom = { "node_modules", "\\.cache" },
+ exclude = {},
+ },
+ filesystem_watchers = {
+ enable = true,
+ debounce_delay = 50,
+ ignore_dirs = {},
+ },
+ git = {
+ enable = true,
+ show_on_dirs = true,
+ show_on_open_dirs = true,
+ disable_for_dirs = {},
+ timeout = 400,
+ cygwin_support = false,
+ },
+ actions = {
+ use_system_clipboard = true,
+ change_dir = {
+ enable = true,
+ global = false,
+ restrict_above_cwd = false,
+ },
+ expand_all = {
+ max_folder_discovery = 300,
+ exclude = {},
+ },
+ file_popup = {
+ open_win_config = {
+ col = 1,
+ row = 1,
+ relative = "cursor",
+ border = "shadow",
+ style = "minimal",
+ },
+ },
+ open_file = {
+ quit_on_open = false,
+ eject = true,
+ resize_window = false,
+ window_picker = {
+ enable = true,
+ picker = "default",
+ chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890",
+ exclude = {
+ filetype = { "notify", "lazy", "qf", "diff", "fugitive", "fugitiveblame" },
+ buftype = { "nofile", "terminal", "help" },
+ },
+ },
+ },
+ remove_file = {
+ close_window = true,
+ },
+ },
+ trash = {
+ cmd = "gio trash",
+ },
+ live_filter = {
+ prefix = "[FILTER]: ",
+ always_show_folders = true,
+ },
+ tab = {
+ sync = {
+ open = false,
+ close = false,
+ ignore = {},
+ },
+ },
+ notify = {
+ threshold = vim.log.levels.INFO,
+ absolute_path = true,
+ },
+ ui = {
+ confirm = {
+ remove = true,
+ trash = true,
+ default_yes = false,
+ },
+ },
+ modified = {
+ enable = false,
+ show_on_dirs = true,
+ show_on_open_dirs = true,
+ },
+ help = {
+ sort_by = "key",
+ },
+ log = {
+ enable = false,
+ truncate = false,
+ types = {
+ all = false,
+ config = false,
+ copy_paste = false,
+ dev = false,
+ diagnostics = false,
+ git = false,
+ profile = false,
+ watcher = false,
+ },
+ },
+ system_open = {
+ cmd = nil,
+ args = {},
+ },
+ },
+ }
+end
+
+function M.start_telescope(telescope_mode)
+ local node = require("nvim-tree.lib").get_node_at_cursor()
+ local abspath = node.link_to or node.absolute_path
+ local is_folder = node.open ~= nil
+ local basedir = is_folder and abspath or vim.fn.fnamemodify(abspath, ":h")
+ require("telescope.builtin")[telescope_mode] {
+ cwd = basedir,
+ }
+end
+
+local function on_attach(bufnr)
+ local api = require "nvim-tree.api"
+
+ local function telescope_find_files(_)
+ require("lvim.core.nvimtree").start_telescope "find_files"
+ end
+
+ local function telescope_live_grep(_)
+ require("lvim.core.nvimtree").start_telescope "live_grep"
+ end
+
+ local function opts(desc)
+ return { desc = "nvim-tree: " .. desc, buffer = bufnr, noremap = true, silent = true, nowait = true }
+ end
+
+ api.config.mappings.default_on_attach(bufnr)
+
+ local useful_keys = {
+ ["l"] = { api.node.open.edit, opts "Open" },
+ ["o"] = { api.node.open.edit, opts "Open" },
+ ["<CR>"] = { api.node.open.edit, opts "Open" },
+ ["v"] = { api.node.open.vertical, opts "Open: Vertical Split" },
+ ["h"] = { api.node.navigate.parent_close, opts "Close Directory" },
+ ["C"] = { api.tree.change_root_to_node, opts "CD" },
+ ["gtg"] = { telescope_live_grep, opts "Telescope Live Grep" },
+ ["gtf"] = { telescope_find_files, opts "Telescope Find File" },
+ }
+
+ require("lvim.keymappings").load_mode("n", useful_keys)
+end
+
+function M.setup()
+ local status_ok, nvim_tree = pcall(require, "nvim-tree")
+
+ if not status_ok then
+ Log:error "Failed to load nvim-tree"
+ return
+ end
+
+ -- Implicitly update nvim-tree when project module is active
+ if lvim.builtin.project.active then
+ lvim.builtin.nvimtree.setup.respect_buf_cwd = true
+ lvim.builtin.nvimtree.setup.update_cwd = true
+ lvim.builtin.nvimtree.setup.update_focused_file.enable = true
+ lvim.builtin.nvimtree.setup.update_focused_file.update_cwd = true
+ end
+
+ -- Add useful keymaps
+ if lvim.builtin.nvimtree.setup.on_attach == "default" then
+ lvim.builtin.nvimtree.setup.on_attach = on_attach
+ end
+
+ nvim_tree.setup(lvim.builtin.nvimtree.setup)
+
+ if lvim.builtin.nvimtree.on_config_done then
+ lvim.builtin.nvimtree.on_config_done(nvim_tree)
+ end
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/core/project.lua b/mac/.config/LunarVim/lua/lvim/core/project.lua
new file mode 100644
index 0000000..17473c5
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/core/project.lua
@@ -0,0 +1,67 @@
+local M = {}
+
+function M.config()
+ lvim.builtin.project = {
+ ---@usage set to false to disable project.nvim.
+ --- This is on by default since it's currently the expected behavior.
+ active = true,
+
+ on_config_done = nil,
+
+ ---@usage set to true to disable setting the current-woriking directory
+ --- Manual mode doesn't automatically change your root directory, so you have
+ --- the option to manually do so using `:ProjectRoot` command.
+ manual_mode = false,
+
+ ---@usage Methods of detecting the root directory
+ --- Allowed values: **"lsp"** uses the native neovim lsp
+ --- **"pattern"** uses vim-rooter like glob pattern matching. Here
+ --- order matters: if one is not detected, the other is used as fallback. You
+ --- can also delete or rearangne the detection methods.
+ -- detection_methods = { "lsp", "pattern" }, -- NOTE: lsp detection will get annoying with multiple langs in one project
+ detection_methods = { "pattern" },
+
+ -- All the patterns used to detect root dir, when **"pattern"** is in
+ -- detection_methods
+ patterns = { ".git", "_darcs", ".hg", ".bzr", ".svn", "Makefile", "package.json", "pom.xml" },
+
+ -- Table of lsp clients to ignore by name
+ -- eg: { "efm", ... }
+ ignore_lsp = {},
+
+ -- Don't calculate root dir on specific directories
+ -- Ex: { "~/.cargo/*", ... }
+ exclude_dirs = {},
+
+ -- Show hidden files in telescope
+ show_hidden = false,
+
+ -- When set to false, you will get a message when project.nvim changes your
+ -- directory.
+ silent_chdir = true,
+
+ -- What scope to change the directory, valid options are
+ -- * global (default)
+ -- * tab
+ -- * win
+ scope_chdir = "global",
+
+ ---@type string
+ ---@usage path to store the project history for use in telescope
+ datapath = get_cache_dir(),
+ }
+end
+
+function M.setup()
+ local status_ok, project = pcall(require, "project_nvim")
+ if not status_ok then
+ return
+ end
+
+ project.setup(lvim.builtin.project)
+ if lvim.builtin.project.on_config_done then
+ lvim.builtin.project.on_config_done(project)
+ end
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/core/telescope.lua b/mac/.config/LunarVim/lua/lvim/core/telescope.lua
new file mode 100644
index 0000000..b701f7e
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/core/telescope.lua
@@ -0,0 +1,150 @@
+local M = {}
+
+---@alias telescope_themes
+---| "cursor" # see `telescope.themes.get_cursor()`
+---| "dropdown" # see `telescope.themes.get_dropdown()`
+---| "ivy" # see `telescope.themes.get_ivy()`
+---| "center" # retain the default telescope theme
+
+function M.config()
+ local actions = require("lvim.utils.modules").require_on_exported_call "telescope.actions"
+ lvim.builtin.telescope = {
+ ---@usage disable telescope completely [not recommended]
+ active = true,
+ on_config_done = nil,
+ theme = "dropdown", ---@type telescope_themes
+ defaults = {
+ prompt_prefix = lvim.icons.ui.Telescope .. " ",
+ selection_caret = lvim.icons.ui.Forward .. " ",
+ entry_prefix = " ",
+ initial_mode = "insert",
+ selection_strategy = "reset",
+ sorting_strategy = nil,
+ layout_strategy = nil,
+ layout_config = {},
+ vimgrep_arguments = {
+ "rg",
+ "--color=never",
+ "--no-heading",
+ "--with-filename",
+ "--line-number",
+ "--column",
+ "--smart-case",
+ "--hidden",
+ "--glob=!.git/",
+ },
+ ---@usage Mappings are fully customizable. Many familiar mapping patterns are setup as defaults.
+ mappings = {
+ i = {
+ ["<C-n>"] = actions.move_selection_next,
+ ["<C-p>"] = actions.move_selection_previous,
+ ["<C-c>"] = actions.close,
+ ["<C-j>"] = actions.cycle_history_next,
+ ["<C-k>"] = actions.cycle_history_prev,
+ ["<C-q>"] = function(...)
+ actions.smart_send_to_qflist(...)
+ actions.open_qflist(...)
+ end,
+ ["<CR>"] = actions.select_default,
+ },
+ n = {
+ ["<C-n>"] = actions.move_selection_next,
+ ["<C-p>"] = actions.move_selection_previous,
+ ["<C-q>"] = function(...)
+ actions.smart_send_to_qflist(...)
+ actions.open_qflist(...)
+ end,
+ },
+ },
+ file_ignore_patterns = {},
+ path_display = { "smart" },
+ winblend = 0,
+ border = {},
+ borderchars = nil,
+ color_devicons = true,
+ set_env = { ["COLORTERM"] = "truecolor" }, -- default = nil,
+ },
+ pickers = {
+ find_files = {
+ hidden = true,
+ },
+ live_grep = {
+ --@usage don't include the filename in the search results
+ only_sort_text = true,
+ },
+ grep_string = {
+ only_sort_text = true,
+ },
+ buffers = {
+ initial_mode = "normal",
+ mappings = {
+ i = {
+ ["<C-d>"] = actions.delete_buffer,
+ },
+ n = {
+ ["dd"] = actions.delete_buffer,
+ },
+ },
+ },
+ planets = {
+ show_pluto = true,
+ show_moon = true,
+ },
+ git_files = {
+ hidden = true,
+ show_untracked = true,
+ },
+ colorscheme = {
+ enable_preview = true,
+ },
+ },
+ extensions = {
+ fzf = {
+ fuzzy = true, -- false will only do exact matching
+ override_generic_sorter = true, -- override the generic sorter
+ override_file_sorter = true, -- override the file sorter
+ case_mode = "smart_case", -- or "ignore_case" or "respect_case"
+ },
+ },
+ }
+end
+
+function M.setup()
+ local previewers = require "telescope.previewers"
+ local sorters = require "telescope.sorters"
+
+ lvim.builtin.telescope = vim.tbl_extend("keep", {
+ file_previewer = previewers.vim_buffer_cat.new,
+ grep_previewer = previewers.vim_buffer_vimgrep.new,
+ qflist_previewer = previewers.vim_buffer_qflist.new,
+ file_sorter = sorters.get_fuzzy_file,
+ generic_sorter = sorters.get_generic_fuzzy_sorter,
+ }, lvim.builtin.telescope)
+
+ local telescope = require "telescope"
+
+ local theme = require("telescope.themes")["get_" .. (lvim.builtin.telescope.theme or "")]
+ if theme then
+ lvim.builtin.telescope.defaults = theme(lvim.builtin.telescope.defaults)
+ end
+
+ telescope.setup(lvim.builtin.telescope)
+
+ if lvim.builtin.project.active then
+ pcall(function()
+ require("telescope").load_extension "projects"
+ end)
+ end
+
+ if lvim.builtin.telescope.on_config_done then
+ lvim.builtin.telescope.on_config_done(telescope)
+ end
+
+ if lvim.builtin.telescope.extensions and lvim.builtin.telescope.extensions.fzf then
+ pcall(function()
+ require("telescope").load_extension "fzf"
+ end)
+ end
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/core/telescope/custom-finders.lua b/mac/.config/LunarVim/lua/lvim/core/telescope/custom-finders.lua
new file mode 100644
index 0000000..f433f35
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/core/telescope/custom-finders.lua
@@ -0,0 +1,98 @@
+local M = {}
+
+local _, builtin = pcall(require, "telescope.builtin")
+local _, finders = pcall(require, "telescope.finders")
+local _, pickers = pcall(require, "telescope.pickers")
+local _, sorters = pcall(require, "telescope.sorters")
+local _, themes = pcall(require, "telescope.themes")
+local _, actions = pcall(require, "telescope.actions")
+local _, previewers = pcall(require, "telescope.previewers")
+local _, make_entry = pcall(require, "telescope.make_entry")
+
+function M.find_lunarvim_files(opts)
+ opts = opts or {}
+ local theme_opts = themes.get_ivy {
+ sorting_strategy = "ascending",
+ layout_strategy = "bottom_pane",
+ prompt_prefix = ">> ",
+ prompt_title = "~ LunarVim files ~",
+ cwd = get_runtime_dir(),
+ search_dirs = { get_lvim_base_dir(), lvim.lsp.templates_dir },
+ }
+ opts = vim.tbl_deep_extend("force", theme_opts, opts)
+ builtin.find_files(opts)
+end
+
+function M.grep_lunarvim_files(opts)
+ opts = opts or {}
+ local theme_opts = themes.get_ivy {
+ sorting_strategy = "ascending",
+ layout_strategy = "bottom_pane",
+ prompt_prefix = ">> ",
+ prompt_title = "~ search LunarVim ~",
+ cwd = get_runtime_dir(),
+ search_dirs = { get_lvim_base_dir(), lvim.lsp.templates_dir },
+ }
+ opts = vim.tbl_deep_extend("force", theme_opts, opts)
+ builtin.live_grep(opts)
+end
+
+local copy_to_clipboard_action = function(prompt_bufnr)
+ local _, action_state = pcall(require, "telescope.actions.state")
+ local entry = action_state.get_selected_entry()
+ local version = entry.value
+ vim.fn.setreg("+", version)
+ vim.fn.setreg('"', version)
+ vim.notify("Copied " .. version .. " to clipboard", vim.log.levels.INFO)
+ actions.close(prompt_bufnr)
+end
+
+function M.view_lunarvim_changelog()
+ local opts = themes.get_ivy {
+ cwd = get_lvim_base_dir(),
+ }
+ opts.entry_maker = make_entry.gen_from_git_commits(opts)
+
+ pickers
+ .new(opts, {
+ prompt_title = "~ LunarVim Changelog ~",
+
+ finder = finders.new_oneshot_job(
+ vim.tbl_flatten {
+ "git",
+ "log",
+ "--pretty=oneline",
+ "--abbrev-commit",
+ },
+ opts
+ ),
+ previewer = {
+ previewers.git_commit_diff_as_was.new(opts),
+ },
+
+ --TODO: consider opening a diff view when pressing enter
+ attach_mappings = function(_, map)
+ map("i", "<enter>", copy_to_clipboard_action)
+ map("n", "<enter>", copy_to_clipboard_action)
+ map("i", "<esc>", actions.close)
+ map("n", "<esc>", actions.close)
+ map("n", "q", actions.close)
+ return true
+ end,
+ sorter = sorters.generic_sorter,
+ })
+ :find()
+end
+
+-- Smartly opens either git_files or find_files, depending on whether the working directory is
+-- contained in a Git repo.
+function M.find_project_files(opts)
+ opts = opts or {}
+ local ok = pcall(builtin.git_files, opts)
+
+ if not ok then
+ builtin.find_files(opts)
+ end
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/core/terminal.lua b/mac/.config/LunarVim/lua/lvim/core/terminal.lua
new file mode 100644
index 0000000..5270dda
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/core/terminal.lua
@@ -0,0 +1,174 @@
+local M = {}
+local Log = require "lvim.core.log"
+
+M.config = function()
+ lvim.builtin["terminal"] = {
+ active = true,
+ on_config_done = nil,
+ -- size can be a number or function which is passed the current terminal
+ size = 20,
+ open_mapping = [[<c-\>]],
+ hide_numbers = true, -- hide the number column in toggleterm buffers
+ shade_filetypes = {},
+ shade_terminals = true,
+ shading_factor = 2, -- the degree by which to darken to terminal colour, default: 1 for dark backgrounds, 3 for light
+ start_in_insert = true,
+ insert_mappings = true, -- whether or not the open mapping applies in insert mode
+ persist_size = false,
+ -- direction = 'vertical' | 'horizontal' | 'window' | 'float',
+ direction = "float",
+ close_on_exit = true, -- close the terminal window when the process exits
+ auto_scroll = true, -- automatically scroll to the bottom on terminal output
+ shell = nil, -- change the default shell
+ -- This field is only relevant if direction is set to 'float'
+ float_opts = {
+ -- The border key is *almost* the same as 'nvim_win_open'
+ -- see :h nvim_win_open for details on borders however
+ -- the 'curved' border is a custom border type
+ -- not natively supported but implemented in this plugin.
+ -- border = 'single' | 'double' | 'shadow' | 'curved' | ... other options supported by win open
+ border = "curved",
+ -- width = <value>,
+ -- height = <value>,
+ winblend = 0,
+ highlights = {
+ border = "Normal",
+ background = "Normal",
+ },
+ },
+ winbar = {
+ enabled = false,
+ },
+ -- Add executables on the config.lua
+ -- { cmd, keymap, description, direction, size }
+ -- lvim.builtin.terminal.execs = {...} to overwrite
+ -- lvim.builtin.terminal.execs[#lvim.builtin.terminal.execs+1] = {"gdb", "tg", "GNU Debugger"}
+ -- TODO: pls add mappings in which key and refactor this
+ execs = {
+ { nil, "<M-1>", "Horizontal Terminal", "horizontal", 0.3 },
+ { nil, "<M-2>", "Vertical Terminal", "vertical", 0.4 },
+ { nil, "<M-3>", "Float Terminal", "float", nil },
+ },
+ }
+end
+
+--- Get current buffer size
+---@return {width: number, height: number}
+local function get_buf_size()
+ local cbuf = vim.api.nvim_get_current_buf()
+ local bufinfo = vim.tbl_filter(function(buf)
+ return buf.bufnr == cbuf
+ end, vim.fn.getwininfo(vim.api.nvim_get_current_win()))[1]
+ if bufinfo == nil then
+ return { width = -1, height = -1 }
+ end
+ return { width = bufinfo.width, height = bufinfo.height }
+end
+
+--- Get the dynamic terminal size in cells
+---@param direction number
+---@param size number
+---@return integer
+local function get_dynamic_terminal_size(direction, size)
+ size = size or lvim.builtin.terminal.size
+ if direction ~= "float" and tostring(size):find(".", 1, true) then
+ size = math.min(size, 1.0)
+ local buf_sizes = get_buf_size()
+ local buf_size = direction == "horizontal" and buf_sizes.height or buf_sizes.width
+ return buf_size * size
+ else
+ return size
+ end
+end
+
+M.init = function()
+ for i, exec in pairs(lvim.builtin.terminal.execs) do
+ local direction = exec[4] or lvim.builtin.terminal.direction
+
+ local opts = {
+ cmd = exec[1] or lvim.builtin.terminal.shell or vim.o.shell,
+ keymap = exec[2],
+ label = exec[3],
+ -- NOTE: unable to consistently bind id/count <= 9, see #2146
+ count = i + 100,
+ direction = direction,
+ size = function()
+ return get_dynamic_terminal_size(direction, exec[5])
+ end,
+ }
+
+ M.add_exec(opts)
+ end
+end
+
+M.setup = function()
+ local terminal = require "toggleterm"
+ terminal.setup(lvim.builtin.terminal)
+ if lvim.builtin.terminal.on_config_done then
+ lvim.builtin.terminal.on_config_done(terminal)
+ end
+end
+
+M.add_exec = function(opts)
+ local binary = opts.cmd:match "(%S+)"
+ if vim.fn.executable(binary) ~= 1 then
+ Log:debug("Skipping configuring executable " .. binary .. ". Please make sure it is installed properly.")
+ return
+ end
+
+ vim.keymap.set({ "n", "t" }, opts.keymap, function()
+ M._exec_toggle { cmd = opts.cmd, count = opts.count, direction = opts.direction, size = opts.size() }
+ end, { desc = opts.label, noremap = true, silent = true })
+end
+
+M._exec_toggle = function(opts)
+ local Terminal = require("toggleterm.terminal").Terminal
+ local term = Terminal:new { cmd = opts.cmd, count = opts.count, direction = opts.direction }
+ term:toggle(opts.size, opts.direction)
+end
+
+---Toggles a log viewer according to log.viewer.layout_config
+---@param logfile string the fullpath to the logfile
+M.toggle_log_view = function(logfile)
+ local log_viewer = lvim.log.viewer.cmd
+ if vim.fn.executable(log_viewer) ~= 1 then
+ log_viewer = "less +F"
+ end
+ Log:debug("attempting to open: " .. logfile)
+ log_viewer = log_viewer .. " " .. logfile
+ local term_opts = vim.tbl_deep_extend("force", lvim.builtin.terminal, {
+ cmd = log_viewer,
+ open_mapping = lvim.log.viewer.layout_config.open_mapping,
+ direction = lvim.log.viewer.layout_config.direction,
+ -- TODO: this might not be working as expected
+ size = lvim.log.viewer.layout_config.size,
+ float_opts = lvim.log.viewer.layout_config.float_opts,
+ })
+
+ local Terminal = require("toggleterm.terminal").Terminal
+ local log_view = Terminal:new(term_opts)
+ log_view:toggle()
+end
+
+M.lazygit_toggle = function()
+ local Terminal = require("toggleterm.terminal").Terminal
+ local lazygit = Terminal:new {
+ cmd = "lazygit",
+ hidden = true,
+ direction = "float",
+ float_opts = {
+ border = "none",
+ width = 100000,
+ height = 100000,
+ zindex = 200,
+ },
+ on_open = function(_)
+ vim.cmd "startinsert!"
+ end,
+ on_close = function(_) end,
+ count = 99,
+ }
+ lazygit:toggle()
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/core/theme.lua b/mac/.config/LunarVim/lua/lvim/core/theme.lua
new file mode 100644
index 0000000..5a39f04
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/core/theme.lua
@@ -0,0 +1,96 @@
+local Log = require "lvim.core.log"
+
+local M = {}
+
+M.config = function()
+ lvim.builtin.theme = {
+ name = "lunar",
+ lunar = {
+ options = { -- currently unused
+ },
+ },
+ tokyonight = {
+ options = {
+ on_highlights = function(hl, c)
+ hl.IndentBlanklineContextChar = {
+ fg = c.dark5,
+ }
+ hl.TSConstructor = {
+ fg = c.blue1,
+ }
+ hl.TSTagDelimiter = {
+ fg = c.dark5,
+ }
+ end,
+ style = "night", -- The theme comes in three styles, `storm`, a darker variant `night` and `day`
+ transparent = lvim.transparent_window, -- Enable this to disable setting the background color
+ terminal_colors = true, -- Configure the colors used when opening a `:terminal` in Neovim
+ styles = {
+ -- Style to be applied to different syntax groups
+ -- Value is any valid attr-list value for `:help nvim_set_hl`
+ comments = { italic = true },
+ keywords = { italic = true },
+ functions = {},
+ variables = {},
+ -- Background styles. Can be "dark", "transparent" or "normal"
+ sidebars = "dark", -- style for sidebars, see below
+ floats = "dark", -- style for floating windows
+ },
+ -- Set a darker background on sidebar-like windows. For example: `["qf", "vista_kind", "terminal", "packer"]`
+ sidebars = {
+ "qf",
+ "vista_kind",
+ "terminal",
+ "packer",
+ "spectre_panel",
+ "NeogitStatus",
+ "help",
+ },
+ day_brightness = 0.3, -- Adjusts the brightness of the colors of the **Day** style. Number between 0 and 1, from dull to vibrant colors
+ hide_inactive_statusline = false, -- Enabling this option, will hide inactive statuslines and replace them with a thin border instead. Should work with the standard **StatusLine** and **LuaLine**.
+ dim_inactive = false, -- dims inactive windows
+ lualine_bold = false, -- When `true`, section headers in the lualine theme will be bold
+ use_background = true, -- can be light/dark/auto. When auto, background will be set to vim.o.background
+ },
+ },
+ }
+end
+
+M.setup = function()
+ -- avoid running in headless mode since it's harder to detect failures
+ if #vim.api.nvim_list_uis() == 0 then
+ Log:debug "headless mode detected, skipping running setup for lualine"
+ return
+ end
+
+ local selected_theme = lvim.builtin.theme.name
+
+ if vim.startswith(lvim.colorscheme, selected_theme) then
+ local status_ok, plugin = pcall(require, selected_theme)
+ if not status_ok then
+ return
+ end
+ pcall(function()
+ plugin.setup(lvim.builtin.theme[selected_theme].options)
+ end)
+ end
+
+ -- ref: https://github.com/neovim/neovim/issues/18201#issuecomment-1104754564
+ local colors = vim.api.nvim_get_runtime_file(("colors/%s.*"):format(lvim.colorscheme), false)
+ if #colors == 0 then
+ Log:debug(string.format("Could not find '%s' colorscheme", lvim.colorscheme))
+ return
+ end
+
+ vim.g.colors_name = lvim.colorscheme
+ vim.cmd("colorscheme " .. lvim.colorscheme)
+
+ if package.loaded.lualine then
+ require("lvim.core.lualine").setup()
+ end
+ if package.loaded.lir then
+ require("lvim.core.lir").icon_setup()
+ end
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/core/treesitter.lua b/mac/.config/LunarVim/lua/lvim/core/treesitter.lua
new file mode 100644
index 0000000..bdb127c
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/core/treesitter.lua
@@ -0,0 +1,135 @@
+local M = {}
+local Log = require "lvim.core.log"
+
+function M.config()
+ lvim.builtin.treesitter = {
+ on_config_done = nil,
+
+ -- A list of parser names, or "all"
+ ensure_installed = { "comment", "markdown_inline", "regex" },
+
+ -- List of parsers to ignore installing (for "all")
+ ignore_install = {},
+
+ -- A directory to install the parsers into.
+ -- By default parsers are installed to either the package dir, or the "site" dir.
+ -- If a custom path is used (not nil) it must be added to the runtimepath.
+ parser_install_dir = nil,
+
+ -- Install parsers synchronously (only applied to `ensure_installed`)
+ sync_install = false,
+
+ -- Automatically install missing parsers when entering buffer
+ auto_install = true,
+
+ matchup = {
+ enable = false, -- mandatory, false will disable the whole extension
+ -- disable = { "c", "ruby" }, -- optional, list of language that will be disabled
+ },
+ highlight = {
+ enable = true, -- false will disable the whole extension
+ additional_vim_regex_highlighting = false,
+ disable = function(lang, buf)
+ if vim.tbl_contains({ "latex" }, lang) then
+ return true
+ end
+
+ local status_ok, big_file_detected = pcall(vim.api.nvim_buf_get_var, buf, "bigfile_disable_treesitter")
+ return status_ok and big_file_detected
+ end,
+ },
+ context_commentstring = {
+ enable = true,
+ enable_autocmd = false,
+ config = {
+ -- Languages that have a single comment style
+ typescript = "// %s",
+ css = "/* %s */",
+ scss = "/* %s */",
+ html = "<!-- %s -->",
+ svelte = "<!-- %s -->",
+ vue = "<!-- %s -->",
+ json = "",
+ },
+ },
+ indent = { enable = true, disable = { "yaml", "python" } },
+ autotag = { enable = false },
+ textobjects = {
+ swap = {
+ enable = false,
+ -- swap_next = textobj_swap_keymaps,
+ },
+ -- move = textobj_move_keymaps,
+ select = {
+ enable = false,
+ -- keymaps = textobj_sel_keymaps,
+ },
+ },
+ textsubjects = {
+ enable = false,
+ keymaps = { ["."] = "textsubjects-smart", [";"] = "textsubjects-big" },
+ },
+ playground = {
+ enable = false,
+ disable = {},
+ updatetime = 25, -- Debounced time for highlighting nodes in the playground from source code
+ persist_queries = false, -- Whether the query persists across vim sessions
+ keybindings = {
+ toggle_query_editor = "o",
+ toggle_hl_groups = "i",
+ toggle_injected_languages = "t",
+ toggle_anonymous_nodes = "a",
+ toggle_language_display = "I",
+ focus_language = "f",
+ unfocus_language = "F",
+ update = "R",
+ goto_node = "<cr>",
+ show_help = "?",
+ },
+ },
+ rainbow = {
+ enable = false,
+ extended_mode = true, -- Highlight also non-parentheses delimiters, boolean or table: lang -> boolean
+ max_file_lines = 1000, -- Do not enable for files with more than 1000 lines, int
+ },
+ }
+end
+
+function M.setup()
+ -- avoid running in headless mode since it's harder to detect failures
+ if #vim.api.nvim_list_uis() == 0 then
+ Log:debug "headless mode detected, skipping running setup for treesitter"
+ return
+ end
+
+ local ts_status_ok, treesitter_configs = pcall(require, "nvim-treesitter.configs")
+ if not ts_status_ok then
+ Log:error "Failed to load nvim-treesitter.configs"
+ return
+ end
+
+ local status_ok, ts_context_commentstring = pcall(require, "ts_context_commentstring")
+ if not status_ok then
+ Log:error "Failed to load ts_context_commentstring"
+ return
+ end
+
+ local opts = vim.deepcopy(lvim.builtin.treesitter)
+
+ -- handle deprecated API, https://github.com/JoosepAlviste/nvim-ts-context-commentstring/issues/82
+ ts_context_commentstring.setup(opts.context_commentstring)
+ opts.context_commentstring = nil
+
+ treesitter_configs.setup(opts)
+
+ if lvim.builtin.treesitter.on_config_done then
+ lvim.builtin.treesitter.on_config_done(treesitter_configs)
+ end
+
+ -- handle deprecated API, https://github.com/windwp/nvim-autopairs/pull/324
+ local ts_utils = require "nvim-treesitter.ts_utils"
+ ts_utils.is_in_node_range = vim.treesitter.is_in_node_range
+ ts_utils.get_node_range = vim.treesitter.get_node_range
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/core/which-key.lua b/mac/.config/LunarVim/lua/lvim/core/which-key.lua
new file mode 100644
index 0000000..ab548d9
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/core/which-key.lua
@@ -0,0 +1,333 @@
+local M = {}
+M.config = function()
+ lvim.builtin.which_key = {
+ ---@usage disable which-key completely [not recommended]
+ active = true,
+ on_config_done = nil,
+ setup = {
+ plugins = {
+ marks = false, -- shows a list of your marks on ' and `
+ registers = false, -- shows your registers on " in NORMAL or <C-r> in INSERT mode
+ spelling = {
+ enabled = true,
+ suggestions = 20,
+ }, -- use which-key for spelling hints
+ -- the presets plugin, adds help for a bunch of default keybindings in Neovim
+ -- No actual key bindings are created
+ presets = {
+ operators = false, -- adds help for operators like d, y, ...
+ motions = false, -- adds help for motions
+ text_objects = false, -- help for text objects triggered after entering an operator
+ windows = false, -- default bindings on <c-w>
+ nav = false, -- misc bindings to work with windows
+ z = false, -- bindings for folds, spelling and others prefixed with z
+ g = false, -- bindings for prefixed with g
+ },
+ },
+ -- add operators that will trigger motion and text object completion
+ -- to enable all native operators, set the preset / operators plugin above
+ operators = { gc = "Comments" },
+ key_labels = {
+ -- override the label used to display some keys. It doesn't effect WK in any other way.
+ -- For example:
+ -- ["<space>"] = "SPC",
+ -- ["<cr>"] = "RET",
+ -- ["<tab>"] = "TAB",
+ },
+ icons = {
+ breadcrumb = lvim.icons.ui.DoubleChevronRight, -- symbol used in the command line area that shows your active key combo
+ separator = lvim.icons.ui.BoldArrowRight, -- symbol used between a key and it's label
+ group = lvim.icons.ui.Plus, -- symbol prepended to a group
+ },
+ popup_mappings = {
+ scroll_down = "<c-d>", -- binding to scroll down inside the popup
+ scroll_up = "<c-u>", -- binding to scroll up inside the popup
+ },
+ window = {
+ border = "single", -- none, single, double, shadow
+ position = "bottom", -- bottom, top
+ margin = { 1, 0, 1, 0 }, -- extra window margin [top, right, bottom, left]
+ padding = { 2, 2, 2, 2 }, -- extra window padding [top, right, bottom, left]
+ winblend = 0,
+ },
+ layout = {
+ height = { min = 4, max = 25 }, -- min and max height of the columns
+ width = { min = 20, max = 50 }, -- min and max width of the columns
+ spacing = 3, -- spacing between columns
+ align = "left", -- align columns left, center or right
+ },
+ ignore_missing = true, -- enable this to hide mappings for which you didn't specify a label
+ hidden = { "<silent>", "<cmd>", "<Cmd>", "<CR>", "call", "lua", "^:", "^ " }, -- hide mapping boilerplate
+ show_help = true, -- show help message on the command line when the popup is visible
+ show_keys = true, -- show the currently pressed key and its label as a message in the command line
+ triggers = "auto", -- automatically setup triggers
+ -- triggers = {"<leader>"} -- or specify a list manually
+ triggers_blacklist = {
+ -- list of mode / prefixes that should never be hooked by WhichKey
+ -- this is mostly relevant for key maps that start with a native binding
+ -- most people should not need to change this
+ i = { "j", "k" },
+ v = { "j", "k" },
+ },
+ -- disable the WhichKey popup for certain buf types and file types.
+ -- Disabled by default for Telescope
+ disable = {
+ buftypes = {},
+ filetypes = { "TelescopePrompt" },
+ },
+ },
+
+ opts = {
+ mode = "n", -- NORMAL mode
+ prefix = "<leader>",
+ buffer = nil, -- Global mappings. Specify a buffer number for buffer local mappings
+ silent = true, -- use `silent` when creating keymaps
+ noremap = true, -- use `noremap` when creating keymaps
+ nowait = true, -- use `nowait` when creating keymaps
+ },
+ vopts = {
+ mode = "v", -- VISUAL mode
+ prefix = "<leader>",
+ buffer = nil, -- Global mappings. Specify a buffer number for buffer local mappings
+ silent = true, -- use `silent` when creating keymaps
+ noremap = true, -- use `noremap` when creating keymaps
+ nowait = true, -- use `nowait` when creating keymaps
+ },
+ -- NOTE: Prefer using : over <cmd> as the latter avoids going back in normal-mode.
+ -- see https://neovim.io/doc/user/map.html#:map-cmd
+ vmappings = {
+ ["/"] = { "<Plug>(comment_toggle_linewise_visual)", "Comment toggle linewise (visual)" },
+ l = {
+ name = "LSP",
+ a = { "<cmd>lua vim.lsp.buf.code_action()<cr>", "Code Action" },
+ },
+ g = {
+ name = "Git",
+ r = { "<cmd>Gitsigns reset_hunk<cr>", "Reset Hunk" },
+ s = { "<cmd>Gitsigns stage_hunk<cr>", "Stage Hunk" },
+ },
+ },
+ mappings = {
+ [";"] = { "<cmd>Alpha<CR>", "Dashboard" },
+ ["w"] = { "<cmd>w!<CR>", "Save" },
+ ["q"] = { "<cmd>confirm q<CR>", "Quit" },
+ ["/"] = { "<Plug>(comment_toggle_linewise_current)", "Comment toggle current line" },
+ ["c"] = { "<cmd>BufferKill<CR>", "Close Buffer" },
+ ["f"] = {
+ function()
+ require("lvim.core.telescope.custom-finders").find_project_files { previewer = false }
+ end,
+ "Find File",
+ },
+ ["h"] = { "<cmd>nohlsearch<CR>", "No Highlight" },
+ ["e"] = { "<cmd>NvimTreeToggle<CR>", "Explorer" },
+ b = {
+ name = "Buffers",
+ j = { "<cmd>BufferLinePick<cr>", "Jump" },
+ f = { "<cmd>Telescope buffers previewer=false<cr>", "Find" },
+ b = { "<cmd>BufferLineCyclePrev<cr>", "Previous" },
+ n = { "<cmd>BufferLineCycleNext<cr>", "Next" },
+ W = { "<cmd>noautocmd w<cr>", "Save without formatting (noautocmd)" },
+ -- w = { "<cmd>BufferWipeout<cr>", "Wipeout" }, -- TODO: implement this for bufferline
+ e = {
+ "<cmd>BufferLinePickClose<cr>",
+ "Pick which buffer to close",
+ },
+ h = { "<cmd>BufferLineCloseLeft<cr>", "Close all to the left" },
+ l = {
+ "<cmd>BufferLineCloseRight<cr>",
+ "Close all to the right",
+ },
+ D = {
+ "<cmd>BufferLineSortByDirectory<cr>",
+ "Sort by directory",
+ },
+ L = {
+ "<cmd>BufferLineSortByExtension<cr>",
+ "Sort by language",
+ },
+ },
+ d = {
+ name = "Debug",
+ t = { "<cmd>lua require'dap'.toggle_breakpoint()<cr>", "Toggle Breakpoint" },
+ b = { "<cmd>lua require'dap'.step_back()<cr>", "Step Back" },
+ c = { "<cmd>lua require'dap'.continue()<cr>", "Continue" },
+ C = { "<cmd>lua require'dap'.run_to_cursor()<cr>", "Run To Cursor" },
+ d = { "<cmd>lua require'dap'.disconnect()<cr>", "Disconnect" },
+ g = { "<cmd>lua require'dap'.session()<cr>", "Get Session" },
+ i = { "<cmd>lua require'dap'.step_into()<cr>", "Step Into" },
+ o = { "<cmd>lua require'dap'.step_over()<cr>", "Step Over" },
+ u = { "<cmd>lua require'dap'.step_out()<cr>", "Step Out" },
+ p = { "<cmd>lua require'dap'.pause()<cr>", "Pause" },
+ r = { "<cmd>lua require'dap'.repl.toggle()<cr>", "Toggle Repl" },
+ s = { "<cmd>lua require'dap'.continue()<cr>", "Start" },
+ q = { "<cmd>lua require'dap'.close()<cr>", "Quit" },
+ U = { "<cmd>lua require'dapui'.toggle({reset = true})<cr>", "Toggle UI" },
+ },
+ p = {
+ name = "Plugins",
+ i = { "<cmd>Lazy install<cr>", "Install" },
+ s = { "<cmd>Lazy sync<cr>", "Sync" },
+ S = { "<cmd>Lazy clear<cr>", "Status" },
+ c = { "<cmd>Lazy clean<cr>", "Clean" },
+ u = { "<cmd>Lazy update<cr>", "Update" },
+ p = { "<cmd>Lazy profile<cr>", "Profile" },
+ l = { "<cmd>Lazy log<cr>", "Log" },
+ d = { "<cmd>Lazy debug<cr>", "Debug" },
+ },
+
+ -- " Available Debug Adapters:
+ -- " https://microsoft.github.io/debug-adapter-protocol/implementors/adapters/
+ -- " Adapter configuration and installation instructions:
+ -- " https://github.com/mfussenegger/nvim-dap/wiki/Debug-Adapter-installation
+ -- " Debug Adapter protocol:
+ -- " https://microsoft.github.io/debug-adapter-protocol/
+ -- " Debugging
+ g = {
+ name = "Git",
+ g = { "<cmd>lua require 'lvim.core.terminal'.lazygit_toggle()<cr>", "Lazygit" },
+ j = { "<cmd>lua require 'gitsigns'.nav_hunk('next', {navigation_message = false})<cr>", "Next Hunk" },
+ k = { "<cmd>lua require 'gitsigns'.nav_hunk('prev', {navigation_message = false})<cr>", "Prev Hunk" },
+ l = { "<cmd>lua require 'gitsigns'.blame_line()<cr>", "Blame" },
+ L = { "<cmd>lua require 'gitsigns'.blame_line({full=true})<cr>", "Blame Line (full)" },
+ p = { "<cmd>lua require 'gitsigns'.preview_hunk()<cr>", "Preview Hunk" },
+ r = { "<cmd>lua require 'gitsigns'.reset_hunk()<cr>", "Reset Hunk" },
+ R = { "<cmd>lua require 'gitsigns'.reset_buffer()<cr>", "Reset Buffer" },
+ s = { "<cmd>lua require 'gitsigns'.stage_hunk()<cr>", "Stage Hunk" },
+ u = {
+ "<cmd>lua require 'gitsigns'.undo_stage_hunk()<cr>",
+ "Undo Stage Hunk",
+ },
+ o = { "<cmd>Telescope git_status<cr>", "Open changed file" },
+ b = { "<cmd>Telescope git_branches<cr>", "Checkout branch" },
+ c = { "<cmd>Telescope git_commits<cr>", "Checkout commit" },
+ C = {
+ "<cmd>Telescope git_bcommits<cr>",
+ "Checkout commit(for current file)",
+ },
+ d = {
+ "<cmd>Gitsigns diffthis HEAD<cr>",
+ "Git Diff",
+ },
+ },
+ l = {
+ name = "LSP",
+ a = { "<cmd>lua vim.lsp.buf.code_action()<cr>", "Code Action" },
+ d = { "<cmd>Telescope diagnostics bufnr=0 theme=get_ivy<cr>", "Buffer Diagnostics" },
+ w = { "<cmd>Telescope diagnostics<cr>", "Diagnostics" },
+ f = { "<cmd>lua require('lvim.lsp.utils').format()<cr>", "Format" },
+ i = { "<cmd>LspInfo<cr>", "Info" },
+ I = { "<cmd>Mason<cr>", "Mason Info" },
+ j = {
+ "<cmd>lua vim.diagnostic.goto_next()<cr>",
+ "Next Diagnostic",
+ },
+ k = {
+ "<cmd>lua vim.diagnostic.goto_prev()<cr>",
+ "Prev Diagnostic",
+ },
+ l = { "<cmd>lua vim.lsp.codelens.run()<cr>", "CodeLens Action" },
+ q = { "<cmd>lua vim.diagnostic.setloclist()<cr>", "Quickfix" },
+ r = { "<cmd>lua vim.lsp.buf.rename()<cr>", "Rename" },
+ s = { "<cmd>Telescope lsp_document_symbols<cr>", "Document Symbols" },
+ S = {
+ "<cmd>Telescope lsp_dynamic_workspace_symbols<cr>",
+ "Workspace Symbols",
+ },
+ e = { "<cmd>Telescope quickfix<cr>", "Telescope Quickfix" },
+ },
+ L = {
+ name = "+LunarVim",
+ c = {
+ "<cmd>edit " .. get_config_dir() .. "/config.lua<cr>",
+ "Edit config.lua",
+ },
+ d = { "<cmd>LvimDocs<cr>", "View LunarVim's docs" },
+ f = {
+ "<cmd>lua require('lvim.core.telescope.custom-finders').find_lunarvim_files()<cr>",
+ "Find LunarVim files",
+ },
+ g = {
+ "<cmd>lua require('lvim.core.telescope.custom-finders').grep_lunarvim_files()<cr>",
+ "Grep LunarVim files",
+ },
+ k = { "<cmd>Telescope keymaps<cr>", "View LunarVim's keymappings" },
+ i = {
+ "<cmd>lua require('lvim.core.info').toggle_popup(vim.bo.filetype)<cr>",
+ "Toggle LunarVim Info",
+ },
+ I = {
+ "<cmd>lua require('lvim.core.telescope.custom-finders').view_lunarvim_changelog()<cr>",
+ "View LunarVim's changelog",
+ },
+ l = {
+ name = "+logs",
+ d = {
+ "<cmd>lua require('lvim.core.terminal').toggle_log_view(require('lvim.core.log').get_path())<cr>",
+ "view default log",
+ },
+ D = {
+ "<cmd>lua vim.fn.execute('edit ' .. require('lvim.core.log').get_path())<cr>",
+ "Open the default logfile",
+ },
+ l = {
+ "<cmd>lua require('lvim.core.terminal').toggle_log_view(vim.lsp.get_log_path())<cr>",
+ "view lsp log",
+ },
+ L = { "<cmd>lua vim.fn.execute('edit ' .. vim.lsp.get_log_path())<cr>", "Open the LSP logfile" },
+ n = {
+ "<cmd>lua require('lvim.core.terminal').toggle_log_view(os.getenv('NVIM_LOG_FILE'))<cr>",
+ "view neovim log",
+ },
+ N = { "<cmd>edit $NVIM_LOG_FILE<cr>", "Open the Neovim logfile" },
+ },
+ r = { "<cmd>LvimReload<cr>", "Reload LunarVim's configuration" },
+ u = { "<cmd>LvimUpdate<cr>", "Update LunarVim" },
+ },
+ s = {
+ name = "Search",
+ b = { "<cmd>Telescope git_branches<cr>", "Checkout branch" },
+ c = { "<cmd>Telescope colorscheme<cr>", "Colorscheme" },
+ f = { "<cmd>Telescope find_files<cr>", "Find File" },
+ h = { "<cmd>Telescope help_tags<cr>", "Find Help" },
+ H = { "<cmd>Telescope highlights<cr>", "Find highlight groups" },
+ M = { "<cmd>Telescope man_pages<cr>", "Man Pages" },
+ r = { "<cmd>Telescope oldfiles<cr>", "Open Recent File" },
+ R = { "<cmd>Telescope registers<cr>", "Registers" },
+ t = { "<cmd>Telescope live_grep<cr>", "Text" },
+ k = { "<cmd>Telescope keymaps<cr>", "Keymaps" },
+ C = { "<cmd>Telescope commands<cr>", "Commands" },
+ l = { "<cmd>Telescope resume<cr>", "Resume last search" },
+ p = {
+ "<cmd>lua require('telescope.builtin').colorscheme({enable_preview = true})<cr>",
+ "Colorscheme with Preview",
+ },
+ },
+ T = {
+ name = "Treesitter",
+ i = { ":TSConfigInfo<cr>", "Info" },
+ },
+ },
+ }
+end
+
+M.setup = function()
+ local which_key = require "which-key"
+
+ which_key.setup(lvim.builtin.which_key.setup)
+
+ local opts = lvim.builtin.which_key.opts
+ local vopts = lvim.builtin.which_key.vopts
+
+ local mappings = lvim.builtin.which_key.mappings
+ local vmappings = lvim.builtin.which_key.vmappings
+
+ which_key.register(mappings, opts)
+ which_key.register(vmappings, vopts)
+
+ if lvim.builtin.which_key.on_config_done then
+ lvim.builtin.which_key.on_config_done(which_key)
+ end
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/icons.lua b/mac/.config/LunarVim/lua/lvim/icons.lua
new file mode 100644
index 0000000..d9fb4cd
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/icons.lua
@@ -0,0 +1,154 @@
+return {
+ kind = {
+ Array = "",
+ Boolean = "",
+ Class = "",
+ Color = "",
+ Constant = "",
+ Constructor = "",
+ Enum = "",
+ EnumMember = "",
+ Event = "",
+ Field = "",
+ File = "",
+ Folder = "󰉋",
+ Function = "",
+ Interface = "",
+ Key = "",
+ Keyword = "",
+ Method = "",
+ Module = "",
+ Namespace = "",
+ Null = "󰟢",
+ Number = "",
+ Object = "",
+ Operator = "",
+ Package = "",
+ Property = "",
+ Reference = "",
+ Snippet = "",
+ String = "",
+ Struct = "",
+ Text = "",
+ TypeParameter = "",
+ Unit = "",
+ Value = "",
+ Variable = "",
+ },
+ git = {
+ LineAdded = "",
+ LineModified = "",
+ LineRemoved = "",
+ FileDeleted = "",
+ FileIgnored = "◌",
+ FileRenamed = "",
+ FileStaged = "S",
+ FileUnmerged = "",
+ FileUnstaged = "",
+ FileUntracked = "U",
+ Diff = "",
+ Repo = "",
+ Octoface = "",
+ Branch = "",
+ },
+ ui = {
+ ArrowCircleDown = "",
+ ArrowCircleLeft = "",
+ ArrowCircleRight = "",
+ ArrowCircleUp = "",
+ BoldArrowDown = "",
+ BoldArrowLeft = "",
+ BoldArrowRight = "",
+ BoldArrowUp = "",
+ BoldClose = "",
+ BoldDividerLeft = "",
+ BoldDividerRight = "",
+ BoldLineLeft = "▎",
+ BookMark = "",
+ BoxChecked = "",
+ Bug = "",
+ Stacks = "",
+ Scopes = "",
+ Watches = "󰂥",
+ DebugConsole = "",
+ Calendar = "",
+ Check = "",
+ ChevronRight = "",
+ ChevronShortDown = "",
+ ChevronShortLeft = "",
+ ChevronShortRight = "",
+ ChevronShortUp = "",
+ Circle = " ",
+ Close = "󰅖",
+ CloudDownload = "",
+ Code = "",
+ Comment = "",
+ Dashboard = "",
+ DividerLeft = "",
+ DividerRight = "",
+ DoubleChevronRight = "»",
+ Ellipsis = "",
+ EmptyFolder = "",
+ EmptyFolderOpen = "",
+ File = "",
+ FileSymlink = "",
+ Files = "",
+ FindFile = "󰈞",
+ FindText = "󰊄",
+ Fire = "",
+ Folder = "󰉋",
+ FolderOpen = "",
+ FolderSymlink = "",
+ Forward = "",
+ Gear = "",
+ History = "",
+ Lightbulb = "",
+ LineLeft = "▏",
+ LineMiddle = "│",
+ List = "",
+ Lock = "",
+ NewFile = "",
+ Note = "",
+ Package = "",
+ Pencil = "󰏫",
+ Plus = "",
+ Project = "",
+ Search = "",
+ SignIn = "",
+ SignOut = "",
+ Tab = "󰌒",
+ Table = "",
+ Target = "󰀘",
+ Telescope = "",
+ Text = "",
+ Tree = "",
+ Triangle = "󰐊",
+ TriangleShortArrowDown = "",
+ TriangleShortArrowLeft = "",
+ TriangleShortArrowRight = "",
+ TriangleShortArrowUp = "",
+ },
+ diagnostics = {
+ BoldError = "",
+ Error = "",
+ BoldWarning = "",
+ Warning = "",
+ BoldInformation = "",
+ Information = "",
+ BoldQuestion = "",
+ Question = "",
+ BoldHint = "",
+ Hint = "󰌶",
+ Debug = "",
+ Trace = "✎",
+ },
+ misc = {
+ Robot = "󰚩",
+ Squirrel = "",
+ Tag = "",
+ Watch = "",
+ Smiley = "",
+ Package = "",
+ CircuitBoard = "",
+ },
+}
diff --git a/mac/.config/LunarVim/lua/lvim/interface/popup.lua b/mac/.config/LunarVim/lua/lvim/interface/popup.lua
new file mode 100644
index 0000000..84a27e1
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/interface/popup.lua
@@ -0,0 +1,64 @@
+local Popup = {}
+
+--- Create a new floating window
+-- @param config The configuration passed to vim.api.nvim_open_win
+-- @param win_opts The options registered with vim.api.nvim_win_set_option
+-- @param buf_opts The options registered with vim.api.nvim_buf_set_option
+-- @return A new popup
+function Popup:new(opts)
+ opts = opts or {}
+ opts.layout = opts.layout or {}
+ opts.win_opts = opts.win_opts or {}
+ opts.buf_opts = opts.buf_opts or {}
+
+ Popup.__index = Popup
+
+ local editor_layout = {
+ height = vim.o.lines - vim.o.cmdheight - 2, -- Add margin for status and buffer line
+ width = vim.o.columns,
+ }
+ local popup_layout = {
+ relative = "editor",
+ height = math.floor(editor_layout.height * 0.9),
+ width = math.floor(editor_layout.width * 0.8),
+ style = "minimal",
+ border = "rounded",
+ }
+ popup_layout.row = math.floor((editor_layout.height - popup_layout.height) / 2)
+ popup_layout.col = math.floor((editor_layout.width - popup_layout.width) / 2)
+
+ local obj = {
+ buffer = vim.api.nvim_create_buf(false, true),
+ layout = vim.tbl_deep_extend("force", popup_layout, opts.layout),
+ win_opts = opts.win_opts,
+ buf_opts = opts.buf_opts,
+ }
+
+ setmetatable(obj, Popup)
+
+ return obj
+end
+
+--- Display the popup with the provided content
+-- @param content_provider A function accepting the popup's layout and returning the content to display
+function Popup:display(content_provider)
+ self.win_id = vim.api.nvim_open_win(self.buffer, true, self.layout)
+ vim.api.nvim_command(
+ string.format("autocmd BufHidden,BufLeave <buffer> ++once lua pcall(vim.api.nvim_win_close, %d, true)", self.win_id)
+ )
+
+ local lines = content_provider(self.layout)
+ vim.api.nvim_buf_set_lines(self.bufnr or 0, 0, -1, false, lines)
+
+ -- window options
+ for key, value in pairs(self.win_opts) do
+ vim.api.nvim_set_option_value(key, value, { win = self.win_id or 0, scope = "local" })
+ end
+
+ -- buffer options
+ for key, value in pairs(self.buf_opts) do
+ vim.api.nvim_set_option_value(key, value, { buf = self.buffer })
+ end
+end
+
+return Popup
diff --git a/mac/.config/LunarVim/lua/lvim/interface/text.lua b/mac/.config/LunarVim/lua/lvim/interface/text.lua
new file mode 100644
index 0000000..0266d52
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/interface/text.lua
@@ -0,0 +1,95 @@
+local M = {}
+
+local function max_len_line(lines)
+ local max_len = 0
+
+ for _, line in ipairs(lines) do
+ local line_len = line:len()
+ if line_len > max_len then
+ max_len = line_len
+ end
+ end
+
+ return max_len
+end
+
+--- Left align lines relatively to the parent container
+-- @param container The container where lines will be displayed
+-- @param lines The text to align
+-- @param alignment The alignment value, range: [0-1]
+function M.align_left(container, lines, alignment)
+ local max_len = max_len_line(lines)
+ local indent_amount = math.ceil(math.max(container.width - max_len, 0) * alignment)
+ return M.shift_right(lines, indent_amount)
+end
+
+--- Center align lines relatively to the parent container
+-- @param container The container where lines will be displayed
+-- @param lines The text to align
+-- @param alignment The alignment value, range: [0-1]
+function M.align_center(container, lines, alignment)
+ local output = {}
+ local max_len = max_len_line(lines)
+
+ for _, line in ipairs(lines) do
+ local padding = string.rep(" ", (math.max(container.width, max_len) - line:len()) * alignment)
+ table.insert(output, padding .. line)
+ end
+
+ return output
+end
+
+--- Shift lines by a given amount
+-- @params lines The lines the shift
+-- @param amount The amount of spaces to add
+function M.shift_right(lines, amount)
+ local output = {}
+ local padding = string.rep(" ", amount)
+
+ for _, line in ipairs(lines) do
+ table.insert(output, padding .. line)
+ end
+
+ return output
+end
+
+--- Pretty format tables
+-- @param entries The table to format
+-- @param col_count The number of column to span the table on
+-- @param col_sep The separator between each column, default: " "
+function M.format_table(entries, col_count, col_sep)
+ col_sep = col_sep or " "
+
+ local col_rows = math.ceil(vim.tbl_count(entries) / col_count)
+ local cols = {}
+ local count = 0
+
+ for i, entry in ipairs(entries) do
+ if ((i - 1) % col_rows) == 0 then
+ table.insert(cols, {})
+ count = count + 1
+ end
+ table.insert(cols[count], entry)
+ end
+
+ local col_max_len = {}
+ for _, col in ipairs(cols) do
+ table.insert(col_max_len, max_len_line(col))
+ end
+
+ local output = {}
+ for i, col in ipairs(cols) do
+ for j, entry in ipairs(col) do
+ if not output[j] then
+ output[j] = entry
+ else
+ local padding = string.rep(" ", col_max_len[i - 1] - cols[i - 1][j]:len())
+ output[j] = output[j] .. padding .. col_sep .. entry
+ end
+ end
+ end
+
+ return output
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/keymappings.lua b/mac/.config/LunarVim/lua/lvim/keymappings.lua
new file mode 100644
index 0000000..e7010a3
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/keymappings.lua
@@ -0,0 +1,177 @@
+local M = {}
+local Log = require "lvim.core.log"
+
+local generic_opts_any = { noremap = true, silent = true }
+
+local generic_opts = {
+ insert_mode = generic_opts_any,
+ normal_mode = generic_opts_any,
+ visual_mode = generic_opts_any,
+ visual_block_mode = generic_opts_any,
+ command_mode = generic_opts_any,
+ operator_pending_mode = generic_opts_any,
+ term_mode = { silent = true },
+}
+
+local mode_adapters = {
+ insert_mode = "i",
+ normal_mode = "n",
+ term_mode = "t",
+ visual_mode = "v",
+ visual_block_mode = "x",
+ command_mode = "c",
+ operator_pending_mode = "o",
+}
+
+---@class Keys
+---@field insert_mode table
+---@field normal_mode table
+---@field terminal_mode table
+---@field visual_mode table
+---@field visual_block_mode table
+---@field command_mode table
+---@field operator_pending_mode table
+
+local defaults = {
+ insert_mode = {
+ -- Move current line / block with Alt-j/k ala vscode.
+ ["<A-j>"] = "<Esc>:m .+1<CR>==gi",
+ -- Move current line / block with Alt-j/k ala vscode.
+ ["<A-k>"] = "<Esc>:m .-2<CR>==gi",
+ -- navigation
+ ["<A-Up>"] = "<C-\\><C-N><C-w>k",
+ ["<A-Down>"] = "<C-\\><C-N><C-w>j",
+ ["<A-Left>"] = "<C-\\><C-N><C-w>h",
+ ["<A-Right>"] = "<C-\\><C-N><C-w>l",
+ },
+
+ normal_mode = {
+ -- Better window movement
+ ["<C-h>"] = "<C-w>h",
+ ["<C-j>"] = "<C-w>j",
+ ["<C-k>"] = "<C-w>k",
+ ["<C-l>"] = "<C-w>l",
+
+ -- Resize with arrows
+ ["<C-Up>"] = ":resize -2<CR>",
+ ["<C-Down>"] = ":resize +2<CR>",
+ ["<C-Left>"] = ":vertical resize -2<CR>",
+ ["<C-Right>"] = ":vertical resize +2<CR>",
+
+ -- Move current line / block with Alt-j/k a la vscode.
+ ["<A-j>"] = ":m .+1<CR>==",
+ ["<A-k>"] = ":m .-2<CR>==",
+
+ -- QuickFix
+ ["]q"] = ":cnext<CR>",
+ ["[q"] = ":cprev<CR>",
+ ["<C-q>"] = ":call QuickFixToggle()<CR>",
+ },
+
+ term_mode = {
+ -- Terminal window navigation
+ ["<C-h>"] = "<C-\\><C-N><C-w>h",
+ ["<C-j>"] = "<C-\\><C-N><C-w>j",
+ ["<C-k>"] = "<C-\\><C-N><C-w>k",
+ ["<C-l>"] = "<C-\\><C-N><C-w>l",
+ },
+
+ visual_mode = {
+ -- Better indenting
+ ["<"] = "<gv",
+ [">"] = ">gv",
+
+ -- ["p"] = '"0p',
+ -- ["P"] = '"0P',
+ },
+
+ visual_block_mode = {
+ -- Move current line / block with Alt-j/k ala vscode.
+ ["<A-j>"] = ":m '>+1<CR>gv-gv",
+ ["<A-k>"] = ":m '<-2<CR>gv-gv",
+ },
+
+ command_mode = {
+ -- navigate tab completion with <c-j> and <c-k>
+ -- runs conditionally
+ ["<C-j>"] = { 'pumvisible() ? "\\<C-n>" : "\\<C-j>"', { expr = true, noremap = true } },
+ ["<C-k>"] = { 'pumvisible() ? "\\<C-p>" : "\\<C-k>"', { expr = true, noremap = true } },
+ },
+}
+
+if vim.fn.has "mac" == 1 then
+ defaults.normal_mode["<A-Up>"] = defaults.normal_mode["<C-Up>"]
+ defaults.normal_mode["<A-Down>"] = defaults.normal_mode["<C-Down>"]
+ defaults.normal_mode["<A-Left>"] = defaults.normal_mode["<C-Left>"]
+ defaults.normal_mode["<A-Right>"] = defaults.normal_mode["<C-Right>"]
+ Log:debug "Activated mac keymappings"
+end
+
+-- Unsets all keybindings defined in keymaps
+-- @param keymaps The table of key mappings containing a list per mode (normal_mode, insert_mode, ..)
+function M.clear(keymaps)
+ local default = M.get_defaults()
+ for mode, mappings in pairs(keymaps) do
+ local translated_mode = mode_adapters[mode] and mode_adapters[mode] or mode
+ for key, _ in pairs(mappings) do
+ -- some plugins may override default bindings that the user hasn't manually overriden
+ if default[mode][key] ~= nil or (default[translated_mode] ~= nil and default[translated_mode][key] ~= nil) then
+ pcall(vim.api.nvim_del_keymap, translated_mode, key)
+ end
+ end
+ end
+end
+
+-- Set key mappings individually
+-- @param mode The keymap mode, can be one of the keys of mode_adapters
+-- @param key The key of keymap
+-- @param val Can be form as a mapping or tuple of mapping and user defined opt
+function M.set_keymaps(mode, key, val)
+ local opt = generic_opts[mode] or generic_opts_any
+ if type(val) == "table" then
+ opt = val[2]
+ val = val[1]
+ end
+ if val then
+ vim.keymap.set(mode, key, val, opt)
+ else
+ pcall(vim.api.nvim_del_keymap, mode, key)
+ end
+end
+
+-- Load key mappings for a given mode
+-- @param mode The keymap mode, can be one of the keys of mode_adapters
+-- @param keymaps The list of key mappings
+function M.load_mode(mode, keymaps)
+ mode = mode_adapters[mode] or mode
+ for k, v in pairs(keymaps) do
+ M.set_keymaps(mode, k, v)
+ end
+end
+
+-- Load key mappings for all provided modes
+-- @param keymaps A list of key mappings for each mode
+function M.load(keymaps)
+ keymaps = keymaps or {}
+ for mode, mapping in pairs(keymaps) do
+ M.load_mode(mode, mapping)
+ end
+end
+
+-- Load the default keymappings
+function M.load_defaults()
+ M.load(M.get_defaults())
+ lvim.keys = lvim.keys or {}
+ for idx, _ in pairs(defaults) do
+ if not lvim.keys[idx] then
+ lvim.keys[idx] = {}
+ end
+ end
+end
+
+-- Get the default keymappings
+function M.get_defaults()
+ return defaults
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/lsp/config.lua b/mac/.config/LunarVim/lua/lvim/lsp/config.lua
new file mode 100644
index 0000000..55f7d64
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/lsp/config.lua
@@ -0,0 +1,164 @@
+local skipped_servers = {
+ "angularls",
+ "ansiblels",
+ "antlersls",
+ "ast_grep",
+ "azure_pipelines_ls",
+ "basedpyright",
+ "biome",
+ "bzl",
+ "ccls",
+ "css_variables",
+ "cssmodules_ls",
+ "custom_elements_ls",
+ "denols",
+ "docker_compose_language_service",
+ "dprint",
+ "elp",
+ "ember",
+ "emmet_language_server",
+ "emmet_ls",
+ "eslint",
+ "eslintls",
+ "fennel_language_server",
+ "gitlab_ci_ls",
+ "glint",
+ "glslls",
+ "golangci_lint_ls",
+ "gradle_ls",
+ "graphql",
+ "harper_ls",
+ "hdl_checker",
+ "hydra_lsp",
+ "htmx",
+ "java_language_server",
+ "jedi_language_server",
+ "lexical",
+ "ltex",
+ "lwc_ls",
+ "mdx_analyzer",
+ "neocmake",
+ "nim_langserver",
+ "ocamlls",
+ "omnisharp",
+ "phpactor",
+ "psalm",
+ "pylsp",
+ "pylyzer",
+ "pyre",
+ "quick_lint_js",
+ "reason_ls",
+ "rnix",
+ "rome",
+ "rubocop",
+ "ruby_ls",
+ "ruby_lsp",
+ "ruff_lsp",
+ "scry",
+ "snyk_ls",
+ "solang",
+ "solc",
+ "solidity_ls",
+ "solidity_ls_nomicfoundation",
+ "sorbet",
+ "sourcekit",
+ "somesass_ls",
+ "sourcery",
+ "spectral",
+ "sqlls",
+ "sqls",
+ "standardrb",
+ "stimulus_ls",
+ "stylelint_lsp",
+ "svlangserver",
+ "swift_mesonls",
+ "templ",
+ "tflint",
+ "tinymist",
+ "unocss",
+ "vale_ls",
+ "vacuum",
+ "verible",
+ "v_analyzer",
+ "vtsls",
+ "vuels",
+}
+
+local skipped_filetypes = { "markdown", "rst", "plaintext", "toml", "proto" }
+
+local join_paths = require("lvim.utils").join_paths
+
+return {
+ templates_dir = join_paths(get_runtime_dir(), "site", "after", "ftplugin"),
+ ---@deprecated use vim.diagnostic.config({ ... }) instead
+ diagnostics = {},
+ document_highlight = false,
+ code_lens_refresh = true,
+ on_attach_callback = nil,
+ on_init_callback = nil,
+ automatic_configuration = {
+ ---@usage list of servers that the automatic installer will skip
+ skipped_servers = skipped_servers,
+ ---@usage list of filetypes that the automatic installer will skip
+ skipped_filetypes = skipped_filetypes,
+ },
+ buffer_mappings = {
+ normal_mode = {
+ ["K"] = { "<cmd>lua vim.lsp.buf.hover()<cr>", "Show hover" },
+ ["gd"] = { "<cmd>lua vim.lsp.buf.definition()<cr>", "Goto definition" },
+ ["gD"] = { "<cmd>lua vim.lsp.buf.declaration()<cr>", "Goto Declaration" },
+ ["gr"] = { "<cmd>lua vim.lsp.buf.references()<cr>", "Goto references" },
+ ["gI"] = { "<cmd>lua vim.lsp.buf.implementation()<cr>", "Goto Implementation" },
+ ["gs"] = { "<cmd>lua vim.lsp.buf.signature_help()<cr>", "show signature help" },
+ ["gl"] = {
+ function()
+ local float = vim.diagnostic.config().float
+
+ if float then
+ local config = type(float) == "table" and float or {}
+ config.scope = "line"
+
+ vim.diagnostic.open_float(config)
+ end
+ end,
+ "Show line diagnostics",
+ },
+ },
+ insert_mode = {},
+ visual_mode = {},
+ },
+ buffer_options = {
+ --- enable completion triggered by <c-x><c-o>
+ omnifunc = "v:lua.vim.lsp.omnifunc",
+ --- use gq for formatting
+ formatexpr = "v:lua.vim.lsp.formatexpr(#{timeout_ms:500})",
+ },
+ ---@usage list of settings of nvim-lsp-installer
+ installer = {
+ setup = {
+ ensure_installed = {},
+ automatic_installation = {
+ exclude = {},
+ },
+ },
+ },
+ nlsp_settings = {
+ setup = {
+ config_home = join_paths(get_config_dir(), "lsp-settings"),
+ -- set to false to overwrite schemastore.nvim
+ append_default_schemas = true,
+ ignored_servers = {},
+ loader = "json",
+ },
+ },
+ null_ls = {
+ setup = {
+ debug = false,
+ },
+ config = {},
+ },
+ ---@deprecated use lvim.lsp.automatic_configuration.skipped_servers instead
+ override = {},
+ ---@deprecated use lvim.lsp.installer.setup.automatic_installation instead
+ automatic_servers_installation = nil,
+}
diff --git a/mac/.config/LunarVim/lua/lvim/lsp/init.lua b/mac/.config/LunarVim/lua/lvim/lsp/init.lua
new file mode 100644
index 0000000..d59b29a
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/lsp/init.lua
@@ -0,0 +1,128 @@
+local M = {}
+local Log = require "lvim.core.log"
+local utils = require "lvim.utils"
+local autocmds = require "lvim.core.autocmds"
+
+local function add_lsp_buffer_options(bufnr)
+ for k, v in pairs(lvim.lsp.buffer_options) do
+ vim.api.nvim_set_option_value(k, v, { buf = bufnr })
+ end
+end
+
+local function add_lsp_buffer_keybindings(bufnr)
+ local mappings = {
+ normal_mode = "n",
+ insert_mode = "i",
+ visual_mode = "v",
+ }
+
+ for mode_name, mode_char in pairs(mappings) do
+ for key, remap in pairs(lvim.lsp.buffer_mappings[mode_name]) do
+ local opts = { buffer = bufnr, desc = remap[2], noremap = true, silent = true }
+ vim.keymap.set(mode_char, key, remap[1], opts)
+ end
+ end
+end
+
+function M.common_capabilities()
+ local status_ok, cmp_nvim_lsp = pcall(require, "cmp_nvim_lsp")
+ if status_ok then
+ return cmp_nvim_lsp.default_capabilities()
+ end
+
+ local capabilities = vim.lsp.protocol.make_client_capabilities()
+ capabilities.textDocument.completion.completionItem.snippetSupport = true
+ capabilities.textDocument.completion.completionItem.resolveSupport = {
+ properties = {
+ "documentation",
+ "detail",
+ "additionalTextEdits",
+ },
+ }
+
+ return capabilities
+end
+
+function M.common_on_exit(_, _)
+ if lvim.lsp.document_highlight then
+ autocmds.clear_augroup "lsp_document_highlight"
+ end
+ if lvim.lsp.code_lens_refresh then
+ autocmds.clear_augroup "lsp_code_lens_refresh"
+ end
+end
+
+function M.common_on_init(client, bufnr)
+ if lvim.lsp.on_init_callback then
+ lvim.lsp.on_init_callback(client, bufnr)
+ Log:debug "Called lsp.on_init_callback"
+ return
+ end
+end
+
+function M.common_on_attach(client, bufnr)
+ if lvim.lsp.on_attach_callback then
+ lvim.lsp.on_attach_callback(client, bufnr)
+ Log:debug "Called lsp.on_attach_callback"
+ end
+ local lu = require "lvim.lsp.utils"
+ if lvim.lsp.document_highlight then
+ lu.setup_document_highlight(client, bufnr)
+ end
+ if lvim.lsp.code_lens_refresh then
+ lu.setup_codelens_refresh(client, bufnr)
+ end
+ add_lsp_buffer_keybindings(bufnr)
+ add_lsp_buffer_options(bufnr)
+ lu.setup_document_symbols(client, bufnr)
+end
+
+function M.get_common_opts()
+ return {
+ on_attach = M.common_on_attach,
+ on_init = M.common_on_init,
+ on_exit = M.common_on_exit,
+ capabilities = M.common_capabilities(),
+ }
+end
+
+function M.setup()
+ Log:debug "Setting up LSP support"
+
+ local lsp_status_ok, _ = pcall(require, "lspconfig")
+ if not lsp_status_ok then
+ return
+ end
+
+ if lvim.use_icons then
+ for _, sign in ipairs(vim.tbl_get(vim.diagnostic.config(), "signs", "values") or {}) do
+ vim.fn.sign_define(sign.name, { texthl = sign.name, text = sign.text, numhl = sign.name })
+ end
+ end
+
+ if not utils.is_directory(lvim.lsp.templates_dir) then
+ require("lvim.lsp.templates").generate_templates()
+ end
+
+ pcall(function()
+ require("nlspsettings").setup(lvim.lsp.nlsp_settings.setup)
+ end)
+
+ require("lvim.lsp.null-ls").setup()
+
+ autocmds.configure_format_on_save()
+
+ local function set_handler_opts_if_not_set(name, handler, opts)
+ if debug.getinfo(vim.lsp.handlers[name], "S").source:find(vim.env.VIMRUNTIME, 1, true) then
+ vim.lsp.handlers[name] = vim.lsp.with(handler, opts)
+ end
+ end
+
+ set_handler_opts_if_not_set("textDocument/hover", vim.lsp.handlers.hover, { border = "rounded" })
+ set_handler_opts_if_not_set("textDocument/signatureHelp", vim.lsp.handlers.signature_help, { border = "rounded" })
+
+ -- Enable rounded borders in :LspInfo window.
+ require("lspconfig.ui.windows").default_options.border = "rounded"
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/lsp/manager.lua b/mac/.config/LunarVim/lua/lvim/lsp/manager.lua
new file mode 100644
index 0000000..5e695ec
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/lsp/manager.lua
@@ -0,0 +1,141 @@
+local M = {}
+
+local Log = require "lvim.core.log"
+local fmt = string.format
+local lvim_lsp_utils = require "lvim.lsp.utils"
+local is_windows = vim.loop.os_uname().version:match "Windows"
+
+local function resolve_mason_config(server_name)
+ local found, mason_config = pcall(require, "mason-lspconfig.server_configurations." .. server_name)
+ if not found then
+ Log:debug(fmt("mason configuration not found for %s", server_name))
+ return {}
+ end
+ local server_mapping = require "mason-lspconfig.mappings.server"
+ local path = require "mason-core.path"
+ local pkg_name = server_mapping.lspconfig_to_package[server_name]
+ local install_dir = path.package_prefix(pkg_name)
+ local conf = mason_config(install_dir)
+ if is_windows and conf.cmd and conf.cmd[1] then
+ local exepath = vim.fn.exepath(conf.cmd[1])
+ if exepath ~= "" then
+ conf.cmd[1] = exepath
+ end
+ end
+ Log:debug(fmt("resolved mason configuration for %s, got %s", server_name, vim.inspect(conf)))
+ return conf or {}
+end
+
+---Resolve the configuration for a server by merging with the default config
+---@param server_name string
+---@vararg any config table [optional]
+---@return table
+local function resolve_config(server_name, ...)
+ local defaults = {
+ on_attach = require("lvim.lsp").common_on_attach,
+ on_init = require("lvim.lsp").common_on_init,
+ on_exit = require("lvim.lsp").common_on_exit,
+ capabilities = require("lvim.lsp").common_capabilities(),
+ }
+
+ local has_custom_provider, custom_config = pcall(require, "lvim/lsp/providers/" .. server_name)
+ if has_custom_provider then
+ Log:debug("Using custom configuration for requested server: " .. server_name)
+ defaults = vim.tbl_deep_extend("force", defaults, custom_config)
+ end
+
+ defaults = vim.tbl_deep_extend("force", defaults, ...)
+
+ return defaults
+end
+
+-- manually start the server and don't wait for the usual filetype trigger from lspconfig
+local function buf_try_add(server_name, bufnr)
+ bufnr = bufnr or vim.api.nvim_get_current_buf()
+ require("lspconfig")[server_name].manager:try_add_wrapper(bufnr)
+end
+
+-- check if the manager autocomd has already been configured since some servers can take a while to initialize
+-- this helps guarding against a data-race condition where a server can get configured twice
+-- which seems to occur only when attaching to single-files
+local function client_is_configured(server_name, ft)
+ ft = ft or vim.bo.filetype
+ local active_autocmds = vim.api.nvim_get_autocmds { event = "FileType", pattern = ft }
+ for _, result in ipairs(active_autocmds) do
+ if result.desc ~= nil and result.desc:match("server " .. server_name .. " ") then
+ Log:debug(string.format("[%q] is already configured", server_name))
+ return true
+ end
+ end
+ return false
+end
+
+local function launch_server(server_name, config)
+ pcall(function()
+ local command = config.cmd
+ or (function()
+ local default_config = require("lspconfig.server_configurations." .. server_name).default_config
+ return default_config.cmd
+ end)()
+ -- some servers have dynamic commands defined with on_new_config
+ if type(command) == "table" and type(command[1]) == "string" and vim.fn.executable(command[1]) ~= 1 then
+ Log:debug(string.format("[%q] is either not installed, missing from PATH, or not executable.", server_name))
+ return
+ end
+ require("lspconfig")[server_name].setup(config)
+ buf_try_add(server_name)
+ end)
+end
+
+---Setup a language server by providing a name
+---@param server_name string name of the language server
+---@param user_config table? when available it will take predence over any default configurations
+function M.setup(server_name, user_config)
+ vim.validate { name = { server_name, "string" } }
+ user_config = user_config or {}
+
+ if lvim_lsp_utils.is_client_active(server_name) or client_is_configured(server_name) then
+ return
+ end
+
+ local server_mapping = require "mason-lspconfig.mappings.server"
+ local registry = require "mason-registry"
+
+ local pkg_name = server_mapping.lspconfig_to_package[server_name]
+ if not pkg_name then
+ local config = resolve_config(server_name, user_config)
+ launch_server(server_name, config)
+ return
+ end
+
+ local should_auto_install = function(name)
+ local installer_settings = lvim.lsp.installer.setup
+ return installer_settings.automatic_installation
+ and not vim.tbl_contains(installer_settings.automatic_installation.exclude, name)
+ end
+
+ if not registry.is_installed(pkg_name) then
+ if should_auto_install(server_name) then
+ Log:debug "Automatic server installation detected"
+ vim.notify_once(string.format("Installation in progress for [%s]", server_name), vim.log.levels.INFO)
+ local pkg = registry.get_package(pkg_name)
+ pkg:install():once("closed", function()
+ if pkg:is_installed() then
+ vim.schedule(function()
+ vim.notify_once(string.format("Installation complete for [%s]", server_name), vim.log.levels.INFO)
+ -- mason config is only available once the server has been installed
+ local config = resolve_config(server_name, resolve_mason_config(server_name), user_config)
+ launch_server(server_name, config)
+ end)
+ end
+ end)
+ else
+ Log:debug(server_name .. " is not managed by the automatic installer")
+ end
+ end
+
+ local config = resolve_config(server_name, resolve_mason_config(server_name), user_config)
+ launch_server(server_name, config)
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/lsp/null-ls/code_actions.lua b/mac/.config/LunarVim/lua/lvim/lsp/null-ls/code_actions.lua
new file mode 100644
index 0000000..50f4cfb
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/lsp/null-ls/code_actions.lua
@@ -0,0 +1,26 @@
+local M = {}
+
+local Log = require "lvim.core.log"
+
+local null_ls = require "null-ls"
+local services = require "lvim.lsp.null-ls.services"
+local method = null_ls.methods.CODE_ACTION
+
+function M.list_registered(filetype)
+ local registered_providers = services.list_registered_providers_names(filetype)
+ return registered_providers[method] or {}
+end
+
+function M.setup(actions_configs)
+ if vim.tbl_isempty(actions_configs) then
+ return
+ end
+
+ local registered = services.register_sources(actions_configs, method)
+
+ if #registered > 0 then
+ Log:debug("Registered the following action-handlers: " .. unpack(registered))
+ end
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/lsp/null-ls/formatters.lua b/mac/.config/LunarVim/lua/lvim/lsp/null-ls/formatters.lua
new file mode 100644
index 0000000..b4fb2f3
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/lsp/null-ls/formatters.lua
@@ -0,0 +1,33 @@
+local M = {}
+
+local Log = require "lvim.core.log"
+
+local null_ls = require "null-ls"
+local services = require "lvim.lsp.null-ls.services"
+local method = null_ls.methods.FORMATTING
+
+function M.list_registered(filetype)
+ local registered_providers = services.list_registered_providers_names(filetype)
+ return registered_providers[method] or {}
+end
+
+function M.list_supported(filetype)
+ local s = require "null-ls.sources"
+ local supported_formatters = s.get_supported(filetype, "formatting")
+ table.sort(supported_formatters)
+ return supported_formatters
+end
+
+function M.setup(formatter_configs)
+ if vim.tbl_isempty(formatter_configs) then
+ return
+ end
+
+ local registered = services.register_sources(formatter_configs, method)
+
+ if #registered > 0 then
+ Log:debug("Registered the following formatters: " .. unpack(registered))
+ end
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/lsp/null-ls/init.lua b/mac/.config/LunarVim/lua/lvim/lsp/null-ls/init.lua
new file mode 100644
index 0000000..51a200f
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/lsp/null-ls/init.lua
@@ -0,0 +1,16 @@
+local M = {}
+
+local Log = require "lvim.core.log"
+
+function M.setup()
+ local status_ok, null_ls = pcall(require, "null-ls")
+ if not status_ok then
+ Log:error "Missing null-ls dependency"
+ return
+ end
+
+ local default_opts = require("lvim.lsp").get_common_opts()
+ null_ls.setup(vim.tbl_deep_extend("force", default_opts, lvim.lsp.null_ls.setup))
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/lsp/null-ls/linters.lua b/mac/.config/LunarVim/lua/lvim/lsp/null-ls/linters.lua
new file mode 100644
index 0000000..ba7670d
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/lsp/null-ls/linters.lua
@@ -0,0 +1,43 @@
+local M = {}
+
+local Log = require "lvim.core.log"
+
+local null_ls = require "null-ls"
+local services = require "lvim.lsp.null-ls.services"
+local method = null_ls.methods.DIAGNOSTICS
+
+local alternative_methods = {
+ null_ls.methods.DIAGNOSTICS,
+ null_ls.methods.DIAGNOSTICS_ON_OPEN,
+ null_ls.methods.DIAGNOSTICS_ON_SAVE,
+}
+
+function M.list_registered(filetype)
+ local registered_providers = services.list_registered_providers_names(filetype)
+ local providers_for_methods = vim.tbl_flatten(vim.tbl_map(function(m)
+ return registered_providers[m] or {}
+ end, alternative_methods))
+
+ return providers_for_methods
+end
+
+function M.list_supported(filetype)
+ local s = require "null-ls.sources"
+ local supported_linters = s.get_supported(filetype, "diagnostics")
+ table.sort(supported_linters)
+ return supported_linters
+end
+
+function M.setup(linter_configs)
+ if vim.tbl_isempty(linter_configs) then
+ return
+ end
+
+ local registered = services.register_sources(linter_configs, method)
+
+ if #registered > 0 then
+ Log:debug("Registered the following linters: " .. unpack(registered))
+ end
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/lsp/null-ls/services.lua b/mac/.config/LunarVim/lua/lvim/lsp/null-ls/services.lua
new file mode 100644
index 0000000..7dc0bb6
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/lsp/null-ls/services.lua
@@ -0,0 +1,104 @@
+local M = {}
+
+local Log = require "lvim.core.log"
+
+local function find_root_dir()
+ local util = require "lspconfig/util"
+ local lsp_utils = require "lvim.lsp.utils"
+
+ local ts_client = lsp_utils.is_client_active "typescript"
+ if ts_client then
+ return ts_client.config.root_dir
+ end
+ local dirname = vim.fn.expand "%:p:h"
+ return util.root_pattern "package.json"(dirname)
+end
+
+local function from_node_modules(command)
+ local root_dir = find_root_dir()
+
+ if not root_dir then
+ return nil
+ end
+
+ local join_paths = require("lvim.utils").join_paths
+ return join_paths(root_dir, "node_modules", ".bin", command)
+end
+
+local local_providers = {
+ prettier = { find = from_node_modules },
+ prettierd = { find = from_node_modules },
+ prettier_d_slim = { find = from_node_modules },
+ eslint_d = { find = from_node_modules },
+ eslint = { find = from_node_modules },
+ stylelint = { find = from_node_modules },
+}
+
+function M.find_command(command)
+ if local_providers[command] then
+ local local_command = local_providers[command].find(command)
+ if local_command and vim.fn.executable(local_command) == 1 then
+ return local_command
+ end
+ end
+
+ if command and vim.fn.executable(command) == 1 then
+ return command
+ end
+ return nil
+end
+
+function M.list_registered_providers_names(filetype)
+ local s = require "null-ls.sources"
+ local available_sources = s.get_available(filetype)
+ local registered = {}
+ for _, source in ipairs(available_sources) do
+ for method in pairs(source.methods) do
+ registered[method] = registered[method] or {}
+ table.insert(registered[method], source.name)
+ end
+ end
+ return registered
+end
+
+function M.register_sources(configs, method)
+ local null_ls = require "null-ls"
+ local is_registered = require("null-ls.sources").is_registered
+
+ local sources, registered_names = {}, {}
+
+ for _, config in ipairs(configs) do
+ local cmd = config.exe or config.command
+ local name = config.name or cmd:gsub("-", "_")
+ local type = method == null_ls.methods.CODE_ACTION and "code_actions" or null_ls.methods[method]:lower()
+ local source = type and null_ls.builtins[type][name]
+ Log:debug(string.format("Received request to register [%s] as a %s source", name, type))
+ if not source then
+ Log:error("Not a valid source: " .. name)
+ elseif is_registered { name = source.name or name, method = method } then
+ Log:trace(string.format("Skipping registering [%s] more than once", name))
+ else
+ local command = M.find_command(source._opts.command) or source._opts.command
+
+ -- treat `args` as `extra_args` for backwards compatibility. Can otherwise use `generator_opts.args`
+ local compat_opts = vim.deepcopy(config)
+ if config.args then
+ compat_opts.extra_args = config.args or config.extra_args
+ compat_opts.args = nil
+ end
+
+ local opts = vim.tbl_deep_extend("keep", { command = command }, compat_opts)
+ Log:debug("Registering source " .. name)
+ Log:trace(vim.inspect(opts))
+ table.insert(sources, source.with(opts))
+ vim.list_extend(registered_names, { source.name })
+ end
+ end
+
+ if #sources > 0 then
+ null_ls.register { sources = sources }
+ end
+ return registered_names
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/lsp/providers/jsonls.lua b/mac/.config/LunarVim/lua/lvim/lsp/providers/jsonls.lua
new file mode 100644
index 0000000..76aea25
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/lsp/providers/jsonls.lua
@@ -0,0 +1,18 @@
+local opts = {
+ settings = {
+ json = {
+ schemas = require("schemastore").json.schemas(),
+ },
+ },
+ setup = {
+ commands = {
+ Format = {
+ function()
+ vim.lsp.buf.range_formatting({}, { 0, 0 }, { vim.fn.line "$", 0 })
+ end,
+ },
+ },
+ },
+}
+
+return opts
diff --git a/mac/.config/LunarVim/lua/lvim/lsp/providers/lua_ls.lua b/mac/.config/LunarVim/lua/lvim/lsp/providers/lua_ls.lua
new file mode 100644
index 0000000..952e04d
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/lsp/providers/lua_ls.lua
@@ -0,0 +1,64 @@
+local default_workspace = {
+ library = {
+ vim.fn.expand "$VIMRUNTIME",
+ get_lvim_base_dir(),
+ require("neodev.config").types(),
+ "${3rd}/busted/library",
+ "${3rd}/luassert/library",
+ "${3rd}/luv/library",
+ },
+
+ maxPreload = 5000,
+ preloadFileSize = 10000,
+}
+
+local add_packages_to_workspace = function(packages, config)
+ -- config.settings.Lua = config.settings.Lua or { workspace = default_workspace }
+ local runtimedirs = vim.api.nvim__get_runtime({ "lua" }, true, { is_lua = true })
+ local workspace = config.settings.Lua.workspace
+ for _, v in pairs(runtimedirs) do
+ for _, pack in ipairs(packages) do
+ if v:match(pack) and not vim.tbl_contains(workspace.library, v) then
+ table.insert(workspace.library, v)
+ end
+ end
+ end
+end
+
+local lspconfig = require "lspconfig"
+
+local make_on_new_config = function(on_new_config, _)
+ return lspconfig.util.add_hook_before(on_new_config, function(new_config, _)
+ local server_name = new_config.name
+
+ if server_name ~= "lua_ls" then
+ return
+ end
+ local plugins = { "plenary.nvim", "telescope.nvim", "nvim-treesitter", "LuaSnip" }
+ add_packages_to_workspace(plugins, new_config)
+ end)
+end
+
+lspconfig.util.default_config = vim.tbl_extend("force", lspconfig.util.default_config, {
+ on_new_config = make_on_new_config(lspconfig.util.default_config.on_new_config),
+})
+
+local opts = {
+ settings = {
+ Lua = {
+ telemetry = { enable = false },
+ runtime = {
+ version = "LuaJIT",
+ special = {
+ reload = "require",
+ },
+ },
+ diagnostics = {
+ globals = { "vim", "lvim", "reload" },
+ },
+ workspace = default_workspace,
+ },
+ },
+}
+
+return opts
diff --git a/mac/.config/LunarVim/lua/lvim/lsp/providers/tailwindcss.lua b/mac/.config/LunarVim/lua/lvim/lsp/providers/tailwindcss.lua
new file mode 100644
index 0000000..ebf0a1c
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/lsp/providers/tailwindcss.lua
@@ -0,0 +1,15 @@
+local opts = {
+ root_dir = function(fname)
+ local util = require "lspconfig/util"
+ return util.root_pattern(
+ "tailwind.config.js",
+ "tailwind.config.ts",
+ "tailwind.config.cjs",
+ "tailwind.js",
+ "tailwind.ts",
+ "tailwind.cjs"
+ )(fname)
+ end,
+}
+
+return opts
diff --git a/mac/.config/LunarVim/lua/lvim/lsp/providers/vuels.lua b/mac/.config/LunarVim/lua/lvim/lsp/providers/vuels.lua
new file mode 100644
index 0000000..326363f
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/lsp/providers/vuels.lua
@@ -0,0 +1,26 @@
+local opts = {
+ setup = {
+ root_dir = function(fname)
+ local util = require "lvim.lspconfig/util"
+ return util.root_pattern "package.json"(fname) or util.root_pattern "vue.config.js"(fname) or vim.fn.getcwd()
+ end,
+ init_options = {
+ config = {
+ vetur = {
+ completion = {
+ autoImport = true,
+ tagCasing = "kebab",
+ useScaffoldSnippets = true,
+ },
+ useWorkspaceDependencies = true,
+ validation = {
+ script = true,
+ style = true,
+ template = true,
+ },
+ },
+ },
+ },
+ },
+}
+return opts
diff --git a/mac/.config/LunarVim/lua/lvim/lsp/providers/yamlls.lua b/mac/.config/LunarVim/lua/lvim/lsp/providers/yamlls.lua
new file mode 100644
index 0000000..c9764fc
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/lsp/providers/yamlls.lua
@@ -0,0 +1,16 @@
+local opts = {
+ settings = {
+ yaml = {
+ hover = true,
+ completion = true,
+ validate = true,
+ schemaStore = {
+ enable = true,
+ url = "https://www.schemastore.org/api/json/catalog.json",
+ },
+ schemas = require("schemastore").yaml.schemas(),
+ },
+ },
+}
+
+return opts
diff --git a/mac/.config/LunarVim/lua/lvim/lsp/templates.lua b/mac/.config/LunarVim/lua/lvim/lsp/templates.lua
new file mode 100644
index 0000000..4a65fac
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/lsp/templates.lua
@@ -0,0 +1,76 @@
+local M = {}
+
+local Log = require "lvim.core.log"
+local utils = require "lvim.utils"
+local lvim_lsp_utils = require "lvim.lsp.utils"
+
+local ftplugin_dir = lvim.lsp.templates_dir
+
+local join_paths = _G.join_paths
+
+function M.remove_template_files()
+ -- remove any outdated files
+ for _, file in ipairs(vim.fn.glob(ftplugin_dir .. "/*.lua", 1, 1)) do
+ vim.fn.delete(file)
+ vim.wait(10)
+ end
+end
+
+local skipped_filetypes = lvim.lsp.automatic_configuration.skipped_filetypes
+local skipped_servers = lvim.lsp.automatic_configuration.skipped_servers
+
+---Check if we should skip generating an ftplugin file based on the server_name
+---@param server_name string name of a valid language server
+local function should_skip(server_name)
+ return vim.tbl_contains(skipped_servers, server_name)
+end
+
+---Generates an ftplugin file based on the server_name in the selected directory
+---@param server_name string name of a valid language server, e.g. pyright, gopls, tsserver, etc.
+---@param dir string the full path to the desired directory
+function M.generate_ftplugin(server_name, dir)
+ if should_skip(server_name) then
+ return
+ end
+
+ -- get the supported filetypes and remove any ignored ones
+ local filetypes = vim.tbl_filter(function(ft)
+ return not vim.tbl_contains(skipped_filetypes, ft)
+ end, lvim_lsp_utils.get_supported_filetypes(server_name) or {})
+
+ if not filetypes then
+ return
+ end
+
+ for _, filetype in ipairs(filetypes) do
+ filetype = filetype:match "%.([^.]*)$" or filetype
+ local filename = join_paths(dir, filetype .. ".lua")
+ local setup_cmd = string.format([[require("lvim.lsp.manager").setup(%q)]], server_name)
+ -- print("using setup_cmd: " .. setup_cmd)
+ -- overwrite the file completely
+ utils.write_file(filename, setup_cmd .. "\n", "a")
+ end
+end
+
+---Generates ftplugin files based on a list of server_names
+---The files are generated to a runtimepath: "$LUNARVIM_RUNTIME_DIR/site/after/ftplugin/template.lua"
+---@param servers_names? table list of servers to be enabled. Will add all by default
+function M.generate_templates(servers_names)
+ servers_names = servers_names or lvim_lsp_utils.get_supported_servers()
+
+ Log:debug "Templates installation in progress"
+
+ M.remove_template_files()
+
+ -- create the directory if it didn't exist
+ if not utils.is_directory(lvim.lsp.templates_dir) then
+ vim.fn.mkdir(ftplugin_dir, "p")
+ end
+
+ for _, server in ipairs(servers_names) do
+ M.generate_ftplugin(server, ftplugin_dir)
+ end
+ Log:debug "Templates installation is complete"
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/lsp/utils.lua b/mac/.config/LunarVim/lua/lvim/lsp/utils.lua
new file mode 100644
index 0000000..0d9bcd7
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/lsp/utils.lua
@@ -0,0 +1,185 @@
+local M = {}
+
+local tbl = require "lvim.utils.table"
+local Log = require "lvim.core.log"
+
+function M.is_client_active(name)
+ local clients = vim.lsp.get_clients()
+ return tbl.find_first(clients, function(client)
+ return client.name == name
+ end)
+end
+
+function M.get_active_clients_by_ft(filetype)
+ local matches = {}
+ local clients = vim.lsp.get_clients()
+ for _, client in pairs(clients) do
+ local supported_filetypes = client.config.filetypes or {}
+ if client.name ~= "null-ls" and vim.tbl_contains(supported_filetypes, filetype) then
+ table.insert(matches, client)
+ end
+ end
+ return matches
+end
+
+function M.get_client_capabilities(client_id)
+ local client = vim.lsp.get_client_by_id(tonumber(client_id))
+ if not client then
+ Log:warn("Unable to determine client from client_id: " .. client_id)
+ return
+ end
+
+ local enabled_caps = {}
+ for capability, status in pairs(client.server_capabilities) do
+ if status == true then
+ table.insert(enabled_caps, capability)
+ end
+ end
+
+ return enabled_caps
+end
+
+---Get supported filetypes per server
+---@param server_name string can be any server supported by nvim-lsp-installer
+---@return string[] supported filestypes as a list of strings
+function M.get_supported_filetypes(server_name)
+ local status_ok, config = pcall(require, ("lspconfig.server_configurations.%s"):format(server_name))
+ if not status_ok then
+ return {}
+ end
+
+ return config.default_config.filetypes or {}
+end
+
+---Get supported servers per filetype
+---@param filter { filetype: string | string[] }?: (optional) Used to filter the list of server names.
+---@return string[] list of names of supported servers
+function M.get_supported_servers(filter)
+ -- force synchronous mode, see: |mason-registry.refresh()|
+ require("mason-registry").refresh()
+ require("mason-registry").get_all_packages()
+
+ local _, supported_servers = pcall(function()
+ return require("mason-lspconfig").get_available_servers(filter)
+ end)
+ return supported_servers or {}
+end
+
+---Get all supported filetypes by nvim-lsp-installer
+---@return string[] supported filestypes as a list of strings
+function M.get_all_supported_filetypes()
+ local status_ok, filetype_server_map = pcall(require, "mason-lspconfig.mappings.filetype")
+ if not status_ok then
+ return {}
+ end
+ return vim.tbl_keys(filetype_server_map or {})
+end
+
+function M.setup_document_highlight(client, bufnr)
+ if lvim.builtin.illuminate.active then
+ Log:debug "skipping setup for document_highlight, illuminate already active"
+ return
+ end
+ local status_ok, highlight_supported = pcall(function()
+ return client.supports_method "textDocument/documentHighlight"
+ end)
+ if not status_ok or not highlight_supported then
+ return
+ end
+ local group = "lsp_document_highlight"
+ local hl_events = { "CursorHold", "CursorHoldI" }
+
+ local ok, hl_autocmds = pcall(vim.api.nvim_get_autocmds, {
+ group = group,
+ buffer = bufnr,
+ event = hl_events,
+ })
+
+ if ok and #hl_autocmds > 0 then
+ return
+ end
+
+ vim.api.nvim_create_augroup(group, { clear = false })
+ vim.api.nvim_create_autocmd(hl_events, {
+ group = group,
+ buffer = bufnr,
+ callback = vim.lsp.buf.document_highlight,
+ })
+ vim.api.nvim_create_autocmd("CursorMoved", {
+ group = group,
+ buffer = bufnr,
+ callback = vim.lsp.buf.clear_references,
+ })
+end
+
+function M.setup_document_symbols(client, bufnr)
+ vim.g.navic_silence = false -- can be set to true to suppress error
+ local symbols_supported = client.supports_method "textDocument/documentSymbol"
+ if not symbols_supported then
+ Log:debug("skipping setup for document_symbols, method not supported by " .. client.name)
+ return
+ end
+ local status_ok, navic = pcall(require, "nvim-navic")
+ if status_ok then
+ navic.attach(client, bufnr)
+ end
+end
+
+function M.setup_codelens_refresh(client, bufnr)
+ local status_ok, codelens_supported = pcall(function()
+ return client.supports_method "textDocument/codeLens"
+ end)
+ if not status_ok or not codelens_supported then
+ return
+ end
+ local group = "lsp_code_lens_refresh"
+ local cl_events = { "BufEnter", "InsertLeave" }
+ local ok, cl_autocmds = pcall(vim.api.nvim_get_autocmds, {
+ group = group,
+ buffer = bufnr,
+ event = cl_events,
+ })
+
+ if ok and #cl_autocmds > 0 then
+ return
+ end
+ vim.api.nvim_create_augroup(group, { clear = false })
+ vim.api.nvim_create_autocmd(cl_events, {
+ group = group,
+ buffer = bufnr,
+ callback = function()
+ vim.lsp.codelens.refresh { bufnr = bufnr }
+ end,
+ })
+end
+
+---filter passed to vim.lsp.buf.format
+---always selects null-ls if it's available and caches the value per buffer
+---@param client table client attached to a buffer
+---@return boolean if client matches
+function M.format_filter(client)
+ local filetype = vim.bo.filetype
+ local n = require "null-ls"
+ local s = require "null-ls.sources"
+ local method = n.methods.FORMATTING
+ local available_formatters = s.get_available(filetype, method)
+
+ if #available_formatters > 0 then
+ return client.name == "null-ls"
+ elseif client.supports_method "textDocument/formatting" then
+ return true
+ else
+ return false
+ end
+end
+
+---Simple wrapper for vim.lsp.buf.format() to provide defaults
+---@param opts table|nil
+function M.format(opts)
+ opts = opts or {}
+ opts.filter = opts.filter or M.format_filter
+
+ return vim.lsp.buf.format(opts)
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/plugin-loader.lua b/mac/.config/LunarVim/lua/lvim/plugin-loader.lua
new file mode 100644
index 0000000..485b8b3
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/plugin-loader.lua
@@ -0,0 +1,138 @@
+local plugin_loader = {}
+
+local utils = require "lvim.utils"
+local Log = require "lvim.core.log"
+local join_paths = utils.join_paths
+
+local plugins_dir = join_paths(get_runtime_dir(), "site", "pack", "lazy", "opt")
+
+function plugin_loader.init(opts)
+ opts = opts or {}
+
+ local lazy_install_dir = opts.install_path
+ or join_paths(vim.fn.stdpath "data", "site", "pack", "lazy", "opt", "lazy.nvim")
+
+ if not utils.is_directory(lazy_install_dir) then
+ print "Initializing first time setup"
+ local core_plugins_dir = join_paths(get_lvim_base_dir(), "plugins")
+ if utils.is_directory(core_plugins_dir) then
+ vim.fn.mkdir(plugins_dir, "p")
+ vim.fn.delete(plugins_dir, "rf")
+ require("lvim.utils").fs_copy(core_plugins_dir, plugins_dir)
+ else
+ vim.fn.system {
+ "git",
+ "clone",
+ "--branch=stable",
+ "https://github.com/folke/lazy.nvim.git",
+ lazy_install_dir,
+ }
+
+ local default_snapshot_path = join_paths(get_lvim_base_dir(), "snapshots", "default.json")
+ local snapshot = assert(vim.fn.json_decode(vim.fn.readfile(default_snapshot_path)))
+ vim.fn.system {
+ "git",
+ "-C",
+ lazy_install_dir,
+ "checkout",
+ snapshot["lazy.nvim"].commit,
+ }
+ end
+
+ vim.api.nvim_create_autocmd("User", { pattern = "LazyDone", callback = require("lvim.lsp").setup })
+ end
+
+ local rtp = vim.opt.rtp:get()
+ local base_dir = (vim.env.LUNARVIM_BASE_DIR or get_runtime_dir() .. "/lvim"):gsub("\\", "/")
+ local idx_base = #rtp + 1
+ for i, path in ipairs(rtp) do
+ path = path:gsub("\\", "/")
+ if path == base_dir then
+ idx_base = i + 1
+ break
+ end
+ end
+ table.insert(rtp, idx_base, lazy_install_dir)
+ table.insert(rtp, idx_base + 1, join_paths(plugins_dir, "*"))
+ vim.opt.rtp = rtp
+
+ pcall(function()
+ -- set a custom path for lazy's cache
+ local lazy_cache = require "lazy.core.cache"
+ lazy_cache.path = join_paths(get_cache_dir(), "lazy", "luac")
+ end)
+end
+
+function plugin_loader.reload(spec)
+ local Config = require "lazy.core.config"
+ local lazy = require "lazy"
+
+ -- TODO: reset cache? and unload plugins?
+
+ Config.spec = spec
+
+ require("lazy.core.plugin").load(true)
+ require("lazy.core.plugin").update_state()
+
+ local not_installed_plugins = vim.tbl_filter(function(plugin)
+ return not plugin._.installed
+ end, Config.plugins)
+
+ require("lazy.manage").clear()
+
+ if #not_installed_plugins > 0 then
+ lazy.install { wait = true }
+ end
+
+ if #Config.to_clean > 0 then
+ -- TODO: set show to true when lazy shows something useful on clean
+ lazy.clean { wait = true, show = false }
+ end
+end
+
+function plugin_loader.load(configurations)
+ Log:debug "loading plugins configuration"
+ local lazy_available, lazy = pcall(require, "lazy")
+ if not lazy_available then
+ Log:warn "skipping loading plugins until lazy.nvim is installed"
+ return
+ end
+
+ -- remove plugins from rtp before loading lazy, so that all plugins won't be loaded on startup
+ vim.opt.runtimepath:remove(join_paths(plugins_dir, "*"))
+
+ local status_ok = xpcall(function()
+ table.insert(lvim.lazy.opts.install.colorscheme, 1, lvim.colorscheme)
+ lazy.setup(configurations, lvim.lazy.opts)
+ end, debug.traceback)
+
+ if not status_ok then
+ Log:warn "problems detected while loading plugins' configurations"
+ Log:trace(debug.traceback())
+ end
+end
+
+function plugin_loader.get_core_plugins()
+ local names = {}
+ local plugins = require "lvim.plugins"
+ local get_name = require("lazy.core.plugin").Spec.get_name
+ for _, spec in pairs(plugins) do
+ if spec.enabled == true or spec.enabled == nil then
+ table.insert(names, get_name(spec[1]))
+ end
+ end
+ return names
+end
+
+function plugin_loader.sync_core_plugins()
+ local core_plugins = plugin_loader.get_core_plugins()
+ Log:trace(string.format("Syncing core plugins: [%q]", table.concat(core_plugins, ", ")))
+ require("lazy").update { wait = true, plugins = core_plugins }
+end
+
+function plugin_loader.ensure_plugins()
+ Log:debug "calling lazy.install()"
+ require("lazy").install { wait = true }
+end
+
+return plugin_loader
diff --git a/mac/.config/LunarVim/lua/lvim/plugins.lua b/mac/.config/LunarVim/lua/lvim/plugins.lua
new file mode 100644
index 0000000..4f76399
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/plugins.lua
@@ -0,0 +1,385 @@
+-- local require = require("lvim.utils.require").require
+local core_plugins = {
+ { "folke/lazy.nvim", tag = "stable" },
+ {
+ "neovim/nvim-lspconfig",
+ lazy = true,
+ dependencies = { "mason-lspconfig.nvim", "nlsp-settings.nvim" },
+ },
+ {
+ "williamboman/mason-lspconfig.nvim",
+ cmd = { "LspInstall", "LspUninstall" },
+ config = function()
+ require("mason-lspconfig").setup(lvim.lsp.installer.setup)
+
+ -- automatic_installation is handled by lsp-manager
+ local settings = require "mason-lspconfig.settings"
+ settings.current.automatic_installation = false
+ end,
+ lazy = true,
+ event = "User FileOpened",
+ dependencies = "mason.nvim",
+ },
+ { "tamago324/nlsp-settings.nvim", cmd = "LspSettings", lazy = true },
+ { "nvimtools/none-ls.nvim", lazy = true },
+ {
+ "williamboman/mason.nvim",
+ config = function()
+ require("lvim.core.mason").setup()
+ end,
+ cmd = { "Mason", "MasonInstall", "MasonUninstall", "MasonUninstallAll", "MasonLog" },
+ build = function()
+ pcall(function()
+ require("mason-registry").refresh()
+ end)
+ end,
+ event = "User FileOpened",
+ lazy = true,
+ },
+ {
+ "folke/tokyonight.nvim",
+ lazy = not vim.startswith(lvim.colorscheme, "tokyonight"),
+ },
+ {
+ "lunarvim/lunar.nvim",
+ lazy = lvim.colorscheme ~= "lunar",
+ },
+ { "Tastyep/structlog.nvim", lazy = true },
+ { "nvim-lua/plenary.nvim", cmd = { "PlenaryBustedFile", "PlenaryBustedDirectory" }, lazy = true },
+ -- Telescope
+ {
+ "nvim-telescope/telescope.nvim",
+ branch = "0.1.x",
+ config = function()
+ require("lvim.core.telescope").setup()
+ end,
+ dependencies = { "telescope-fzf-native.nvim" },
+ lazy = true,
+ cmd = "Telescope",
+ enabled = lvim.builtin.telescope.active,
+ },
+ { "nvim-telescope/telescope-fzf-native.nvim", build = "make", lazy = true, enabled = lvim.builtin.telescope.active },
+ -- Install nvim-cmp, and buffer source as a dependency
+ {
+ "hrsh7th/nvim-cmp",
+ config = function()
+ if lvim.builtin.cmp then
+ require("lvim.core.cmp").setup()
+ end
+ end,
+ event = { "InsertEnter", "CmdlineEnter" },
+ dependencies = {
+ "cmp-nvim-lsp",
+ "cmp_luasnip",
+ "cmp-buffer",
+ "cmp-path",
+ "cmp-cmdline",
+ },
+ },
+ { "hrsh7th/cmp-nvim-lsp", lazy = true },
+ { "saadparwaiz1/cmp_luasnip", lazy = true },
+ { "hrsh7th/cmp-buffer", lazy = true },
+ { "hrsh7th/cmp-path", lazy = true },
+ {
+ "hrsh7th/cmp-cmdline",
+ lazy = true,
+ enabled = lvim.builtin.cmp and lvim.builtin.cmp.cmdline.enable or false,
+ },
+ {
+ "L3MON4D3/LuaSnip",
+ config = function()
+ local utils = require "lvim.utils"
+ local paths = {}
+ if lvim.builtin.luasnip.sources.friendly_snippets then
+ paths[#paths + 1] = utils.join_paths(get_runtime_dir(), "site", "pack", "lazy", "opt", "friendly-snippets")
+ end
+ local user_snippets = utils.join_paths(get_config_dir(), "snippets")
+ if utils.is_directory(user_snippets) then
+ paths[#paths + 1] = user_snippets
+ end
+ require("luasnip.loaders.from_lua").lazy_load()
+ require("luasnip.loaders.from_vscode").lazy_load {
+ paths = paths,
+ }
+ require("luasnip.loaders.from_snipmate").lazy_load()
+ end,
+ event = "InsertEnter",
+ dependencies = {
+ "friendly-snippets",
+ },
+ },
+ { "rafamadriz/friendly-snippets", lazy = true, cond = lvim.builtin.luasnip.sources.friendly_snippets },
+ {
+ "folke/neodev.nvim",
+ lazy = true,
+ },
+
+ -- Autopairs
+ {
+ "windwp/nvim-autopairs",
+ event = "InsertEnter",
+ config = function()
+ require("lvim.core.autopairs").setup()
+ end,
+ enabled = lvim.builtin.autopairs.active,
+ dependencies = { "nvim-treesitter/nvim-treesitter", "hrsh7th/nvim-cmp" },
+ },
+
+ -- Treesitter
+ {
+ "nvim-treesitter/nvim-treesitter",
+ -- run = ":TSUpdate",
+ config = function()
+ local utils = require "lvim.utils"
+ local path = utils.join_paths(get_runtime_dir(), "site", "pack", "lazy", "opt", "nvim-treesitter")
+ vim.opt.rtp:prepend(path) -- treesitter needs to be before nvim's runtime in rtp
+ require("lvim.core.treesitter").setup()
+ end,
+ cmd = {
+ "TSInstall",
+ "TSUninstall",
+ "TSUpdate",
+ "TSUpdateSync",
+ "TSInstallInfo",
+ "TSInstallSync",
+ "TSInstallFromGrammar",
+ },
+ event = "User FileOpened",
+ },
+ {
+ -- Lazy loaded by Comment.nvim pre_hook
+ "JoosepAlviste/nvim-ts-context-commentstring",
+ lazy = true,
+ },
+
+ -- NvimTree
+ {
+ "nvim-tree/nvim-tree.lua",
+ config = function()
+ require("lvim.core.nvimtree").setup()
+ end,
+ enabled = lvim.builtin.nvimtree.active,
+ cmd = { "NvimTreeToggle", "NvimTreeOpen", "NvimTreeFocus", "NvimTreeFindFileToggle" },
+ event = "User DirOpened",
+ },
+ -- Lir
+ {
+ "tamago324/lir.nvim",
+ config = function()
+ require("lvim.core.lir").setup()
+ end,
+ enabled = lvim.builtin.lir.active,
+ event = "User DirOpened",
+ },
+ {
+ "lewis6991/gitsigns.nvim",
+ config = function()
+ require("lvim.core.gitsigns").setup()
+ end,
+ event = "User FileOpened",
+ cmd = "Gitsigns",
+ enabled = lvim.builtin.gitsigns.active,
+ },
+
+ -- Whichkey
+ {
+ "folke/which-key.nvim",
+ config = function()
+ require("lvim.core.which-key").setup()
+ end,
+ cmd = "WhichKey",
+ event = "VeryLazy",
+ enabled = lvim.builtin.which_key.active,
+ },
+
+ -- Comments
+ {
+ "numToStr/Comment.nvim",
+ config = function()
+ require("lvim.core.comment").setup()
+ end,
+ keys = { { "gc", mode = { "n", "v" } }, { "gb", mode = { "n", "v" } } },
+ event = "User FileOpened",
+ enabled = lvim.builtin.comment.active,
+ },
+
+ -- project.nvim
+ {
+ "ahmedkhalf/project.nvim",
+ config = function()
+ require("lvim.core.project").setup()
+ end,
+ enabled = lvim.builtin.project.active,
+ event = "VimEnter",
+ cmd = "Telescope projects",
+ },
+
+ -- Icons
+ {
+ "nvim-tree/nvim-web-devicons",
+ enabled = lvim.use_icons,
+ lazy = true,
+ },
+
+ -- Status Line and Bufferline
+ {
+ -- "hoob3rt/lualine.nvim",
+ "nvim-lualine/lualine.nvim",
+ -- "Lunarvim/lualine.nvim",
+ config = function()
+ require("lvim.core.lualine").setup()
+ end,
+ event = "VimEnter",
+ enabled = lvim.builtin.lualine.active,
+ },
+
+ -- breadcrumbs
+ {
+ "SmiteshP/nvim-navic",
+ config = function()
+ require("lvim.core.breadcrumbs").setup()
+ end,
+ event = "User FileOpened",
+ enabled = lvim.builtin.breadcrumbs.active,
+ },
+
+ {
+ "akinsho/bufferline.nvim",
+ config = function()
+ require("lvim.core.bufferline").setup()
+ end,
+ branch = "main",
+ event = "User FileOpened",
+ enabled = lvim.builtin.bufferline.active,
+ },
+
+ -- Debugging
+ {
+ "mfussenegger/nvim-dap",
+ config = function()
+ require("lvim.core.dap").setup()
+ end,
+ lazy = true,
+ dependencies = {
+ "rcarriga/nvim-dap-ui",
+ },
+ enabled = lvim.builtin.dap.active,
+ },
+
+ -- Debugger user interface
+ {
+ "rcarriga/nvim-dap-ui",
+ config = function()
+ require("lvim.core.dap").setup_ui()
+ end,
+ lazy = true,
+ enabled = lvim.builtin.dap.active,
+ },
+
+ -- alpha
+ {
+ "goolord/alpha-nvim",
+ config = function()
+ require("lvim.core.alpha").setup()
+ end,
+ enabled = lvim.builtin.alpha.active,
+ event = "VimEnter",
+ },
+
+ -- Terminal
+ {
+ "akinsho/toggleterm.nvim",
+ branch = "main",
+ init = function()
+ require("lvim.core.terminal").init()
+ end,
+ config = function()
+ require("lvim.core.terminal").setup()
+ end,
+ cmd = {
+ "ToggleTerm",
+ "TermExec",
+ "ToggleTermToggleAll",
+ "ToggleTermSendCurrentLine",
+ "ToggleTermSendVisualLines",
+ "ToggleTermSendVisualSelection",
+ },
+ keys = lvim.builtin.terminal.open_mapping,
+ enabled = lvim.builtin.terminal.active,
+ },
+
+ -- SchemaStore
+ {
+ "b0o/schemastore.nvim",
+ lazy = true,
+ },
+
+ {
+ "RRethy/vim-illuminate",
+ config = function()
+ require("lvim.core.illuminate").setup()
+ end,
+ event = "User FileOpened",
+ enabled = lvim.builtin.illuminate.active,
+ },
+
+ {
+ "lukas-reineke/indent-blankline.nvim",
+ config = function()
+ require("lvim.core.indentlines").setup()
+ end,
+ event = "User FileOpened",
+ enabled = lvim.builtin.indentlines.active,
+ },
+
+ {
+ "lunarvim/onedarker.nvim",
+ branch = "freeze",
+ config = function()
+ pcall(function()
+ if lvim and lvim.colorscheme == "onedarker" then
+ require("onedarker").setup()
+ lvim.builtin.lualine.options.theme = "onedarker"
+ end
+ end)
+ end,
+ lazy = lvim.colorscheme ~= "onedarker",
+ },
+
+ {
+ "lunarvim/bigfile.nvim",
+ config = function()
+ pcall(function()
+ require("bigfile").setup(lvim.builtin.bigfile.config)
+ end)
+ end,
+ enabled = lvim.builtin.bigfile.active,
+ dependencies = { "nvim-treesitter/nvim-treesitter" },
+ event = { "FileReadPre", "BufReadPre", "User FileOpened" },
+ },
+}
+
+local default_snapshot_path = join_paths(get_lvim_base_dir(), "snapshots", "default.json")
+local content = vim.fn.readfile(default_snapshot_path)
+local default_sha1 = assert(vim.fn.json_decode(content))
+
+-- taken from <https://github.com/folke/lazy.nvim/blob/c7122d64cdf16766433588486adcee67571de6d0/lua/lazy/core/plugin.lua#L27>
+local get_short_name = function(long_name)
+ local name = long_name:sub(-4) == ".git" and long_name:sub(1, -5) or long_name
+ local slash = name:reverse():find("/", 1, true) --[[@as number?]]
+ return slash and name:sub(#name - slash + 2) or long_name:gsub("%W+", "_")
+end
+
+local get_default_sha1 = function(spec)
+ local short_name = get_short_name(spec[1])
+ return default_sha1[short_name] and default_sha1[short_name].commit
+end
+
+if not vim.env.LVIM_DEV_MODE then
+ -- Manually lock the commit hashes of core plugins
+ for _, spec in ipairs(core_plugins) do
+ spec["commit"] = get_default_sha1(spec)
+ end
+end
+
+return core_plugins
diff --git a/mac/.config/LunarVim/lua/lvim/utils.lua b/mac/.config/LunarVim/lua/lvim/utils.lua
new file mode 100644
index 0000000..5e49906
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/utils.lua
@@ -0,0 +1,132 @@
+local M = {}
+local uv = vim.loop
+
+-- recursive Print (structure, limit, separator)
+local function r_inspect_settings(structure, limit, separator)
+ limit = limit or 100 -- default item limit
+ separator = separator or "." -- indent string
+ if limit < 1 then
+ print "ERROR: Item limit reached."
+ return limit - 1
+ end
+ if structure == nil then
+ io.write("-- O", separator:sub(2), " = nil\n")
+ return limit - 1
+ end
+ local ts = type(structure)
+
+ if ts == "table" then
+ for k, v in pairs(structure) do
+ -- replace non alpha keys with ["key"]
+ if tostring(k):match "[^%a_]" then
+ k = '["' .. tostring(k) .. '"]'
+ end
+ limit = r_inspect_settings(v, limit, separator .. "." .. tostring(k))
+ if limit < 0 then
+ break
+ end
+ end
+ return limit
+ end
+
+ if ts == "string" then
+ -- escape sequences
+ structure = string.format("%q", structure)
+ end
+ separator = separator:gsub("%.%[", "%[")
+ if type(structure) == "function" then
+ -- don't print functions
+ io.write("-- lvim", separator:sub(2), " = function ()\n")
+ else
+ io.write("lvim", separator:sub(2), " = ", tostring(structure), "\n")
+ end
+ return limit - 1
+end
+
+function M.generate_settings()
+ -- Opens a file in append mode
+ local file = io.open("lv-settings.lua", "w")
+
+ -- sets the default output file as test.lua
+ io.output(file)
+
+ -- write all `lvim` related settings to `lv-settings.lua` file
+ r_inspect_settings(lvim, 10000, ".")
+
+ -- closes the open file
+ io.close(file)
+end
+
+--- Returns a table with the default values that are missing.
+--- either parameter can be empty.
+--@param config (table) table containing entries that take priority over defaults
+--@param default_config (table) table contatining default values if found
+function M.apply_defaults(config, default_config)
+ config = config or {}
+ default_config = default_config or {}
+ local new_config = vim.tbl_deep_extend("keep", vim.empty_dict(), config)
+ new_config = vim.tbl_deep_extend("keep", new_config, default_config)
+ return new_config
+end
+
+--- Checks whether a given path exists and is a file.
+--@param path (string) path to check
+--@returns (bool)
+function M.is_file(path)
+ local stat = uv.fs_stat(path)
+ return stat and stat.type == "file" or false
+end
+
+--- Checks whether a given path exists and is a directory
+--@param path (string) path to check
+--@returns (bool)
+function M.is_directory(path)
+ local stat = uv.fs_stat(path)
+ return stat and stat.type == "directory" or false
+end
+
+M.join_paths = _G.join_paths
+
+---Write data to a file
+---@param path string can be full or relative to `cwd`
+---@param txt string|table text to be written, uses `vim.inspect` internally for tables
+---@param flag string used to determine access mode, common flags: "w" for `overwrite` or "a" for `append`
+function M.write_file(path, txt, flag)
+ local data = type(txt) == "string" and txt or vim.inspect(txt)
+ uv.fs_open(path, flag, 438, function(open_err, fd)
+ assert(not open_err, open_err)
+ uv.fs_write(fd, data, -1, function(write_err)
+ assert(not write_err, write_err)
+ uv.fs_close(fd, function(close_err)
+ assert(not close_err, close_err)
+ end)
+ end)
+ end)
+end
+
+---Copies a file or directory recursively
+---@param source string
+---@param destination string
+function M.fs_copy(source, destination)
+ local source_stats = assert(vim.loop.fs_stat(source))
+
+ if source_stats.type == "file" then
+ assert(vim.loop.fs_copyfile(source, destination))
+ return
+ elseif source_stats.type == "directory" then
+ local handle = assert(vim.loop.fs_scandir(source))
+
+ assert(vim.loop.fs_mkdir(destination, source_stats.mode))
+
+ while true do
+ local name = vim.loop.fs_scandir_next(handle)
+ if not name then
+ break
+ end
+
+ M.fs_copy(M.join_paths(source, name), M.join_paths(destination, name))
+ end
+ end
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/utils/git.lua b/mac/.config/LunarVim/lua/lvim/utils/git.lua
new file mode 100644
index 0000000..d5f1d92
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/utils/git.lua
@@ -0,0 +1,152 @@
+local M = {}
+
+local Log = require "lvim.core.log"
+local fmt = string.format
+local if_nil = vim.F.if_nil
+
+local function git_cmd(opts)
+ local plenary_loaded, Job = pcall(require, "plenary.job")
+ if not plenary_loaded then
+ return 1, { "" }
+ end
+
+ opts = opts or {}
+ opts.cwd = opts.cwd or get_lvim_base_dir()
+
+ local stderr = {}
+ local stdout, ret = Job:new({
+ command = "git",
+ args = opts.args,
+ cwd = opts.cwd,
+ on_stderr = function(_, data)
+ table.insert(stderr, data)
+ end,
+ }):sync(10000)
+
+ if not vim.tbl_isempty(stderr) then
+ Log:debug(stderr)
+ end
+
+ if not vim.tbl_isempty(stdout) then
+ Log:debug(stdout)
+ end
+
+ return ret, stdout, stderr
+end
+
+local function safe_deep_fetch()
+ local ret, result, error = git_cmd { args = { "rev-parse", "--is-shallow-repository" } }
+ if ret ~= 0 then
+ Log:error(vim.inspect(error))
+ return
+ end
+ -- git fetch --unshallow will cause an error on a complete clone
+ local fetch_mode = result[1] == "true" and "--unshallow" or "--all"
+ ret = git_cmd { args = { "fetch", fetch_mode } }
+ if ret ~= 0 then
+ Log:error(fmt "Git fetch %s failed! Please pull the changes manually in %s", fetch_mode, get_lvim_base_dir())
+ return
+ end
+ if fetch_mode == "--unshallow" then
+ ret = git_cmd { args = { "remote", "set-branches", "origin", "*" } }
+ if ret ~= 0 then
+ Log:error(fmt "Git fetch %s failed! Please pull the changes manually in %s", fetch_mode, get_lvim_base_dir())
+ return
+ end
+ end
+ return true
+end
+
+---pulls the latest changes from github
+function M.update_base_lvim()
+ Log:info "Checking for updates"
+
+ if not vim.loop.fs_access(get_lvim_base_dir(), "w") then
+ Log:warn(fmt("Lunarvim update aborted! cannot write to %s", get_lvim_base_dir()))
+ return
+ end
+
+ if not safe_deep_fetch() then
+ return
+ end
+
+ local ret
+
+ ret = git_cmd { args = { "diff", "--quiet", "@{upstream}" } }
+ if ret == 0 then
+ Log:info "LunarVim is already up-to-date"
+ return
+ end
+
+ ret = git_cmd { args = { "merge", "--ff-only", "--progress" } }
+ if ret ~= 0 then
+ Log:error("Update failed! Please pull the changes manually in " .. get_lvim_base_dir())
+ return
+ end
+
+ return true
+end
+
+---Switch Lunarvim to the specified development branch
+---@param branch string
+function M.switch_lvim_branch(branch)
+ if not safe_deep_fetch() then
+ return
+ end
+ local args = { "switch", branch }
+
+ if branch:match "^[0-9]" then
+ -- avoids producing an error for tags
+ vim.list_extend(args, { "--detach" })
+ end
+
+ local ret = git_cmd { args = args }
+ if ret ~= 0 then
+ Log:error "Unable to switch branches! Check the log for further information"
+ return
+ end
+ return true
+end
+
+---Get the current Lunarvim development branch
+---@return string|nil
+function M.get_lvim_branch()
+ local _, results = git_cmd { args = { "rev-parse", "--abbrev-ref", "HEAD" } }
+ local branch = if_nil(results[1], "")
+ return branch
+end
+
+---Get currently checked-out tag of Lunarvim
+---@return string
+function M.get_lvim_tag()
+ local args = { "describe", "--tags", "--abbrev=0" }
+
+ local _, results = git_cmd { args = args }
+ local tag = if_nil(results[1], "")
+ return tag
+end
+
+---Get the description of currently checked-out commit of Lunarvim
+---@return string|nil
+function M.get_lvim_description()
+ local _, results = git_cmd { args = { "describe", "--dirty", "--always" } }
+
+ local description = if_nil(results[1], M.get_lvim_branch())
+ return description
+end
+
+---Get currently running version of Lunarvim
+---@return string
+function M.get_lvim_version()
+ local current_branch = M.get_lvim_branch()
+
+ local lvim_version
+ if current_branch ~= "HEAD" or "" then
+ lvim_version = current_branch .. "-" .. M.get_lvim_description()
+ else
+ lvim_version = "v" .. M.get_lvim_tag()
+ end
+ return lvim_version
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/utils/hooks.lua b/mac/.config/LunarVim/lua/lvim/utils/hooks.lua
new file mode 100644
index 0000000..2bf2ff0
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/utils/hooks.lua
@@ -0,0 +1,76 @@
+local M = {}
+
+local Log = require "lvim.core.log"
+local in_headless = #vim.api.nvim_list_uis() == 0
+local plugin_loader = require "lvim.plugin-loader"
+
+function M.run_pre_update()
+ Log:debug "Starting pre-update hook"
+end
+
+function M.run_pre_reload()
+ Log:debug "Starting pre-reload hook"
+end
+
+-- TODO: convert to lazy.nvim
+-- function M.run_on_packer_complete()
+-- -- FIXME(kylo252): nvim-tree.lua/lua/nvim-tree/view.lua:442: Invalid window id
+-- vim.g.colors_name = lvim.colorscheme
+-- pcall(vim.cmd.colorscheme, lvim.colorscheme)
+-- end
+
+function M.run_post_reload()
+ Log:debug "Starting post-reload hook"
+end
+
+---Reset any startup cache files used by lazy.nvim
+---It also forces regenerating any template ftplugin files
+---Tip: Useful for clearing any outdated settings
+function M.reset_cache()
+ local lvim_modules = {}
+ for module, _ in pairs(package.loaded) do
+ if module:match "lvim.core" or module:match "lvim.lsp" then
+ package.loaded[module] = nil
+ table.insert(lvim_modules, module)
+ end
+ end
+ Log:trace(string.format("Cache invalidated for core modules: { %s }", table.concat(lvim_modules, ", ")))
+ require("lvim.lsp.templates").generate_templates()
+end
+
+function M.run_post_update()
+ Log:debug "Starting post-update hook"
+
+ if vim.fn.has "nvim-0.9" ~= 1 then
+ local compat_tag = "1.2.0"
+ vim.notify(
+ "Please upgrade your Neovim base installation. Newer version of Lunarvim requires v0.9+",
+ vim.log.levels.WARN
+ )
+ vim.wait(1000)
+ local ret = reload("lvim.utils.git").switch_lvim_branch(compat_tag)
+ if ret then
+ vim.notify("Reverted to the last known compatible version: " .. compat_tag, vim.log.levels.WARN)
+ end
+ return
+ end
+
+ M.reset_cache()
+
+ Log:debug "Syncing core plugins"
+ plugin_loader.reload { reload "lvim.plugins", lvim.plugins }
+ plugin_loader.sync_core_plugins()
+ M.reset_cache() -- force cache clear and templates regen once more
+
+ if not in_headless then
+ vim.schedule(function()
+ if package.loaded["nvim-treesitter"] then
+ vim.cmd [[ TSUpdateSync ]]
+ end
+ -- TODO: add a changelog
+ vim.notify("Update complete", vim.log.levels.INFO)
+ end)
+ end
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/utils/modules.lua b/mac/.config/LunarVim/lua/lvim/utils/modules.lua
new file mode 100644
index 0000000..45cacfa
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/utils/modules.lua
@@ -0,0 +1,122 @@
+local M = {}
+
+local Log = require "lvim.core.log"
+-- revisit this
+-- function prequire(package)
+-- local status, lib = pcall(require, package)
+-- if status then
+-- return lib
+-- else
+-- vim.notify("Failed to require '" .. package .. "' from " .. debug.getinfo(2).source)
+-- return nil
+-- end
+-- end
+
+local function _assign(old, new, k)
+ local otype = type(old[k])
+ local ntype = type(new[k])
+ -- print("hi")
+ if (otype == "thread" or otype == "userdata") or (ntype == "thread" or ntype == "userdata") then
+ vim.notify(string.format("warning: old or new attr %s type be thread or userdata", k))
+ end
+ old[k] = new[k]
+end
+
+local function _replace(old, new, repeat_tbl)
+ if repeat_tbl[old] then
+ return
+ end
+ repeat_tbl[old] = true
+
+ local dellist = {}
+ for k, _ in pairs(old) do
+ if not new[k] then
+ table.insert(dellist, k)
+ end
+ end
+ for _, v in ipairs(dellist) do
+ old[v] = nil
+ end
+
+ for k, _ in pairs(new) do
+ if not old[k] then
+ old[k] = new[k]
+ else
+ if type(old[k]) ~= type(new[k]) then
+ Log:debug(
+ string.format("Reloader: mismatch between old [%s] and new [%s] type for [%s]", type(old[k]), type(new[k]), k)
+ )
+ _assign(old, new, k)
+ else
+ if type(old[k]) == "table" then
+ _replace(old[k], new[k], repeat_tbl)
+ else
+ _assign(old, new, k)
+ end
+ end
+ end
+ end
+end
+
+M.require_clean = function(m)
+ package.loaded[m] = nil
+ _G[m] = nil
+ local _, module = pcall(require, m)
+ return module
+end
+
+M.require_safe = function(mod)
+ local status_ok, module = pcall(require, mod)
+ if not status_ok then
+ local trace = debug.getinfo(2, "SL")
+ local shorter_src = trace.short_src
+ local lineinfo = shorter_src .. ":" .. (trace.currentline or trace.linedefined)
+ local msg = string.format("%s : skipped loading [%s]", lineinfo, mod)
+ Log:debug(msg)
+ end
+ return module
+end
+
+M.reload = function(mod)
+ if not package.loaded[mod] then
+ return M.require_safe(mod)
+ end
+
+ local old = package.loaded[mod]
+ package.loaded[mod] = nil
+ local new = M.require_safe(mod)
+
+ if type(old) == "table" and type(new) == "table" then
+ local repeat_tbl = {}
+ _replace(old, new, repeat_tbl)
+ end
+
+ package.loaded[mod] = old
+ return old
+end
+
+-- code from <https://github.com/tjdevries/lazy-require.nvim/blob/bb626818ebc175b8c595846925fd96902b1ce02b/lua/lazy-require.lua#L25>
+function M.require_on_index(require_path)
+ return setmetatable({}, {
+ __index = function(_, key)
+ return require(require_path)[key]
+ end,
+
+ __newindex = function(_, key, value)
+ require(require_path)[key] = value
+ end,
+ })
+end
+
+-- code from <https://github.com/tjdevries/lazy-require.nvim/blob/bb626818ebc175b8c595846925fd96902b1ce02b/lua/lazy-require.lua#L25>
+function M.require_on_exported_call(require_path)
+ return setmetatable({}, {
+ __index = function(_, k)
+ return function(...)
+ return require(require_path)[k](...)
+ end
+ end,
+ })
+end
+
+return M
diff --git a/mac/.config/LunarVim/lua/lvim/utils/table.lua b/mac/.config/LunarVim/lua/lvim/utils/table.lua
new file mode 100644
index 0000000..1ac5949
--- /dev/null
+++ b/mac/.config/LunarVim/lua/lvim/utils/table.lua
@@ -0,0 +1,24 @@
+local Table = {}
+
+--- Find the first entry for which the predicate returns true.
+-- @param t The table
+-- @param predicate The function called for each entry of t
+-- @return The entry for which the predicate returned True or nil
+function Table.find_first(t, predicate)
+ for _, entry in pairs(t) do
+ if predicate(entry) then
+ return entry
+ end
+ end
+ return nil
+end
+
+--- Check if the predicate returns True for at least one entry of the table.
+-- @param t The table
+-- @param predicate The function called for each entry of t
+-- @return True if predicate returned True at least once, false otherwise
+function Table.contains(t, predicate)
+ return Table.find_first(t, predicate) ~= nil
+end
+
+return Table
diff --git a/mac/.config/LunarVim/snapshots/default.json b/mac/.config/LunarVim/snapshots/default.json
new file mode 100644
index 0000000..381d6e2
--- /dev/null
+++ b/mac/.config/LunarVim/snapshots/default.json
@@ -0,0 +1,131 @@
+{
+ "Comment.nvim": {
+ "commit": "0236521"
+ },
+ "LuaSnip": {
+ "commit": "1def353"
+ },
+ "alpha-nvim": {
+ "commit": "29074ee"
+ },
+ "bigfile.nvim": {
+ "commit": "33eb067"
+ },
+ "bufferline.nvim": {
+ "commit": "73edc1f"
+ },
+ "cmp-buffer": {
+ "commit": "3022dbc"
+ },
+ "cmp-cmdline": {
+ "commit": "d250c63"
+ },
+ "cmp-nvim-lsp": {
+ "commit": "39e2eda"
+ },
+ "cmp-path": {
+ "commit": "91ff86c"
+ },
+ "cmp_luasnip": {
+ "commit": "05a9ab2"
+ },
+ "friendly-snippets": {
+ "commit": "dd2fd12"
+ },
+ "gitsigns.nvim": {
+ "commit": "805610a"
+ },
+ "indent-blankline.nvim": {
+ "commit": "9637670"
+ },
+ "lazy.nvim": {
+ "commit": "8f19915"
+ },
+ "lir.nvim": {
+ "commit": "7a9d45d"
+ },
+ "lualine.nvim": {
+ "commit": "0a5a668"
+ },
+ "lunar.nvim": {
+ "commit": "08bbc93"
+ },
+ "mason-lspconfig.nvim": {
+ "commit": "a4caa0d"
+ },
+ "mason.nvim": {
+ "commit": "49ff59a"
+ },
+ "neodev.nvim": {
+ "commit": "ce9a2e8"
+ },
+ "nlsp-settings.nvim": {
+ "commit": "d92035e"
+ },
+ "none-ls.nvim": {
+ "commit": "3a48266"
+ },
+ "nvim-autopairs": {
+ "commit": "c15de7e"
+ },
+ "nvim-cmp": {
+ "commit": "5260e5e"
+ },
+ "nvim-dap": {
+ "commit": "5a2f712"
+ },
+ "nvim-dap-ui": {
+ "commit": "34160a7"
+ },
+ "nvim-lspconfig": {
+ "commit": "eadcee1"
+ },
+ "nvim-navic": {
+ "commit": "8649f69"
+ },
+ "nvim-tree.lua": {
+ "commit": "2bc725a"
+ },
+ "nvim-treesitter": {
+ "commit": "30de5e7"
+ },
+ "nvim-ts-context-commentstring": {
+ "commit": "cb06438"
+ },
+ "nvim-web-devicons": {
+ "commit": "e37bb1f"
+ },
+ "onedarker.nvim": {
+ "commit": "b00dd21"
+ },
+ "plenary.nvim": {
+ "commit": "a3e3bc8"
+ },
+ "project.nvim": {
+ "commit": "8c6bad7"
+ },
+ "schemastore.nvim": {
+ "commit": "9a5992a"
+ },
+ "structlog.nvim": {
+ "commit": "45b26a2"
+ },
+ "telescope-fzf-native.nvim": {
+ "commit": "9ef21b2"
+ },
+ "telescope.nvim": {
+ "commit": "d829aa6"
+ },
+ "toggleterm.nvim": {
+ "commit": "fee58a0"
+ },
+ "tokyonight.nvim": {
+ "commit": "b9b494f"
+ },
+ "vim-illuminate": {
+ "commit": "5eeb795"
+ },
+ "which-key.nvim": {
+ "commit": "4433e5e"
+ }
+}
diff --git a/mac/.config/LunarVim/tests/lvim/helpers.lua b/mac/.config/LunarVim/tests/lvim/helpers.lua
new file mode 100644
index 0000000..83f7a1a
--- /dev/null
+++ b/mac/.config/LunarVim/tests/lvim/helpers.lua
@@ -0,0 +1,32 @@
+local M = {}
+
+function M.search_file(file, args)
+ local Job = require "plenary.job"
+ local stderr = {}
+ local stdout, ret = Job:new({
+ command = "grep",
+ args = { args, file },
+ cwd = vim.loop.cwd(),
+ on_stderr = function(_, data)
+ table.insert(stderr, data)
+ end,
+ }):sync()
+ return ret, stdout, stderr
+end
+
+function M.log_contains(query)
+ local logfile = require("lvim.core.log"):get_path()
+ local ret, stdout, stderr = M.search_file(logfile, query)
+ if ret == 0 then
+ return true
+ end
+ if not vim.tbl_isempty(stderr) then
+ error(vim.inspect(stderr))
+ end
+ if not vim.tbl_isempty(stdout) then
+ error(vim.inspect(stdout))
+ end
+ return false
+end
+
+return M
diff --git a/mac/.config/LunarVim/tests/minimal_init.lua b/mac/.config/LunarVim/tests/minimal_init.lua
new file mode 100644
index 0000000..e9fe3d6
--- /dev/null
+++ b/mac/.config/LunarVim/tests/minimal_init.lua
@@ -0,0 +1,12 @@
+local path_sep = vim.loop.os_uname().version:match "Windows" and "\\" or "/"
+local base_dir = vim.env.LUNARVIM_BASE_DIR
+local tests_dir = base_dir .. path_sep .. "tests"
+
+vim.opt.rtp:append(tests_dir)
+vim.opt.rtp:append(base_dir)
+
+require("lvim.bootstrap"):init(base_dir)
+
+-- NOTE: careful about name collisions
+-- see https://github.com/nvim-lualine/lualine.nvim/pull/621
+require "tests.lvim.helpers"
diff --git a/mac/.config/LunarVim/tests/minimal_lsp.lua b/mac/.config/LunarVim/tests/minimal_lsp.lua
new file mode 100644
index 0000000..46f5c0e
--- /dev/null
+++ b/mac/.config/LunarVim/tests/minimal_lsp.lua
@@ -0,0 +1,112 @@
+local on_windows = vim.loop.os_uname().version:match "Windows"
+
+local function join_paths(...)
+ local path_sep = on_windows and "\\" or "/"
+ local result = table.concat({ ... }, path_sep)
+ return result
+end
+
+vim.cmd [[set runtimepath=$VIMRUNTIME]]
+
+local temp_dir = vim.loop.os_getenv "TEMP" or "/tmp"
+
+vim.cmd("set packpath=" .. join_paths(temp_dir, "nvim", "site"))
+
+local package_root = join_paths(temp_dir, "nvim", "site", "pack")
+local plugins_dir = join_paths(package_root, "lazy", "opt")
+local install_path = join_paths(package_root, "lazy.nvim")
+
+-- Choose whether to use the executable that's managed by mason
+local use_lsp_installer = true
+
+local function load_plugins()
+ vim.opt.rtp:prepend(install_path)
+ require("lazy").setup({
+ "neovim/nvim-lspconfig",
+ "williamboman/mason-lspconfig.nvim",
+ "williamboman/mason.nvim",
+ }, {
+ root = plugins_dir,
+ })
+end
+
+function _G.dump(...)
+ local objects = vim.tbl_map(vim.inspect, { ... })
+ print(unpack(objects))
+ return ...
+end
+
+_G.load_config = function()
+ vim.lsp.set_log_level "trace"
+ require("vim.lsp.log").set_format_func(vim.inspect)
+ local nvim_lsp = require "lspconfig"
+ local on_attach = function(_, bufnr)
+ local function buf_set_option(k, v)
+ vim.api.nvim_set_option_value(k, v, { buf = bufnr })
+ end
+
+ buf_set_option("omnifunc", "v:lua.vim.lsp.omnifunc")
+
+ -- Mappings.
+ local opts = { buffer = bufnr, noremap = true, silent = true }
+ vim.keymap.set("n", "gD", vim.lsp.buf.declaration, opts)
+ vim.keymap.set("n", "gd", vim.lsp.buf.definition, opts)
+ vim.keymap.set("n", "K", vim.lsp.buf.hover, opts)
+ vim.keymap.set("n", "gi", vim.lsp.buf.implementation, opts)
+ vim.keymap.set("n", "<C-k>", vim.lsp.buf.signature_help, opts)
+ vim.keymap.set("n", "<space>wa", vim.lsp.buf.add_workspace_folder, opts)
+ vim.keymap.set("n", "<space>wr", vim.lsp.buf.remove_workspace_folder, opts)
+ vim.keymap.set("n", "<space>wl", function()
+ print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
+ end, opts)
+ vim.keymap.set("n", "<space>lD", vim.lsp.buf.type_definition, opts)
+ vim.keymap.set("n", "<space>lr", vim.lsp.buf.rename, opts)
+ vim.keymap.set("n", "gr", vim.lsp.buf.references, opts)
+ vim.keymap.set("n", "gl", vim.diagnostic.open_float, opts)
+ vim.keymap.set("n", "[d", vim.diagnostic.goto_prev, opts)
+ vim.keymap.set("n", "]d", vim.diagnostic.goto_next, opts)
+ vim.keymap.set("n", "<space>q", vim.diagnostic.setloclist, opts)
+ vim.keymap.set("n", "<space>li", "<cmd>LspInfo<CR>", opts)
+ vim.keymap.set("n", "<space>lI", "<cmd>Mason<CR>", opts)
+ end
+
+ -- Add the server that troubles you here, e.g. "clangd", "pyright", "tsserver"
+ local name = "lua_ls"
+
+ local setup_opts = {
+ on_attach = on_attach,
+ }
+
+ if not name then
+ print "You have not defined a server name, please edit minimal_init.lua"
+ end
+ if not nvim_lsp[name].document_config.default_config.cmd and not setup_opts.cmd then
+ print [[You have not defined a server default cmd for a server
+ that requires it please edit minimal_init.lua]]
+ end
+
+ nvim_lsp[name].setup(setup_opts)
+ if use_lsp_installer then
+ require("mason-lspconfig").setup { automatic_installation = true }
+ end
+
+ print [[You can find your log at $HOME/.cache/nvim/lsp.log. Please paste in a github issue under a details tag as described in the issue template.]]
+end
+
+if vim.fn.isdirectory(install_path) == 0 then
+ print "Installing lazy.nvim"
+ vim.fn.system {
+ "git",
+ "clone",
+ "--filter=blob:none",
+ "--single-branch",
+ "https://github.com/folke/lazy.nvim.git",
+ install_path,
+ }
+ load_plugins()
+ vim.cmd [[autocmd User LazyDone ++once lua load_config()]]
+else
+ load_plugins()
+ require("lazy").sync()
+ _G.load_config()
+end
diff --git a/mac/.config/LunarVim/tests/specs/bootstrap_spec.lua b/mac/.config/LunarVim/tests/specs/bootstrap_spec.lua
new file mode 100644
index 0000000..bb52955
--- /dev/null
+++ b/mac/.config/LunarVim/tests/specs/bootstrap_spec.lua
@@ -0,0 +1,57 @@
+local uv = vim.loop
+local home_dir = uv.os_homedir()
+
+describe("initial start", function()
+ before_each(function()
+ vim.cmd [[
+ let v:errmsg = ""
+ let v:errors = []
+ ]]
+ end)
+
+ after_each(function()
+ local errmsg = vim.fn.eval "v:errmsg"
+ local exception = vim.fn.eval "v:exception"
+ local errors = vim.fn.eval "v:errors"
+ assert.equal("", errmsg)
+ assert.equal("", exception)
+ assert.True(vim.tbl_isempty(errors))
+ end)
+
+ local lvim_config_path = get_config_dir()
+ local lvim_runtime_path = get_runtime_dir()
+ local lvim_cache_path = get_cache_dir()
+
+ it("should be able to detect test environment", function()
+ assert.truthy(os.getenv "LVIM_TEST_ENV")
+ assert.falsy(package.loaded["lvim.impatient"])
+ end)
+
+ it("should be able to use lunarvim cache directory using vim.fn", function()
+ assert.equal(lvim_cache_path, vim.fn.stdpath "cache")
+ end)
+
+ it("should be to retrieve default neovim directories", function()
+ local xdg_config = os.getenv "XDG_CONFIG_HOME" or join_paths(home_dir, ".config")
+ assert.equal(join_paths(xdg_config, "nvim"), vim.call("stdpath", "config"))
+ end)
+
+ it("should be able to read lunarvim directories", function()
+ local rtp_list = vim.opt.rtp:get()
+ assert.truthy(vim.tbl_contains(rtp_list, lvim_runtime_path .. "/lvim"))
+ assert.truthy(vim.tbl_contains(rtp_list, lvim_config_path))
+ end)
+
+ it("should be able to run treesitter without errors", function()
+ assert.truthy(vim.treesitter.highlighter.active)
+ end)
+
+ it("should be able to pass basic checkhealth without errors", function()
+ vim.cmd "set cmdheight&"
+ vim.cmd "silent checkhealth nvim"
+ local errmsg = vim.fn.eval "v:errmsg"
+ local exception = vim.fn.eval "v:exception"
+ assert.equal("", errmsg) -- v:errmsg was not updated.
+ assert.equal("", exception)
+ end)
+end)
diff --git a/mac/.config/LunarVim/tests/specs/config_loader_spec.lua b/mac/.config/LunarVim/tests/specs/config_loader_spec.lua
new file mode 100644
index 0000000..565f1a5
--- /dev/null
+++ b/mac/.config/LunarVim/tests/specs/config_loader_spec.lua
@@ -0,0 +1,54 @@
+local config = require "lvim.config"
+local fmt = string.format
+
+describe("config-loader", function()
+ local user_config_path = join_paths(get_config_dir(), "config.lua")
+ local default_config_path = join_paths(get_lvim_base_dir(), "utils", "installer", "config.example.lua")
+
+ before_each(function()
+ os.execute(fmt("cp -f %s %s", default_config_path, user_config_path))
+ vim.cmd [[
+ let v:errmsg = ""
+ let v:errors = []
+ ]]
+ end)
+
+ after_each(function()
+ local errmsg = vim.fn.eval "v:errmsg"
+ local exception = vim.fn.eval "v:exception"
+ local errors = vim.fn.eval "v:errors"
+ assert.equal("", errmsg)
+ assert.equal("", exception)
+ assert.True(vim.tbl_isempty(errors))
+ end)
+
+ it("should be able to find user-config", function()
+ assert.equal(user_config_path, get_config_dir() .. "/config.lua")
+ end)
+
+ it("should be able to load user-config without errors", function()
+ config:load(user_config_path)
+ end)
+
+ it("should be able to reload user-config without errors", function()
+ config:load(user_config_path)
+ local test_path = "/tmp/lvim"
+ os.execute(string.format([[echo "vim.opt.undodir = '%s'" >> %s]], test_path, user_config_path))
+ config:reload()
+ vim.schedule(function()
+ assert.equal(vim.opt.undodir:get()[1], test_path)
+ end)
+ end)
+
+ it("should not get interrupted by errors in user-config", function()
+ local test_path = "/tmp/lunarvim"
+ os.execute(string.format([[echo "vim.opt.undodir = '%s'" >> %s]], test_path, user_config_path))
+ config:load(user_config_path)
+ assert.equal(vim.opt.undodir:get()[1], test_path)
+ require("lvim.core.log"):set_level "error"
+ lvim.log.level = "error"
+ os.execute(string.format("echo 'ignore_me()' >> %s", user_config_path))
+ config:load(user_config_path)
+ assert.equal(vim.opt.undodir:get()[1], test_path)
+ end)
+end)
diff --git a/mac/.config/LunarVim/tests/specs/lsp_spec.lua b/mac/.config/LunarVim/tests/specs/lsp_spec.lua
new file mode 100644
index 0000000..3f81405
--- /dev/null
+++ b/mac/.config/LunarVim/tests/specs/lsp_spec.lua
@@ -0,0 +1,94 @@
+local utils = require "lvim.utils"
+local helpers = require "tests.lvim.helpers"
+local spy = require "luassert.spy"
+
+describe("lsp workflow", function()
+ before_each(function()
+ vim.cmd [[
+ let v:errmsg = ""
+ let v:errors = []
+ ]]
+ end)
+
+ after_each(function()
+ local errmsg = vim.fn.eval "v:errmsg"
+ local exception = vim.fn.eval "v:exception"
+ local errors = vim.fn.eval "v:errors"
+ assert.equal("", errmsg)
+ assert.equal("", exception)
+ assert.True(vim.tbl_isempty(errors))
+ end)
+
+ lvim.lsp.templates_dir = join_paths(get_cache_dir(), "artifacts")
+ vim.go.loadplugins = true
+ local plugins = require "lvim.plugins"
+ require("lvim.plugin-loader").load { plugins, lvim.plugins }
+
+ -- trigger loading event manually for mason
+ vim.api.nvim_exec_autocmds("User", { pattern = "FileOpened" })
+
+ it("should be able to delete ftplugin templates", function()
+ if utils.is_directory(lvim.lsp.templates_dir) then
+ vim.fn.delete(lvim.lsp.templates_dir, "rf")
+ vim.wait(100)
+ end
+ assert.False(utils.is_directory(lvim.lsp.templates_dir))
+ end)
+
+ it("should be able to generate ftplugin templates", function()
+ if utils.is_directory(lvim.lsp.templates_dir) then
+ vim.fn.delete(lvim.lsp.templates_dir, "rf")
+ vim.wait(100)
+ end
+
+ require("lvim.lsp").setup()
+ vim.wait(500)
+
+ local template_files = vim.fn.glob(lvim.lsp.templates_dir .. "/*.lua", 1, 1)
+ assert.False(vim.tbl_isempty(template_files))
+ end)
+
+ it("should not include blacklisted servers in the generated templates", function()
+ require("lvim.lsp").setup()
+
+ for _, server_name in ipairs(lvim.lsp.automatic_configuration.skipped_servers) do
+ local setup_cmd = string.format([[require("lvim.lsp.manager").setup(%q)]], server_name)
+ local _, stdout, _ = helpers.search_file(lvim.lsp.templates_dir, setup_cmd)
+ assert.True(vim.tbl_isempty(stdout))
+ end
+ end)
+
+ it("should only include one server per generated template", function()
+ require("lvim.lsp").setup()
+ vim.wait(500)
+
+ local allowed_dupes = { "tailwindcss", "ruff" }
+ local template_files = vim.fn.glob(lvim.lsp.templates_dir .. "/*.lua", 1, 1)
+ for _, file in ipairs(template_files) do
+ local content = {}
+ for entry in io.lines(file) do
+ local server_name = entry:match [[.*setup%("(.*)"%)]]
+ if not vim.tbl_contains(allowed_dupes, server_name) then
+ table.insert(content, server_name)
+ end
+ end
+ local err_msg = ""
+ if #content > 1 then
+ err_msg = string.format(
+ "found more than one server for [%q]: \n{\n %q \n}",
+ file:match "[^/]*.lua$",
+ table.concat(content, ", ")
+ )
+ end
+ assert.equal(err_msg, "")
+ end
+ end)
+
+ it("should not attempt to re-generate ftplugin templates", function()
+ local s = spy.on(require "lvim.lsp.templates", "generate_templates")
+
+ require("lvim.lsp").setup()
+ assert.spy(s):was_not_called()
+ s:revert()
+ end)
+end)
diff --git a/mac/.config/LunarVim/tests/specs/plugins_load_spec.lua b/mac/.config/LunarVim/tests/specs/plugins_load_spec.lua
new file mode 100644
index 0000000..94896d2
--- /dev/null
+++ b/mac/.config/LunarVim/tests/specs/plugins_load_spec.lua
@@ -0,0 +1,37 @@
+describe("plugin-loader", function()
+ local plugins = require "lvim.plugins"
+ local loader = require "lvim.plugin-loader"
+
+ pcall(function()
+ lvim.log.level = "debug"
+ package.loaded["lvim.core.log"] = nil
+ end)
+
+ it("should be able to load default packages without errors", function()
+ vim.go.loadplugins = true
+ loader.load { plugins, lvim.plugins }
+
+ -- TODO: maybe there's a way to avoid hard-coding the names of the modules?
+ local startup_plugins = {
+ "lazy",
+ }
+
+ for _, plugin in ipairs(startup_plugins) do
+ assert.truthy(package.loaded[plugin])
+ end
+ end)
+
+ it("should be able to load lsp packages without errors", function()
+ require("lvim.lsp").setup()
+
+ local lsp_packages = {
+ "lspconfig",
+ "nlspsettings",
+ "null-ls",
+ }
+
+ for _, plugin in ipairs(lsp_packages) do
+ assert.truthy(package.loaded[plugin])
+ end
+ end)
+end)
diff --git a/mac/.config/LunarVim/utils/bin/jdtls b/mac/.config/LunarVim/utils/bin/jdtls
new file mode 100755
index 0000000..a882158
--- /dev/null
+++ b/mac/.config/LunarVim/utils/bin/jdtls
@@ -0,0 +1,62 @@
+#!/usr/bin/env bash
+
+# NOTE:
+# This doesn't work as is on Windows. You'll need to create an equivalent `.bat` file instead
+#
+# NOTE:
+# If you're not using Linux you'll need to adjust the `-configuration` option
+# to point to the `config_mac' or `config_win` folders depending on your system.
+
+case Darwin in
+Linux)
+ CONFIG="$HOME/.local/share/nvim/lsp_servers/jdtls/config_linux"
+ ;;
+Darwin)
+ CONFIG="$HOME/.local/share/nvim/lsp_servers/jdtls/config_mac"
+ ;;
+esac
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ]; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ]; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ]; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# JAR="$HOME/.config/nvim/.language-servers/eclipse.jdt.ls/org.eclipse.jdt.ls.product/target/repository/plugins/org.eclipse.equinox.launcher_*.jar"
+JAR="$HOME/.local/share/nvim/lsp_servers/jdtls/plugins/org.eclipse.equinox.launcher_*.jar"
+GRADLE_HOME=$HOME/gradle "$JAVACMD" \
+ -Declipse.application=org.eclipse.jdt.ls.core.id1 \
+ -Dosgi.bundles.defaultStartLevel=4 \
+ -Declipse.product=org.eclipse.jdt.ls.core.product \
+ -Dlog.protocol=true \
+ -Dlog.level=ALL \
+ -javaagent:$HOME/.local/share/nvim/lsp_servers/jdtls/lombok.jar \
+ -Xms1g \
+ -Xmx2G \
+ -jar $(echo "$JAR") \
+ -configuration "$CONFIG" \
+ -data "${1:-$HOME/workspace}" \
+ --add-modules=ALL-SYSTEM \
+ --add-opens java.base/java.util=ALL-UNNAMED \
+ --add-opens java.base/java.lang=ALL-UNNAMED
+
+# for older java versions if you wanna use lombok
+# -Xbootclasspath/a:/usr/local/share/lombok/lombok.jar \
+
+# -javaagent:/usr/local/share/lombok/lombok.jar \
diff --git a/mac/.config/LunarVim/utils/bin/lvim.ps1 b/mac/.config/LunarVim/utils/bin/lvim.ps1
new file mode 100644
index 0000000..3ec8125
--- /dev/null
+++ b/mac/.config/LunarVim/utils/bin/lvim.ps1
@@ -0,0 +1,13 @@
+#Requires -Version 7.1
+$ErrorActionPreference = "Stop" # exit when command fails
+
+$env:XDG_DATA_HOME = $env:XDG_DATA_HOME ?? $env:APPDATA
+$env:XDG_CONFIG_HOME = $env:XDG_CONFIG_HOME ?? $env:LOCALAPPDATA
+$env:XDG_CACHE_HOME = $env:XDG_CACHE_HOME ?? $env:TEMP
+
+$env:LUNARVIM_RUNTIME_DIR = $env:LUNARVIM_RUNTIME_DIR ?? "$env:XDG_DATA_HOME\lunarvim"
+$env:LUNARVIM_CONFIG_DIR = $env:LUNARVIM_CONFIG_DIR ?? "$env:XDG_CONFIG_HOME\lvim"
+$env:LUNARVIM_CACHE_DIR = $env:LUNARVIM_CACHE_DIR ?? "$env:XDG_CACHE_HOME\lvim"
+$env:LUNARVIM_BASE_DIR = $env:LUNARVIM_BASE_DIR ?? "$env:LUNARVIM_RUNTIME_DIR\lvim"
+
+nvim -u "$env:LUNARVIM_BASE_DIR\init.lua" @args
diff --git a/mac/.config/LunarVim/utils/bin/lvim.template b/mac/.config/LunarVim/utils/bin/lvim.template
new file mode 100644
index 0000000..4c04b9f
--- /dev/null
+++ b/mac/.config/LunarVim/utils/bin/lvim.template
@@ -0,0 +1,11 @@
+#!/usr/bin/env bash
+
+export NVIM_APPNAME="${NVIM_APPNAME:-NVIM_APPNAME_VAR}"
+
+export LUNARVIM_RUNTIME_DIR="${LUNARVIM_RUNTIME_DIR:-RUNTIME_DIR_VAR}"
+export LUNARVIM_CONFIG_DIR="${LUNARVIM_CONFIG_DIR:-CONFIG_DIR_VAR}"
+export LUNARVIM_CACHE_DIR="${LUNARVIM_CACHE_DIR:-CACHE_DIR_VAR}"
+
+export LUNARVIM_BASE_DIR="${LUNARVIM_BASE_DIR:-BASE_DIR_VAR}"
+
+exec -a "$NVIM_APPNAME" nvim -u "$LUNARVIM_BASE_DIR/init.lua" "$@"
diff --git a/mac/.config/LunarVim/utils/ci/generate_new_lockfile.lua b/mac/.config/LunarVim/utils/ci/generate_new_lockfile.lua
new file mode 100644
index 0000000..2677b20
--- /dev/null
+++ b/mac/.config/LunarVim/utils/ci/generate_new_lockfile.lua
@@ -0,0 +1,125 @@
+local sp = os.getenv "SNAPSHOT_PATH"
+
+local function call_proc(process, opts, cb)
+ local output, error_output = "", ""
+ local handle_stdout = function(err, chunk)
+ assert(not err, err)
+ if chunk then
+ output = output .. chunk
+ end
+ end
+
+ local handle_stderr = function(err, chunk)
+ assert(not err, err)
+ if chunk then
+ error_output = error_output .. chunk
+ end
+ end
+
+ local uv = vim.loop
+ local handle
+
+ local stdout = uv.new_pipe(false)
+ local stderr = uv.new_pipe(false)
+
+ local stdio = { nil, stdout, stderr }
+
+ handle = uv.spawn(
+ process,
+ { args = opts.args, cwd = opts.cwd or uv.cwd(), stdio = stdio },
+ vim.schedule_wrap(function(code)
+ if code ~= 0 then
+ stdout:read_stop()
+ stderr:read_stop()
+ end
+
+ local check = uv.new_check()
+ check:start(function()
+ for _, pipe in ipairs(stdio) do
+ if pipe and not pipe:is_closing() then
+ return
+ end
+ end
+ check:stop()
+ handle:close()
+ cb(code, output, error_output)
+ end)
+ end)
+ )
+
+ uv.read_start(stdout, handle_stdout)
+ uv.read_start(stderr, handle_stderr)
+
+ return handle
+end
+
+local plugins_list = {}
+
+local completed = 0
+
+local function write_lockfile(verbose)
+ local default_plugins = {}
+ local active_jobs = {}
+
+ local core_plugins = require "lvim.plugins"
+ for _, plugin in pairs(core_plugins) do
+ local name = plugin[1]:match "/(%S*)"
+ local url = "https://github.com/" .. plugin[1]
+ local commit = ""
+ table.insert(default_plugins, {
+ name = name,
+ url = url,
+ commit = commit,
+ branch = plugin.branch or "HEAD",
+ tag = plugin.tag,
+ })
+ end
+
+ table.sort(default_plugins, function(a, b)
+ return a.name < b.name
+ end)
+
+ for _, entry in pairs(default_plugins) do
+ local on_done = function(success, result, errors)
+ completed = completed + 1
+ if not success then
+ print("error: " .. errors)
+ return
+ end
+ local latest_sha = result:gsub("\tHEAD\n", ""):sub(1, 7)
+ if entry.tag then
+ local dereferenced_commit = result:match("\n(.*)\trefs/tags/" .. entry.tag .. "%^{}\n")
+ if dereferenced_commit then
+ latest_sha = dereferenced_commit:sub(1, 7)
+ end
+ end
+ plugins_list[entry.name] = {
+ commit = latest_sha,
+ }
+ end
+
+ local handle = call_proc("git", {
+ args = { "ls-remote", entry.url, entry.tag and entry.tag .. "*" or entry.branch },
+ }, on_done)
+ assert(handle)
+ table.insert(active_jobs, handle)
+ end
+
+ print("active: " .. #active_jobs)
+ print("plugins: " .. #default_plugins)
+
+ vim.wait(#active_jobs * 60 * 1000, function()
+ return completed == #active_jobs
+ end)
+
+ if verbose then
+ print(vim.inspect(plugins_list))
+ end
+
+ local fd = assert(io.open(sp, "w"))
+ fd:write(vim.json.encode(plugins_list), "\n")
+ fd:flush()
+end
+
+write_lockfile()
+vim.cmd "q"
diff --git a/mac/.config/LunarVim/utils/ci/generate_new_lockfile.sh b/mac/.config/LunarVim/utils/ci/generate_new_lockfile.sh
new file mode 100644
index 0000000..ebd71b3
--- /dev/null
+++ b/mac/.config/LunarVim/utils/ci/generate_new_lockfile.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+set -e
+
+REPO_DIR=$(git rev-parse --show-toplevel)
+
+export SNAPSHOT_NAME="default.json"
+export SNAPSHOT_DIR="${REPO_DIR}/snapshots"
+
+mkdir -p "${SNAPSHOT_DIR}"
+
+export SNAPSHOT_PATH="${REPO_DIR}/snapshots/${SNAPSHOT_NAME}"
+
+time lvim --headless \
+ -c "source ./utils/ci/generate_new_lockfile.lua"
+
+temp=$(mktemp)
+
+jq --sort-keys . "${SNAPSHOT_PATH}" >"${temp}"
+mv "${temp}" "${SNAPSHOT_PATH}"
diff --git a/mac/.config/LunarVim/utils/ci/run_commitlint.sh b/mac/.config/LunarVim/utils/ci/run_commitlint.sh
new file mode 100644
index 0000000..b752956
--- /dev/null
+++ b/mac/.config/LunarVim/utils/ci/run_commitlint.sh
@@ -0,0 +1,10 @@
+#!/usr/bin/env bash
+set -eo pipefail
+
+REPO_DIR="$(git rev-parse --show-toplevel)"
+HELP_URL="https://github.com/LunarVim/LunarVim/blob/rolling/CONTRIBUTING.md#commit-messages"
+CONFIG="$REPO_DIR/.github/workflows/commitlint.config.js"
+
+if ! npx commitlint --edit --verbose --help-url "$HELP_URL" --config "$CONFIG"; then
+ exit 1
+fi
diff --git a/mac/.config/LunarVim/utils/ci/run_test.sh b/mac/.config/LunarVim/utils/ci/run_test.sh
new file mode 100644
index 0000000..3e1bcf1
--- /dev/null
+++ b/mac/.config/LunarVim/utils/ci/run_test.sh
@@ -0,0 +1,25 @@
+#!/usr/bin/env bash
+set -e
+
+export LUNARVIM_RUNTIME_DIR="${LUNARVIM_RUNTIME_DIR:-"$HOME/.local/share/lunarvim"}"
+export LUNARVIM_BASE_DIR="${LUNARVIM_BASE_DIR:-"$LUNARVIM_RUNTIME_DIR/lvim"}"
+
+export LVIM_TEST_ENV=true
+
+# we should start with an empty configuration
+LUNARVIM_CONFIG_DIR="$(mktemp -d)"
+LUNARVIM_CACHE_DIR="$(mktemp -d)"
+
+export LUNARVIM_CONFIG_DIR LUNARVIM_CACHE_DIR
+
+printf "cache_dir: %s\nconfig_dir: %s\n" "$LUNARVIM_CACHE_DIR" "$LUNARVIM_CONFIG_DIR"
+
+lvim() {
+ nvim -u "$LUNARVIM_BASE_DIR/tests/minimal_init.lua" --cmd "set runtimepath+=$LUNARVIM_BASE_DIR" "$@"
+}
+
+if [ -n "$1" ]; then
+ lvim --headless -c "lua require('plenary.busted').run('$1')"
+else
+ lvim --headless -c "PlenaryBustedDirectory tests/specs { minimal_init = './tests/minimal_init.lua' }"
+fi
diff --git a/mac/.config/LunarVim/utils/ci/update_changelog.sh b/mac/.config/LunarVim/utils/ci/update_changelog.sh
new file mode 100644
index 0000000..49dae53
--- /dev/null
+++ b/mac/.config/LunarVim/utils/ci/update_changelog.sh
@@ -0,0 +1,15 @@
+#!/usr/bin/env bash
+set -eo pipefail
+
+BRANCH="$(git rev-parse --abbrev-ref HEAD)"
+
+if [ "$BRANCH" != "master" ]; then
+ exit 0
+fi
+
+REPO_DIR="$(git rev-parse --show-toplevel)"
+LATEST_TAG="$(git describe --tags --abbrev=0)"
+CONFIG_FILE="$REPO_DIR/.github/workflows/cliff.toml"
+CHANGELOG="$REPO_DIR/CHANGELOG.md"
+
+git -C "$REPO_DIR" cliff "$LATEST_TAG"..HEAD -u -c "$CONFIG_FILE" -p "$CHANGELOG"
diff --git a/mac/.config/LunarVim/utils/ci/verify_plugins.lua b/mac/.config/LunarVim/utils/ci/verify_plugins.lua
new file mode 100644
index 0000000..95d98a1
--- /dev/null
+++ b/mac/.config/LunarVim/utils/ci/verify_plugins.lua
@@ -0,0 +1,147 @@
+local completed = 0
+local collection = {}
+local active_jobs = {}
+
+local fmt = string.format
+local core_plugins = require "lvim.plugins"
+
+local default_snapshot_path = join_paths(get_lvim_base_dir(), "snapshots", "default.json")
+local fd = io.open(default_snapshot_path, "rb")
+local content
+if fd then
+ content = fd:read "*a"
+end
+local default_sha1 = vim.json.decode(content)
+
+local get_short_name = function(spec)
+ return spec[1]:match "/(%S*)"
+end
+
+local get_default_sha1 = function(spec)
+ local short_name, _ = get_short_name(spec)
+ assert(default_sha1[short_name])
+ return default_sha1[short_name].commit
+end
+
+local is_directory = require("lvim.utils").is_directory
+local lazydir = join_paths(get_runtime_dir(), "site", "pack", "lazy")
+
+local verify_lazy = function()
+ if not is_directory(lazydir) then
+ io.write "Lazy.nvim not installed!"
+ os.exit(1)
+ end
+ local status_ok, lazy = pcall(require, "lazy")
+ if status_ok and lazy then
+ return
+ end
+ io.write "Lazy.nvim not installed!"
+ os.exit(1)
+end
+
+local get_install_path = function(spec)
+ local prefix = join_paths(lazydir, "opt")
+ local path = join_paths(prefix, get_short_name(spec))
+ return is_directory(path) and path
+end
+
+local function call_proc(process, opts, cb)
+ local output, error_output = "", ""
+ local handle_stdout = function(err, chunk)
+ assert(not err, err)
+ if chunk then
+ output = output .. chunk
+ end
+ end
+
+ local handle_stderr = function(err, chunk)
+ assert(not err, err)
+ if chunk then
+ error_output = error_output .. chunk
+ end
+ end
+
+ local uv = vim.loop
+ local handle
+
+ local stdout = uv.new_pipe(false)
+ local stderr = uv.new_pipe(false)
+
+ local stdio = { nil, stdout, stderr }
+
+ handle = uv.spawn(
+ process,
+ { args = opts.args, cwd = opts.cwd or uv.cwd(), stdio = stdio },
+ vim.schedule_wrap(function(code)
+ if code ~= 0 then
+ ---@diagnostic disable-next-line: undefined-field
+ stdout:read_stop()
+ ---@diagnostic disable-next-line: undefined-field
+ stderr:read_stop()
+ end
+
+ local check = uv.new_check()
+ check:start(function()
+ for _, pipe in ipairs(stdio) do
+ if pipe and not pipe:is_closing() then
+ return
+ end
+ end
+ check:stop()
+ handle:close()
+ cb(code, output, error_output)
+ end)
+ end)
+ )
+
+ uv.read_start(stdout, handle_stdout)
+ uv.read_start(stderr, handle_stderr)
+
+ return handle
+end
+
+local function verify_core_plugins(verbose)
+ for _, spec in pairs(core_plugins) do
+ local path = get_install_path(spec)
+ if spec.enabled or spec.enabled == nil and path then
+ table.insert(collection, {
+ name = get_short_name(spec),
+ commit = get_default_sha1(spec),
+ path = path,
+ })
+ end
+ end
+
+ for _, entry in pairs(collection) do
+ local on_done = function(code, result, errors)
+ completed = completed + 1
+ if code ~= 0 then
+ io.write(errors .. "\n")
+ -- os.exit(code)
+ else
+ if verbose then
+ io.write(fmt("verified [%s]\n", entry.name))
+ end
+ end
+ local current_commit = result:gsub("\n", ""):gsub([[']], [[]]):sub(1, 7)
+ -- just in case there are some extra qutoes or it's a longer commit hash
+ if current_commit ~= entry.commit then
+ io.write(fmt("mismatch at [%s]: expected [%s], got [%s]\n", entry.name, entry.commit, current_commit))
+ os.exit(1)
+ end
+ end
+
+ local handle = call_proc("git", { args = { "rev-parse", "--short", "HEAD" }, cwd = entry.path }, on_done)
+ assert(handle)
+ table.insert(active_jobs, handle)
+ end
+
+ vim.wait(#active_jobs * 60 * 1000, function()
+ ---@diagnostic disable-next-line: redundant-return-value
+ return completed == #active_jobs
+ end)
+end
+
+verify_lazy()
+verify_core_plugins()
+vim.cmd "q"
diff --git a/mac/.config/LunarVim/utils/ci/verify_plugins.sh b/mac/.config/LunarVim/utils/ci/verify_plugins.sh
new file mode 100644
index 0000000..48ed12f
--- /dev/null
+++ b/mac/.config/LunarVim/utils/ci/verify_plugins.sh
@@ -0,0 +1,10 @@
+#!/usr/bin/env bash
+set -e
+
+BASEDIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)"
+BASEDIR="$(dirname -- "$(dirname -- "$BASEDIR")")"
+
+LUNARVIM_BASE_DIR="${LUNARVIM_BASE_DIR:-"$BASEDIR"}"
+
+lvim --headless \
+ -c "luafile ${LUNARVIM_BASE_DIR}/utils/ci/verify_plugins.lua"
diff --git a/mac/.config/LunarVim/utils/desktop/16x16/lvim.svg b/mac/.config/LunarVim/utils/desktop/16x16/lvim.svg
new file mode 100644
index 0000000..6898fd0
--- /dev/null
+++ b/mac/.config/LunarVim/utils/desktop/16x16/lvim.svg
@@ -0,0 +1,10 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" version="1.1">
+ <circle style="fill:#4f4f4f" cx="8" cy="8" r="8"/>
+ <path style="fill:#ffffff" d="M 6.270786,6 H 7.270393 L 6.399607,11 H 5.4 Z"/>
+ <path style="fill:#ffffff" d="m 8.9788284,10 v 1 H 5.4000004 L 5.64,10 Z"/>
+ <path style="fill:#6f6fee" d="M 8 3 A 5 5 0 0 0 3 8 A 5 5 0 0 0 8 13 A 5 5 0 0 0 13 8 A 5 5 0 0 0 8 3 z M 8 4 A 4.0000001 4.0000001 0 0 1 12 8 A 4.0000001 4.0000001 0 0 1 8 12 A 4.0000001 4.0000001 0 0 1 4 8 A 4.0000001 4.0000001 0 0 1 8 4 z"/>
+ <path style="fill:#ffffff" d="M 8,7.3304688 V 11 H 9 V 7.3304688 C 8.8433906,7.3753512 8.674825,7.4 8.5,7.4 8.325175,7.4 8.1566094,7.375352 8,7.3304688 Z"/>
+ <path style="fill:#ffffff" d="m 10.34358,6 h 0.99958 L 9.24,11 H 8.24042 Z"/>
+ <path style="fill:#59d4f1" d="M 3.5644531 5.0019531 C 3.2874864 5.0076244 3.0408032 5.0355933 2.8261719 5.0898438 C 2.4446055 5.186288 2.1239441 5.3751204 2.0273438 5.7460938 C 1.9307428 6.1170665 2.1035029 6.4946837 2.3710938 6.8359375 C 2.5408113 7.0523749 2.7626959 7.2697752 3.0273438 7.4902344 C 3.0493821 7.2726184 3.0837732 7.0580708 3.1328125 6.8496094 C 2.9822517 6.7117295 2.8555085 6.578593 2.7617188 6.4589844 C 2.5522032 6.1917933 2.5164475 6.0188003 2.5371094 5.9394531 C 2.5577714 5.8601064 2.6680418 5.7415288 2.9667969 5.6660156 C 3.2655515 5.5905026 3.710536 5.5710215 4.25 5.6171875 C 5.3289283 5.7095195 6.7903586 6.0596776 8.3515625 6.6484375 C 9.9127664 7.2371965 11.279225 7.9539585 12.208984 8.6191406 C 12.673864 8.9517314 13.030718 9.273824 13.240234 9.5410156 C 13.44975 9.8082077 13.483553 9.9811995 13.462891 10.060547 C 13.442231 10.139897 13.331958 10.258473 13.033203 10.333984 C 12.862309 10.377175 12.641933 10.40159 12.384766 10.40625 C 12.273012 10.609478 12.147711 10.803518 12.009766 10.988281 C 12.462418 11.011122 12.855509 10.990613 13.173828 10.910156 C 13.555395 10.813706 13.876056 10.622925 13.972656 10.251953 C 14.069256 9.8809797 13.8965 9.5053164 13.628906 9.1640625 C 13.361315 8.8228159 12.971582 8.4777562 12.478516 8.125 C 11.492385 7.4194869 10.09492 6.6920542 8.4980469 6.0898438 C 6.9011749 5.4876337 5.4080174 5.1252736 4.2636719 5.0273438 C 4.1206289 5.0151036 3.9833613 5.0059394 3.8515625 5.0019531 C 3.7527131 4.9989614 3.6567754 5.0000627 3.5644531 5.0019531 z"/>
+ <circle style="fill:#ffffff" cx="8.45" cy="6.25" r=".75"/>
+</svg>
diff --git a/mac/.config/LunarVim/utils/desktop/22x22/lvim.svg b/mac/.config/LunarVim/utils/desktop/22x22/lvim.svg
new file mode 100644
index 0000000..06f24f5
--- /dev/null
+++ b/mac/.config/LunarVim/utils/desktop/22x22/lvim.svg
@@ -0,0 +1,16 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" version="1.1">
+ <circle style="opacity:0.2" cx="11" cy="11.5" r="10"/>
+ <circle style="fill:#4f4f4f" cx="11" cy="11" r="10"/>
+ <path style="opacity:0.2" d="M 8.5878906,8.5 7.5,14.5 h 1 3.472656 H 12 12.300781 l 2.628907,-6 h -1 L 12,12.904297 V 10.910156 A 1.5,1.5 0 0 1 11.5,11 1.5,1.5 0 0 1 11,10.910156 V 13.5 H 8.6816406 l 0.9062504,-5 z"/>
+ <path style="opacity:0.2" d="m 11,5.5 a 6,6 0 0 0 -6,6 6,6 0 0 0 6,6 6,6 0 0 0 6,-6 6,6 0 0 0 -6,-6 z m 0,0.9230769 A 5.0769231,5.0769231 0 0 1 16.076923,11.5 5.0769231,5.0769231 0 0 1 11,16.576923 5.0769231,5.0769231 0 0 1 5.9230769,11.5 5.0769231,5.0769231 0 0 1 11,6.4230769 Z"/>
+ <path style="fill:#ffffff" d="M 8.5884825,8 H 9.588483 L 8.5,14 h -1 z"/>
+ <path style="opacity:0.1;fill:#ffffff" d="M 11,1 A 10,10 0 0 0 1,11 10,10 0 0 0 1.01075,11.291 10,10 0 0 1 11,1.5 10,10 0 0 1 20.9895,11.209 10,10 0 0 0 21,11 10,10 0 0 0 11,1 Z"/>
+ <path style="fill:#ffffff" d="m 11.973536,13 v 1 H 7.5000005 L 7.8,13 Z"/>
+ <path style="fill:#6f6fee" d="m 11,5 a 6,6 0 0 0 -6,6 6,6 0 0 0 6,6 6,6 0 0 0 6,-6 6,6 0 0 0 -6,-6 z m 0,0.9230769 A 5.0769231,5.0769231 0 0 1 16.076923,11 5.0769231,5.0769231 0 0 1 11,16.076923 5.0769231,5.0769231 0 0 1 5.9230769,11 5.0769231,5.0769231 0 0 1 11,5.9230769 Z"/>
+ <path style="fill:#ffffff" d="M 11,10.410156 V 14 h 1 V 10.410156 A 1.5,1.5 0 0 1 11.5,10.5 1.5,1.5 0 0 1 11,10.410156 Z"/>
+ <path style="fill:#ffffff" d="m 13.92895,8 h 1 L 12.3,14 h -1 z"/>
+ <path style="opacity:0.2" d="M 5.0859375,7.5019531 C 4.7166486,7.5095131 4.3857845,7.5468071 4.0996094,7.6191406 3.5908542,7.7477316 3.16591,8.0014688 3.0371094,8.4960938 2.9083084,8.9907183 3.1373532,9.492266 3.4941406,9.947266 3.7722382,10.301914 4.4997487,10.832068 5.0078125,11.216797 5.0214895,10.921995 5.0566015,10.63375 5.1113281,10.351562 4.751879,10.066543 4.1825448,9.660671 4.0136719,9.445313 3.7343179,9.089062 3.6872945,8.8577481 3.7148438,8.7519531 3.7423928,8.6461586 3.8907222,8.4893549 4.2890625,8.3886719 4.6874019,8.2879889 5.2807146,8.2607121 6,8.3222656 c 1.4385712,0.123107 3.387144,0.5919496 5.46875,1.3769534 2.081606,0.785003 3.902899,1.740054 5.142578,2.626953 0.61984,0.443449 1.095646,0.872264 1.375,1.228516 0.279353,0.356249 0.326378,0.587564 0.298828,0.693359 -0.02755,0.105795 -0.175878,0.262598 -0.574218,0.363281 -0.242816,0.06137 -1.007389,0.03264 -1.585938,0.0098 -0.16587,0.271812 -0.352953,0.528429 -0.558594,0.769531 0.788474,0.05519 1.896167,0.100399 2.332032,-0.0098 0.508753,-0.128592 0.937605,-0.382329 1.066406,-0.876953 0.128801,-0.494625 -0.104151,-0.996172 -0.460938,-1.451172 C 18.147118,12.597735 17.628125,12.138305 16.970703,11.667969 15.655861,10.727283 13.793224,9.756063 11.664062,8.953125 9.534898,8.150188 7.5433721,7.6676809 6.0175781,7.5371094 5.8268541,7.5207894 5.6444818,7.5092212 5.46875,7.5039062 5.3369509,7.4999175 5.2090338,7.4994325 5.0859375,7.5019531 Z"/>
+ <path style="fill:#59d4f1" d="M 5.0859375,7.0019531 C 4.7166486,7.0095131 4.3857845,7.0468071 4.0996094,7.1191406 3.5908542,7.2477316 3.16591,7.5014688 3.0371094,7.9960938 2.9083084,8.4907183 3.1373532,8.9922661 3.4941406,9.447266 3.7722382,9.801914 4.4997487,10.332068 5.0078125,10.716797 5.0214895,10.421995 5.0566015,10.13375 5.1113281,9.851562 4.751879,9.566543 4.1825448,9.160671 4.0136719,8.9453125 3.7343179,8.589062 3.6872945,8.3577481 3.7148438,8.2519531 3.7423928,8.1461586 3.8907222,7.9893549 4.2890625,7.8886719 4.6874019,7.7879889 5.2807146,7.7607121 6,7.8222656 c 1.4385712,0.123107 3.387144,0.5919496 5.46875,1.3769534 2.081606,0.785003 3.902899,1.740054 5.142578,2.626953 0.61984,0.443449 1.095646,0.872264 1.375,1.228516 0.279353,0.356249 0.326378,0.587564 0.298828,0.693359 -0.02755,0.105795 -0.175878,0.262598 -0.574218,0.363281 -0.242816,0.06137 -1.007389,0.03264 -1.585938,0.0098 -0.16587,0.271812 -0.352953,0.528429 -0.558594,0.769531 0.788474,0.05519 1.896167,0.100399 2.332032,-0.0098 0.508753,-0.128592 0.937605,-0.382329 1.066406,-0.876953 0.128801,-0.494625 -0.104151,-0.996172 -0.460938,-1.451172 C 18.147118,12.097735 17.628125,11.638305 16.970703,11.167969 15.655861,10.227283 13.793224,9.256063 11.664062,8.453125 9.534898,7.650188 7.5433721,7.1676809 6.0175781,7.0371094 5.8268541,7.0207894 5.6444818,7.0092212 5.46875,7.0039062 5.3369509,6.9999175 5.2090338,6.9994325 5.0859375,7.0019531 Z"/>
+ <circle style="opacity:0.2" cx="11.5" cy="9.5" r="1"/>
+ <circle style="fill:#ffffff" cx="11.5" cy="9" r="1"/>
+</svg>
diff --git a/mac/.config/LunarVim/utils/desktop/24x24/lvim.svg b/mac/.config/LunarVim/utils/desktop/24x24/lvim.svg
new file mode 100644
index 0000000..456298d
--- /dev/null
+++ b/mac/.config/LunarVim/utils/desktop/24x24/lvim.svg
@@ -0,0 +1,16 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" version="1.1">
+ <circle style="opacity:0.2" cx="12" cy="12.5" r="10"/>
+ <circle style="fill:#4f4f4f" cx="12" cy="12" r="10"/>
+ <path style="opacity:0.2" d="M 9.5878906,9.5 8.5,15.5 h 1 3.472656 H 13 13.300781 l 2.628907,-6 h -1 L 13,13.904297 V 11.910156 A 1.5,1.5 0 0 1 12.5,12 1.5,1.5 0 0 1 12,11.910156 V 14.5 H 9.6816406 l 0.9062504,-5 z"/>
+ <path style="opacity:0.2" d="m 12,6.5 a 6,6 0 0 0 -6,6 6,6 0 0 0 6,6 6,6 0 0 0 6,-6 6,6 0 0 0 -6,-6 z m 0,0.9230769 A 5.0769231,5.0769231 0 0 1 17.076923,12.5 5.0769231,5.0769231 0 0 1 12,17.576923 5.0769231,5.0769231 0 0 1 6.9230769,12.5 5.0769231,5.0769231 0 0 1 12,7.4230769 Z"/>
+ <path style="fill:#ffffff" d="M 9.5884825,9 H 10.588483 L 9.5,15 h -1 z"/>
+ <path style="opacity:0.1;fill:#ffffff" d="M 12,2 A 10,10 0 0 0 2,12 10,10 0 0 0 2.01075,12.291 10,10 0 0 1 12,2.5 10,10 0 0 1 21.9895,12.209 10,10 0 0 0 22,12 10,10 0 0 0 12,2 Z"/>
+ <path style="fill:#ffffff" d="m 12.973536,14 v 1 H 8.5000005 L 8.8,14 Z"/>
+ <path style="fill:#6f6fee" d="m 12,6 a 6,6 0 0 0 -6,6 6,6 0 0 0 6,6 6,6 0 0 0 6,-6 6,6 0 0 0 -6,-6 z m 0,0.9230769 A 5.0769231,5.0769231 0 0 1 17.076923,12 5.0769231,5.0769231 0 0 1 12,17.076923 5.0769231,5.0769231 0 0 1 6.9230769,12 5.0769231,5.0769231 0 0 1 12,6.9230769 Z"/>
+ <path style="fill:#ffffff" d="M 12 11.410156 L 12 15 L 13 15 L 13 11.410156 A 1.5 1.5 0 0 1 12.5 11.5 A 1.5 1.5 0 0 1 12 11.410156 z"/>
+ <path style="fill:#ffffff" d="m 14.92895,9 h 1 L 13.3,15 h -1 z"/>
+ <path style="opacity:0.2" d="m 6.0859375,8.5019531 c -0.3692889,0.00756 -0.700153,0.044854 -0.9863281,0.1171875 -0.5087552,0.128591 -0.9336994,0.3823282 -1.0625,0.8769532 -0.128801,0.4946245 0.1002438,0.9961722 0.4570312,1.4511722 0.2780976,0.354648 1.0056081,0.884802 1.5136719,1.269531 0.013677,-0.294802 0.048789,-0.583047 0.1035156,-0.865235 C 5.751879,11.066543 5.1825448,10.660671 5.0136719,10.445313 4.7343179,10.089062 4.6872945,9.8577481 4.7148438,9.7519531 4.7423928,9.6461586 4.8907222,9.4893549 5.2890625,9.3886719 5.6874019,9.2879889 6.2807146,9.2607121 7,9.3222656 c 1.4385712,0.123107 3.387144,0.5919496 5.46875,1.3769534 2.081606,0.785003 3.902899,1.740054 5.142578,2.626953 0.61984,0.443449 1.095646,0.872264 1.375,1.228516 0.279353,0.356249 0.326378,0.587564 0.298828,0.693359 -0.02755,0.105795 -0.175878,0.262598 -0.574218,0.363281 -0.242816,0.06137 -1.007389,0.03264 -1.585938,0.0098 -0.16587,0.271812 -0.352953,0.528429 -0.558594,0.769531 0.788474,0.05519 1.896167,0.100399 2.332032,-0.0098 0.508753,-0.128592 0.937605,-0.382329 1.066406,-0.876953 0.128801,-0.494625 -0.104151,-0.996172 -0.460938,-1.451172 C 19.147118,13.597735 18.628125,13.138305 17.970703,12.667969 16.655861,11.727283 14.793224,10.756063 12.664062,9.953125 10.534898,9.150188 8.5433721,8.6676809 7.0175781,8.5371094 6.8268541,8.5207894 6.6444818,8.5092212 6.46875,8.5039062 6.3369509,8.4999175 6.2090338,8.4994325 6.0859375,8.5019531 Z"/>
+ <path style="fill:#59d4f1" d="M 6.0859375 8.0019531 C 5.7166486 8.009515 5.3857845 8.0468072 5.0996094 8.1191406 C 4.5908542 8.2477316 4.16591 8.5014688 4.0371094 8.9960938 C 3.9083084 9.4907183 4.1373532 9.9922661 4.4941406 10.447266 C 4.7722382 10.801914 5.4997487 11.332068 6.0078125 11.716797 C 6.0214896 11.421995 6.0566018 11.13375 6.1113281 10.851562 C 5.751879 10.566543 5.1825448 10.160671 5.0136719 9.9453125 C 4.7343179 9.589062 4.6872945 9.3577481 4.7148438 9.2519531 C 4.7423928 9.1461586 4.8907222 8.9893549 5.2890625 8.8886719 C 5.6874019 8.7879889 6.2807146 8.7607121 7 8.8222656 C 8.4385712 8.9453726 10.387144 9.4142152 12.46875 10.199219 C 14.550356 10.984222 16.371649 11.939273 17.611328 12.826172 C 18.231168 13.269621 18.706974 13.698436 18.986328 14.054688 C 19.265681 14.410937 19.312706 14.642252 19.285156 14.748047 C 19.257606 14.853842 19.109278 15.010645 18.710938 15.111328 C 18.468122 15.172698 17.703549 15.14397 17.125 15.121094 C 16.95913 15.392906 16.772047 15.649523 16.566406 15.890625 C 17.35488 15.94582 18.462573 15.991024 18.898438 15.880859 C 19.407191 15.752267 19.836043 15.49853 19.964844 15.003906 C 20.093645 14.509281 19.860693 14.007734 19.503906 13.552734 C 19.147118 13.097735 18.628125 12.638305 17.970703 12.167969 C 16.655861 11.227283 14.793224 10.256063 12.664062 9.453125 C 10.534898 8.650188 8.5433721 8.1676809 7.0175781 8.0371094 C 6.8268541 8.0207894 6.6444818 8.0092212 6.46875 8.0039062 C 6.3369509 7.9999175 6.2090338 7.9994325 6.0859375 8.0019531 z"/>
+ <circle style="opacity:0.2" cx="12.5" cy="10.5" r="1"/>
+ <circle style="fill:#ffffff" cx="12.5" cy="10" r="1"/>
+</svg>
diff --git a/mac/.config/LunarVim/utils/desktop/32x32/lvim.svg b/mac/.config/LunarVim/utils/desktop/32x32/lvim.svg
new file mode 100644
index 0000000..13e53c2
--- /dev/null
+++ b/mac/.config/LunarVim/utils/desktop/32x32/lvim.svg
@@ -0,0 +1,16 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" version="1.1">
+ <circle style="opacity:0.2" cx="16" cy="17" r="14"/>
+ <circle style="fill:#4f4f4f" cx="16" cy="16" r="14"/>
+ <path style="opacity:0.2" d="m 12.623047,13 -1.523438,9 h 1 5.263672 0.15625 l 3.681641,-9 H 20.099609 L 17,20.582031 v -4.703125 c -0.156609,0.07489 -0.325175,0.115235 -0.5,0.115235 -0.174825,0 -0.343391,-0.04035 -0.5,-0.115235 V 21 h -3.730469 l 1.353516,-8 z"/>
+ <path style="opacity:0.2" d="m 16,8 a 9,9 0 0 0 -9,9 9,9 0 0 0 9,9 9,9 0 0 0 9,-9 9,9 0 0 0 -9,-9 z m 0,1 a 7.9999999,7.9999999 0 0 1 8,8 7.9999999,7.9999999 0 0 1 -8,8 7.9999999,7.9999999 0 0 1 -8,-8 7.9999999,7.9999999 0 0 1 8,-8 z"/>
+ <path style="fill:#ffffff" d="m 12.623876,12 h 1.000062 l -1.523876,9 H 11.1 Z"/>
+ <path style="fill:#ffffff" d="m 17.36295,20 v 1 H 11.100001 L 11.52,20 Z"/>
+ <path style="fill:#6f6fee" d="M 16 7 A 9 9 0 0 0 7 16 A 9 9 0 0 0 16 25 A 9 9 0 0 0 25 16 A 9 9 0 0 0 16 7 z M 16 8 A 7.9999999 7.9999999 0 0 1 24 16 A 7.9999999 7.9999999 0 0 1 16 24 A 7.9999999 7.9999999 0 0 1 8 16 A 7.9999999 7.9999999 0 0 1 16 8 z"/>
+ <path style="fill:#ffffff" d="M 16,14.878 V 21 h 1 v -6.122 c -0.156609,0.07489 -0.325175,0.116001 -0.5,0.116001 -0.174825,0 -0.343391,-0.04112 -0.5,-0.116001 z"/>
+ <path style="fill:#ffffff" d="m 20.100529,12 h 1.099735 l -3.680529,9 H 16.42 Z"/>
+ <path style="opacity:0.2" d="m 7.8671875,11.001953 c -0.5077723,0.0104 -0.9600248,0.06265 -1.3535156,0.162109 -0.6995383,0.176815 -1.2877432,0.524962 -1.4648438,1.205079 -0.1771015,0.680116 0.1383235,1.370461 0.6289063,1.996093 0.3535818,0.450916 0.8387175,0.906463 1.4140625,1.367188 0.054036,-0.383267 0.1297372,-0.758831 0.2304687,-1.125 C 6.936014,14.274886 6.6151218,13.957096 6.3945312,13.675781 6.0104195,13.18593 5.9445418,12.868126 5.9824219,12.722656 c 0.03788,-0.145468 0.2432978,-0.361559 0.7910156,-0.5 0.5477168,-0.13844 1.3625452,-0.176431 2.3515625,-0.0918 1.978035,0.169274 4.657324,0.813185 7.519531,1.892579 2.862208,1.07939 5.367708,2.391827 7.072266,3.611328 0.85228,0.609749 1.50456,1.199602 1.888672,1.689453 0.38411,0.489849 0.449988,0.807655 0.412109,0.953125 -0.03788,0.14547 -0.243297,0.361559 -0.791016,0.5 -0.297281,0.07514 -0.678568,0.117262 -1.11914,0.128906 -0.181389,0.375764 -0.385371,0.737546 -0.615234,1.082031 0.77116,0.03049 1.443228,-0.01309 1.99414,-0.152343 0.699539,-0.176816 1.287743,-0.526914 1.464844,-1.207032 0.177101,-0.680117 -0.14223,-1.370461 -0.632813,-1.996094 -0.490583,-0.62563 -1.20542,-1.257576 -2.109375,-1.904296 -1.807909,-1.29344 -4.369276,-2.628372 -7.296875,-3.732422 -2.9276,-1.104052 -5.665705,-1.767727 -7.7636715,-1.947266 -0.2622456,-0.02244 -0.5142281,-0.03566 -0.7558594,-0.04297 -0.1812237,-0.0055 -0.3561332,-0.0074 -0.5253906,-0.0039 z"/>
+ <path style="fill:#59d4f1" d="M 7.8671875 10.001953 C 7.3594152 10.01235 6.9071627 10.064605 6.5136719 10.164062 C 5.8141336 10.340877 5.2259287 10.689024 5.0488281 11.369141 C 4.8717266 12.049257 5.1871516 12.739602 5.6777344 13.365234 C 6.0313162 13.81615 6.5164519 14.271697 7.0917969 14.732422 C 7.1458329 14.349155 7.2215341 13.973591 7.3222656 13.607422 C 6.936014 13.274886 6.6151218 12.957096 6.3945312 12.675781 C 6.0104195 12.18593 5.9445418 11.868126 5.9824219 11.722656 C 6.0203019 11.577188 6.2257197 11.361097 6.7734375 11.222656 C 7.3211543 11.084216 8.1359827 11.046225 9.125 11.130859 C 11.103035 11.300133 13.782324 11.944044 16.644531 13.023438 C 19.506739 14.102828 22.012239 15.415265 23.716797 16.634766 C 24.569077 17.244515 25.221357 17.834368 25.605469 18.324219 C 25.989579 18.814068 26.055457 19.131874 26.017578 19.277344 C 25.979698 19.422814 25.774281 19.638903 25.226562 19.777344 C 24.929281 19.852484 24.547994 19.894606 24.107422 19.90625 C 23.926033 20.282014 23.722051 20.643796 23.492188 20.988281 C 24.263348 21.018773 24.935416 20.975188 25.486328 20.835938 C 26.185867 20.659122 26.774071 20.309024 26.951172 19.628906 C 27.128273 18.948789 26.808942 18.258445 26.318359 17.632812 C 25.827776 17.007182 25.112939 16.375236 24.208984 15.728516 C 22.401075 14.435076 19.839708 13.100144 16.912109 11.996094 C 13.984509 10.892042 11.246404 10.228367 9.1484375 10.048828 C 8.8861919 10.026388 8.6342094 10.013169 8.3925781 10.005859 C 8.2113544 10.000372 8.0364449 9.9984875 7.8671875 10.001953 z"/>
+ <circle style="opacity:0.2" cx="16.5" cy="13.5" r="1.5"/>
+ <circle style="fill:#ffffff" cx="16.5" cy="12.5" r="1.5"/>
+ <path style="fill:#ffffff;opacity:0.1" d="M 16 2 A 14 14 0 0 0 2 16 A 14 14 0 0 0 2.0351562 16.5 A 14 14 0 0 1 16 3 A 14 14 0 0 1 29.980469 16.279297 A 14 14 0 0 0 30 16 A 14 14 0 0 0 16 2 z"/>
+</svg>
diff --git a/mac/.config/LunarVim/utils/desktop/48x48/lvim.svg b/mac/.config/LunarVim/utils/desktop/48x48/lvim.svg
new file mode 100644
index 0000000..35baac2
--- /dev/null
+++ b/mac/.config/LunarVim/utils/desktop/48x48/lvim.svg
@@ -0,0 +1,16 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" version="1.1">
+ <circle style="opacity:0.2" cx="24" cy="25" r="20"/>
+ <circle style="fill:#4f4f4f" cx="24" cy="24" r="20"/>
+ <path style="opacity:0.2" d="M 19.177734,19 17,32 H 19 25.947266 26 26.599609 l 5.257813,-13 h -2 L 26,28.537109 V 22.826172 C 25.686781,22.938378 25.34965,23 25,23 24.65035,23 24.313219,22.938378 24,22.826172 V 30 h -4.664062 l 1.841796,-11 z"/>
+ <path style="opacity:0.2" d="M 24,12 A 13,13 0 0 0 11,25 13,13 0 0 0 24,38 13,13 0 0 0 37,25 13,13 0 0 0 24,12 Z m 0,2 A 11,11 0 0 1 35,25 11,11 0 0 1 24,36 11,11 0 0 1 13,25 11,11 0 0 1 24,14 Z"/>
+ <path style="fill:#ffffff" d="m 19.176965,18 h 2 L 19,31 h -2 z"/>
+ <path style="opacity:0.1;fill:#ffffff" d="M 24,4 A 20,20 0 0 0 4,24 20,20 0 0 0 4.0215,24.582 20,20 0 0 1 24,5 20,20 0 0 1 43.979,24.418 20,20 0 0 0 44,24 20,20 0 0 0 24,4 Z"/>
+ <path style="fill:#ffffff" transform="rotate(90)" d="m 29,-25.947071 h 2 v 8.94707 L 29,-17.6 Z"/>
+ <path style="fill:#6f6fee" d="M 24 11 A 13 13 0 0 0 11 24 A 13 13 0 0 0 24 37 A 13 13 0 0 0 37 24 A 13 13 0 0 0 24 11 z M 24 13 A 11 11 0 0 1 35 24 A 11 11 0 0 1 24 35 A 11 11 0 0 1 13 24 A 11 11 0 0 1 24 13 z"/>
+ <path style="fill:#ffffff" d="M 24 21.826172 L 24 31 L 26 31 L 26 21.826172 C 25.686781 21.938378 25.34965 22 25 22 C 24.65035 22 24.313219 21.938378 24 21.826172 z"/>
+ <path style="fill:#ffffff" d="m 29.857899,18 h 2 L 26.6,31 h -2 z"/>
+ <path style="opacity:0.2" d="m 12.589844,17.007812 c -1.087361,-0.03191 -2.033318,0.03758 -2.8203128,0.230469 -1.0493252,0.257182 -1.9296569,0.764657 -2.1953124,1.753907 -0.2656566,0.989249 0.2074728,1.994297 0.9433593,2.904296 0.6108665,0.755397 1.467085,1.517943 2.5117189,2.292969 C 11.065328,23.604184 11.13905,23.030537 11.25,22.46875 10.545728,21.903038 9.9733934,21.364462 9.5917969,20.892578 9.0156194,20.180077 8.9177885,19.717449 8.9746094,19.505859 9.0314304,19.29427 9.3385655,18.97871 10.160156,18.777344 c 0.821589,-0.201366 2.043793,-0.253967 3.527344,-0.13086 2.967103,0.246214 6.985914,1.181947 11.279297,2.751954 4.293384,1.570005 8.050542,3.478156 10.607422,5.251953 1.278442,0.886898 2.257807,1.744529 2.833984,2.457031 0.576176,0.7125 0.674009,1.17513 0.617188,1.386719 -0.05682,0.21159 -0.363957,0.527149 -1.185547,0.728515 -0.628279,0.153987 -1.494373,0.21928 -2.529297,0.1875 -0.30129,0.530516 -0.637404,1.038934 -1.007813,1.519532 1.561087,0.127738 2.882793,0.08766 3.925782,-0.167969 1.049325,-0.257183 1.931608,-0.766611 2.197265,-1.75586 0.265656,-0.98925 -0.211379,-1.992344 -0.947265,-2.902343 -0.735888,-0.909998 -1.808108,-1.82886 -3.164063,-2.769532 -2.711908,-1.881345 -6.553839,-3.823812 -10.945312,-5.429687 -4.391472,-1.605874 -8.499482,-2.570888 -11.646485,-2.832031 -0.393375,-0.03264 -0.770359,-0.05382 -1.132812,-0.06445 z"/>
+ <path style="fill:#59d4f1" d="M 12.589844 16.007812 C 11.502483 15.975907 10.556526 16.045394 9.7695312 16.238281 C 8.720206 16.495463 7.8398743 17.002938 7.5742188 17.992188 C 7.3085622 18.981437 7.7816916 19.986485 8.5175781 20.896484 C 9.1284446 21.651881 9.9846631 22.414427 11.029297 23.189453 C 11.065328 22.604184 11.13905 22.030537 11.25 21.46875 C 10.545728 20.903038 9.9733934 20.364462 9.5917969 19.892578 C 9.0156194 19.180077 8.9177885 18.717449 8.9746094 18.505859 C 9.0314304 18.29427 9.3385655 17.97871 10.160156 17.777344 C 10.981745 17.575978 12.203949 17.523377 13.6875 17.646484 C 16.654603 17.892698 20.673414 18.828431 24.966797 20.398438 C 29.260181 21.968443 33.017339 23.876594 35.574219 25.650391 C 36.852661 26.537289 37.832026 27.39492 38.408203 28.107422 C 38.984379 28.819922 39.082212 29.282552 39.025391 29.494141 C 38.968571 29.705731 38.661434 30.02129 37.839844 30.222656 C 37.211565 30.376643 36.345471 30.441936 35.310547 30.410156 C 35.009257 30.940672 34.673143 31.44909 34.302734 31.929688 C 35.863821 32.057426 37.185527 32.017349 38.228516 31.761719 C 39.277841 31.504536 40.160124 30.995108 40.425781 30.005859 C 40.691437 29.016609 40.214402 28.013515 39.478516 27.103516 C 38.742628 26.193518 37.670408 25.274656 36.314453 24.333984 C 33.602545 22.452639 29.760614 20.510172 25.369141 18.904297 C 20.977669 17.298423 16.869659 16.333409 13.722656 16.072266 C 13.329281 16.039623 12.952297 16.018448 12.589844 16.007812 z"/>
+ <circle style="opacity:0.2" cx="25" cy="20" r="2"/>
+ <circle style="fill:#ffffff" cx="25" cy="19" r="2"/>
+</svg>
diff --git a/mac/.config/LunarVim/utils/desktop/64x64/lvim.svg b/mac/.config/LunarVim/utils/desktop/64x64/lvim.svg
new file mode 100644
index 0000000..fd2a964
--- /dev/null
+++ b/mac/.config/LunarVim/utils/desktop/64x64/lvim.svg
@@ -0,0 +1,16 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" version="1.1">
+ <circle style="opacity:0.2" cx="32" cy="33" r="28"/>
+ <circle style="fill:#4f4f4f" cx="32" cy="32" r="28"/>
+ <path style="opacity:0.2" d="M 25.248047,25 22.199219,43 H 25 34.726562 35.640625 L 43.001953,25 H 40.201172 L 35,37.71875 v -7.761719 c -0.469829,0.157088 -0.975524,0.242188 -1.5,0.242188 -0.524476,0 -1.030171,-0.0851 -1.5,-0.242188 V 40 h -6.492188 l 2.539063,-15 z"/>
+ <path style="opacity:0.2" d="M 32,15 A 18,18 0 0 0 14,33 18,18 0 0 0 32,51 18,18 0 0 0 50,33 18,18 0 0 0 32,15 Z m 0,3 A 15,15 0 0 1 47,33 15,15 0 0 1 32,48 15,15 0 0 1 17,33 15,15 0 0 1 32,18 Z"/>
+ <path style="fill:#ffffff" d="m 25.247751,24 h 2.8 L 25,42 h -2.8 z"/>
+ <path style="fill:#ffffff" d="m 34.725899,39 v 3 H 22.200001 L 23.04,39 Z"/>
+ <path style="fill:#6f6fee" d="M 32 14 A 18 18 0 0 0 14 32 A 18 18 0 0 0 32 50 A 18 18 0 0 0 50 32 A 18 18 0 0 0 32 14 z M 32 17 A 15 15 0 0 1 47 32 A 15 15 0 0 1 32 47 A 15 15 0 0 1 17 32 A 15 15 0 0 1 32 17 z"/>
+ <path style="fill:#ffffff" d="M 32,28.956641 V 41.8 h 3 V 28.956641 C 34.530171,29.113729 34.024476,29.2 33.5,29.2 32.975524,29.2 32.469829,29.11373 32,28.956641 Z"/>
+ <path style="fill:#ffffff" d="m 40.201059,24 h 2.8 L 35.64,42 h -2.8 z"/>
+ <path style="opacity:0.2" d="m 14.996094,22.003906 c -1.061706,0.02079 -2.009278,0.123345 -2.832032,0.322266 -1.462671,0.353629 -2.690245,1.051874 -3.0605464,2.412109 -0.3703029,1.360234 0.2906429,2.742877 1.3164064,3.994141 0.835691,1.019402 2.194435,2.048482 3.621094,3.09375 0.05184,-0.804762 0.15637,-1.594664 0.310546,-2.367188 -0.955946,-0.755084 -1.917855,-1.475923 -2.435546,-2.107422 -0.803143,-0.9797 -0.938579,-1.615311 -0.859375,-1.90625 0.0792,-0.290939 0.507115,-0.725071 1.652343,-1.001953 1.145226,-0.276882 2.848071,-0.348962 4.916016,-0.179687 4.135892,0.338547 9.738042,1.624417 15.722656,3.783203 5.984616,2.158783 11.22108,4.783657 14.785156,7.222656 1.782041,1.2195 3.148029,2.397251 3.951172,3.376953 0.803141,0.979699 0.940533,1.617265 0.861328,1.908204 -0.07921,0.290939 -0.509069,0.725072 -1.654296,1.001953 -0.849354,0.205348 -2.199135,0.292392 -3.595704,0.257812 -0.412148,0.732269 -0.875734,1.431516 -1.382812,2.095703 2.118497,0.160889 4.101812,0.104952 5.521484,-0.238281 1.462671,-0.353632 2.692197,-1.05383 3.0625,-2.414063 0.370302,-1.360236 -0.294548,-2.73897 -1.320312,-3.990234 -1.025766,-1.251262 -2.520069,-2.515155 -4.410156,-3.808594 -3.780171,-2.58688 -9.136469,-5.258694 -15.257813,-7.466796 -6.121342,-2.208104 -11.847717,-3.533503 -16.234375,-3.892579 -0.548332,-0.04488 -1.072896,-0.07522 -1.578125,-0.08984 -0.378922,-0.01097 -0.745707,-0.01279 -1.099609,-0.0059 z"/>
+ <path style="fill:#59d4f1" d="M 14.996094 21.003906 C 13.934388 21.0247 12.986816 21.127251 12.164062 21.326172 C 10.701391 21.679801 9.473817 22.378046 9.1035156 23.738281 C 8.7332127 25.098515 9.3941585 26.481158 10.419922 27.732422 C 11.255613 28.751824 12.614357 29.780904 14.041016 30.826172 C 14.09286 30.02141 14.197386 29.231508 14.351562 28.458984 C 13.395616 27.7039 12.433707 26.983061 11.916016 26.351562 C 11.112873 25.371862 10.977437 24.736251 11.056641 24.445312 C 11.135841 24.154373 11.563756 23.720241 12.708984 23.443359 C 13.85421 23.166477 15.557055 23.094397 17.625 23.263672 C 21.760892 23.602219 27.363042 24.888089 33.347656 27.046875 C 39.332272 29.205658 44.568736 31.830532 48.132812 34.269531 C 49.914853 35.489031 51.280841 36.666782 52.083984 37.646484 C 52.887125 38.626183 53.024517 39.263749 52.945312 39.554688 C 52.866102 39.845627 52.436243 40.27976 51.291016 40.556641 C 50.441662 40.761989 49.091881 40.849033 47.695312 40.814453 C 47.283164 41.546722 46.819578 42.245969 46.3125 42.910156 C 48.430997 43.071045 50.414312 43.015108 51.833984 42.671875 C 53.296655 42.318243 54.526181 41.618045 54.896484 40.257812 C 55.266786 38.897576 54.601936 37.518842 53.576172 36.267578 C 52.550406 35.016316 51.056103 33.752423 49.166016 32.458984 C 45.385845 29.872104 40.029547 27.20029 33.908203 24.992188 C 27.786861 22.784084 22.060486 21.458685 17.673828 21.099609 C 17.125496 21.054729 16.600932 21.024386 16.095703 21.009766 C 15.716781 20.998796 15.349996 20.996975 14.996094 21.003906 z"/>
+ <circle style="opacity:0.2" cx="33.5" cy="26.5" r="2.5"/>
+ <circle style="fill:#ffffff" cx="33.5" cy="25.5" r="2.5"/>
+ <path style="fill:#ffffff;opacity:0.1" d="M 32 4 A 28 28 0 0 0 4 32 A 28 28 0 0 0 4.0351562 32.5 A 28 28 0 0 1 32 5 A 28 28 0 0 1 59.982422 32.251953 A 28 28 0 0 0 60 32 A 28 28 0 0 0 32 4 z"/>
+</svg>
diff --git a/mac/.config/LunarVim/utils/desktop/lvim.desktop b/mac/.config/LunarVim/utils/desktop/lvim.desktop
new file mode 100644
index 0000000..cb4cb47
--- /dev/null
+++ b/mac/.config/LunarVim/utils/desktop/lvim.desktop
@@ -0,0 +1,13 @@
+[Desktop Entry]
+Name=LunarVim
+GenericName=Text Editor
+Comment=An IDE layer for Neovim with sane defaults. Completely free and community driven.
+TryExec=lvim
+Exec=lvim %F
+Terminal=true
+Type=Application
+Keywords=Text;editor;
+Icon=lvim
+Categories=Utility;TextEditor;
+StartupNotify=false
+MimeType=text/english;text/plain;text/x-makefile;text/x-c++hdr;text/x-c++src;text/x-chdr;text/x-csrc;text/x-java;text/x-moc;text/x-pascal;text/x-tcl;text/x-tex;application/x-shellscript;text/x-c;text/x-c++;
diff --git a/mac/.config/LunarVim/utils/docker/Dockerfile.local b/mac/.config/LunarVim/utils/docker/Dockerfile.local
new file mode 100644
index 0000000..ed4a67f
--- /dev/null
+++ b/mac/.config/LunarVim/utils/docker/Dockerfile.local
@@ -0,0 +1,27 @@
+# To run this file execute:
+# docker build -f <Path to this file> <Path to Lunarvim basedir> -t Lunarvim:local
+
+FROM ubuntu:latest
+
+# Set environment correctly
+ENV DEBIAN_FRONTEND=noninteractive
+ENV PATH="/root/.local/bin:/root/.cargo/bin:/root/.npm-global/bin${PATH}"
+
+# Copy in local directory
+COPY --chown=root:root . /LunarVim
+
+# Install dependencies and LunarVim
+RUN apt update && \
+ apt -y install sudo curl build-essential git fzf python3-dev python3-pip cargo && \
+ curl -fsSL https://deb.nodesource.com/setup_16.x | bash - && \
+ apt update && \
+ apt -y install nodejs && \
+ apt clean && rm -rf /var/lib/apt/lists/* /tmp/* && \
+ /LunarVim/utils/installer/install-neovim-from-release && \
+ /LunarVim/utils/installer/install.sh --local --no-install-dependencies
+
+# Setup LVIM to run on startup
+ENTRYPOINT ["/bin/bash"]
+CMD ["lvim"]
+
+# vim: ft=dockerfile:
diff --git a/mac/.config/LunarVim/utils/docker/Dockerfile.remote b/mac/.config/LunarVim/utils/docker/Dockerfile.remote
new file mode 100644
index 0000000..e6f811e
--- /dev/null
+++ b/mac/.config/LunarVim/utils/docker/Dockerfile.remote
@@ -0,0 +1,27 @@
+# To run this file execute:
+# docker build -f Dockerfile.remote . -t Lunarvim:remote
+
+FROM ubuntu:latest
+
+# Build argument to point to correct branch on GitHub
+ARG LV_BRANCH=release-1.2/neovim-0.8
+
+# Set environment correctly
+ENV DEBIAN_FRONTEND=noninteractive
+ENV PATH="/root/.local/bin:/root/.cargo/bin:/root/.npm-global/bin${PATH}"
+
+# Install dependencies and LunarVim
+RUN apt update && \
+ apt -y install sudo curl build-essential git fzf python3-dev python3-pip cargo && \
+ curl -fsSL https://deb.nodesource.com/setup_16.x | bash - && \
+ apt update && \
+ apt -y install nodejs && \
+ apt clean && rm -rf /var/lib/apt/lists/* /tmp/* && \
+ curl -LSs https://raw.githubusercontent.com/lunarvim/lunarvim/${LV_BRANCH}/utils/installer/install-neovim-from-release | bash && \
+ LV_BRANCH=${LV_BRANCH} curl -LSs https://raw.githubusercontent.com/lunarvim/lunarvim/${LV_BRANCH}/utils/installer/install.sh | bash -s -- --no-install-dependencies
+
+# Setup LVIM to run on startup
+ENTRYPOINT ["/bin/bash"]
+CMD ["lvim"]
+
+# vim: ft=dockerfile:
diff --git a/mac/.config/LunarVim/utils/installer/config.example.lua b/mac/.config/LunarVim/utils/installer/config.example.lua
new file mode 100644
index 0000000..9776f64
--- /dev/null
+++ b/mac/.config/LunarVim/utils/installer/config.example.lua
@@ -0,0 +1,5 @@
+-- Read the docs: https://www.lunarvim.org/docs/configuration
+-- Example configs: https://github.com/LunarVim/starter.lvim
+-- Video Tutorials: https://www.youtube.com/watch?v=sFA9kX-Ud_c&list=PLhoH5vyxr6QqGu0i7tt_XoVK9v-KvZ3m6
+-- Forum: https://www.reddit.com/r/lunarvim/
+-- Discord: https://discord.com/invite/Xb9B4Ny
diff --git a/mac/.config/LunarVim/utils/installer/config_win.example.lua b/mac/.config/LunarVim/utils/installer/config_win.example.lua
new file mode 100644
index 0000000..1fccb5a
--- /dev/null
+++ b/mac/.config/LunarVim/utils/installer/config_win.example.lua
@@ -0,0 +1,27 @@
+-- Read the docs: https://www.lunarvim.org/docs/configuration
+-- Example configs: https://github.com/LunarVim/starter.lvim
+-- Video Tutorials: https://www.youtube.com/watch?v=sFA9kX-Ud_c&list=PLhoH5vyxr6QqGu0i7tt_XoVK9v-KvZ3m6
+-- Forum: https://www.reddit.com/r/lunarvim/
+-- Discord: https://discord.com/invite/Xb9B4Ny
+
+-- Enable powershell as your default shell
+vim.opt.shell = "pwsh.exe"
+vim.opt.shellcmdflag =
+ "-NoLogo -NoProfile -ExecutionPolicy RemoteSigned -Command [Console]::InputEncoding=[Console]::OutputEncoding=[System.Text.Encoding]::UTF8;"
+vim.cmd [[
+ let &shellredir = '2>&1 | Out-File -Encoding UTF8 %s; exit $LastExitCode'
+ let &shellpipe = '2>&1 | Out-File -Encoding UTF8 %s; exit $LastExitCode'
+ set shellquote= shellxquote=
+ ]]
+
+-- Set a compatible clipboard manager
+vim.g.clipboard = {
+ copy = {
+ ["+"] = "win32yank.exe -i --crlf",
+ ["*"] = "win32yank.exe -i --crlf",
+ },
+ paste = {
+ ["+"] = "win32yank.exe -o --lf",
+ ["*"] = "win32yank.exe -o --lf",
+ },
+}
diff --git a/mac/.config/LunarVim/utils/installer/install-neovim-from-release b/mac/.config/LunarVim/utils/installer/install-neovim-from-release
new file mode 100755
index 0000000..f041f77
--- /dev/null
+++ b/mac/.config/LunarVim/utils/installer/install-neovim-from-release
@@ -0,0 +1,83 @@
+#!/usr/bin/env bash
+
+set -eu pipefall
+
+declare -r LV_INSTALL_PREFIX="${INSTALL_PREFIX:-"$HOME/.local"}"
+declare -r RELEASE_VER="${RELEASE_VER:-latest}" # can be set to nightly
+
+declare ARCHIVE_NAME
+declare OS
+
+OS="$(uname -s)"
+
+if [ "$OS" == "Linux" ]; then
+ ARCHIVE_NAME="nvim-linux64"
+elif [ "$OS" == "Darwin" ]; then
+ ARCHIVE_NAME="nvim-macos-x86_64"
+else
+ echo "$OS platform is not supported currently"
+ exit 1
+fi
+
+if [[ "${RELEASE_VER}" == "latest" ]]; then
+ declare -r RELEASE_URL="https://github.com/neovim/neovim/releases/${RELEASE_VER}/download/${ARCHIVE_NAME}.tar.gz"
+else
+ declare -r RELEASE_URL="https://github.com/neovim/neovim/releases/download/${RELEASE_VER}/${ARCHIVE_NAME}.tar.gz"
+fi
+declare -r CHECKSUM_URL="$RELEASE_URL.sha256sum"
+
+DOWNLOAD_DIR="$(mktemp -d)"
+readonly DOWNLOAD_DIR
+
+RELEASE_SHA="$(curl -Ls "$CHECKSUM_URL" | awk '{print $1}')"
+readonly RELEASE_SHA
+
+function main() {
+ if [ ! -d "$LV_INSTALL_PREFIX" ]; then
+ mkdir -p "$LV_INSTALL_PREFIX" || __invalid__prefix__handler
+ fi
+ download_neovim
+ verify_neovim
+ install_neovim
+}
+
+function download_neovim() {
+ echo "Downloading Neovim's binary from $RELEASE_VER release.."
+ if ! curl --progress-bar --fail -L "$RELEASE_URL" -o "$DOWNLOAD_DIR/$ARCHIVE_NAME.tar.gz"; then
+ echo "Download failed. Check that the release/filename are correct."
+ exit 1
+ fi
+ echo "Download complete!"
+}
+
+function verify_neovim() {
+ echo "Verifying the installation.."
+ DOWNLOADED_SHA="$(openssl dgst -sha256 "$DOWNLOAD_DIR/$ARCHIVE_NAME.tar.gz" | awk '{print $2}')"
+
+ if [ "$RELEASE_SHA" != "$DOWNLOADED_SHA" ]; then
+ echo "Error! checksum mismatch."
+ echo "Expected: $RELEASE_SHA but got: $DOWNLOADED_SHA"
+ exit 1
+ fi
+ echo "Verification complete!"
+}
+
+function install_neovim() {
+
+ echo "Installing Neovim.."
+ pushd "$DOWNLOAD_DIR"
+ tar -xzf "$DOWNLOAD_DIR/$ARCHIVE_NAME.tar.gz"
+ popd
+ # https://dev.to/ackshaey/macos-vs-linux-the-cp-command-will-trip-you-up-2p00
+ cp -r "$DOWNLOAD_DIR/$ARCHIVE_NAME/." "$LV_INSTALL_PREFIX"
+ echo "Installation complete!"
+ echo "Now you can run $LV_INSTALL_PREFIX/bin/nvim"
+}
+
+function __invalid__prefix__handler() {
+ echo "Error! Invalid value for LV_INSTALL_PREFIX: [$INSTALL_PREFIX]"
+ echo "Please verify that the folder exists and re-run the installer!"
+ exit 1
+}
+
+main "$@"
diff --git a/mac/.config/LunarVim/utils/installer/install.ps1 b/mac/.config/LunarVim/utils/installer/install.ps1
new file mode 100644
index 0000000..5aef434
--- /dev/null
+++ b/mac/.config/LunarVim/utils/installer/install.ps1
@@ -0,0 +1,305 @@
+#Requires -Version 7.1
+$ErrorActionPreference = "Stop" # exit when command fails
+if ($PSVersionTable.PSVersion -lt 7.1) {
+ Write-Error "Powershell version needs to be greater than 7.1!"
+}
+
+# set script variables
+$LV_BRANCH = $LV_BRANCH ?? "master"
+$LV_REMOTE = $LV_REMOTE ?? "lunarvim/lunarvim.git"
+$INSTALL_PREFIX = $INSTALL_PREFIX ?? "$HOME\.local"
+
+$env:XDG_DATA_HOME = $env:XDG_DATA_HOME ?? $env:APPDATA
+$env:XDG_CONFIG_HOME = $env:XDG_CONFIG_HOME ?? $env:LOCALAPPDATA
+$env:XDG_CACHE_HOME = $env:XDG_CACHE_HOME ?? $env:TEMP
+
+$env:LUNARVIM_RUNTIME_DIR = $env:LUNARVIM_RUNTIME_DIR ?? "$env:XDG_DATA_HOME\lunarvim"
+$env:LUNARVIM_CONFIG_DIR = $env:LUNARVIM_CONFIG_DIR ?? "$env:XDG_CONFIG_HOME\lvim"
+$env:LUNARVIM_CACHE_DIR = $env:LUNARVIM_CACHE_DIR ?? "$env:XDG_CACHE_HOME\lvim"
+$env:LUNARVIM_BASE_DIR = $env:LUNARVIM_BASE_DIR ?? "$env:LUNARVIM_RUNTIME_DIR\lvim"
+
+$__lvim_dirs = (
+ $env:LUNARVIM_BASE_DIR,
+ $env:LUNARVIM_RUNTIME_DIR,
+ $env:LUNARVIM_CONFIG_DIR,
+ $env:LUNARVIM_CACHE_DIR
+)
+
+function __add_separator($div_width) {
+ "-" * $div_width
+ Write-Output ""
+}
+
+function msg($text){
+ Write-Output $text
+ __add_separator "80"
+}
+
+function main($cliargs) {
+
+ print_logo
+
+ verify_lvim_dirs
+
+ if ($cliargs.Contains("--overwrite")) {
+ Write-Output "!!Warning!! -> Removing all lunarvim related config because of the --overwrite flag"
+ $answer = Read-Host "Would you like to continue? [y]es or [n]o "
+ if ("$answer" -ne "y" -and "$answer" -ne "Y") {
+ exit 1
+ }
+ uninstall_lvim
+ }
+ if ($cliargs.Contains("--local") -or $cliargs.Contains("--testing")) {
+ msg "Using local LunarVim installation"
+ local_install
+ exit
+ }
+
+ msg "Checking dependencies.."
+ check_system_deps
+
+ $answer = Read-Host "Would you like to check lunarvim's NodeJS dependencies? [y]es or [n]o (default: no) "
+ if ("$answer" -eq "y" -or "$answer" -eq "Y") {
+ install_nodejs_deps
+ }
+
+ $answer = Read-Host "Would you like to check lunarvim's Python dependencies? [y]es or [n]o (default: no) "
+ if ("$answer" -eq "y" -or "$answer" -eq "Y") {
+ install_python_deps
+ }
+
+
+ if (Test-Path "$env:LUNARVIM_BASE_DIR\init.lua" ) {
+ msg "Updating LunarVim"
+ validate_lunarvim_files
+ }
+ else {
+ msg "Cloning Lunarvim"
+ clone_lvim
+ setup_lvim
+ }
+}
+
+function print_missing_dep_msg($dep) {
+ Write-Output "[ERROR]: Unable to find dependency [$dep]"
+ Write-Output "Please install it first and re-run the installer."
+}
+
+$winget_package_matrix=@{"git" = "Git.Git"; "nvim" = "Neovim.Neovim"; "make" = "GnuWin32.Make"; "node" = "OpenJS.NodeJS"; "pip" = "Python.Python.3.11"}
+$winget_additional_arguments_matrix=@{"git" = "--source winget --interactive"; "nvim" = "--interactive"; "make" = "--interactive"; "node" = ""; "pip" = ""}
+
+$scoop_package_matrix=@{"git" = "git"; "nvim" = "neovim"; "make" = "make"; "node" = "nodejs"; "pip" = "python"}
+
+function install_system_package($dep) {
+ # Make installers sometimes have a problem when adding make to path
+ Write-Output "WARNING: Preparing 'make' installation. The make directory ('C:\Program Files (x86)\GnuWin32\bin') might not be added to the PATH by the installer, and you might have to manually to the PATH!"
+ if (Get-Command -Name "winget" -ErrorAction SilentlyContinue) {
+ Write-Output "Attempting to install dependency [$dep] with winget"
+
+ $command="winget"
+ $command_arguments = "-e --id $($winget_package_matrix[$dep]) $($winget_additional_arguments_matrix[$dep])".Trim() -split ' '
+ }
+ elseif (Get-Command -Name "scoop" -ErrorAction SilentlyContinue) {
+ Write-Output "Attempting to install dependency [$dep] with scoop"
+ # TODO: check if it's fine to not run it with --global
+ $command = "scoop"
+ $command_arguments = "$($scoop_package_matrix[$dep])".Trim() -split ' '
+ }
+ else {
+ print_missing_dep_msg "$dep"
+ exit 1
+ }
+
+ try {
+ & $command install $command_arguments
+ # Refresh the path after installation
+ $env:Path = [System.Environment]::GetEnvironmentVariable("Path", "Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path", "User")
+ } catch {
+ Write-Output "An error occurred: $_"
+ exit 1
+ }
+}
+
+function check_system_dep($dep) {
+ try {
+ Get-Command -Name $dep -ErrorAction Stop | Out-Null
+ }
+ catch {
+ install_system_package "$dep"
+ }
+}
+
+function check_system_deps() {
+ check_system_dep "git"
+ check_system_dep "nvim"
+ check_system_dep "make"
+}
+
+function install_nodejs_deps() {
+ $dep = "node"
+ try {
+ check_system_dep "$dep"
+ Invoke-Command -ScriptBlock { npm install --global neovim tree-sitter-cli } -ErrorAction Break
+ }
+ catch {
+ print_missing_dep_msg "$dep"
+ }
+}
+
+function install_python_deps() {
+ $dep = "pip"
+ try {
+ check_system_dep "$dep"
+ Invoke-Command -ScriptBlock { python -m pip install --user pynvim } -ErrorAction Break
+ }
+ catch {
+ print_missing_dep_msg "$dep"
+ }
+}
+
+function backup_old_config() {
+ $src = "$env:LUNARVIM_CONFIG_DIR"
+ if (Test-Path $src) {
+ New-Item "$src.old" -ItemType Directory -Force | Out-Null
+ Copy-Item -Force -Recurse "$src\*" "$src.old\." | Out-Null
+ }
+ msg "Backup operation complete"
+}
+
+
+function local_install() {
+ verify_lvim_dirs
+ $repoDir = git rev-parse --show-toplevel
+ $gitLocalCloneCmd = git clone --progress "$repoDir" "$env:LUNARVIM_BASE_DIR"
+ Invoke-Command -ErrorAction Stop -ScriptBlock { $gitLocalCloneCmd; setup_lvim }
+}
+
+function clone_lvim() {
+ try {
+ $gitCloneCmd = git clone --progress --depth 1 --branch "$LV_BRANCH" `
+ "https://github.com/$LV_REMOTE" `
+ "$env:LUNARVIM_BASE_DIR"
+ Invoke-Command -ErrorAction Stop -ScriptBlock { $gitCloneCmd }
+ }
+ catch {
+ msg "Failed to clone repository. Installation failed."
+ exit 1
+ }
+}
+
+function setup_shim() {
+ if ((Test-Path "$INSTALL_PREFIX\bin") -eq $false) {
+ New-Item "$INSTALL_PREFIX\bin" -ItemType Directory | Out-Null
+ }
+
+ Copy-Item -Force "$env:LUNARVIM_BASE_DIR\utils\bin\lvim.ps1" "$INSTALL_PREFIX\bin\lvim.ps1"
+}
+
+function uninstall_lvim() {
+ foreach ($dir in $__lvim_dirs) {
+ if (Test-Path "$dir") {
+ Remove-Item -Force -Recurse "$dir"
+ }
+ }
+}
+
+function verify_lvim_dirs() {
+ foreach ($dir in $__lvim_dirs) {
+ if ((Test-Path "$dir") -eq $false) {
+ New-Item "$dir" -ItemType Directory | Out-Null
+ }
+ }
+ backup_old_config
+}
+
+
+function setup_lvim() {
+ msg "Installing LunarVim shim"
+ setup_shim
+
+ msg "Installing sample configuration"
+
+ if (Test-Path "$env:LUNARVIM_CONFIG_DIR\config.lua") {
+ Move-Item "$env:LUNARVIM_CONFIG_DIR\config.lua" "$env:LUNARVIM_CONFIG_DIR\config.lua.old"
+ }
+
+ New-Item -ItemType File -Path "$env:LUNARVIM_CONFIG_DIR\config.lua" | Out-Null
+
+ $exampleConfig = "$env:LUNARVIM_BASE_DIR\utils\installer\config_win.example.lua"
+ Copy-Item -Force "$exampleConfig" "$env:LUNARVIM_CONFIG_DIR\config.lua"
+
+ Write-Host "Make sure to run `:Lazy sync` at first launch" -ForegroundColor Green
+
+ create_alias
+
+ msg "Thank you for installing LunarVim!!"
+
+ Write-Output "You can start it by running: $INSTALL_PREFIX\bin\lvim.ps1"
+ Write-Output "Do not forget to use a font with glyphs (icons) support [https://github.com/ryanoasis/nerd-fonts]"
+}
+
+
+function validate_lunarvim_files() {
+ Set-Alias lvim "$INSTALL_PREFIX\bin\lvim.ps1"
+ try {
+ $verify_version_cmd="if !empty(v:errmsg) | cquit | else | quit | endif"
+ Invoke-Command -ScriptBlock { lvim --headless -c 'LvimUpdate' -c "$verify_version_cmd" } -ErrorAction SilentlyContinue
+ }
+ catch {
+ Write-Output "Unable to guarantee data integrity while updating. Please run `:LvimUpdate` manually instead."
+ exit 1
+ }
+ Write-Output "Your LunarVim installation is now up to date!"
+}
+
+function create_alias {
+ try {
+ $answer = Read-Host $(`
+ "Would you like to create an alias inside your Powershell profile?`n" + `
+ "(This enables you to start lvim with the command 'lvim') [y]es or [n]o (default: no)" )
+ }
+ catch {
+ msg "Non-interactive mode detected. Skipping alias creation"
+ return
+ }
+
+ if ("$answer" -ne "y" -or "$answer" -ne "Y") {
+ return
+ }
+
+ $lvim_bin="$INSTALL_PREFIX\bin\lvim.ps1"
+ $lvim_alias = Get-Alias lvim -ErrorAction SilentlyContinue
+
+ if ($lvim_alias.Definition -eq $lvim_bin) {
+ Write-Output "Alias is already set and will not be reset."
+ return
+ }
+
+ try {
+ Get-Content $PROFILE -ErrorAction Stop
+ }
+ catch {
+ New-Item -Path $PROFILE -ItemType "file" -Force
+ }
+
+ Add-Content -Path $PROFILE -Value $("`r`nSet-Alias lvim '$lvim_bin'")
+
+ Write-Host 'To use the new alias in this window reload your profile with: `. $PROFILE`' -ForegroundColor Green
+}
+
+function print_logo(){
+ Write-Output "
+
+ 88\ 88\
+ 88 | \__|
+ 88 |88\ 88\ 888888$\ 888888\ 888888\ 88\ 88\ 88\ 888888\8888\
+ 88 |88 | 88 |88 __88\ \____88\ 88 __88\\88\ 88 |88 |88 _88 _88\
+ 88 |88 | 88 |88 | 88 | 888888$ |88 | \__|\88\88 / 88 |88 / 88 / 88 |
+ 88 |88 | 88 |88 | 88 |88 __88 |88 | \88$ / 88 |88 | 88 | 88 |
+ 88 |\888888 |88 | 88 |\888888$ |88 | \$ / 88 |88 | 88 | 88 |
+ \__| \______/ \__| \__| \_______|\__| \_/ \__|\__| \__| \__|
+
+ "
+}
+
+main "$args"
diff --git a/mac/.config/LunarVim/utils/installer/install.sh b/mac/.config/LunarVim/utils/installer/install.sh
new file mode 100755
index 0000000..0fd09bc
--- /dev/null
+++ b/mac/.config/LunarVim/utils/installer/install.sh
@@ -0,0 +1,461 @@
+#!/usr/bin/env bash
+set -eo pipefail
+
+OS="$(uname -s)"
+
+#Set branch to master unless specified by the user
+declare -x LV_BRANCH="${LV_BRANCH:-"master"}"
+declare -xr LV_REMOTE="${LV_REMOTE:-lunarvim/lunarvim.git}"
+declare -xr INSTALL_PREFIX="${INSTALL_PREFIX:-"$HOME/.local"}"
+
+declare -xr XDG_DATA_HOME="${XDG_DATA_HOME:-"$HOME/.local/share"}"
+declare -xr XDG_CACHE_HOME="${XDG_CACHE_HOME:-"$HOME/.cache"}"
+declare -xr XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-"$HOME/.config"}"
+
+declare -xr NVIM_APPNAME="${NVIM_APPNAME:-"lvim"}"
+
+declare -xr LUNARVIM_RUNTIME_DIR="${LUNARVIM_RUNTIME_DIR:-"$XDG_DATA_HOME/lunarvim"}"
+declare -xr LUNARVIM_CONFIG_DIR="${LUNARVIM_CONFIG_DIR:-"$XDG_CONFIG_HOME/$NVIM_APPNAME"}"
+declare -xr LUNARVIM_CACHE_DIR="${LUNARVIM_CACHE_DIR:-"$XDG_CACHE_HOME/$NVIM_APPNAME"}"
+declare -xr LUNARVIM_BASE_DIR="${LUNARVIM_BASE_DIR:-"$LUNARVIM_RUNTIME_DIR/$NVIM_APPNAME"}"
+
+declare -xr LUNARVIM_LOG_LEVEL="${LUNARVIM_LOG_LEVEL:-warn}"
+
+declare BASEDIR
+BASEDIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)"
+BASEDIR="$(dirname -- "$(dirname -- "$BASEDIR")")"
+readonly BASEDIR
+
+declare ARGS_LOCAL=0
+declare ARGS_OVERWRITE=0
+declare ARGS_INSTALL_DEPENDENCIES=1
+declare INTERACTIVE_MODE=1
+declare ADDITIONAL_WARNINGS=""
+
+declare -a __lvim_dirs=(
+ "$LUNARVIM_RUNTIME_DIR"
+ "$LUNARVIM_CACHE_DIR"
+ "$LUNARVIM_BASE_DIR"
+)
+
+declare -a __npm_deps=(
+ "neovim"
+)
+# treesitter installed with brew causes conflicts #3738
+if ! command -v tree-sitter &>/dev/null; then
+ __npm_deps+=("tree-sitter-cli")
+fi
+
+declare -a __rust_deps=(
+ "fd::fd-find"
+ "rg::ripgrep"
+)
+
+function usage() {
+ echo "Usage: install.sh [<options>]"
+ echo ""
+ echo "Options:"
+ echo " -h, --help Print this help message"
+ echo " -l, --local Install local copy of LunarVim"
+ echo " -y, --yes Disable confirmation prompts (answer yes to all questions)"
+ echo " --overwrite Overwrite previous LunarVim configuration (a backup is always performed first)"
+ echo " --[no-]install-dependencies Whether to automatically install external dependencies (will prompt by default)"
+}
+
+function parse_arguments() {
+ while [ "$#" -gt 0 ]; do
+ case "$1" in
+ -l | --local)
+ ARGS_LOCAL=1
+ ;;
+ --overwrite)
+ ARGS_OVERWRITE=1
+ ;;
+ -y | --yes)
+ INTERACTIVE_MODE=0
+ ;;
+ --install-dependencies)
+ ARGS_INSTALL_DEPENDENCIES=1
+ ;;
+ --no-install-dependencies)
+ ARGS_INSTALL_DEPENDENCIES=0
+ ;;
+ -h | --help)
+ usage
+ exit 0
+ ;;
+ esac
+ shift
+ done
+}
+
+function msg() {
+ local text="$1"
+ local div_width="80"
+ printf "%${div_width}s\n" ' ' | tr ' ' -
+ printf "%s\n" "$text"
+}
+
+function confirm() {
+ local question="$1"
+ while true; do
+ msg "$question"
+ read -p "[y]es or [n]o (default: no) : " -r answer
+ case "$answer" in
+ y | Y | yes | YES | Yes)
+ return 0
+ ;;
+ n | N | no | NO | No | *[[:blank:]]* | "")
+ return 1
+ ;;
+ *)
+ msg "Please answer [y]es or [n]o."
+ ;;
+ esac
+ done
+}
+
+function stringify_array() {
+ echo -n "${@}" | sed 's/ /, /'
+}
+
+function main() {
+ parse_arguments "$@"
+
+ print_logo
+
+ msg "Detecting platform for managing any additional neovim dependencies"
+ detect_platform
+
+ check_system_deps
+
+ if [ "$ARGS_INSTALL_DEPENDENCIES" -eq 1 ]; then
+ if [ "$INTERACTIVE_MODE" -eq 1 ]; then
+ if confirm "Would you like to install LunarVim's NodeJS/BunJS dependencies: $(stringify_array "${__npm_deps[@]}")?"; then
+ install_nodejs_deps
+ fi
+ if confirm "Would you like to install LunarVim's Rust dependencies: $(stringify_array "${__rust_deps[@]}")?"; then
+ install_rust_deps
+ fi
+ else
+ install_nodejs_deps
+ install_rust_deps
+ fi
+ fi
+
+ remove_old_cache_files
+
+ verify_lvim_dirs
+
+ if [ "$ARGS_LOCAL" -eq 1 ]; then
+ link_local_lvim
+ else
+ clone_lvim
+ fi
+
+ setup_lvim
+
+ msg "$ADDITIONAL_WARNINGS"
+ msg "Thank you for installing LunarVim!!"
+ echo "You can start it by running: $INSTALL_PREFIX/bin/$NVIM_APPNAME"
+ echo "Do not forget to use a font with glyphs (icons) support [https://github.com/ryanoasis/nerd-fonts]"
+}
+
+function detect_platform() {
+ case "$OS" in
+ Linux)
+ if [ -f "/etc/arch-release" ] || [ -f "/etc/artix-release" ]; then
+ RECOMMEND_INSTALL="sudo pacman -S"
+ elif [ -f "/etc/fedora-release" ] || [ -f "/etc/redhat-release" ]; then
+ RECOMMEND_INSTALL="sudo dnf install -y"
+ elif [ -f "/etc/gentoo-release" ]; then
+ RECOMMEND_INSTALL="emerge -tv"
+ else # assume debian based
+ RECOMMEND_INSTALL="sudo apt install -y"
+ fi
+ ;;
+ FreeBSD)
+ RECOMMEND_INSTALL="sudo pkg install -y"
+ ;;
+ NetBSD)
+ RECOMMEND_INSTALL="sudo pkgin install"
+ ;;
+ OpenBSD)
+ RECOMMEND_INSTALL="doas pkg_add"
+ ;;
+ Darwin)
+ RECOMMEND_INSTALL="brew install"
+ ;;
+ *)
+ echo "OS $OS is not currently supported."
+ exit 1
+ ;;
+ esac
+}
+
+function print_missing_dep_msg() {
+ if [ "$#" -eq 1 ]; then
+ echo "[ERROR]: Unable to find dependency [$1]"
+ echo "Please install it first and re-run the installer. Try: $RECOMMEND_INSTALL $1"
+ else
+ local cmds
+ cmds=$(for i in "$@"; do echo "$RECOMMEND_INSTALL $i"; done)
+ printf "[ERROR]: Unable to find dependencies [%s]" "$@"
+ printf "Please install any one of the dependencies and re-run the installer. Try: \n%s\n" "$cmds"
+ fi
+}
+
+function check_neovim_min_version() {
+ local verify_version_cmd='if !has("nvim-0.9") | cquit | else | quit | endif'
+
+ # exit with an error if min_version not found
+ if ! nvim --headless -u NONE -c "$verify_version_cmd"; then
+ echo "[ERROR]: LunarVim requires at least Neovim v0.9 or higher"
+ exit 1
+ fi
+}
+
+function verify_core_plugins() {
+ msg "Verifying core plugins"
+ if ! bash "$LUNARVIM_BASE_DIR/utils/ci/verify_plugins.sh"; then
+ echo "[ERROR]: Unable to verify plugins, make sure to manually run ':Lazy sync' when starting lvim for the first time."
+ exit 1
+ fi
+ echo "Verification complete!"
+}
+
+function validate_install_prefix() {
+ local prefix="$1"
+ case $PATH in
+ *"$prefix/bin"*)
+ return
+ ;;
+ esac
+ local profile="$HOME/.profile"
+ test -z "$ZSH_VERSION" && profile="$HOME/.zshenv"
+ ADDITIONAL_WARNINGS="[WARN] the folder $prefix/bin is not on PATH, consider adding 'export PATH=$prefix/bin:\$PATH' to your $profile"
+
+ # avoid problems when calling any verify_* function
+ export PATH="$prefix/bin:$PATH"
+}
+
+function check_system_deps() {
+
+ validate_install_prefix "$INSTALL_PREFIX"
+
+ if ! command -v git &>/dev/null; then
+ print_missing_dep_msg "git"
+ exit 1
+ fi
+ if ! command -v nvim &>/dev/null; then
+ print_missing_dep_msg "neovim"
+ exit 1
+ fi
+ check_neovim_min_version
+}
+
+function __install_nodejs_deps_pnpm() {
+ echo "Installing node modules with pnpm.."
+ pnpm install -g "${__npm_deps[@]}"
+ echo "All NodeJS dependencies are successfully installed"
+}
+
+function __install_nodejs_deps_npm() {
+ echo "Installing node modules with npm.."
+ for dep in "${__npm_deps[@]}"; do
+ if ! npm ls -g "$dep" &>/dev/null; then
+ printf "installing %s .." "$dep"
+ npm install -g "$dep"
+ fi
+ done
+
+ echo "All NodeJS dependencies are successfully installed"
+}
+
+function __install_nodejs_deps_yarn() {
+ echo "Installing node modules with yarn.."
+ yarn global add "${__npm_deps[@]}"
+ echo "All NodeJS dependencies are successfully installed"
+}
+
+function __install_nodejs_deps_bun() {
+ echo "Installing bun modules with bun..."
+ bun install -g "${__npm_deps[@]}"
+ echo "All BunJS dependencies are successfully installed"
+}
+
+function __validate_node_installation() {
+ local pkg_manager="$1"
+ local manager_home
+
+ if ! command -v "$pkg_manager" &>/dev/null; then
+ return 1
+ fi
+
+ if [ "$pkg_manager" == "npm" ]; then
+ manager_home="$(npm config get prefix 2>/dev/null)"
+ elif [ "$pkg_manager" == "bun" ]; then
+ manager_home="$BUN_INSTALL"
+ elif [ "$pkg_manager" == "pnpm" ]; then
+ manager_home="$(pnpm config get prefix 2>/dev/null)"
+ else
+ manager_home="$(yarn global bin 2>/dev/null)"
+ fi
+
+ if [ ! -d "$manager_home" ] || [ ! -w "$manager_home" ]; then
+ return 1
+ fi
+
+ return 0
+}
+
+function install_nodejs_deps() {
+ local -a pkg_managers=("pnpm" "bun" "yarn" "npm")
+ for pkg_manager in "${pkg_managers[@]}"; do
+ if __validate_node_installation "$pkg_manager"; then
+ eval "__install_nodejs_deps_$pkg_manager"
+ return
+ fi
+ done
+ echo "[WARN]: skipping installing optional nodejs dependencies due to insufficient permissions."
+ echo "check how to solve it: https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally"
+}
+
+function __attempt_to_install_with_cargo() {
+ if command -v cargo &>/dev/null; then
+ echo "Installing missing Rust dependency with cargo"
+ cargo install "$1"
+ else
+ echo "[WARN]: Unable to find cargo. Make sure to install it to avoid any problems"
+ exit 1
+ fi
+}
+
+# we try to install the missing one with cargo even though it's unlikely to be found
+function install_rust_deps() {
+ for dep in "${__rust_deps[@]}"; do
+ if ! command -v "${dep%%::*}" &>/dev/null; then
+ __attempt_to_install_with_cargo "${dep##*::}"
+ fi
+ done
+ echo "All Rust dependencies are successfully installed"
+}
+
+function __backup_dir() {
+ local src="$1"
+ if [ ! -d "$src" ]; then
+ return
+ fi
+ mkdir -p "$src.old"
+ msg "Backing up old $src to $src.old"
+ if command -v rsync &>/dev/null; then
+ rsync --archive --quiet --backup --partial --copy-links --cvs-exclude "$src"/ "$src.old"
+ else
+ case "$OS" in
+ Darwin)
+ cp -R "$src/." "$src.old/."
+ ;;
+ *)
+ cp -r "$src/." "$src.old/."
+ ;;
+ esac
+ fi
+}
+
+function verify_lvim_dirs() {
+ for dir in "${__lvim_dirs[@]}"; do
+ if [ -d "$dir" ]; then
+ if [ "$ARGS_OVERWRITE" -eq 0 ]; then
+ __backup_dir "$dir"
+ fi
+ rm -rf "$dir"
+ fi
+ mkdir -p "$dir"
+ done
+ mkdir -p "$LUNARVIM_CONFIG_DIR"
+}
+
+function clone_lvim() {
+ msg "Cloning LunarVim configuration"
+ if ! git clone --progress --depth 1 --branch "$LV_BRANCH" \
+ "https://github.com/${LV_REMOTE}" "$LUNARVIM_BASE_DIR"; then
+ echo "Failed to clone repository. Installation failed."
+ exit 1
+ fi
+}
+
+function link_local_lvim() {
+ echo "Linking local LunarVim repo"
+
+ # Detect whether it's a symlink or a folder
+ if [ -d "$LUNARVIM_BASE_DIR" ]; then
+ msg "Moving old files to ${LUNARVIM_BASE_DIR}.old"
+ mv "$LUNARVIM_BASE_DIR" "${LUNARVIM_BASE_DIR}".old
+ fi
+
+ echo " - $BASEDIR -> $LUNARVIM_BASE_DIR"
+ ln -s -f "$BASEDIR" "$LUNARVIM_BASE_DIR"
+}
+
+function setup_shim() {
+ make -C "$LUNARVIM_BASE_DIR" install-bin
+}
+
+function remove_old_cache_files() {
+ local lazy_cache="$LUNARVIM_CACHE_DIR/lazy/cache"
+ if [ -e "$lazy_cache" ]; then
+ msg "Removing old lazy cache file"
+ rm -f "$lazy_cache"
+ fi
+}
+
+function setup_lvim() {
+
+ msg "Installing LunarVim shim"
+
+ setup_shim
+
+ create_desktop_file
+
+ [ ! -f "$LUNARVIM_CONFIG_DIR/config.lua" ] \
+ && cp "$LUNARVIM_BASE_DIR/utils/installer/config.example.lua" "$LUNARVIM_CONFIG_DIR/config.lua"
+
+ echo "Preparing Lazy setup"
+
+ "$INSTALL_PREFIX/bin/$NVIM_APPNAME" --headless -c 'quitall'
+
+ printf "\nLazy setup complete\n"
+
+ verify_core_plugins
+}
+
+function create_desktop_file() {
+ # TODO: Any other OSes that use desktop files?
+ ([ "$OS" != "Linux" ] || ! command -v xdg-desktop-menu &>/dev/null) && return
+ echo "Creating desktop file"
+
+ for d in "$LUNARVIM_BASE_DIR"/utils/desktop/*/; do
+ size_folder=$(basename "$d")
+ mkdir -p "$XDG_DATA_HOME/icons/hicolor/$size_folder/apps/"
+ cp "$LUNARVIM_BASE_DIR/utils/desktop/$size_folder/lvim.svg" "$XDG_DATA_HOME/icons/hicolor/$size_folder/apps"
+ done
+
+ xdg-desktop-menu install --novendor "$LUNARVIM_BASE_DIR/utils/desktop/lvim.desktop" || true
+}
+
+function print_logo() {
+ cat <<'EOF'
+
+ 88\ 88\
+ 88 | \__|
+ 88 |88\ 88\ 888888$\ 888888\ 888888\ 88\ 88\ 88\ 888888\8888\
+ 88 |88 | 88 |88 __88\ \____88\ 88 __88\\88\ 88 |88 |88 _88 _88\
+ 88 |88 | 88 |88 | 88 | 888888$ |88 | \__|\88\88 / 88 |88 / 88 / 88 |
+ 88 |88 | 88 |88 | 88 |88 __88 |88 | \88$ / 88 |88 | 88 | 88 |
+ 88 |\888888 |88 | 88 |\888888$ |88 | \$ / 88 |88 | 88 | 88 |
+ \__| \______/ \__| \__| \_______|\__| \_/ \__|\__| \__| \__|
+
+EOF
+}
+
+main "$@"
diff --git a/mac/.config/LunarVim/utils/installer/install_bin.sh b/mac/.config/LunarVim/utils/installer/install_bin.sh
new file mode 100755
index 0000000..a25ad37
--- /dev/null
+++ b/mac/.config/LunarVim/utils/installer/install_bin.sh
@@ -0,0 +1,40 @@
+#!/usr/bin/env bash
+set -eo pipefail
+
+INSTALL_PREFIX="${INSTALL_PREFIX:-"$HOME/.local"}"
+
+XDG_DATA_HOME="${XDG_DATA_HOME:-"$HOME/.local/share"}"
+XDG_CACHE_HOME="${XDG_CACHE_HOME:-"$HOME/.cache"}"
+XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-"$HOME/.config"}"
+
+NVIM_APPNAME="${NVIM_APPNAME:-lvim}"
+
+LUNARVIM_RUNTIME_DIR="${LUNARVIM_RUNTIME_DIR:-"$XDG_DATA_HOME/lunarvim"}"
+LUNARVIM_CONFIG_DIR="${LUNARVIM_CONFIG_DIR:-"$XDG_CONFIG_HOME/$NVIM_APPNAME"}"
+LUNARVIM_CACHE_DIR="${LUNARVIM_CACHE_DIR:-"$XDG_CACHE_HOME/$NVIM_APPNAME"}"
+LUNARVIM_BASE_DIR="${LUNARVIM_BASE_DIR:-"$LUNARVIM_RUNTIME_DIR/$NVIM_APPNAME"}"
+
+function setup_shim() {
+ local src="$LUNARVIM_BASE_DIR/utils/bin/lvim.template"
+ local dst="$INSTALL_PREFIX/bin/$NVIM_APPNAME"
+
+ [ ! -d "$INSTALL_PREFIX/bin" ] && mkdir -p "$INSTALL_PREFIX/bin"
+
+ # remove outdated installation so that `cp` doesn't complain
+ rm -f "$dst"
+
+ cp "$src" "$dst"
+
+ sed -e s"#NVIM_APPNAME_VAR#\"${NVIM_APPNAME}\"#"g \
+ -e s"#RUNTIME_DIR_VAR#\"${LUNARVIM_RUNTIME_DIR}\"#"g \
+ -e s"#CONFIG_DIR_VAR#\"${LUNARVIM_CONFIG_DIR}\"#"g \
+ -e s"#CACHE_DIR_VAR#\"${LUNARVIM_CACHE_DIR}\"#"g \
+ -e s"#BASE_DIR_VAR#\"${LUNARVIM_BASE_DIR}\"#"g "$src" \
+ | tee "$dst" >/dev/null
+
+ chmod u+x "$dst"
+}
+
+setup_shim "$@"
+
+echo "You can start LunarVim by running: $INSTALL_PREFIX/bin/$NVIM_APPNAME"
diff --git a/mac/.config/LunarVim/utils/installer/install_stylua.sh b/mac/.config/LunarVim/utils/installer/install_stylua.sh
new file mode 100755
index 0000000..963416e
--- /dev/null
+++ b/mac/.config/LunarVim/utils/installer/install_stylua.sh
@@ -0,0 +1,63 @@
+#!/usr/bin/env bash
+
+set -eu pipefall
+
+declare -r INSTALL_DIR="$PWD/utils"
+declare -r RELEASE="0.10.0"
+declare -r OS="linux"
+# declare -r OS="$(uname -s)"
+declare -r FILENAME="stylua-$RELEASE-$OS"
+
+declare -a __deps=("curl" "unzip")
+
+function check_deps() {
+ for dep in "${__deps[@]}"; do
+ if ! command -v "$dep" >/dev/null; then
+ echo "Missing depdendecy!"
+ echo "The \"$dep\" command was not found!. Please install and try again."
+ fi
+ done
+}
+
+function download_stylua() {
+ local DOWNLOAD_DIR
+ local URL="https://github.com/JohnnyMorganz/StyLua/releases/download/v$RELEASE/$FILENAME.zip"
+
+ DOWNLOAD_DIR="$(mktemp -d)"
+ echo "Initiating download for Stylua v$RELEASE"
+ if ! curl --progress-bar --fail -L "$URL" -o "$DOWNLOAD_DIR/$FILENAME.zip"; then
+ echo "Download failed. Check that the release/filename are correct."
+ exit 1
+ fi
+
+ echo "Installation in progress.."
+ unzip -q "$DOWNLOAD_DIR/$FILENAME.zip" -d "$DOWNLOAD_DIR"
+
+ if [ -f "$DOWNLOAD_DIR/stylua" ]; then
+ mv "$DOWNLOAD_DIR/stylua" "$INSTALL_DIR/stylua"
+ else
+ mv "$DOWNLOAD_DIR/$FILENAME/stylua" "$INSTALL_DIR/."
+ fi
+
+ chmod u+x "$INSTALL_DIR/stylua"
+}
+
+function verify_install() {
+ echo "Verifying installation.."
+ local DOWNLOADED_VER
+ DOWNLOADED_VER="$("$INSTALL_DIR/stylua" -V | awk '{ print $2 }')"
+ if [ "$DOWNLOADED_VER" != "$RELEASE" ]; then
+ echo "Mismatched version!"
+ echo "Expected: v$RELEASE but got v$DOWNLOADED_VER"
+ exit 1
+ fi
+ echo "Verification complete!"
+}
+
+function main() {
+ check_deps
+ download_stylua
+ verify_install
+}
+
+main "$@"
diff --git a/mac/.config/LunarVim/utils/installer/uninstall.ps1 b/mac/.config/LunarVim/utils/installer/uninstall.ps1
new file mode 100644
index 0000000..dcfeb26
--- /dev/null
+++ b/mac/.config/LunarVim/utils/installer/uninstall.ps1
@@ -0,0 +1,63 @@
+#Requires -Version 7.1
+$ErrorActionPreference = "Stop" # exit when command fails
+
+# set script variables
+$LV_BRANCH = $LV_BRANCH ?? "master"
+$LV_REMOTE = $LV_REMOTE ?? "lunarvim/lunarvim.git"
+$INSTALL_PREFIX = $INSTALL_PREFIX ?? "$HOME\.local"
+
+$env:XDG_DATA_HOME = $env:XDG_DATA_HOME ?? $env:APPDATA
+$env:XDG_CONFIG_HOME = $env:XDG_CONFIG_HOME ?? $env:LOCALAPPDATA
+$env:XDG_CACHE_HOME = $env:XDG_CACHE_HOME ?? $env:TEMP
+
+$env:LUNARVIM_RUNTIME_DIR = $env:LUNARVIM_RUNTIME_DIR ?? "$env:XDG_DATA_HOME\lunarvim"
+$env:LUNARVIM_CONFIG_DIR = $env:LUNARVIM_CONFIG_DIR ?? "$env:XDG_CONFIG_HOME\lvim"
+$env:LUNARVIM_CACHE_DIR = $env:LUNARVIM_CACHE_DIR ?? "$env:XDG_CACHE_HOME\lvim"
+$env:LUNARVIM_BASE_DIR = $env:LUNARVIM_BASE_DIR ?? "$env:LUNARVIM_RUNTIME_DIR\lvim"
+
+$__lvim_dirs = (
+ $env:LUNARVIM_BASE_DIR,
+ $env:LUNARVIM_RUNTIME_DIR,
+ $env:LUNARVIM_CONFIG_DIR,
+ $env:LUNARVIM_CACHE_DIR
+)
+
+function main($cliargs) {
+ Write-Output "Removing LunarVim binary..."
+ remove_lvim_bin
+ Write-Output "Removing LunarVim directories..."
+ $force = $false
+ if ($cliargs.Contains("--remove-backups")) {
+ $force = $true
+ }
+ remove_lvim_dirs $force
+ Write-Output "Uninstalled LunarVim!"
+}
+
+function remove_lvim_bin(){
+ $lvim_bin="$INSTALL_PREFIX\bin\lvim"
+ if (Test-Path $lvim_bin) {
+ Remove-Item -Force $lvim_bin
+ }
+ if (Test-Path alias:lvim) {
+ Write-Warning "Please make sure to remove the 'lvim' alias from your `$PROFILE`: $PROFILE"
+ }
+}
+
+function remove_lvim_dirs($force) {
+ foreach ($dir in $__lvim_dirs) {
+ if (Test-Path $dir) {
+ Remove-Item -Force -Recurse $dir
+ }
+ if ($force -eq $true) {
+ if (Test-Path "$dir.bak") {
+ Remove-Item -Force -Recurse "$dir.bak"
+ }
+ if (Test-Path "$dir.old") {
+ Remove-Item -Force -Recurse "$dir.old"
+ }
+ }
+ }
+}
+
+main($args)
diff --git a/mac/.config/LunarVim/utils/installer/uninstall.sh b/mac/.config/LunarVim/utils/installer/uninstall.sh
new file mode 100755
index 0000000..9b26263
--- /dev/null
+++ b/mac/.config/LunarVim/utils/installer/uninstall.sh
@@ -0,0 +1,89 @@
+#!/usr/bin/env bash
+set -eo pipefail
+
+ARGS_REMOVE_BACKUPS=0
+ARGS_REMOVE_CONFIG=0
+
+declare -r XDG_DATA_HOME="${XDG_DATA_HOME:-"$HOME/.local/share"}"
+declare -r XDG_CACHE_HOME="${XDG_CACHE_HOME:-"$HOME/.cache"}"
+declare -r XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-"$HOME/.config"}"
+
+declare -xr NVIM_APPNAME="${NVIM_APPNAME:-"lvim"}"
+
+declare -xr LUNARVIM_RUNTIME_DIR="${LUNARVIM_RUNTIME_DIR:-"$XDG_DATA_HOME/lunarvim"}"
+declare -xr LUNARVIM_CONFIG_DIR="${LUNARVIM_CONFIG_DIR:-"$XDG_CONFIG_HOME/$NVIM_APPNAME"}"
+declare -xr LUNARVIM_CACHE_DIR="${LUNARVIM_CACHE_DIR:-"$XDG_CACHE_HOME/$NVIM_APPNAME"}"
+declare -xr LUNARVIM_BASE_DIR="${LUNARVIM_BASE_DIR:-"$LUNARVIM_RUNTIME_DIR/$NVIM_APPNAME"}"
+
+declare -a __lvim_dirs=(
+ "$LUNARVIM_RUNTIME_DIR"
+ "$LUNARVIM_CACHE_DIR"
+)
+
+__lvim_config_dir="$LUNARVIM_CONFIG_DIR"
+
+function usage() {
+ echo "Usage: uninstall.sh [<options>]"
+ echo ""
+ echo "Options:"
+ echo " -h, --help Print this help message"
+ echo " --remove-config Remove user config files as well"
+ echo " --remove-backups Remove old backup folders as well"
+}
+
+function parse_arguments() {
+ while [ "$#" -gt 0 ]; do
+ case "$1" in
+ --remove-backups)
+ ARGS_REMOVE_BACKUPS=1
+ ;;
+ --remove-config)
+ ARGS_REMOVE_CONFIG=1
+ ;;
+ -h | --help)
+ usage
+ exit 0
+ ;;
+ esac
+ shift
+ done
+}
+
+function remove_lvim_dirs() {
+ if [ "$ARGS_REMOVE_CONFIG" -eq 1 ]; then
+ __lvim_dirs+=("$__lvim_config_dir")
+ fi
+ for dir in "${__lvim_dirs[@]}"; do
+ rm -rf "$dir"
+ if [ "$ARGS_REMOVE_BACKUPS" -eq 1 ]; then
+ rm -rf "$dir.{bak,old}"
+ fi
+ done
+}
+
+function remove_lvim_bin() {
+ lvim_bin="$(command -v "$NVIM_APPNAME" 2>/dev/null)"
+ rm -f "$lvim_bin"
+}
+
+function remove_desktop_file() {
+ OS="$(uname -s)"
+ # TODO: Any other OSes that use desktop files?
+ ([ "$OS" != "Linux" ] || ! command -v xdg-desktop-menu &>/dev/null) && return
+ echo "Removing desktop file..."
+
+ find "$XDG_DATA_HOME/icons/hicolor" -name "lvim.svg" -type f -delete
+ xdg-desktop-menu uninstall lvim.desktop
+}
+
+function main() {
+ parse_arguments "$@"
+ echo "Removing LunarVim binary..."
+ remove_lvim_bin
+ echo "Removing LunarVim directories..."
+ remove_lvim_dirs
+ remove_desktop_file
+ echo "Uninstalled LunarVim!"
+}
+
+main "$@"