diff options
Diffstat (limited to 'mac/.config/LunarVim')
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 @@ + + +<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 + + + + +<!-----------------------------------------------------------------------------> + +## 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 "$@" |
