From 429a03c71060c8762145a89382d7b4f583b66cb0 Mon Sep 17 00:00:00 2001 From: Oscar Wallberg Date: Thu, 31 Aug 2023 21:58:22 +0200 Subject: [PATCH] Initial commit --- README.md | 73 ++++ init.lua | 45 +++ lazy-lock.json | 37 ++ lua/bootstrap.lua | 45 +++ lua/config/aerial.lua | 253 +++++++++++++ lua/config/bufferline.lua | 215 +++++++++++ lua/config/catppuccin.lua | 76 ++++ lua/config/comment.lua | 86 +++++ lua/config/darkplus.lua | 17 + lua/config/diffview.lua | 121 +++++++ lua/config/edge.lua | 33 ++ lua/config/flog.lua | 17 + lua/config/fugitive.lua | 24 ++ lua/config/galaxyline.lua | 19 + lua/config/github-nvim-theme.lua | 61 ++++ lua/config/gitsigns.lua | 61 ++++ lua/config/gruvbox.lua | 19 + lua/config/indent-blankline.lua | 24 ++ lua/config/indentLine.lua | 22 ++ lua/config/kanagawa.lua | 34 ++ lua/config/lazygit.lua | 21 ++ lua/config/lsp_signature.lua | 17 + lua/config/lualine.lua | 113 ++++++ lua/config/luasnip.lua | 31 ++ lua/config/mason-lspconfig.lua | 32 ++ lua/config/mason.lua | 17 + lua/config/material.lua | 54 +++ lua/config/nightfox.lua | 67 ++++ lua/config/nightfox_lualine_custom.lua | 47 +++ lua/config/nord.lua | 22 ++ lua/config/nvim-autopairs.lua | 35 ++ lua/config/nvim-cmp.lua | 196 ++++++++++ lua/config/nvim-comment.lua | 33 ++ lua/config/nvim-dap-ui.lua | 57 +++ lua/config/nvim-dap.lua | 102 ++++++ lua/config/nvim-tree.lua | 230 ++++++++++++ lua/config/nvim-treesitter.lua | 67 ++++ lua/config/onedark.lua | 49 +++ lua/config/sonokai.lua | 20 ++ lua/config/supertab.lua | 17 + lua/config/symbols-outline.lua | 69 ++++ lua/config/telescope.lua | 126 +++++++ lua/config/tokyonight.lua | 26 ++ lua/config/ultisnips.lua | 27 ++ lua/config/vim-code-dark.lua | 17 + lua/config/vista.lua | 21 ++ lua/config/vscode.lua | 52 +++ lua/config/winresizer.lua | 22 ++ lua/config/winshift.lua | 17 + lua/core/autocommands.lua | 65 ++++ lua/core/globals.lua | 33 ++ lua/core/mappings.lua | 80 +++++ lua/core/options.lua | 89 +++++ lua/lsp/config/bashls.lua | 23 ++ lua/lsp/config/clangd.lua | 25 ++ lua/lsp/config/cmake.lua | 23 ++ lua/lsp/config/diagnosticls.lua | 176 +++++++++ lua/lsp/config/golangci_lint_ls.lua | 22 ++ lua/lsp/config/gopls.lua | 84 +++++ lua/lsp/config/groovyls.lua | 23 ++ lua/lsp/config/jedi_language_server.lua | 171 +++++++++ lua/lsp/config/lemminx.lua | 40 +++ lua/lsp/config/lua_ls.lua | 47 +++ lua/lsp/config/pylsp.lua | 61 ++++ lua/lsp/config/pyright.lua | 39 ++ lua/lsp/config/rust_analyzer.lua | 38 ++ lua/lsp/init.lua | 287 +++++++++++++++ lua/lsp/spec.lua | 88 +++++ lua/plugins.lua | 213 +++++++++++ lua/pytest.lua | 74 ++++ lua/utils.lua | 86 +++++ plugin/packer_compiled.lua | 457 ++++++++++++++++++++++++ 72 files changed, 5130 insertions(+) create mode 100644 README.md create mode 100644 init.lua create mode 100644 lazy-lock.json create mode 100644 lua/bootstrap.lua create mode 100644 lua/config/aerial.lua create mode 100644 lua/config/bufferline.lua create mode 100644 lua/config/catppuccin.lua create mode 100644 lua/config/comment.lua create mode 100644 lua/config/darkplus.lua create mode 100644 lua/config/diffview.lua create mode 100644 lua/config/edge.lua create mode 100644 lua/config/flog.lua create mode 100644 lua/config/fugitive.lua create mode 100644 lua/config/galaxyline.lua create mode 100644 lua/config/github-nvim-theme.lua create mode 100644 lua/config/gitsigns.lua create mode 100644 lua/config/gruvbox.lua create mode 100644 lua/config/indent-blankline.lua create mode 100644 lua/config/indentLine.lua create mode 100644 lua/config/kanagawa.lua create mode 100644 lua/config/lazygit.lua create mode 100644 lua/config/lsp_signature.lua create mode 100644 lua/config/lualine.lua create mode 100644 lua/config/luasnip.lua create mode 100644 lua/config/mason-lspconfig.lua create mode 100644 lua/config/mason.lua create mode 100644 lua/config/material.lua create mode 100644 lua/config/nightfox.lua create mode 100644 lua/config/nightfox_lualine_custom.lua create mode 100644 lua/config/nord.lua create mode 100644 lua/config/nvim-autopairs.lua create mode 100644 lua/config/nvim-cmp.lua create mode 100644 lua/config/nvim-comment.lua create mode 100644 lua/config/nvim-dap-ui.lua create mode 100644 lua/config/nvim-dap.lua create mode 100644 lua/config/nvim-tree.lua create mode 100644 lua/config/nvim-treesitter.lua create mode 100644 lua/config/onedark.lua create mode 100644 lua/config/sonokai.lua create mode 100644 lua/config/supertab.lua create mode 100644 lua/config/symbols-outline.lua create mode 100644 lua/config/telescope.lua create mode 100644 lua/config/tokyonight.lua create mode 100644 lua/config/ultisnips.lua create mode 100644 lua/config/vim-code-dark.lua create mode 100644 lua/config/vista.lua create mode 100644 lua/config/vscode.lua create mode 100644 lua/config/winresizer.lua create mode 100644 lua/config/winshift.lua create mode 100644 lua/core/autocommands.lua create mode 100644 lua/core/globals.lua create mode 100644 lua/core/mappings.lua create mode 100644 lua/core/options.lua create mode 100644 lua/lsp/config/bashls.lua create mode 100644 lua/lsp/config/clangd.lua create mode 100644 lua/lsp/config/cmake.lua create mode 100644 lua/lsp/config/diagnosticls.lua create mode 100644 lua/lsp/config/golangci_lint_ls.lua create mode 100644 lua/lsp/config/gopls.lua create mode 100644 lua/lsp/config/groovyls.lua create mode 100644 lua/lsp/config/jedi_language_server.lua create mode 100644 lua/lsp/config/lemminx.lua create mode 100644 lua/lsp/config/lua_ls.lua create mode 100644 lua/lsp/config/pylsp.lua create mode 100644 lua/lsp/config/pyright.lua create mode 100644 lua/lsp/config/rust_analyzer.lua create mode 100644 lua/lsp/init.lua create mode 100644 lua/lsp/spec.lua create mode 100644 lua/plugins.lua create mode 100644 lua/pytest.lua create mode 100644 lua/utils.lua create mode 100644 plugin/packer_compiled.lua diff --git a/README.md b/README.md new file mode 100644 index 0000000..5d7451a --- /dev/null +++ b/README.md @@ -0,0 +1,73 @@ +## Requirements: + +### Python +- jedi-language-server (https://github.com/pappasam/jedi-language-server) +- diagnostic-languageserver (https://github.com/iamcco/diagnostic-languageserver) +- isort +- debugpy + +### Lua +- Lua LSP (https://github.com/sumneko/lua-language-server) +- LuaFormatter (https://github.com/Koihik/LuaFormatter) + +### Bash +- bash-language-server +- shellcheck +- shfmt + +### XML +- lemminx LSP (https://github.com/eclipse/lemminx) + +### Markdown +- yarn (for initial installing through packer) + +### Rust +- rust-analyzer + +### Go +- go +- gopls +- golangci-lint-langserver +- golangci-lint + +### C/C++ +- clangd + NOTE: Clang >= 11 is recommended! See: https://github.com/neovim/nvim-lsp/issues/23 + The file `compile_commands.json` needs to be available for clangd to work properly. + If using CMake, it can be generated automatically using the following: + `cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1` + See here for more info: https://clangd.llvm.org/installation#compile_commandsjson +- clang-tidy + Reads the `.clang-tidy` configuration file if available in root of project. + To generate a configiration file, run the following: + ``` + $ clang-tidy -checks='clang-analyzer-*,cppcoreguidelines-*,bugprone-*,modernize-*,performance-*,readability-*' -dum +p-config > .clang-tidy + ``` + Modify the checks as desirable. +- clang-format + Reads the `.clang-format` configuration file if available in root of project. + + +### CMake +- cmake +- cmake-language-server (https://github.com/regen100/cmake-language-server) + +### Misc +- For clipboard support, one of the following: + - |g:clipboard| + - pbcopy, pbpaste (macOS) + - wl-copy, wl-paste (if $WAYLAND_DISPLAY is set) + - xclip (if $DISPLAY is set) + - xsel (if $DISPLAY is set) + - lemonade (for SSH) https://github.com/pocke/lemonade + - doitclient (for SSH) http://www.chiark.greenend.org.uk/~sgtatham/doit/ + - win32yank (Windows) +- For emoji support on Arch, instsall noto-fonts-emoji. +- pynvim (python-neovim on fedora) +- groovy-language-server (https://github.com/prominic/groovy-language-server.git) + + +## Optional: +- fd https://github.com/sharkdp/fd +- ripgrep https://github.com/BurntSushi/ripgrep diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..b9b0f61 --- /dev/null +++ b/init.lua @@ -0,0 +1,45 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +local files = { 'globals', 'options', 'autocommands', 'mappings' } + +for _, file in ipairs(files) do + local pkg = "core." .. file + local ok, err = pcall(require, pkg) + if not ok then + print("Error while loading package " .. pkg) + print(err) + return + end +end + +if vim.g.vscode then + -- VSCode extension +else + local ok, err = pcall(require, 'bootstrap') + if not ok then + print("Error during bootstrap") + print(err:gsub("\t", " ")) + return + end + + ok, err = pcall(require, 'plugins') + if not ok then + print("Error while loading plugins") + print(err:gsub("\t", " ")) + return + end +end diff --git a/lazy-lock.json b/lazy-lock.json new file mode 100644 index 0000000..64f9d26 --- /dev/null +++ b/lazy-lock.json @@ -0,0 +1,37 @@ +{ + "Comment.nvim": { "branch": "master", "commit": "0236521ea582747b58869cb72f70ccfa967d2e89" }, + "Jenkinsfile-vim-syntax": { "branch": "master", "commit": "0d05729168ea44d60862f17cffa80024ab30bcc9" }, + "LuaSnip": { "branch": "master", "commit": "0b4950a237ce441a6a3a947d501622453f6860ea" }, + "aerial.nvim": { "branch": "master", "commit": "dc17cfd401689337124c75270677fd3b7639cf23" }, + "bufferline.nvim": { "branch": "main", "commit": "9961d87bb3ec008213c46ba14b3f384a5f520eb5" }, + "cmp-buffer": { "branch": "main", "commit": "3022dbc9166796b644a841a02de8dd1cc1d311fa" }, + "cmp-cmdline": { "branch": "main", "commit": "8ee981b4a91f536f52add291594e89fb6645e451" }, + "cmp-nvim-lsp": { "branch": "main", "commit": "44b16d11215dce86f253ce0c30949813c0a90765" }, + "cmp-path": { "branch": "main", "commit": "91ff86cd9c29299a64f968ebb45846c485725f23" }, + "cmp_luasnip": { "branch": "master", "commit": "18095520391186d634a0045dacaa346291096566" }, + "friendly-snippets": { "branch": "main", "commit": "00e191fea2cfbbdd378243f35b5953296537a116" }, + "gitsigns.nvim": { "branch": "main", "commit": "d8b52fc95e3d424e5c09b287ee2c293dcb4e26fb" }, + "indentLine": { "branch": "master", "commit": "b96a75985736da969ac38b72a7716a8c57bdde98" }, + "lazy.nvim": { "branch": "main", "commit": "3ad55ae678876516156cca2f361c51f7952a924b" }, + "lsp_signature.nvim": { "branch": "master", "commit": "58d4e810801da74c29313da86075d6aea537501f" }, + "lspkind-nvim": { "branch": "master", "commit": "57610d5ab560c073c465d6faf0c19f200cb67e6e" }, + "lualine.nvim": { "branch": "master", "commit": "45e27ca739c7be6c49e5496d14fcf45a303c3a63" }, + "mason-lspconfig.nvim": { "branch": "main", "commit": "dfdd771b792fbb4bad8e057d72558255695aa1a7" }, + "mason.nvim": { "branch": "main", "commit": "0942198fb9a998b6ccee36fb8dd7495eb8ba659c" }, + "nvim-autopairs": { "branch": "master", "commit": "ae5b41ce880a6d850055e262d6dfebd362bb276e" }, + "nvim-cmp": { "branch": "main", "commit": "5dce1b778b85c717f6614e3f4da45e9f19f54435" }, + "nvim-dap": { "branch": "master", "commit": "4377a05b9476587b7b485d6a9d9745768c4e4b37" }, + "nvim-dap-ui": { "branch": "master", "commit": "85b16ac2309d85c88577cd8ee1733ce52be8227e" }, + "nvim-lspconfig": { "branch": "master", "commit": "a27356f1ef9c11e1f459cc96a3fcac5c265e72d6" }, + "nvim-tree.lua": { "branch": "master", "commit": "00741206c2df9c4b538055def19b99790f0c95c8" }, + "nvim-treesitter": { "branch": "master", "commit": "920b37260ebc720b0399bd12954fd2bf8bd18242" }, + "nvim-web-devicons": { "branch": "master", "commit": "cfc8824cc1db316a276b36517f093baccb8e799a" }, + "plenary.nvim": { "branch": "master", "commit": "0dbe561ae023f02c2fb772b879e905055b939ce3" }, + "telescope.nvim": { "branch": "master", "commit": "2c1ed33a6f6f2db3b69f5421f6b405eda1b07748" }, + "vim-flog": { "branch": "master", "commit": "2cfa2e9d67a06a75d3d4e965c6bad558ff41e488" }, + "vim-fugitive": { "branch": "master", "commit": "572c8510123cbde02e8a1dafcd376c98e1e13f43" }, + "vim-startuptime": { "branch": "master", "commit": "454b3de856b7bd298700de33d79774ca9b9e3875" }, + "vscode.nvim": { "branch": "main", "commit": "11b212096a0b2056fc8acaf31c0d62d656b6fd2d" }, + "winresizer": { "branch": "master", "commit": "9bd559a03ccec98a458e60c705547119eb5350f3" }, + "winshift.nvim": { "branch": "main", "commit": "37468ed6f385dfb50402368669766504c0e15583" } +} \ No newline at end of file diff --git a/lua/bootstrap.lua b/lua/bootstrap.lua new file mode 100644 index 0000000..3b3f1c5 --- /dev/null +++ b/lua/bootstrap.lua @@ -0,0 +1,45 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +local utils = require('utils') + +-- Install lazy.nvim +local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" +if not vim.loop.fs_stat(lazypath) then + if utils.os_name == "Linux" then + utils.assert_any_available({ 'curl', 'wget' }) + utils.assert_available('unzip') + utils.assert_available('gzip') + elseif utils.os_name == "Windows_NT" then + utils.assert_any_available({ 'pwsh', 'powershell' }) + utils.assert_any_available({ '7z', 'peazip', 'arc', 'wzzip', 'rar' }) + else + error('OS not supported: ' .. utils.os_name) + end + + utils.assert_available('git') + utils.assert_available('tar') + + vim.fn.system({ + "git", + "clone", + "--filter=blob:none", + "https://github.com/folke/lazy.nvim.git", + "--branch=stable", -- latest stable release + lazypath, + }) +end +vim.opt.rtp:prepend(lazypath) diff --git a/lua/config/aerial.lua b/lua/config/aerial.lua new file mode 100644 index 0000000..f26e789 --- /dev/null +++ b/lua/config/aerial.lua @@ -0,0 +1,253 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +require("aerial").setup({ + -- Priority list of preferred backends for aerial. + -- This can be a filetype map (see :help aerial-filetype-map) + backends = { "treesitter", "lsp", "markdown" }, + + layout = { + -- These control the width of the aerial window. + -- They can be integers or a float between 0 and 1 (e.g. 0.4 for 40%) + -- min_width and max_width can be a list of mixed types. + -- max_width = {40, 0.2} means "the lesser of 40 columns or 20% of total" + max_width = { 40, 0.2 }, + width = nil, + min_width = 40, + + -- Determines the default direction to open the aerial window. The 'prefer' + -- options will open the window in the other direction *if* there is a + -- different buffer in the way of the preferred direction + -- Enum: prefer_right, prefer_left, right, left, float + default_direction = "left", + + -- Determines where the aerial window will be opened + -- edge - open aerial at the far right/left of the editor + -- window - open aerial to the right/left of the current window + placement = "edge", + }, + + -- Determines how the aerial window decides which buffer to display symbols for + -- window - aerial window will display symbols for the buffer in the window from which it was opened + -- global - aerial window will display symbols for the current window + attach_mode = "window", + + -- List of enum values that configure when to auto-close the aerial window + -- unfocus - close aerial when you leave the original source window + -- switch_buffer - close aerial when you change buffers in the source window + -- unsupported - close aerial when attaching to a buffer that has no symbol source + close_automatic_events = {}, + + -- Set to false to remove the default keybindings for the aerial buffer + default_bindings = true, + + -- Disable aerial on files with this many lines + disable_max_lines = 10000, + + -- Disable aerial on files this size or larger (in bytes) + disable_max_size = 10000000, -- Default 2MB + + -- A list of all symbols to display. Set to false to display all symbols. + -- This can be a filetype map (see :help aerial-filetype-map) + -- To see all available values, see :help SymbolKind + filter_kind = { + "Class", + "Constructor", + "Enum", + "Function", + "Interface", + "Module", + "Method", + "Struct", + }, + + -- Determines line highlighting mode when multiple splits are visible. + -- split_width Each open window will have its cursor location marked in the + -- aerial buffer. Each line will only be partially highlighted + -- to indicate which window is at that location. + -- full_width Each open window will have its cursor location marked as a + -- full-width highlight in the aerial buffer. + -- last Only the most-recently focused window will have its location + -- marked in the aerial buffer. + -- none Do not show the cursor locations in the aerial window. + highlight_mode = "split_width", + + -- Highlight the closest symbol if the cursor is not exactly on one. + highlight_closest = true, + + -- Highlight the symbol in the source buffer when cursor is in the aerial win + highlight_on_hover = true, + + -- When jumping to a symbol, highlight the line for this many ms. + -- Set to false to disable + highlight_on_jump = 300, + + -- Define symbol icons. You can also specify "Collapsed" to change the + -- icon when the tree is collapsed at that symbol, or "Collapsed" to specify a + -- default collapsed icon. The default icon set is determined by the + -- "nerd_font" option below. + -- If you have lspkind-nvim installed, it will be the default icon set. + -- This can be a filetype map (see :help aerial-filetype-map) + icons = {}, + + -- Control which windows and buffers aerial should ignore. + -- If attach_mode is "global", focusing an ignored window/buffer will + -- not cause the aerial window to update. + -- If open_automatic is true, focusing an ignored window/buffer will not + -- cause an aerial window to open. + -- If open_automatic is a function, ignore rules have no effect on aerial + -- window opening behavior; it's entirely handled by the open_automatic + -- function. + ignore = { + -- Ignore unlisted buffers. See :help buflisted + unlisted_buffers = true, + + -- List of filetypes to ignore. + filetypes = {}, + + -- Ignored buftypes. + -- Can be one of the following: + -- false or nil - No buftypes are ignored. + -- "special" - All buffers other than normal buffers are ignored. + -- table - A list of buftypes to ignore. See :help buftype for the + -- possible values. + -- function - A function that returns true if the buffer should be + -- ignored or false if it should not be ignored. + -- Takes two arguments, `bufnr` and `buftype`. + buftypes = "special", + + -- Ignored wintypes. + -- Can be one of the following: + -- false or nil - No wintypes are ignored. + -- "special" - All windows other than normal windows are ignored. + -- table - A list of wintypes to ignore. See :help win_gettype() for the + -- possible values. + -- function - A function that returns true if the window should be + -- ignored or false if it should not be ignored. + -- Takes two arguments, `winid` and `wintype`. + wintypes = "special", + }, + + -- When you fold code with za, zo, or zc, update the aerial tree as well. + -- Only works when manage_folds = true + link_folds_to_tree = true, + + -- Fold code when you open/collapse symbols in the tree. + -- Only works when manage_folds = true + link_tree_to_folds = true, + + -- Use symbol tree for folding. Set to true or false to enable/disable + -- 'auto' will manage folds if your previous foldmethod was 'manual' + manage_folds = false, + + -- Set default symbol icns to use patched font icons (see https://www.nerdfonts.com/) + -- "auto" will set it to true if nvim-web-devicons or lspkind-nvim is installed. + nerd_font = "auto", + + -- Call this function when aerial attaches to a buffer. + -- Useful for setting keymaps. Takes a single `bufnr` argument. + on_attach = function(bufnr) + -- Toggle the aerial window with a + vim.api.nvim_buf_set_keymap(bufnr, 'n', 'at', 'AerialToggle!', {}) + -- Jump forwards/backwards with '{' and '}' + vim.api.nvim_buf_set_keymap(bufnr, 'n', '{', 'AerialPrev', {}) + vim.api.nvim_buf_set_keymap(bufnr, 'n', '}', 'AerialNext', {}) + -- Jump up the tree with '[[' or ']]' + vim.api.nvim_buf_set_keymap(bufnr, 'n', '[[', 'AerialPrevUp', {}) + vim.api.nvim_buf_set_keymap(bufnr, 'n', ']]', 'AerialNextUp', {}) + end, + + -- Call this function when aerial first sets symbols on a buffer. + -- Takes a single `bufnr` argument. + on_first_symbols = nil, + + -- Automatically open aerial when entering supported buffers. + -- This can be a function (see :help aerial-open-automatic) + open_automatic = false, + + -- Run this command after jumping to a symbol (false will disable) + post_jump_cmd = "normal! zz", + + -- When true, aerial will automatically close after jumping to a symbol + close_on_select = false, + + -- Show box drawing characters for the tree hierarchy + show_guides = true, + + -- The autocmds that trigger symbols update (not used for LSP backend) + update_events = "TextChanged,InsertLeave", + + -- Customize the characters used when show_guides = true + guides = { + -- When the child item has a sibling below it + mid_item = "├─", + -- When the child item is the last in the list + last_item = "└─", + -- When there are nested child guides to the right + nested_top = "│ ", + -- Raw indentation + whitespace = " ", + }, + + -- Options for opening aerial in a floating win + float = { + -- Controls border appearance. Passed to nvim_open_win + border = "rounded", + + -- Determines location of floating window + -- cursor - Opens float on top of the cursor + -- editor - Opens float centered in the editor + -- win - Opens float centered in the window + relative = "cursor", + + -- These control the height of the floating window. + -- They can be integers or a float between 0 and 1 (e.g. 0.4 for 40%) + -- min_height and max_height can be a list of mixed types. + -- min_height = {8, 0.1} means "the greater of 8 rows or 10% of total" + max_height = 0.9, + height = nil, + min_height = { 8, 0.1 }, + + override = function(conf, source_winid) + -- This is the config that will be passed to nvim_open_win. + -- Change values here to customize the layout + return conf + end, + }, + + lsp = { + -- Fetch document symbols when LSP diagnostics update. + -- If false, will update on buffer changes. + diagnostics_trigger_update = true, + + -- Set to false to not update the symbols when there are LSP errors + update_when_errors = true, + + -- How long to wait (in ms) after a buffer change before updating + -- Only used when diagnostics_trigger_update = false + update_delay = 300, + }, + + treesitter = { + -- How long to wait (in ms) after a buffer change before updating + update_delay = 300, + }, + + markdown = { + -- How long to wait (in ms) after a buffer change before updating + update_delay = 300, + }, +}) diff --git a/lua/config/bufferline.lua b/lua/config/bufferline.lua new file mode 100644 index 0000000..692161e --- /dev/null +++ b/lua/config/bufferline.lua @@ -0,0 +1,215 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +local utils = require 'utils' + +local hl_CustomHeader +local head_cache +--- @param trunc_width number trunctates component when screen width is less then trunc_width +--- @param trunc_len number truncates component to trunc_len number of chars +--- @param hide_width number hides component when window width is smaller then hide_width +--- @param no_ellipsis boolean whether to disable adding '...' at end after truncation +--- return function that can format the component accordingly +local function trunc(trunc_width, trunc_len, hide_width, no_ellipsis) + return function(str) + local win_width = vim.fn.winwidth(0) + if hide_width and win_width < hide_width then + return '' + elseif trunc_width and trunc_len and win_width < trunc_width and #str > + trunc_len then + return str:sub(1, trunc_len) .. (no_ellipsis and '' or '...') + end + return str + end +end + +--- @param trunc_len number truncates component to trunc_len number of chars +--- @param no_ellipsis boolean whether to disable adding '...' at start before truncation +--- return function that can format the component accordingly +local function l_trunc(trunc_len, no_ellipsis) + return function(str) + if #str > trunc_len then + if no_ellipsis then + return str:sub(#str - trunc_len) + else + return '...' .. str:sub(#str - trunc_len + 3) + end + else + return str + end + end +end + +--- @param trunc_len number truncates component to trunc_len number of chars +--- @param no_ellipsis boolean whether to disable adding '...' at start before truncation +--- return function that can format the component accordingly +local function r_trunc(trunc_len, no_ellipsis) + return function(str) + if #str > trunc_len then + if no_ellipsis then + return str:sub(1, trunc_len) + elseif #str < trunc_len then + return str + else + return str:sub(1, trunc_len - 3) .. + (no_ellipsis and '' or '...') + end + end + return str + end +end + +local function short_path(len) + return function(str) + if #str > len then return vim.fn.pathshorten(str, 1) end + return str + end +end + +local function header() + if hl_CustomHeader == nil then + local header_hl = require('utils').get_hl('NvimTreeNormal') + if header_hl ~= nil then + hl_CustomHeader = 'gui=bold guifg=' .. header_hl.foreground .. + ' guibg=' .. header_hl.background + vim.api.nvim_command('hi CustomHeader ' .. hl_CustomHeader) + end + end + -- local header = short_path(40)(vim.fn.getcwd()) + -- NOTE: Decided not to use this. Probably doesn't work. + local gitdir = vim.fn.FugitiveExtractGitDir(vim.fn.getcwd()) + local text = '' + if gitdir == '' then + text = vim.fn.fnamemodify(vim.fn.getcwd(), ':~') + else + text = vim.fn.fnamemodify(gitdir, ':~:h') + -- text = vim.fn.fnamemodify(vim.fn.FugitiveWorkTree(), ':~') + -- local branch = r_trunc(15, false)(vim.fn.FugitiveHead()) + local head = vim.fn.FugitiveHead(8, gitdir) + if head == '' then + if head_cache[gitdir] ~= nil then + head = head_cache[gitdir] + else + local f = io.open(gitdir, 'r') + if f then + io.input(f) + local line = io.read('*l') + local head = line:gsub( + 'ref: /refs/(heads/|remotes/|tags/)', '' + ) + head_cache[gitdir] = head + end + end + end + if head ~= '' then text = text .. '  ' .. head end + end + + -- return l_trunc(40-2, false)(short_path(40-2)(text)) + return l_trunc(40 - 2, false)(text) +end + +require('bufferline').setup( + { + options = { + mode = 'buffers', + numbers = function(ordinal, id, lower, raise) return '' end, + close_command = 'bdelete %d', -- can be a string | function, see "Mouse actions" + right_mouse_command = 'bdelete %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 = '▎', -- this should be omitted if indicator style is not 'icon' + style = 'icon' + }, + buffer_close_icon = '', + modified_icon = '●', + close_icon = '', + left_trunc_marker = '', + right_trunc_marker = '', + --- 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: + -- name | str | the basename of the active file + -- path | str | the full path of the active file + -- bufnr (buffer only) | int | the number of the active buffer + -- buffers (tabs only) | table(int) | the numbers of the buffers in the tab + -- tabnr (tabs only) | int | the "handle" of the tab, can be converted to its ordinal number using: `vim.api.nvim_tabpage_get_number(buf.tabnr)` + return buf.name + end, + max_name_length = 18, + max_prefix_length = 15, -- prefix used when a buffer is de-duplicated + truncate_names = true, + tab_size = 18, + diagnostics = 'nvim_lsp', + diagnostics_update_in_insert = false, + diagnostics_indicator = function(count, _, _, _) + return '(' .. count .. ')' + end, + -- NOTE: this will be called a lot so don't do any heavy processing here + custom_filter = function(buf, _) + local disabled_ft = { 'NvimTree', 'fugitive' } + + if utils.has_value(disabled_ft, vim.bo[buf].filetype) then + return false + end + + return true + end, + offsets = { + { + filetype = 'NvimTree', + text = 'File Explorer', -- header, + text_align = 'center', + seperator = true + -- padding = 1, + -- highlight = "CustomHeader", + }, + { + filetype = 'fugitive', + text = 'Fugitive', -- header, + text_align = 'center', + seperator = true + -- padding = 1, + -- highlight = "CustomHeader", + }, + { + filetype = 'aerial', + text = 'Aerial', -- header, + text_align = 'center', + seperator = true + -- padding = 1, + -- highlight = "CustomHeader", + } + }, + color_icons = true, -- whether or not to add the filetype icon highlights + show_buffer_icons = true, -- disable filetype icons for buffers + show_buffer_close_icons = false, + show_buffer_default_icon = true, -- whether or not an unrecognised filetype should show a default icon + 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', -- | "thick" | "thin" | { 'any', 'any' }, + enforce_regular_tabs = true, + always_show_bufferline = true, + hover = { enabled = true, delay = 200, reveal = { 'close' } }, + sort_by = 'id' + } + } +) diff --git a/lua/config/catppuccin.lua b/lua/config/catppuccin.lua new file mode 100644 index 0000000..fed3cc0 --- /dev/null +++ b/lua/config/catppuccin.lua @@ -0,0 +1,76 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +local colors = require("catppuccin.palettes").get_palette() -- fetch colors from g:catppuccin_flavour palette +vim.g.catppuccin_flavour = "mocha" -- latte, frappe, macchiato, mocha +require("catppuccin").setup({ + compile_path = vim.fn.stdpath("cache") .. "/catppuccin", + transparent_background = false, + term_colors = false, + dim_inactive = { + enabled = false, + shade = "dark", + percentage = 0.15, + }, + styles = { + comments = {}, + conditionals = {}, + loops = {}, + functions = {}, + keywords = {}, + strings = {}, + variables = {}, + numbers = {}, + booleans = {}, + properties = {}, + types = {}, + operators = {}, + }, + integrations = { + cmp = true, + gitsigns = true, + nvimtree = true, + telescope = true, + treesitter = true, + aerial = true, + native_lsp = { + enabled = true, + virtual_text = { + errors = { "italic" }, + hints = { "italic" }, + warnings = { "italic" }, + information = { "italic" }, + }, + underlines = { + errors = { "underline" }, + hints = { "underline" }, + warnings = { "underline" }, + information = { "underline" }, + }, + }, + -- For more plugins integrations please see https://github.com/catppuccin/nvim#integrations + }, + color_overrides = {}, + custom_highlights = { + -- Comment = { fg = colors.flamingo }, + -- TSConstBuiltin = { fg = colors.peach, style = {} }, + -- TSConstant = { fg = colors.sky }, + -- TSComment = { fg = colors.surface2, style = { "italic" } } + ['@parameter'] = { style = {} } + } +}) + +vim.cmd("colorscheme catppuccin") diff --git a/lua/config/comment.lua b/lua/config/comment.lua new file mode 100644 index 0000000..5808367 --- /dev/null +++ b/lua/config/comment.lua @@ -0,0 +1,86 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +require('Comment').setup( +{ + ---Add a space b/w comment and the line + ---@type boolean|fun():boolean + padding = true, + + ---Whether the cursor should stay at its position + ---NOTE: This only affects NORMAL mode mappings and doesn't work with dot-repeat + ---@type boolean + 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|fun():string + ignore = '^$', + + ---LHS of toggle mappings in NORMAL + VISUAL mode + ---@type table + toggler = { + ---Line-comment toggle keymap + line = 'gcc', + ---Block-comment toggle keymap + block = 'gbc', + }, + + ---LHS of operator-pending mappings in NORMAL + VISUAL mode + ---@type table + opleader = { + ---Line-comment keymap + line = 'gc', + ---Block-comment keymap + 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', + }, + + ---Create basic (operator-pending) and extended mappings for NORMAL + VISUAL mode + ---@type table + mappings = { + ---Operator-pending mapping + ---Includes `gcc`, `gbc`, `gc[count]{motion}` and `gb[count]{motion}` + ---NOTE: These mappings can be changed individually by `opleader` and `toggler` config + basic = true, + ---Extra mapping + ---Includes `gco`, `gcO`, `gcA` + extra = true, + ---Extended mapping + ---Includes `g>`, `g<`, `g>[count]{motion}` and `g<[count]{motion}` + extended = false, + }, + + ---Pre-hook, called before commenting the line + ---@type fun(ctx: Ctx):string + pre_hook = nil, + + ---Post-hook, called after commenting is done + ---@type fun(ctx: Ctx) + post_hook = nil, +} +) diff --git a/lua/config/darkplus.lua b/lua/config/darkplus.lua new file mode 100644 index 0000000..4b578fd --- /dev/null +++ b/lua/config/darkplus.lua @@ -0,0 +1,17 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +vim.cmd("colorscheme darkplus") diff --git a/lua/config/diffview.lua b/lua/config/diffview.lua new file mode 100644 index 0000000..7417064 --- /dev/null +++ b/lua/config/diffview.lua @@ -0,0 +1,121 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +local cb = require'diffview.config'.diffview_callback + +require'diffview'.setup { + diff_binaries = false, -- Show diffs for binaries + enhanced_diff_hl = true, -- See ':h diffview-config-enhanced_diff_hl' + use_icons = true, -- Requires nvim-web-devicons + icons = { -- Only applies when use_icons is true. + folder_closed = "", + folder_open = "", + }, + signs = { + fold_closed = "", + fold_open = "", + }, + file_panel = { + position = "left", -- One of 'left', 'right', 'top', 'bottom' + width = 35, -- Only applies when position is 'left' or 'right' + height = 10, -- Only applies when position is 'top' or 'bottom' + listing_style = "tree", -- One of 'list' or 'tree' + tree_options = { -- Only applies when listing_style is 'tree' + flatten_dirs = true, -- Flatten dirs that only contain one single dir + folder_statuses = "only_folded", -- One of 'never', 'only_folded' or 'always'. + }, + }, + file_history_panel = { + position = "bottom", + width = 35, + height = 16, + log_options = { + max_count = 256, -- Limit the number of commits + follow = false, -- Follow renames (only for single file) + all = false, -- Include all refs under 'refs/' including HEAD + merges = false, -- List only merge commits + no_merges = false, -- List no merge commits + reverse = false, -- List commits in reverse order + }, + }, + default_args = { -- Default args prepended to the arg-list for the listed commands + DiffviewOpen = {}, + DiffviewFileHistory = {}, + }, + hooks = {}, -- See ':h diffview-config-hooks' + key_bindings = { + disable_defaults = false, -- Disable the default key bindings + -- The `view` bindings are active in the diff buffers, only when the current + -- tabpage is a Diffview. + view = { + [""] = cb("select_next_entry"), -- Open the diff for the next file + [""] = cb("select_prev_entry"), -- Open the diff for the previous file + ["gf"] = cb("goto_file"), -- Open the file in a new split in previous tabpage + [""] = cb("goto_file_split"), -- Open the file in a new split + ["gf"] = cb("goto_file_tab"), -- Open the file in a new tabpage + ["e"] = cb("focus_files"), -- Bring focus to the files panel + ["b"] = cb("toggle_files"), -- Toggle the files panel. + }, + file_panel = { + ["j"] = cb("next_entry"), -- Bring the cursor to the next file entry + [""] = cb("next_entry"), + ["k"] = cb("prev_entry"), -- Bring the cursor to the previous file entry. + [""] = cb("prev_entry"), + [""] = cb("select_entry"), -- Open the diff for the selected entry. + ["o"] = cb("select_entry"), + ["<2-LeftMouse>"] = cb("select_entry"), + ["-"] = cb("toggle_stage_entry"), -- Stage / unstage the selected entry. + ["S"] = cb("stage_all"), -- Stage all entries. + ["U"] = cb("unstage_all"), -- Unstage all entries. + ["X"] = cb("restore_entry"), -- Restore entry to the state on the left side. + ["R"] = cb("refresh_files"), -- Update stats and entries in the file list. + [""] = cb("select_next_entry"), + [""] = cb("select_prev_entry"), + ["gf"] = cb("goto_file"), + [""] = cb("goto_file_split"), + ["gf"] = cb("goto_file_tab"), + ["i"] = cb("listing_style"), -- Toggle between 'list' and 'tree' views + ["f"] = cb("toggle_flatten_dirs"), -- Flatten empty subdirectories in tree listing style. + ["e"] = cb("focus_files"), + ["b"] = cb("toggle_files"), + }, + file_history_panel = { + ["g!"] = cb("options"), -- Open the option panel + [""] = cb("open_in_diffview"), -- Open the entry under the cursor in a diffview + ["y"] = cb("copy_hash"), -- Copy the commit hash of the entry under the cursor + ["zR"] = cb("open_all_folds"), + ["zM"] = cb("close_all_folds"), + ["j"] = cb("next_entry"), + [""] = cb("next_entry"), + ["k"] = cb("prev_entry"), + [""] = cb("prev_entry"), + [""] = cb("select_entry"), + ["o"] = cb("select_entry"), + ["<2-LeftMouse>"] = cb("select_entry"), + [""] = cb("select_next_entry"), + [""] = cb("select_prev_entry"), + ["gf"] = cb("goto_file"), + [""] = cb("goto_file_split"), + ["gf"] = cb("goto_file_tab"), + ["e"] = cb("focus_files"), + ["b"] = cb("toggle_files"), + }, + option_panel = { + [""] = cb("select"), + ["q"] = cb("close"), + }, + }, +} diff --git a/lua/config/edge.lua b/lua/config/edge.lua new file mode 100644 index 0000000..c209033 --- /dev/null +++ b/lua/config/edge.lua @@ -0,0 +1,33 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +vim.g.edge_style = 'default' +vim.g.edge_disable_italic_comment = 0 +vim.g.edge_enable_italic = 0 +vim.g.edge_cursor = 'auto' +vim.g.edge_transparent_background = 0 +vim.g.edge_menu_selection_background = 'blue' +vim.g.edge_spell_foreground = 'none' +vim.g.edge_show_eob = 1 +vim.g.edge_diagnostic_text_highlight = 0 +vim.g.edge_diagnostic_line_highlight = 1 +vim.g.edge_diagnostic_virtual_text = 'grey' +vim.g.edge_current_word = 'grey background' +vim.g.edge_disable_terminal_colors = 0 +vim.g.edge_lightline_disable_bold = 0 +vim.g.edge_better_performance = 1 + +vim.fn.execute('colorscheme edge') diff --git a/lua/config/flog.lua b/lua/config/flog.lua new file mode 100644 index 0000000..b487e33 --- /dev/null +++ b/lua/config/flog.lua @@ -0,0 +1,17 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +vim.keymap.set('n', "gl", ":Flog", { remap = false, silent = true }) diff --git a/lua/config/fugitive.lua b/lua/config/fugitive.lua new file mode 100644 index 0000000..94069f7 --- /dev/null +++ b/lua/config/fugitive.lua @@ -0,0 +1,24 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +local function git_status_tab() + vim.fn.execute("tabnew") + vim.fn.execute("leftabove vertical G | vertical resize 60 | set wfw") +end + +vim.keymap.set('n', 'gd', ':Gdiffsplit', { remap = false }) +vim.keymap.set('n', 'gg', git_status_tab, { silent = true, remap = false }) +vim.keymap.set('n', 'gc', ':G commit', { remap = false }) diff --git a/lua/config/galaxyline.lua b/lua/config/galaxyline.lua new file mode 100644 index 0000000..eab846b --- /dev/null +++ b/lua/config/galaxyline.lua @@ -0,0 +1,19 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +local gl = require('galaxyline') + +-- maybe some other day diff --git a/lua/config/github-nvim-theme.lua b/lua/config/github-nvim-theme.lua new file mode 100644 index 0000000..842ee21 --- /dev/null +++ b/lua/config/github-nvim-theme.lua @@ -0,0 +1,61 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +require('github-theme').setup( + { + theme_style = 'dimmed', + transparent = false, + hide_end_of_buffer = false, + hide_inactive_statusline = false, + dark_float = true, + dev = false, + + -- styles + comment_style = 'italic', + function_style = 'NONE', + keyword_style = 'NONE', + msg_area_style = 'NONE', + variable_style = 'NONE', + + -- sidebars + sidebars = { + 'qf', + 'vista_kind', + 'terminal', + 'packer', + 'aerial', + 'NvimTree' + }, + + -- Change the "hint" color to the "orange" color, and make the "error" color bright red + -- colors = { hint = 'orange', error = '#ff0000' }, + + -- Overwrite the highlight groups + -- overrides = function(c) + -- return { + -- htmlTag = { + -- fg = c.red, + -- bg = '#282c34', + -- sp = c.hint, + -- style = 'underline' + -- }, + -- DiagnosticHint = { link = 'LspDiagnosticsDefaultHint' }, + -- -- this will remove the highlight groups + -- TSField = {} + -- } + -- end + } +) diff --git a/lua/config/gitsigns.lua b/lua/config/gitsigns.lua new file mode 100644 index 0000000..87d5539 --- /dev/null +++ b/lua/config/gitsigns.lua @@ -0,0 +1,61 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +require('gitsigns').setup( + { + on_attach = function(bufnr) + local gs = package.loaded.gitsigns + local function map(mode, l, r, opts) + opts = opts or {} + opts.buffer = bufnr + vim.keymap.set(mode, l, r, opts) + end + + -- map('n', ']c', + -- function() + -- gs.next_hunk{ + -- wrap=false, + -- navigation_message=true, + -- foldopen=true + -- } + -- end + -- ) + -- map('n', '[c', + -- function() + -- gs.prev_hunk{ + -- wrap=false, + -- navigation_message=true, + -- foldopen=true + -- } + -- end + -- ) + map('n', 'gv', gs.select_hunk) + -- map('n', '', "&diff ? '' : 'Gitsigns next_hunk'", {expr=true}) + -- map('n', '', "&diff ? '' : 'Gitsigns prev_hunk'", {expr=true}) + map({ 'n', 'v' }, 'gr', ':Gitsigns reset_hunk') -- gs.reset_hunk() doesn't work with selected lines + map('n', 'g?', gs.preview_hunk) + map('n', 'gb', function() + gs.blame_line { full = true } + end) + -- map('n', 'gd', gs.diffthis) + end, + signs = { + -- default + -- untracked = { text = '┆' } + untracked = { text = '│' } + } + } +) diff --git a/lua/config/gruvbox.lua b/lua/config/gruvbox.lua new file mode 100644 index 0000000..e17be07 --- /dev/null +++ b/lua/config/gruvbox.lua @@ -0,0 +1,19 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +vim.opt.termguicolors = true +vim.o.background = "dark" -- or "light" for light mode +vim.fn.execute("colorscheme gruvbox") diff --git a/lua/config/indent-blankline.lua b/lua/config/indent-blankline.lua new file mode 100644 index 0000000..60334cb --- /dev/null +++ b/lua/config/indent-blankline.lua @@ -0,0 +1,24 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +require("indent_blankline").setup({ + show_current_context = true, + show_current_context_start = false, + use_treesitter = true, + show_first_indent_level = true, + char = '│', + -- context_char = '┃', +}) diff --git a/lua/config/indentLine.lua b/lua/config/indentLine.lua new file mode 100644 index 0000000..b4eac1a --- /dev/null +++ b/lua/config/indentLine.lua @@ -0,0 +1,22 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +-- more options at https://www.jetbrains.com/lp/mono/ +vim.g.indentLine_char = '▏' +-- Disable conceal for some syntax plugins +vim.g.vim_json_conceal = 0 +vim.g.markdown_syntax_conceal = 0 +vim.g.indentLine_fileTypeExclude = { 'NvimTree' } diff --git a/lua/config/kanagawa.lua b/lua/config/kanagawa.lua new file mode 100644 index 0000000..54578c2 --- /dev/null +++ b/lua/config/kanagawa.lua @@ -0,0 +1,34 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +require('kanagawa').setup({ + undercurl = true, -- enable undercurls + commentStyle = { italic = true }, + functionStyle = {}, + keywordStyle = {}, + statementStyle = { bold = true }, + typeStyle = {}, + variablebuiltinStyle = {}, + specialReturn = true, -- special highlight for the return keyword + specialException = true, -- special highlight for exception handling keywords + transparent = false, -- do not set background color + dimInactive = true, -- dim inactive window `:h hl-NormalNC` + globalStatus = true, -- adjust window separators highlight for laststatus=3 + colors = {}, + overrides = {}, +}) + +vim.cmd("colorscheme kanagawa") diff --git a/lua/config/lazygit.lua b/lua/config/lazygit.lua new file mode 100644 index 0000000..560aa42 --- /dev/null +++ b/lua/config/lazygit.lua @@ -0,0 +1,21 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +vim.g.lazygit_floating_window_winblend = 0 -- transparency of floating window +vim.g.lazygit_floating_window_scaling_factor = 0.9 -- scaling factor for floating window +vim.g.lazygit_floating_window_corner_chars = { '╭', '╮', '╰', '╯' } -- customize lazygit popup window corner characters +vim.g.lazygit_floating_window_use_plenary = 0 -- use plenary.nvim to manage floating window if available +vim.g.lazygit_use_neovim_remote = 1 -- fallback to 0 if neovim-remote is not installed diff --git a/lua/config/lsp_signature.lua b/lua/config/lsp_signature.lua new file mode 100644 index 0000000..4626753 --- /dev/null +++ b/lua/config/lsp_signature.lua @@ -0,0 +1,17 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +require("lsp_signature").setup() diff --git a/lua/config/lualine.lua b/lua/config/lualine.lua new file mode 100644 index 0000000..51d040f --- /dev/null +++ b/lua/config/lualine.lua @@ -0,0 +1,113 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +--- @param trunc_width number trunctates component when screen width is less then trunc_width +--- @param trunc_len number truncates component to trunc_len number of chars +--- @param hide_width number hides component when window width is smaller then hide_width +--- @param no_ellipsis boolean whether to disable adding '...' at end after truncation +--- return function that can format the component accordingly +local function trunc(trunc_width, trunc_len, hide_width, no_ellipsis) + return function(str) + local win_width = vim.fn.winwidth(0) + if hide_width and win_width < hide_width then return '' + elseif trunc_width and trunc_len and win_width < trunc_width and #str > trunc_len then + return str:sub(1, trunc_len) .. (no_ellipsis and '' or '...') + end + return str + end +end + +--- @param trunc_len number truncates component to trunc_len number of chars +--- @param no_ellipsis boolean whether to disable adding '...' at start before truncation +--- return function that can format the component accordingly +local function l_trunc(trunc_len, no_ellipsis) + return function(str) + if #str > trunc_len then + return (no_ellipsis and '' or '...') .. str:sub(-trunc_len, -1) + end + return str + end +end + +--- @param trunc_len number truncates component to trunc_len number of chars +--- @param no_ellipsis boolean whether to disable adding '...' at start before truncation +--- return function that can format the component accordingly +local function r_trunc(trunc_len, no_ellipsis) + return function(str) + if #str > trunc_len then + return str:sub(1, trunc_len) .. (no_ellipsis and '' or '...') + end + return str + end +end + +local function short_path(len) + return function(str) + if #str > len then + return vim.fn.pathshorten(str, 1) + end + return str + end +end + +local function header() + local text = short_path(40)(vim.fn.getcwd()) + local branch = r_trunc(15, false)(vim.fn.FugitiveHead()) + if branch ~= '' then + text = text .. '  ' .. branch + end + return text +end + +require('lualine').setup ({ + options = { + icons_enabled = true, + -- theme = require('config.nightfox_lualine_custom'), + theme = 'auto', + -- theme = "catppuccin", + component_separators = { left = '', right = '' }, + section_separators = { left = '', right = '' }, + disabled_filetypes = { 'NvimTree', 'fugitive' }, + always_divide_middle = true, + globalstatus = true + }, + sections = { + lualine_a = { }, + lualine_b = { 'mode' }, + lualine_c = { { 'filename', path = 1 }, 'diff', {'diagnostics', sources = {'nvim_lsp'}}}, + lualine_x = { 'filetype', 'encoding', 'fileformat', 'progress' }, + lualine_y = { 'location' }, + lualine_z = { } + }, + inactive_sections = { + lualine_a = { }, + lualine_b = { }, + lualine_c = { 'filename' }, + lualine_x = { 'location' }, + lualine_y = { }, + lualine_z = { } + }, + -- tabline = { + -- lualine_a = { { header } }, + -- lualine_b = { {'tabs', mode = 0 } }, + -- lualine_c = { { 'buffers', show_filename_only = true, filetype_names = { TelescopePrompt = 'Telescope', fugitive = 'Fugitive' } } }, + -- lualine_x = {}, + -- lualine_y = {}, + -- lualine_z = {} + -- }, + extensions = { } +}) + diff --git a/lua/config/luasnip.lua b/lua/config/luasnip.lua new file mode 100644 index 0000000..a618ef5 --- /dev/null +++ b/lua/config/luasnip.lua @@ -0,0 +1,31 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +-- local ls = require"luasnip" +-- local s = ls.snippet +-- local sn = ls.snippet_node +-- local isn = ls.indent_snippet_node +-- local t = ls.text_node +-- local i = ls.insert_node +-- local f = ls.function_node +-- local c = ls.choice_node +-- local d = ls.dynamic_node +-- local r = ls.restore_node +-- local events = require("luasnip.util.events") +-- local ai = require("luasnip.nodes.absolute_indexer") + +-- For rafamadriz/friendly-snippets +require("luasnip.loaders.from_vscode").lazy_load() \ No newline at end of file diff --git a/lua/config/mason-lspconfig.lua b/lua/config/mason-lspconfig.lua new file mode 100644 index 0000000..621e706 --- /dev/null +++ b/lua/config/mason-lspconfig.lua @@ -0,0 +1,32 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +require("mason-lspconfig").setup({ + -- A list of servers to automatically install if they're not already installed. Example: { "rust_analyzer@nightly", "lua_ls" } + -- This setting has no relation with the `automatic_installation` setting. + ---@type string[] + ensure_installed = require('lsp'):language_servers(), + + -- Whether servers that are set up (via lspconfig) should be automatically installed if they're not already installed. + -- This setting has no relation with the `ensure_installed` setting. + -- Can either be: + -- - false: Servers are not automatically installed. + -- - true: All servers set up via lspconfig are automatically installed. + -- - { exclude: string[] }: All servers set up via lspconfig, except the ones provided in the list, are automatically installed. + -- Example: automatic_installation = { exclude = { "rust_analyzer", "solargraph" } } + ---@type boolean + -- automatic_installation = true +}) diff --git a/lua/config/mason.lua b/lua/config/mason.lua new file mode 100644 index 0000000..1054597 --- /dev/null +++ b/lua/config/mason.lua @@ -0,0 +1,17 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +require("mason").setup() diff --git a/lua/config/material.lua b/lua/config/material.lua new file mode 100644 index 0000000..414186b --- /dev/null +++ b/lua/config/material.lua @@ -0,0 +1,54 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +require('material').setup({ + contrast = { + sidebars = false, -- Enable contrast for sidebar-like windows ( for example Nvim-Tree ) + floating_windows = false, -- Enable contrast for floating windows + line_numbers = false, -- Enable contrast background for line numbers + sign_column = false, -- Enable contrast background for the sign column + cursor_line = false, -- Enable darker background for the cursor line + non_current_windows = false, -- Enable darker background for non-current windows + popup_menu = false, -- Enable lighter background for the popup menu + }, + italics = { + comments = false, -- Enable italic comments + keywords = false, -- Enable italic keywords + functions = false, -- Enable italic functions + strings = false, -- Enable italic strings + variables = false -- Enable italic variables + }, + contrast_filetypes = { -- Specify which filetypes get the contrasted (darker) background + "terminal", -- Darker terminal background + "packer", -- Darker packer background + "qf" -- Darker qf list background + }, + high_visibility = { + lighter = false, -- Enable higher contrast text for lighter style + darker = false -- Enable higher contrast text for darker style + }, + disable = { + borders = false, -- Disable borders between verticaly split windows + background = false, -- Prevent the theme from setting the background (NeoVim then uses your teminal background) + term_colors = false, -- Prevent the theme from setting terminal colors + eob_lines = false -- Hide the end-of-buffer lines + }, + lualine_style = "default", -- Lualine style ( can be 'stealth' or 'default' ) + async_loading = true, -- Load parts of the theme asyncronously for faster startup (turned on by default) + custom_highlights = {} -- Overwrite highlights with your own +}) +vim.g.material_style = "deep ocean" +vim.fn.execute("colorscheme material") diff --git a/lua/config/nightfox.lua b/lua/config/nightfox.lua new file mode 100644 index 0000000..db99832 --- /dev/null +++ b/lua/config/nightfox.lua @@ -0,0 +1,67 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +require('nightfox').setup({ + options = { + -- Compiled file's destination location + compile_path = vim.fn.stdpath("cache") .. "/nightfox", + compile_file_suffix = "_compiled", -- Compiled file suffix + transparent = false, -- Disable setting background + terminal_colors = true, -- Set terminal colors (vim.g.terminal_color_*) used in `:terminal` + dim_inactive = false, -- Non focused panes set to alternative background + styles = { -- Style to be applied to different syntax groups + comments = "NONE", -- Value is any valid attr-list value `:help attr-list` + functions = "NONE", + keywords = "NONE", + numbers = "NONE", + strings = "NONE", + types = "NONE", + variables = "NONE", + }, + inverse = { -- Inverse highlight for different types + match_paren = false, + visual = false, + search = false, + }, + modules = { -- List of various plugins and additional options + cmp = true, + diagnostic = { + enable = true, + background = true + }, + gitsigns = true, + native_lsp = true, + nvimtree = true, + telescope = true, + treesitter = true, + }, + }, + groups = { + all = { + -- By default nightfox links some groups together. `CursorColumn` is one of these groups. When overriding + -- Make sure `link` is cleared to `""` so that the link will be removed. + -- see https://github.com/EdenEast/nightfox.nvim/blob/main/lua/nightfox/group/editor.lua + Normal = { bg = "palette.bg0", link = "" }, + NormalNC = { bg = "palette.bg0", link = "" }, + NormalFloat = { bg = "palette.bg1", link = "" }, + CursorLine = { bg = "palette.bg1", link = "" }, + StatusLine = { bg = "palette.bg1", link = "" }, + StatusLineNC = { bg = "palette.bg1", link = "" } + } + } +}) + +vim.cmd("colorscheme nightfox") diff --git a/lua/config/nightfox_lualine_custom.lua b/lua/config/nightfox_lualine_custom.lua new file mode 100644 index 0000000..1f0e316 --- /dev/null +++ b/lua/config/nightfox_lualine_custom.lua @@ -0,0 +1,47 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +local Color = require("nightfox.lib.color") +local spec = require("nightfox.spec").load("nightfox") + +local pal = spec.pallet +local bg = Color.from_hex(spec.bg1) +local fg = spec.fg2 + +local function generate_mode(color, amount) + amount = amount or 0.3 + local fade = bg:blend(Color.from_hex(color), amount):to_css() + local b = bg:to_css() + local f = fg + + return { + a = { bg = color, fg = b }, + b = { bg = fade, fg = f }, + c = { bg = b, fg = f }, + } +end + +-- stylua: ignore +local nightfox = { + normal = generate_mode(pal.blue.base), + insert = generate_mode(pal.green.base), + command = generate_mode(pal.yellow.base), + visual = generate_mode(pal.magenta.base), + replace = generate_mode(pal.red.base), + inactive = generate_mode(spec.fg3), +} + +return nightfox diff --git a/lua/config/nord.lua b/lua/config/nord.lua new file mode 100644 index 0000000..4a1cd87 --- /dev/null +++ b/lua/config/nord.lua @@ -0,0 +1,22 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +vim.g.nord_contrast = true +vim.g.nord_borders = false +vim.g.nord_disable_background = false +vim.g.nord_italic = false + +require('nord').set() diff --git a/lua/config/nvim-autopairs.lua b/lua/config/nvim-autopairs.lua new file mode 100644 index 0000000..98cba42 --- /dev/null +++ b/lua/config/nvim-autopairs.lua @@ -0,0 +1,35 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +require('nvim-autopairs').setup({ + disable_filetype = { "TelescopePrompt" }, + disable_in_macro = false, -- disable when recording or executing a macro + disable_in_visualblock = false, -- disable when insert after visual block mode + ignored_next_char = [=[[%w%%%'%[%"%.]]=], + enable_moveright = true, + enable_afterquote = true, -- add bracket pairs after quote + enable_check_bracket_line = true, --- check bracket in same line + enable_bracket_in_quote = true, -- + enable_abbr = false, -- trigger abbreviation + break_undo = true, -- switch for basic rule break undo sequence + check_ts = false, + map_cr = true, + map_bs = true, -- map the key + map_c_h = false, -- Map the key to delete a pair + map_c_w = false, -- map to delete a pair if possible +}) +-- cmp_autopairs.lisp[#cmp_autopairs.lisp+1] = "racket" + diff --git a/lua/config/nvim-cmp.lua b/lua/config/nvim-cmp.lua new file mode 100644 index 0000000..951a590 --- /dev/null +++ b/lua/config/nvim-cmp.lua @@ -0,0 +1,196 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +local has_words_before = function() + unpack = unpack or table.unpack + 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 + +local cmp = require('cmp') +local luasnip = require('luasnip') +local lspkind = require('lspkind') + +cmp.setup({ + enabled = function() + -- disable completion in comments + local context = require 'cmp.config.context' + -- keep command mode completion enabled when cursor is in a comment + if vim.api.nvim_get_mode().mode == 'c' then + return true + else + return not context.in_treesitter_capture('comment') and + not context.in_syntax_group('Comment') + end + end, + completion = { keyword_length = 3 }, + snippet = { + expand = function(args) + -- vim.fn["vsnip#anonymous"](args.body) -- For `vsnip` users. + luasnip.lsp_expand(args.body) -- For `luasnip` users. + -- require('snippy').expand_snippet(args.body) -- For `snippy` users. + -- vim.fn["UltiSnips#Anon"](args.body) -- For `ultisnips` users. + end + }, + formatting = { + format = function(entry, vim_item) + vim_item = lspkind.cmp_format({ + mode = 'text', -- show only symbol annotations + maxwidth = 50, -- prevent the popup from showing more than provided characters (e.g 50 will not show more than 50 characters) + ellipsis_char = + '...' -- when popup menu exceed maxwidth, the truncated part would show ellipsis_char instead (must define maxwidth first) + + -- The function below will be called before any actual modifications from lspkind + -- so that you can provide more controls on popup customization. (See [#30](https://github.com/onsails/lspkind-nvim/pull/30)) + --[[ before = function(entry, vim_item) + ... + return vim_item + end ]] + })(entry, vim_item) + + vim_item.dup = 0 + + return vim_item + end + }, + experimental = { ghost_text = true }, + mapping = { + [''] = cmp.mapping.select_prev_item(), + [''] = cmp.mapping.select_next_item(), + [''] = cmp.mapping.scroll_docs(-4), + [''] = cmp.mapping.scroll_docs(4), + [''] = cmp.mapping.complete(), + [''] = cmp.mapping.close(), + [''] = cmp.mapping( + function(fallback) + if cmp.visible() then + cmp.confirm( + { + behavior = cmp.ConfirmBehavior.Replace, + select = true + } + ) + -- vim.api.nvim_feedkeys('(', 'i', true) + else + fallback() + end + end, { 'i', 's' } + ), + -- [''] = cmp.mapping( + -- function(fallback) + -- if cmp.visible() then + -- cmp.select_next_item() + -- elseif luasnip.expand_or_jumpable() then + -- luasnip.expand_or_jump() + -- else + -- fallback() + -- end + -- end, { 'i', 's' } + -- ), + + -- [''] = 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' } + -- ), + [''] = cmp.mapping( + function(fallback) + if cmp.visible() then + cmp.select_next_item() + -- You could replace the expand_or_jumpable() calls within expand_or_locally_jumpable() + -- they way you will only jump inside the snippet region + elseif luasnip.expand_or_jumpable() then + luasnip.expand_or_jump() + elseif has_words_before() then + cmp.complete() + else + fallback() + end + end, { 'i', 's' } + ), + + [''] = 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' } + ) + }, + sources = { + -- { name = 'buffer' }, + { name = 'path' }, + { name = 'nvim_lsp' }, + -- { name = 'nvim_lsp_signature_help' }, + -- { name = 'nvim_lua' }, + -- { name = 'vsnip' }, -- For vsnip users. + { name = 'luasnip' } -- For luasnip users. + -- { name = 'ultisnips' }, -- For ultisnips users. + -- { name = 'snippy' }, -- For snippy users. + } +}) +-- see https://github.com/hrsh7th/nvim-cmp/wiki/Menu-Appearance#how-to-add-visual-studio-code-dark-theme-colors-to-the-menu +-- -- gray +-- vim.fn.execute("highlight! CmpItemAbbrDeprecated guibg=NONE gui=strikethrough guifg=#808080") +-- -- blue +-- vim.fn.execute("highlight! CmpItemAbbrMatch guibg=NONE guifg=#569CD6") +-- vim.fn.execute("highlight! CmpItemAbbrMatchFuzzy guibg=NONE guifg=#569CD6") +-- -- light blue +-- vim.fn.execute("highlight! CmpItemKindVariable guibg=NONE guifg=#9CDCFE") +-- vim.fn.execute("highlight! CmpItemKindInterface guibg=NONE guifg=#9CDCFE") +-- vim.fn.execute("highlight! CmpItemKindText guibg=NONE guifg=#9CDCFE") +-- -- pink +-- vim.fn.execute("highlight! CmpItemKindFunction guibg=NONE guifg=#C586C0") +-- vim.fn.execute("highlight! CmpItemKindMethod guibg=NONE guifg=#C586C0") +-- -- front +-- vim.fn.execute("highlight! CmpItemKindKeyword guibg=NONE guifg=#D4D4D4") +-- vim.fn.execute("highlight! CmpItemKindProperty guibg=NONE guifg=#D4D4D4") +-- vim.fn.execute("highlight! CmpItemKindUnit guibg=NONE guifg=#D4D4D4") + +cmp.setup.cmdline( + '/', + { + mapping = cmp.mapping.preset.cmdline(), + sources = { { name = 'buffer' } } + } +) + +cmp.setup.cmdline( + ':', + { + mapping = cmp.mapping.preset.cmdline(), + sources = cmp.config.sources( + { { name = 'path' } }, + { { name = 'cmdline', option = { ignore_cmds = { 'Man', '!' } } } } + ) + } +) + +local cmp_autopairs = require('nvim-autopairs.completion.cmp') +cmp.event:on( + 'confirm_done', + cmp_autopairs.on_confirm_done() +) diff --git a/lua/config/nvim-comment.lua b/lua/config/nvim-comment.lua new file mode 100644 index 0000000..3d5dbbb --- /dev/null +++ b/lua/config/nvim-comment.lua @@ -0,0 +1,33 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +require('nvim_comment').setup({ + -- Linters prefer comment and line to have a space in between markers + marker_padding = true, + -- should comment out empty or whitespace only lines + comment_empty = true, + -- Should key mappings be created + create_mappings = true, + -- Normal mode mapping left hand side + -- line_mapping = "cc", + -- Visual/Operator mapping left hand side + -- operator_mapping = "c", + -- Hook function to call before commenting takes place + hook = nil +}) +vim.keymap.set('n', 'c', ':CommentToggle') +vim.keymap.set('v', 'c', ":'<, '>CommentToggle") + diff --git a/lua/config/nvim-dap-ui.lua b/lua/config/nvim-dap-ui.lua new file mode 100644 index 0000000..c07e488 --- /dev/null +++ b/lua/config/nvim-dap-ui.lua @@ -0,0 +1,57 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +require("dapui").setup({ + icons = { expanded = "▾", collapsed = "▸" }, + mappings = { + -- Use a table to apply multiple mappings + expand = { "", "<2-LeftMouse>" }, + open = "o", + remove = "d", + edit = "e", + repl = "r", + toggle = "t", + }, + layouts = { + { + elements = { + 'scopes', + 'breakpoints', + 'stacks', + 'watches', + }, + size = 40, + position = 'left', + }, + { + elements = { + 'repl', + 'console', + }, + size = 10, + position = 'bottom', + }, + }, + floating = { + max_height = nil, -- These can be integers or a float between 0 and 1. + max_width = nil, -- Floats will be treated as percentage of your screen. + border = "single", -- Border style. Can be "single", "double" or "rounded" + mappings = { + close = { "q", "" }, + }, + }, + windows = { indent = 1 }, +}) diff --git a/lua/config/nvim-dap.lua b/lua/config/nvim-dap.lua new file mode 100644 index 0000000..e9fc8f6 --- /dev/null +++ b/lua/config/nvim-dap.lua @@ -0,0 +1,102 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +vim.fn.execute("nnoremap :lua require'dap'.continue()") +vim.fn.execute("nnoremap :lua require'dap'.step_over()") +vim.fn.execute("nnoremap :lua require'dap'.step_into()") +vim.fn.execute("nnoremap :lua require'dap'.step_out()") +vim.fn.execute("nnoremap dt :lua require'config.nvim-dap'.pytest({'-k', ''})") +vim.fn.execute("nnoremap dl :lua require'config.nvim-dap'.launch({''})") +vim.fn.execute("nnoremap db :lua require'dap'.toggle_breakpoint()") +-- vim.fn.execute("nnoremap B :lua require'dap'.set_breakpoint(vim.fn.input('Breakpoint condition: '))") +-- vim.fn.execute("nnoremap lp :lua require'dap'.set_breakpoint(nil, nil, vim.fn.input('Log point message: '))") +vim.fn.execute("nnoremap dr :lua require'dap'.repl.open()") +-- vim.fn.execute("nnoremap dl :lua require'dap'.run_last()") + +local utils = require('utils') + +M = {} + +local env_ok = false +local dap = nil + +local function check_env() + local debugpy = utils.exec('python -m debugpy --version') + assert(debugpy.rc == 0, 'Python module debugpy is required') + env_ok = true +end + +local function load_dap() + local ok, p = pcall(require, 'dap') + assert(ok, 'nvim-dap is required') + return p +end + +local function start(config) + if not env_ok then + check_env() + end + if not dap then + dap = load_dap() + dap.adapters.python = { + type = 'executable'; + command = 'python'; + args = { '-m', 'debugpy.adapter' }; + cwd = vim.fn.getcwd(); + } + end + dap.run(config) + -- List of events described at https://microsoft.github.io/debug-adapter-protocol/specification#Events + -- Also see :h dap-extensions + dap.listeners.after['event_initialized']['nvim-dap.lua'] = function() + dap.set_exception_breakpoints({ 'userUnhandled' }) + end +end + +function M.launch(args) + assert(type(args) == 'table', 'Args not specified or of wrong type') + local config = { + name = 'Launch file', + type = 'python', + request = 'launch', + program = "${file}"; + -- python = 'python'; + -- program = vim.fn.getcwd() .. '/.venv/bin/pytest'; + console = "integratedTerminal", + args = args + } + start(config) +end + +function M.pytest(args) + assert(type(args) == 'table', 'Args not specified or of wrong type') + local config = { + name = 'pytest ' .. table.concat(args, ' '), + type = 'python', + request = 'launch', + + -- pythonPath = vim.fn.getcwd() .. '/.venv/bin/python', + module = 'pytest', + -- python = 'python'; + -- program = vim.fn.getcwd() .. '/.venv/bin/pytest'; + args = args, + console = "integratedTerminal", + -- program = "${file}"; + } + start(config) +end + +return M diff --git a/lua/config/nvim-tree.lua b/lua/config/nvim-tree.lua new file mode 100644 index 0000000..d597321 --- /dev/null +++ b/lua/config/nvim-tree.lua @@ -0,0 +1,230 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +local nvim_tree = require('nvim-tree') + +nvim_tree.setup({ + auto_reload_on_write = true, + create_in_closed_folder = false, + disable_netrw = false, + hijack_cursor = true, + hijack_netrw = false, + hijack_unnamed_buffer_when_opening = false, + -- ignore_buffer_on_setup = false, + -- open_on_setup = false, + -- open_on_setup_file = false, + open_on_tab = false, + ignore_buf_on_tab_change = {}, + sort_by = "name", + root_dirs = {}, + prefer_startup_root = false, + sync_root_with_cwd = true, + reload_on_bufenter = false, + respect_buf_cwd = false, + on_attach = "disable", + remove_keymaps = false, + select_prompts = false, + view = { + adaptive_size = false, + centralize_selection = false, + width = 40, + hide_root_folder = false, + side = "left", + preserve_window_proportions = true, + number = false, + relativenumber = false, + signcolumn = "yes", + mappings = { + custom_only = false, + -- list = { + -- { key = "q", action = ""}, + -- }, + }, + 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 = true, + group_empty = true, + highlight_git = true, + full_name = false, + highlight_opened_files = "name", + root_folder_modifier = ":~", + indent_width = 2, + indent_markers = { + enable = false, + inline_arrows = true, + icons = { + corner = "└", + edge = "│", + item = "│", + bottom = "─", + none = " ", + }, + }, + icons = { + webdev_colors = true, + git_placement = "after", + padding = " ", + symlink_arrow = " ➛ ", + show = { + file = true, + folder = true, + folder_arrow = false, + git = true, + }, + glyphs = { + default = "", + symlink = "", + bookmark = "", + folder = { + arrow_closed = "", + arrow_open = "", + default = "", + open = "", + empty = "", + empty_open = "", + symlink = "", + symlink_open = "", + }, + git = { + unstaged = "✗", + staged = "✓", + unmerged = "", + renamed = "➜", + untracked = "★", + deleted = "", + ignored = "◌", + }, + }, + }, + special_files = { "Cargo.toml", "Makefile", "README.md", "readme.md" }, + symlink_destination = true, + }, + hijack_directories = { + enable = true, + auto_open = true, + }, + update_focused_file = { + enable = true, + update_root = true, + ignore_list = { + 'help' + }, + }, + -- ignore_ft_on_setup = {}, + system_open = { + cmd = "", + args = {}, + }, + diagnostics = { + enable = true, + show_on_dirs = false, + debounce_delay = 50, + icons = { + hint = "", + info = "", + warning = "", + error = "", + }, + }, + filters = { + dotfiles = false, + custom = {}, + exclude = {}, + }, + filesystem_watchers = { + enable = true, + debounce_delay = 50, + }, + git = { + enable = true, + ignore = true, + show_on_dirs = true, + timeout = 400, + }, + actions = { + use_system_clipboard = true, + change_dir = { + enable = false, + 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, + resize_window = false, + window_picker = { + enable = true, + chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890", + exclude = { + filetype = { "notify", "packer", "qf", "diff", "fugitive", "fugitiveblame" }, + buftype = { "nofile", "terminal", "help" }, + }, + }, + }, + remove_file = { + close_window = true, + }, + }, + trash = { + cmd = "trash", + require_confirm = true, + }, + live_filter = { + prefix = "[FILTER]: ", + always_show_folders = true, + }, + log = { + enable = false, + truncate = false, + types = { + all = false, + config = false, + copy_paste = false, + dev = false, + diagnostics = false, + git = false, + profile = false, + watcher = false, + }, + }, +}) + +local opts = { remap = false, silent = true } +vim.keymap.set('n', "tt", function() nvim_tree.toggle(false, true) end, opts) diff --git a/lua/config/nvim-treesitter.lua b/lua/config/nvim-treesitter.lua new file mode 100644 index 0000000..3c04e20 --- /dev/null +++ b/lua/config/nvim-treesitter.lua @@ -0,0 +1,67 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +require('nvim-treesitter.configs').setup({ + -- One of "all", "maintained" (parsers with maintainers), or a list of languages + ensure_installed = { + "bash", + "c", + "cpp", + "cmake", + "css", + "dockerfile", + "go", + "html", + "java", + "javascript", + "json", + "lua", + "make", + "ninja", + "python", + "rust", + "toml", + "vim", + "yaml", + "yang", + }, + + indent = { + enable = true + }, + + -- Install languages synchronously (only applied to `ensure_installed`) + sync_install = false, + + -- List of parsers to ignore installing + ignore_install = { }, + + highlight = { + -- `false` will disable the whole extension + enable = true, + + -- list of language that will be disabled + disable = { }, + + -- Setting this to true will run `:h syntax` and tree-sitter at the same time. + -- Set this to `true` if you depend on 'syntax' being enabled (like for indentation). + -- Using this option may slow down your editor, and you may see some duplicate highlights. + -- Instead of true it can also be a list of languages + additional_vim_regex_highlighting = false, + }, +}) +-- vim.opt.foldmethod = "expr" +-- vim.opt.foldexpr = "nvim_treesitter#foldexpr()" diff --git a/lua/config/onedark.lua b/lua/config/onedark.lua new file mode 100644 index 0000000..8c2cb1b --- /dev/null +++ b/lua/config/onedark.lua @@ -0,0 +1,49 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +require('onedark').setup { + -- Main options -- + style = 'darker', -- Default theme style. Choose between 'dark', 'darker', 'cool', 'deep', 'warm', 'warmer' and 'light' + transparent = false, -- Show/hide background + term_colors = true, -- Change terminal color as per the selected theme style + ending_tildes = true, -- Show the end-of-buffer tildes. By default they are hidden + -- toggle theme style --- + toggle_style_key = 'ts', -- Default keybinding to toggle + toggle_style_list = {'dark', 'darker', 'cool', 'deep', 'warm', 'warmer', 'light'}, -- List of styles to toggle between + + -- Change code style --- + -- Options are italic, bold, underline, none + -- You can configure multiple style with comma seperated, For e.g., keywords = 'italic,bold' + code_style = { + comments = 'italic', + keywords = 'none', + functions = 'none', + strings = 'none', + variables = 'none' + }, + + -- Custom Highlights -- + colors = {}, -- Override default colors + highlights = {}, -- Override highlight groups + + -- Plugins Config -- + diagnostics = { + darker = true, -- darker colors for diagnostic + undercurl = true, -- use undercurl instead of underline for diagnostics + background = true, -- use background color for virtual text + }, +} +require('onedark').load() diff --git a/lua/config/sonokai.lua b/lua/config/sonokai.lua new file mode 100644 index 0000000..eb17fb0 --- /dev/null +++ b/lua/config/sonokai.lua @@ -0,0 +1,20 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +vim.g.sonokai_style = "atlantis" +vim.g.sonokai_enable_italic = 1 +vim.g.sonokai_disable_italic_comment = 1 +vim.fn.execute("colorscheme sonokai") diff --git a/lua/config/supertab.lua b/lua/config/supertab.lua new file mode 100644 index 0000000..f3b45dd --- /dev/null +++ b/lua/config/supertab.lua @@ -0,0 +1,17 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +vim.g.SuperTabDefaultCompletionType = "" diff --git a/lua/config/symbols-outline.lua b/lua/config/symbols-outline.lua new file mode 100644 index 0000000..8b40fb4 --- /dev/null +++ b/lua/config/symbols-outline.lua @@ -0,0 +1,69 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +vim.g.symbols_outline = { + highlight_hovered_item = true, + show_guides = true, + auto_preview = true, + position = 'left', + relative_width = true, + width = 25, + auto_close = false, + show_numbers = true, + show_relative_numbers = true, + show_symbol_details = true, + preview_bg_highlight = 'Pmenu', + keymaps = { -- These keymaps can be a string or a table for multiple keys + close = {"", "q"}, + goto_location = "", + focus_location = "o", + hover_symbol = "", + toggle_preview = "K", + rename_symbol = "r", + code_actions = "a", + }, + lsp_blacklist = {}, + symbol_blacklist = {}, + symbols = { + File = {icon = "", hl = "TSURI"}, + Module = {icon = "", hl = "TSNamespace"}, + Namespace = {icon = "", hl = "TSNamespace"}, + Package = {icon = "", hl = "TSNamespace"}, + Class = {icon = "𝓒", hl = "TSType"}, + Method = {icon = "ƒ", hl = "TSMethod"}, + Property = {icon = "", hl = "TSMethod"}, + Field = {icon = "", hl = "TSField"}, + Constructor = {icon = "", hl = "TSConstructor"}, + Enum = {icon = "ℰ", hl = "TSType"}, + Interface = {icon = "ﰮ", hl = "TSType"}, + Function = {icon = "", hl = "TSFunction"}, + Variable = {icon = "", hl = "TSConstant"}, + Constant = {icon = "", hl = "TSConstant"}, + String = {icon = "𝓐", hl = "TSString"}, + Number = {icon = "#", hl = "TSNumber"}, + Boolean = {icon = "⊨", hl = "TSBoolean"}, + Array = {icon = "", hl = "TSConstant"}, + Object = {icon = "⦿", hl = "TSType"}, + Key = {icon = "🔐", hl = "TSType"}, + Null = {icon = "NULL", hl = "TSType"}, + EnumMember = {icon = "", hl = "TSField"}, + Struct = {icon = "𝓢", hl = "TSType"}, + Event = {icon = "🗲", hl = "TSType"}, + Operator = {icon = "+", hl = "TSOperator"}, + TypeParameter = {icon = "𝙏", hl = "TSParameter"} + } +} +vim.api.nvim_set_keymap('n', 'o', ':SymbolsOutlineOpen', { noremap = true, silent = true }) diff --git a/lua/config/telescope.lua b/lua/config/telescope.lua new file mode 100644 index 0000000..6f739e3 --- /dev/null +++ b/lua/config/telescope.lua @@ -0,0 +1,126 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +local builtin = require('telescope.builtin') + +vim.keymap.set( + 'n', 'ff', function() builtin.find_files({ hidden = true }) end, + { remap = false } +) +vim.keymap.set( + 'n', 'fr', function() builtin.oldfiles({ hidden = true }) end, + { remap = false } +) +vim.keymap.set( + 'n', 'fg', function() + builtin.live_grep( + { additional_args = function(_) return { '--hidden' } end } + ) + end, { remap = false } +) +vim.keymap.set( + 'n', 'fb', function() builtin.buffers() end, { remap = false } +) + +--[[ local telescope = require('telescope') + +telescope.setup { + extensions = { + command_palette = { + { + 'File', + { 'entire selection (C-a)', ':call feedkeys("GVgg")' }, + { 'save current file (C-s)', ':w' }, + { 'save all files (C-A-s)', ':wa' }, + { 'quit (C-q)', ':qa' }, + { + 'file browser (C-i)', + ':lua require\'telescope\'.extensions.file_browser.file_browser()', + 1 + }, + { + 'search word (A-w)', + ':lua require(\'telescope.builtin\').live_grep()', + 1 + }, + { + 'git files (A-f)', + ':lua require(\'telescope.builtin\').git_files()', + 1 + }, + { + 'files (C-f)', + ':lua require(\'telescope.builtin\').find_files()', + 1 + } + }, + { + 'Help', + { 'tips', ':help tips' }, + { 'cheatsheet', ':help index' }, + { 'tutorial', ':help tutor' }, + { 'summary', ':help summary' }, + { 'quick reference', ':help quickref' }, + { + 'search help(F1)', + ':lua require(\'telescope.builtin\').help_tags()', + 1 + } + }, + { + 'Vim', + { 'reload vimrc', ':source $MYVIMRC' }, + { 'check health', ':checkhealth' }, + { + 'jumps (Alt-j)', + ':lua require(\'telescope.builtin\').jumplist()' + }, + { 'commands', ':lua require(\'telescope.builtin\').commands()' }, + { + 'command history', + ':lua require(\'telescope.builtin\').command_history()' + }, + { + 'registers (A-e)', + ':lua require(\'telescope.builtin\').registers()' + }, + { + 'colorshceme', + ':lua require(\'telescope.builtin\').colorscheme()', + 1 + }, + { + 'vim options', + ':lua require(\'telescope.builtin\').vim_options()' + }, + { 'keymaps', ':lua require(\'telescope.builtin\').keymaps()' }, + { 'buffers', ':Telescope buffers' }, + { + 'search history (C-h)', + ':lua require(\'telescope.builtin\').search_history()' + }, + { 'paste mode', ':set paste!' }, + { 'cursor line', ':set cursorline!' }, + { 'cursor column', ':set cursorcolumn!' }, + { 'spell checker', ':set spell!' }, + { 'relative number', ':set relativenumber!' }, + { 'search highlighting (F12)', ':set hlsearch!' } + } + } + } +} + +require('telescope').load_extension('command_palette') ]] diff --git a/lua/config/tokyonight.lua b/lua/config/tokyonight.lua new file mode 100644 index 0000000..6f693bb --- /dev/null +++ b/lua/config/tokyonight.lua @@ -0,0 +1,26 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +vim.g.tokyonight_style = "night" +vim.g.tokyonight_terminal_colors = true +vim.g.tokyonight_italic_comments = true +vim.g.tokyonight_italic_keywords = true +vim.g.tokyonight_sidebars = {'packer', 'terminal'} +vim.g.tokyonight_dark_sidebar = true +vim.g.tokyonight_dark_float = true +vim.g.tokyonight_lualine_bold = true + +vim.fn.execute("colorscheme tokyonight") diff --git a/lua/config/ultisnips.lua b/lua/config/ultisnips.lua new file mode 100644 index 0000000..0fe1d8c --- /dev/null +++ b/lua/config/ultisnips.lua @@ -0,0 +1,27 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +-- Trigger configuration. You need to change this to something other than if you use one of the following: +-- - https://github.com/Valloric/YouCompleteMe +-- - https://github.com/nvim-lua/completion-nvim +-- vim.g.UltiSnipsExpandTrigger="" +-- vim.g.UltiSnipsJumpForwardTrigger="" +-- vim.g.UltiSnipsJumpBackwardTrigger="" +vim.g.UltiSnipsExpandTrigger = '(ultisnips_expand)' +vim.g.UltiSnipsJumpForwardTrigger = '(ultisnips_jump_forward)' +vim.g.UltiSnipsJumpBackwardTrigger = '(ultisnips_jump_backward)' +vim.g.UltiSnipsListSnippets = '' +vim.g.UltiSnipsRemoveSelectModeMappings = 0 diff --git a/lua/config/vim-code-dark.lua b/lua/config/vim-code-dark.lua new file mode 100644 index 0000000..21e9e3a --- /dev/null +++ b/lua/config/vim-code-dark.lua @@ -0,0 +1,17 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +vim.cmd("colorscheme codedark") diff --git a/lua/config/vista.lua b/lua/config/vista.lua new file mode 100644 index 0000000..0ff4240 --- /dev/null +++ b/lua/config/vista.lua @@ -0,0 +1,21 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +vim.g.vista_sidebar_position = 'vertical topleft' + +vim.g.vista_icon_indent = { "╰─▸ ", "├─▸ " } +vim.g.vista_default_executive = 'nvim_lsp' + diff --git a/lua/config/vscode.lua b/lua/config/vscode.lua new file mode 100644 index 0000000..3944c3c --- /dev/null +++ b/lua/config/vscode.lua @@ -0,0 +1,52 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +-- Conservative style of the standard Visual Studio +-- with reduced number of colors +-- vim.g.codedark_conservative = 1 +-- vim.g.vscode_style = "dark" +-- vim.g.vscode_transparency = 0 +-- vim.g.vscode_italic_comment = 1 +-- vim.g.vscode_disable_nvimtree_bg = true +-- vim.fn.execute("colorscheme vscode") + +-- local c = require('vscode.colors') +require('vscode').setup({ + style = 'dark', + + -- Enable transparent background + transparent = false, + + -- Enable italic comment + italic_comments = false, + + -- Disable nvim-tree background color + disable_nvimtree_bg = false, + + -- Override colors (see ./lua/vscode/colors.lua) + -- color_overrides = { + -- vscLineNumber = '#FFFFFF', + -- }, + + -- Override highlight groups (see ./lua/vscode/theme.lua) + group_overrides = { + -- this supports the same val table as vim.api.nvim_set_hl + -- use colors from this colorscheme by requiring vscode.colors! + -- Cursor = { fg=c.vscDarkBlue, bg=c.vscLightGreen, bold=true }, + } +}) + +require('vscode').load() \ No newline at end of file diff --git a/lua/config/winresizer.lua b/lua/config/winresizer.lua new file mode 100644 index 0000000..5b4f369 --- /dev/null +++ b/lua/config/winresizer.lua @@ -0,0 +1,22 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +vim.g.winresizer_vert_resize = "5" +vim.g.winresizer_horiz_resize = "5" +vim.g.winresizer_start_key = "" + +local opts = { remap = false, silent = true } +vim.keymap.set('n', "r", ":WinResizerStartResize", opts) diff --git a/lua/config/winshift.lua b/lua/config/winshift.lua new file mode 100644 index 0000000..3878276 --- /dev/null +++ b/lua/config/winshift.lua @@ -0,0 +1,17 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +vim.keymap.set('n', 'm', ':WinShift', { remap = false }) diff --git a/lua/core/autocommands.lua b/lua/core/autocommands.lua new file mode 100644 index 0000000..d5db3aa --- /dev/null +++ b/lua/core/autocommands.lua @@ -0,0 +1,65 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +local function term_close() + -- Split previous buffer, switching to it + vim.fn.execute("split " .. vim.fn.expand("#")) + -- Close previous window (terminal) + vim.fn.execute(vim.fn.winnr("#") .. "wincmd q") +end +vim.api.nvim_create_autocmd("TermClose", { + pattern = "term://*", + callback = term_close +}) + +local function my_hl() + -- example (default visual) + -- highlight Visual guifg=NONE guibg=#264F78 gui=none + -- highlight DiffDelete guifg=#414141 guibg=#1E1E1E gui=none + -- highlight GitSignsChange guifg=#0C7D9D + -- highlight IndentBlanklineContextChar guifg=#999999 + -- semshi (python highlights) + -- highlight semshiLocal ctermfg=209 guifg=#ff875f + -- highlight semshiGlobal guifg=#dcdcaa + -- highlight semshiImported guifg=#4ec9b0 + -- highlight semshiParameter guifg=#9cdcfe + -- highlight semshiParameterUnused guifg=#72a1bb + -- highlight semshiFree ctermfg=218 guifg=#ffafd7 + -- highlight semshiBuiltin ctermfg=207 guifg=#dcdcaa + -- highlight semshiAttribute ctermfg=49 guifg=#00ffaf + -- highlight semshiSelf ctermfg=249 guifg=#dcdcaa + -- highlight semshiUnresolved ctermfg=226 guifg=#ffff00 cterm=underline gui=underline + -- highlight semshiSelected ctermfg=231 guifg=#ffffff ctermbg=161 guibg=#d7005f + -- highlight semshiErrorSign ctermfg=231 guifg=#ffffff ctermbg=160 guibg=#d70000 + -- highlight semshiErrorChar ctermfg=231 guifg=#ffffff ctermbg=160 guibg=#d70000 + -- sign define semshiError text=E> texthl=semshiErrorSign +end +vim.api.nvim_create_augroup("my_colors", { clear = true }) +vim.api.nvim_create_autocmd("ColorScheme", { + pattern = "*", + callback = my_hl, + group = "my_colors" +}) + +vim.api.nvim_create_autocmd("FileType", { + pattern = "go", + callback = function() + vim.opt_local.tabstop = 4 + vim.opt_local.expandtab = false + vim.opt_local.listchars = 'tab:▏ ' + vim.opt_local.list = true + end +}) diff --git a/lua/core/globals.lua b/lua/core/globals.lua new file mode 100644 index 0000000..57b572a --- /dev/null +++ b/lua/core/globals.lua @@ -0,0 +1,33 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +vim.g.is_win = vim.fn.has('win32') == 1 or vim.fn.has('win64') == 1 +vim.g.is_linux = vim.fn.has('unix') == 1 and vim.fn.has('win64') ~= 1 +vim.g.is_mac = vim.fn.has('macunix') == 1 + +if vim.fn.executable('python3') then + if vim.g.is_win then + vim.g.python3_host_prog=string.gsub(vim.fn.exepath('python3'), '.exe$', '') + elseif vim.g.is_linux or vim.g.is_mac then + vim.g.python3_host_prog=vim.fn.exepath('python3') + end +else + error("Python 3 executable not found! You must install Python 3 and set its PATH correctly!") +end + +vim.g.mapleader = " " +vim.g.vimsyn_embed = "1" +vim.fn.execute("language en_US.utf-8") diff --git a/lua/core/mappings.lua b/lua/core/mappings.lua new file mode 100644 index 0000000..b5502ba --- /dev/null +++ b/lua/core/mappings.lua @@ -0,0 +1,80 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +local opts = { remap = false, silent = true } +local opts_expr = { remap = false, silent = true, expr = true } + +--- Tab mappings --- +-- vim.keymap.set('n', "tn", ":tabnew NvimTreeOpen", opts) +vim.keymap.set('n', "tn", ":tabnew", opts) +vim.keymap.set('n', "tq", ":tabclose", opts) +-- switch tabs with Ctrl+PgUp/Ctrl+PgDwn (default vim mapping) + +--- Window mappings --- +vim.keymap.set('n', "", ":wincmd h", opts) +vim.keymap.set('n', "", ":wincmd j", opts) +vim.keymap.set('n', "", ":wincmd k", opts) +vim.keymap.set('n', "", ":wincmd l", opts) +-- Open new window in horizontal split +vim.keymap.set('n', "h", ":new", opts) +-- Open new window in vertical split +vim.keymap.set('n', "v", ":vnew", opts) +-- Open new window in horizontal split at bottom +vim.keymap.set('n', "", ":bo new", opts) +-- Close buffer and window +vim.keymap.set('n', "q", ":bd", opts) + +--- Buffer mappings --- +-- Navigate up/down half a screen +vim.keymap.set({'n', 'v'}, "", "", opts) +vim.keymap.set({'n', 'v'}, "", "", opts) +-- Center cursorline +vim.keymap.set('n', "", "zz", opts) +-- Save buffer +vim.keymap.set('n', "", ":w", opts) +-- Cycle buffers +vim.keymap.set('n', "", ":BufferLineCycleNext", opts) +vim.keymap.set('n', "", ":BufferLineCyclePrev", opts) +-- Close buffer without closing window +vim.keymap.set('n', "q", ":bpspbnbd", opts) + +--- General mappings --- +-- Remap some swedish keys for easier use +vim.keymap.set('n', "ö", "}", { remap = true }) +vim.keymap.set('v', "ö", "}", { remap = true }) +vim.keymap.set('n', "ä", "{", { remap = true }) +vim.keymap.set('v', "ä", "{", { remap = true }) +vim.keymap.set('n', ",", "]", { remap = true }) +vim.keymap.set('n', ".", "[", { remap = true }) +-- yank/put using named register +vim.keymap.set('n', 'y', '"0y', opts) +vim.keymap.set('v', 'y', '"0y', opts) +vim.keymap.set('n', 'p', '"0p', opts) +vim.keymap.set('v', 'p', '"0p', opts) +-- Allow exiting insert mode in terminal by hitting +vim.keymap.set('t', "", "", opts) +-- Navigate forward/backwards +vim.keymap.set('n', "", "", opts) +vim.keymap.set('n', "", "", opts) +-- Use :diffput/get instead of normal one to allow staging visual selection +vim.keymap.set('n', "dp", "&diff ? ':diffput' : 'dp'", opts_expr) +vim.keymap.set('v', "dp", "&diff ? ':diffput' : 'dp'", opts_expr) +vim.keymap.set('n', "do", "&diff ? ':diffget' : 'do'", opts_expr) +vim.keymap.set('v', "do", "&diff ? ':diffget' : 'do'", opts_expr) + +-- Remove default mappings +vim.keymap.set('', "", "") +vim.keymap.set('', "q", "") diff --git a/lua/core/options.lua b/lua/core/options.lua new file mode 100644 index 0000000..1d0f37a --- /dev/null +++ b/lua/core/options.lua @@ -0,0 +1,89 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +vim.opt.cursorline = true +vim.opt.number = true +vim.opt.relativenumber = true +vim.opt.mouse = "a" +vim.opt.mousemodel = "extend" +vim.opt.fillchars:append("diff: ") +vim.opt.splitbelow = true +vim.opt.splitright = true +-- set tabline=%!MyTabLine() +vim.opt.tabstop = 8 +vim.opt.softtabstop = 4 +vim.opt.expandtab = true +vim.opt.shiftwidth = 4 +vim.opt.smarttab = false +-- Folds are configured in nvim-treesitter, but this needs to be set before +-- loading the first buffer which is not possible in nvim-treesitter.lua due to +-- lazy loading (I think) +vim.opt.foldlevelstart = 99 +vim.opt.foldmethod = "indent" +vim.opt.foldignore = "" +vim.opt.guifont = "JetBrains Mono:11" +vim.opt.completeopt:append({ "menu", "menuone", "preview", "noinsert" }) +-- Max number of items +vim.opt.pumheight = 20 +-- pseudo transparency for completion menu +vim.opt.pumblend = 10 +-- pseudo transparency for floating window +vim.opt.winblend = 5 +-- set nowrap +vim.opt.clipboard:append("unnamedplus") +vim.opt.matchpairs:append({ "<:>", "':'", "\":\"" }) +vim.opt.fileencoding = "utf-8" +-- Only relevant with wrap enabled (default) +vim.opt.linebreak = true +vim.opt.breakindent = true +vim.opt.showbreak = "↪" +-- Minimum amount of lines to show offset +/- to cursorline +vim.opt.scrolloff = 3 +vim.opt.visualbell = true +vim.opt.errorbells = false +-- Persistent undo even after you close a file and re-open it +vim.opt.undofile = true +-- Insert mode key word completion setting, see :h 'compelete' +-- and https://medium.com/usevim/set-complete-e76b9f196f0f#:~:text=When%20in%20Insert%20mode%2C%20you,%2D%2D%20CTRL%2DN%20goes%20backwards. +-- kspell is only relevant if ':set spell' is toggled on, e.g. when editing +-- documents +vim.opt.complete:append("kspell") +vim.opt.complete:remove({ "w", "b", "u", "t" }) +vim.opt.spelllang = "en" +-- Align indent to next multiple value of shiftwidth. +-- E.g., only insert as many spaces necessary for reaching the next shiftwidth +vim.opt.shiftround = true +-- Allow virtualedit (editing on empty spaces) in visual block mode (Ctrl+V) +vim.opt.virtualedit = "block" +-- True color support. Avoid if terminal does not support it. +vim.opt.termguicolors = true +vim.opt.signcolumn = "auto" +-- Diff options +vim.opt.diffopt = {} +-- Use vertical split by default +vim.opt.diffopt:append("vertical") +-- Insert filler lines +vim.opt.diffopt:append("filler") +-- Execute :diffoff when only one diff window remain +vim.opt.diffopt:append("closeoff") +-- Use internal diff library +vim.opt.diffopt:append("internal") +-- These make diffs easier to read, please see the following: +-- https://vimways.org/2018/the-power-of-diff/ +vim.opt.diffopt:append({ "indent-heuristic", "algorithm:histogram" }) +vim.fn.execute("filetype plugin on") +vim.opt.hlsearch = false +vim.opt.laststatus = 3 diff --git a/lua/lsp/config/bashls.lua b/lua/lsp/config/bashls.lua new file mode 100644 index 0000000..1abaad9 --- /dev/null +++ b/lua/lsp/config/bashls.lua @@ -0,0 +1,23 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +-- requires shellcheck also (for linting) + +return { + cmd = { 'bash-language-server', 'start' }, + cmd_env = { GLOB_PATTERN = '*@(.sh|.inc|.bash|.command)' }, + single_file_support = true +} diff --git a/lua/lsp/config/clangd.lua b/lua/lsp/config/clangd.lua new file mode 100644 index 0000000..2d19ad1 --- /dev/null +++ b/lua/lsp/config/clangd.lua @@ -0,0 +1,25 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +return { + cmd = { + 'clangd', + '--clang-tidy', + '--enable-config', + '--log=verbose' + }, + single_file_support = true, +} \ No newline at end of file diff --git a/lua/lsp/config/cmake.lua b/lua/lsp/config/cmake.lua new file mode 100644 index 0000000..cf35636 --- /dev/null +++ b/lua/lsp/config/cmake.lua @@ -0,0 +1,23 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +return { + cmd = { 'cmake-language-server' }, + single_file_support = true, + init_options = { + buildDirectory = "build" + } +} diff --git a/lua/lsp/config/diagnosticls.lua b/lua/lsp/config/diagnosticls.lua new file mode 100644 index 0000000..9e2be37 --- /dev/null +++ b/lua/lsp/config/diagnosticls.lua @@ -0,0 +1,176 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +return { + cmd = { 'diagnostic-languageserver', '--stdio' }, + single_file_support = true, + -- For more info see https://github.com/iamcco/diagnostic-languageserver + init_options = { + filetypes = { python = 'flake8', lua = 'luaFormatter' }, + linters = { + -- some help from this: + -- https://github.com/creativenull/diagnosticls-configs-nvim/blob/main/lua/diagnosticls-configs/linters/flake8.lua + flake8 = { + command = 'flake8', + args = { + '--config', + 'tox.ini', + '--format', + '%(row)d,%(col)d,%(code).1s,%(code)s: %(text)s', + '-' + }, + rootPatterns = { 'Pipfile', '.git', 'tox.ini' }, + isStdout = true, + isStderr = false, + debounce = 100, + offsetLine = 0, + offsetColumn = 0, + sourceName = 'flake8', + formatLines = 1, + formatPattern = { + [[(\d+),(\d+),([A-Z]),(.*)(\r|\n)*$]], + { line = 1, column = 2, security = 3, message = { 4 } } + }, + securities = { + -- Available securities are { 'error', 'warning', 'hint', 'info' } + E = 'error', + W = 'warning', + B = 'hint', + F = 'error', + D = 'info' + } + } + }, + formatFiletypes = { + python = { 'black', 'isort' }, + lua = { 'luaFormatter' }, + sh = { 'shfmt' } + }, + formatters = { + black = { + sourceName = 'black', + command = 'black', + args = { + '--stdin-filename', + '%filename', + '-t', + 'py39', + '--quiet', + '-' + }, + rootPatterns = { 'Pipfile', '.git', 'tox.ini' }, + isStdout = true, + isStderr = false, + ignoreExitCode = false + }, + isort = { + sourceName = 'isort', + command = 'isort', + args = { '--quiet', '-' }, + rootPatterns = { 'Pipfile', '.git', 'tox.ini' }, + isStdout = true, + isStderr = false, + ignoreExitCode = false + }, + luaFormatter = { + sourceName = 'luaFormatter', + command = 'lua-format', + isStdout = true, + isStderr = false, + ignoreExitCode = false, + args = { + '--column-limit', + '80', -- Column limit of one line + '--indent-width', + '4', -- Number of spaces used for indentation + -- '--use-tab', -- Use tab for indentation + '--no-use-tab', -- Do not use tab for indentation + '--tab-width', + '4', -- Number of spaces used per tab + '--continuation-indent-width', + '4', -- Indent width for continuations line + '--spaces-before-call', + '1', -- Space on function calls + '--keep-simple-control-block-one-line', -- Keep block in one line + -- '--no-keep-simple-control-block-one-line', -- Do not keep block in one line + '--keep-simple-function-one-line', -- Keep function in one line + -- '--no-keep-simple-function-one-line', -- Do not keep function in one line + '--align-args', -- Align the arguments + -- '--no-align-args', -- Do not align the arguments + '--break-after-functioncall-lp', -- Break after '(' of function call + -- '--no-break-after-functioncall-lp', -- Do not break after '(' of function call + '--break-before-functioncall-rp', -- Break before ')' of function call + -- '--no-break-before-functioncall-rp', -- Do not break before ')' of function call + -- '--spaces-inside-functioncall-parens', -- Put spaces on the inside of parens in function calls + '--no-spaces-inside-functioncall-parens', -- Do not put spaces on the inside of parens in function calls + -- '--spaces-inside-functiondef-parens', -- Put spaces on the inside of parens in function headers + '--no-spaces-inside-functiondef-parens', -- Do not put spaces on the inside of parens in function headers + '--align-parameter', -- Align the parameters + -- '--no-align-parameter', -- Do not align the parameters + '--chop-down-parameter', -- Chop down all parameters + -- '--no-chop-down-parameter', -- Do not chop down all parameters + '--break-after-functiondef-lp', -- Break after '(' of function def + -- '--no-break-after-functiondef-lp', -- Do not break after '(' of function def + '--break-before-functiondef-rp', -- Break before ')' of function def + -- '--no-break-before-functiondef-rp', -- Do not break before ')' of function def + '--align-table-field', -- Align fields of table + -- '--no-align-table-field', -- Do not align fields of table + '--break-after-table-lb', -- Break after '{' of table + -- '--no-break-after-table-lb', -- Do not break after '{' of table + '--break-before-table-rb', -- Break before '}' of table + -- '--no-break-before-table-rb', -- Do not break before '}' of table + '--chop-down-table', -- Chop down any table + -- '--no-chop-down-table', -- Do not chop down any table + '--chop-down-kv-table', -- Chop down table if table contains key + -- '--no-chop-down-kv-table', -- Do not chop down table if table contains key + '--table-sep', + ',', -- Character to separate table fields + '--column-table-limit', + '80', -- Column limit of each line of a table + -- '--extra-sep-at-table-end', -- Add a extra field separator + '--no-extra-sep-at-table-end', -- Do not add a extra field separator + '--spaces-inside-table-braces', -- Put spaces on the inside of braces in table constructors + -- '--no-spaces-inside-table-braces', -- Do not put spaces on the inside of braces in table constructors + '--break-after-operator', -- Put break after operators + -- '--no-break-after-operator', -- Do not put break after operators + '--double-quote-to-single-quote', -- Transform string literals to use single quote + -- '--no-double-quote-to-single-quote', -- Do not transform string literals to use single quote + -- '--single-quote-to-double-quote', -- Transform string literals to use double + '--no-single-quote-to-double-quote', -- Do not transform string literals to use double + '--spaces-around-equals-in-field', -- Put spaces around the equal sign in key/value fields + -- '--no-spaces-around-equals-in-field', -- Do not put spaces around the equal sign in key/value fields + '--line-breaks-after-function-body', + '1', -- Line brakes after function body + '--line-separator', + 'input' -- input(determined by the input content), + -- os(Use line ending of the current Operating system), + -- lf(Unix style "\n"), + -- crlf(Windows style "\r\n"), + -- cr(classic Max style "\r") + } + }, + shfmt = { + sourceName = 'shfmt', + command = 'shfmt', + args = { '-s', '-i', '4', '-ci' }, + rootPatterns = { 'Pipfile', '.git', 'tox.ini' }, + isStdout = true, + isStderr = false, + ignoreExitCode = false + } + } + } +} diff --git a/lua/lsp/config/golangci_lint_ls.lua b/lua/lsp/config/golangci_lint_ls.lua new file mode 100644 index 0000000..6ccef4d --- /dev/null +++ b/lua/lsp/config/golangci_lint_ls.lua @@ -0,0 +1,22 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +return { + cmd = { "golangci-lint-langserver" }, + init_options = { + command = { "golangci-lint", "run", "--out-format", "json" } + } +} \ No newline at end of file diff --git a/lua/lsp/config/gopls.lua b/lua/lsp/config/gopls.lua new file mode 100644 index 0000000..5cd93c8 --- /dev/null +++ b/lua/lsp/config/gopls.lua @@ -0,0 +1,84 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +return { + cmd = { "gopls", "serve" }, + -- https://github.com/golang/tools/blob/master/gopls/doc/settings.md + settings = { + gopls = { + gofumpt = true, + codelenses = { + gc_details = true, + generate = true, + regenerate_cgo = true, + run_vulncheck_exp = true, + tidy = true, + upgrade_dependency = true, + vendor = true + }, + usePlaceholders = true, + analyses = { + asmdecl = true, + assign = true, + atomic = true, + atomicalign = true, + bools = true, + buildtag = true, + cgocall = true, + composites = true, + copylocks = true, + deepequalerrors = true, + embed = true, + errorsas = true, + fieldalignment = true, + httpresponse = true, + ifaceassert = true, + infertypeargs = true, + loopclosure = true, + lostcancel = true, + nilfunc = true, + nilness = true, + printf = true, + shadow = true, + shift = true, + simplifycompositelit = true, + simplifyrange = true, + simplifyslice = true, + sortslice = true, + stdmethods = true, + stringintconv = true, + structtag = true, + testinggoroutine = true, + tests = true, + timeformat = true, + unmarshal = true, + unreachable = true, + unsafeptr = true, + unusedparams = true, + unusedresult = true, + unusedwrite = true, + useany = true, + fillreturns = true, + nonewvars = true, + noresultvalues = true, + undeclaredname = true, + unusedvariable = true, + fillstruct = true, + stubmethods = true + } + } + } +} \ No newline at end of file diff --git a/lua/lsp/config/groovyls.lua b/lua/lsp/config/groovyls.lua new file mode 100644 index 0000000..baeda9c --- /dev/null +++ b/lua/lsp/config/groovyls.lua @@ -0,0 +1,23 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +return { + cmd = { + 'java', '-jar', + '/usr/share/java/groovy-language-server/groovy-language-server-all.jar' + }, + single_file_support = true +} \ No newline at end of file diff --git a/lua/lsp/config/jedi_language_server.lua b/lua/lsp/config/jedi_language_server.lua new file mode 100644 index 0000000..450c178 --- /dev/null +++ b/lua/lsp/config/jedi_language_server.lua @@ -0,0 +1,171 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +return { + cmd = { 'jedi-language-server' }, + single_file_support = true, + -- For more info see https://github.com/pappasam/jedi-language-server#configurationSources + -- and https://github.com/pappasam/coc-jedi#configuration (good descriptions) + init_options = { + completion = { + -- If your language client supports CompletionItem snippets but you don't like them, + -- disable them by setting this option to true. + -- type: boolean + -- default: false + disableSnippets = false, + -- Return all completion results in initial completion request. + -- Set to true if your language client does not support completionItem/resolve. + -- type: boolean + -- default: false + resolveEagerly = false, + -- A list of regular expressions. + -- If any regular expression in ignorePatterns matches a completion's name, + -- that completion item is not returned to the client. + -- type: string[] + -- default: [] + -- In general, you should prefer the default value for this option. + -- Jedi is very good at filtering values for end users. + -- That said, there are situations where IDE developers, + -- or some programmers in some code bases, may want to filter some completions by name. + -- This flexible interface is provided to accommodate these advanced use cases. + ignorePatterns = {} + }, + -- Built-in diagnostics seem to be very basic, + -- to the point where you are wondering if it's even active. + -- Will use iamcco/diagnostic-languageserver instead. + diagnostics = { + -- Enables (or disables) diagnostics provided by Jedi + -- type: boolean + -- default: true + enable = false, + -- When diagnostics are enabled, run on document open + -- type: boolean + -- default: true + didOpen = true, + -- When diagnostics are enabled, run on in-memory document change + -- (eg, while you're editing, without needing to save to disk) + -- type: boolean + -- default: true + didChange = true, + -- When diagnostics are enabled, run on document save (to disk) + -- type: boolean + -- default: true + didSave = true + }, + hover = { + -- Enable (or disable) all hover text. + -- If set to false, will cause the hover method not to be registered to the language server. + -- type: boolean + -- default: true + enable = true, + -- disable.[jedi-type].all + -- Disable all hover text of jedi-type specified. + -- type: boolean + -- default: false + -- disable.[jedi-type].names + -- Disable hover text identified by name in list of jedi-type specified. + -- type: string[] + -- default: [] + -- disable.[jedi-type].fullNames + -- Disable hover text identified by the fully qualified name in list of jedi-type specified. + -- If no fully qualified name can be found, jedi-language-server will default to + -- the name to prevent any unexpected behavior for users + -- (relevant for jedi types like keywords that don't have full names). + -- type: string[] + -- default: [] + disable = { + class = { all = false, names = {}, fullNames = {} }, + -- Need to escape lua keyword + ['function'] = { all = false, names = {}, fullNames = {} }, + instance = { all = false, names = {}, fullNames = {} }, + keyword = { all = false, names = {}, fullNames = {} }, + module = { all = false, names = {}, fullNames = {} }, + param = { all = false, names = {}, fullNames = {} }, + path = { all = false, names = {}, fullNames = {} }, + property = { all = false, names = {}, fullNames = {} }, + statement = { all = false, names = {}, fullNames = {} } + } + }, + jediSettings = { + -- Modules that jedi will directly import without analyzing. + -- Improves autocompletion but loses goto definition. + -- type: string[] + -- default: [] + -- If you're noticing that modules like numpy and pandas are taking a super long time to load + -- and you value completions / signatures over goto definition, + -- I recommend using this option like this: + -- autoImportModules = { "numpy", "pandas" }, + autoImportModules = {}, + -- Completions are by default case insensitive. + -- Set to false to make completions case sensitive. + -- type: boolean + -- default: true + caseInsensitiveCompletion = true, + -- Print jedi debugging messages to stderr. + -- type: boolean + -- default: false + debug = false + }, + -- The preferred MarkupKind for all jedi-language-server messages that take MarkupContent. + -- type: string + -- accepted values: "markdown", "plaintext" + -- If omitted, jedi-language-server defaults to the client-preferred configuration. + -- If there is no client-preferred configuration, jedi language server users "plaintext". + -- markupKindPreferred = "markdown", + workspace = { + -- Add additional paths for Jedi's analysis. + -- Useful with vendor directories, packages in a non-standard location, etc. + -- You probably won't need to use this, but you'll be happy it's here when you need it! + -- type: string[] + -- default: [] + -- Non-absolute paths are relative to your project root. + -- For example, let's say your Python project is structured like this: + -- ├── funky + -- │ └── haha.py + -- ├── poetry.lock + -- ├── pyproject.toml + -- └── test.py + -- Assume that funky/haha.py contains 1 line, x = 12, + -- and your build system does some wizardry that makes haha importable just like os or pathlib. + -- In this example, if you want to have this same non-standard behavior with jedi-language-server, + -- put the following: + -- extraPaths = { "funky" } + -- When editing test.py, you'll get completions, goto definition, + -- and all other lsp features for the line `from haha import ....` + -- Again, you probably don't need this. + extraPaths = {}, + symbols = { + -- Performance optimization that sets names of folders that are ignored for workspace/symbols. + -- type: string[] + -- default: { ".nox", ".tox", ".venv", "__pycache__", "venv" } + -- If you manually set this option, it overrides the default. + -- Setting it to an empty array will result in no ignored folders. + ignoreFolders = { + '.nox', '.tox', '.venv', '__pycache__', 'venv', + 'artifacts', 'config', '.vscode', '.pytest_cache', + 'build', 'scripts', 'incoax_tests.egg-info', + 'node_modules' + }, + -- Maximum number of symbols returned by a call to workspace/symbols. + -- type: number + -- default: 20 + -- A value less than or equal to zero removes the maximum + -- and allows jedi-language-server to return all workplace symbols found by jedi. + maxSymbols = 20 + } + } + } +} \ No newline at end of file diff --git a/lua/lsp/config/lemminx.lua b/lua/lsp/config/lemminx.lua new file mode 100644 index 0000000..55e8227 --- /dev/null +++ b/lua/lsp/config/lemminx.lua @@ -0,0 +1,40 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +return { + cmd = { 'lemminx' }, + single_file_support = true, + init_options = { + settings = { + xml = { + trace = { server = 'verbose' }, + catalogs = {}, + logs = { + client = false, + file = '/home/oscar/lsp4xml.log' + }, + format = { + splitAttributes = true, + joinCDATALines = false, + joinContentLines = true, + joinCommentLines = false, + spaceBeforeEmptyCloseLine = false, + enabled = true + } + } + } + } +} \ No newline at end of file diff --git a/lua/lsp/config/lua_ls.lua b/lua/lsp/config/lua_ls.lua new file mode 100644 index 0000000..2b99810 --- /dev/null +++ b/lua/lsp/config/lua_ls.lua @@ -0,0 +1,47 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +local runtime_path = vim.split(package.path, ';') +table.insert(runtime_path, 'lua/?.lua') +table.insert(runtime_path, 'lua/?/init.lua') + +-- spec: https://luals.github.io/wiki/settings/ + +return { + cmd = { 'lua-language-server' }, + single_file_support = true, + settings = { + Lua = { + runtime = { + -- Tell the language server which version of Lua you're using (most likely LuaJIT in the case of Neovim) + version = 'LuaJIT', + -- Setup your lua path + path = runtime_path + }, + diagnostics = { + -- Get the language server to recognize the `vim` global + globals = { 'vim' } + }, + workspace = { + -- Make the server aware of Neovim runtime files + library = vim.api.nvim_get_runtime_file('', true), + checkThirdParty = false + }, + -- Do not send telemetry data containing a randomized but unique identifier + telemetry = { enable = false } + } + } +} \ No newline at end of file diff --git a/lua/lsp/config/pylsp.lua b/lua/lsp/config/pylsp.lua new file mode 100644 index 0000000..5b78b42 --- /dev/null +++ b/lua/lsp/config/pylsp.lua @@ -0,0 +1,61 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +return { + cmd = { 'pylsp' }, + single_file_support = true, + -- Reference: https://github.com/python-lsp/python-lsp-server/blob/develop/CONFIGURATION.md + settings = { + pylsp = { + -- configurationSources = { "flake8", "jedi_completion", "jedi_definition", "jedi_hover", "jedi_references", "jedi_signature_help", "jedi_symbols" }, + plugins = { + flake8 = { + config = 'tox.ini', + enabled = true + -- executable = "flake8" + }, + pyls_isort = { enabled = true }, + jedi_completion = { + enabled = true, + include_params = false, + include_class_objects = true, + fuzzy = true, + eager = true, + resolve_at_most = 25, + cache_for = { + 'pandas', + 'numpy', + 'tensorflow', + 'matplotlib' + } + }, + jedi_definition = { + enabled = true, + follow_imports = true, + follow_builtin_imports = true + }, + jedi_hover = { enabled = true }, + jedi_references = { enabled = true }, + jedi_signature_help = { enabled = true }, + jedi_symbols = { + enabled = true, + all_scopes = true, + include_import_symbols = true + } + } + } + } +} diff --git a/lua/lsp/config/pyright.lua b/lua/lsp/config/pyright.lua new file mode 100644 index 0000000..2502234 --- /dev/null +++ b/lua/lsp/config/pyright.lua @@ -0,0 +1,39 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +return { + cmd = { 'pyright-langserver', '--stdio' }, + single_file_support = true, + -- see https://github.com/microsoft/pyright/blob/main/docs/configuration.md + -- and https://github.com/fannheyward/coc-pyright + settings = { + python = { + disableCompletion = false, + disableDiagnostics = false, + analysis = { + autoImportCompletions = true, + autoSearchPaths = true, + diagnosticMode = 'workspace', + stubPath = 'typings', + typeschedPaths = {}, + diagnosticSeverityOverrides = {}, + typeCheckingMode = 'off', + useLibraryCodeForTypes = true + }, + completion = { importSupport = true, snippetSupport = true } + } + } +} diff --git a/lua/lsp/config/rust_analyzer.lua b/lua/lsp/config/rust_analyzer.lua new file mode 100644 index 0000000..0c7f107 --- /dev/null +++ b/lua/lsp/config/rust_analyzer.lua @@ -0,0 +1,38 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +return { + cmd = { 'rust-analyzer' }, + settings = { + -- https://github.com/rust-lang/rust-analyzer/blob/master/docs/user/generated_config.adoc + ['rust-analyzer'] = { + cargo = { + -- Extra environment variables that will be set when running cargo, rustc + -- or other commands within the workspace. Useful for setting RUSTFLAGS. + extraEnv = { + OPENSSL_INCLUDE_DIR = '/usr/include/openssl-1.0/', + OPENSSL_LIB_DIR = '/usr/lib/openssl-1.0/' + } + } + --[[ inlayHints = { + closingBraceHints = { + -- Whether to show inlay hints after a closing `}` to indicate what item it belongs to. + enable = false + }, + } ]] + } + } +} diff --git a/lua/lsp/init.lua b/lua/lsp/init.lua new file mode 100644 index 0000000..021aebd --- /dev/null +++ b/lua/lsp/init.lua @@ -0,0 +1,287 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +local P = {} + +P._filetypes = nil +P._language_servers = nil + +P.capabilities = {} + +P.spec = require('lsp.spec') + +function P._setup_diagnostic() + vim.diagnostic.config({ + underline = true, + signs = true, + virtual_text = false, + -- virtual_text = { + -- format = function(diagnostic) + -- return string.format("%s: %s", diagnostic.user_data.lsp.code, diagnostic.message) + -- end + -- }, + float = { + show_header = false, + source = 'if_many', + border = 'rounded', + focusable = false, + format = function(diagnostic) + return string.format('%s', diagnostic.message) + end + + }, + update_in_insert = false, -- default to false + severity_sort = true -- default to false + }) + -- Change diagnostic icons + vim.fn.sign_define('DiagnosticSignError', { + text = 'E', + texthl = 'DiagnosticSignError', + -- culhl = 'DiagnosticSignError', + numhl = 'DiagnosticSignError' + -- linehl = 'LspDiagnosticsUnderlineError' + }) + vim.fn.sign_define('DiagnosticSignWarn', { + text = 'W', + texthl = 'DiagnosticSignWarn', + -- culhl = 'DiagnosticSignWarn', + numhl = 'DiagnosticSignWarn' + -- linehl = 'LspDiagnosticsUnderlineWarning' + }) + vim.fn.sign_define('DiagnosticSignHint', { + text = 'H', + texthl = 'DiagnosticSignHint', + -- culhl = 'DiagnosticSignHint', + numhl = 'DiagnosticSignHint' + -- linehl = 'LspDiagnosticsUnderlineHint' + }) + vim.fn.sign_define('DiagnosticSignInfo', { + text = 'i', + texthl = 'DiagnosticSignInfo', + -- culhl = 'DiagnosticSignInfo', + numhl = 'DiagnosticSignInfo' + -- linehl = 'LspDiagnosticsUnderlineInfo' + }) + + -- Change some highlights + -- vim.cmd('highlight DiagnosticUnderlineError guifg=' .. utils.get_hl('DiagnosticError').foreground) + -- vim.cmd('highlight DiagnosticUnderlineWarn guifg=' .. utils.get_hl('DiagnosticWarn').foreground) +end + +function P.on_attach(client, bufnr) + -- Enable completion triggered by + -- Disabled in favor of nvim-cmp + -- vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc') + require('lsp_signature').on_attach({ + debug = false, -- set to true to enable debug logging + log_path = vim.fn.stdpath('cache') .. '/lsp_signature.log', -- log dir when debug is on + -- default is ~/.cache/nvim/lsp_signature.log + verbose = false, -- show debug line number + + bind = true, -- This is mandatory, otherwise border config won't get registered. + -- If you want to hook lspsaga or other signature handler, pls set to false + doc_lines = 20, -- will show two lines of comment/doc(if there are more than two lines in doc, will be truncated); + -- set to 0 if you DO NOT want any API comments be shown + -- This setting only take effect in insert mode, it does not affect signature help in normal + -- mode, 10 by default + + max_height = 12, -- max height of signature floating_window + max_width = 80, -- max_width of signature floating_window + noice = false, -- set to true if you using noice to render markdown + wrap = true, -- allow doc/signature text wrap inside floating_window, useful if your lsp return doc/sig is too long + + floating_window = true, -- show hint in a floating window, set to false for virtual text only mode + + floating_window_above_cur_line = true, -- try to place the floating above the current line when possible Note: + -- will set to true when fully tested, set to false will use whichever side has more space + -- this setting will be helpful if you do not want the PUM and floating win overlap + + floating_window_off_x = 1, -- adjust float windows x position. + floating_window_off_y = 0, -- adjust float windows y position. e.g -2 move window up 2 lines; 2 move down 2 lines + + close_timeout = nil, -- close floating window after ms when laster parameter is entered + fix_pos = false, -- set to true, the floating window will not auto-close until finish all parameters + hint_enable = false, -- virtual hint enable + hint_prefix = '🐼 ', -- Panda for parameter, NOTE: for the terminal not support emoji, might crash + hint_scheme = 'String', + hi_parameter = 'IncSearch', -- default 'LspSignatureActiveParameter', -- how your parameter will be highlight + handler_opts = { + border = 'none' -- double, rounded, single, shadow, none + }, + + always_trigger = true, -- sometime show signature on new line or in middle of parameter can be confusing, set it to false for #58 + + auto_close_after = nil, -- autoclose signature float win after x sec, disabled if nil. + extra_trigger_chars = {}, -- Array of extra characters that will trigger signature completion, e.g., {"(", ","} + zindex = 200, -- by default it will be on top of all floating windows, set to <= 50 send it to bottom + + padding = '', -- character to pad on left and right of signature can be ' ', or '|' etc + + transparency = nil, -- disabled by default, allow floating win transparent value 1~100 + shadow_blend = 36, -- if you using shadow as border use this set the opacity + shadow_guibg = 'Black', -- if you using shadow as border use this set the color e.g. 'Green' or '#121315' + timer_interval = 200, -- default timer check interval set to lower value if you want to reduce latency + toggle_key = '', -- toggle signature on and off in insert mode, e.g. toggle_key = '' + + select_signature_key = nil, -- cycle to next signature, e.g. '' function overloading + move_cursor_key = '' -- imap, use nvim_set_current_win to move cursor between current win and floating + }, bufnr) + -- Mappings. + -- See `:help vim.lsp.*` for documentation on any of the below functions + local opts = { noremap = true, silent = true } + vim.api.nvim_buf_set_keymap(bufnr, 'n', 'L', + 'lua vim.diagnostic.open_float()', opts) + vim.api.nvim_buf_set_keymap(bufnr, 'n', '[d', + 'lua vim.diagnostic.goto_prev()', opts) + vim.api.nvim_buf_set_keymap(bufnr, 'n', ']d', + 'lua vim.diagnostic.goto_next()', opts) + vim.api.nvim_buf_set_keymap(bufnr, 'n', 'll', + 'lua vim.diagnostic.setloclist()', opts) + vim.api.nvim_buf_set_keymap(bufnr, 'n', 'gD', + 'lua vim.lsp.buf.declaration()', opts) + vim.api.nvim_buf_set_keymap(bufnr, 'n', 'gd', + 'lua vim.lsp.buf.definition()', opts) + vim.api.nvim_buf_set_keymap(bufnr, 'n', 'K', + 'lua vim.lsp.buf.hover()', opts) + vim.api.nvim_buf_set_keymap(bufnr, 'n', 'gi', + 'lua vim.lsp.buf.implementation()', + opts) + vim.api.nvim_buf_set_keymap(bufnr, 'n', 's', + 'lua vim.lsp.buf.signature_help()', + opts) + vim.api.nvim_buf_set_keymap(bufnr, 'n', 'wa', + 'lua vim.lsp.buf.add_workspace_folder()', + opts) + vim.api.nvim_buf_set_keymap(bufnr, 'n', 'wr', + 'lua vim.lsp.buf.remove_workspace_folder()', + opts) + vim.api.nvim_buf_set_keymap(bufnr, 'n', 'wl', + 'lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))', + opts) + vim.api.nvim_buf_set_keymap(bufnr, 'n', 'gt', + 'lua vim.lsp.buf.type_definition()', + opts) + vim.api.nvim_buf_set_keymap(bufnr, 'n', 'rn', + 'lua vim.lsp.buf.rename()', opts) + vim.api.nvim_buf_set_keymap(bufnr, 'n', 'ca', + 'lua vim.lsp.buf.code_action()', opts) + vim.api.nvim_buf_set_keymap(bufnr, 'n', 'gr', + 'lua vim.lsp.buf.references()', opts) + vim.api.nvim_buf_set_keymap(bufnr, 'n', 'lf', + 'lua vim.lsp.buf.format({async = true})', + opts) + -- if client.server_capabilities.document_range_formatting then + vim.api.nvim_buf_set_keymap(bufnr, 'v', 'lf', + 'lua vim.lsp.buf.format({async = true})', + opts) + -- end + + -- The below command will highlight the current variable and its usages in the buffer. + if client.server_capabilities.document_highlight then + vim.fn.execute('hi! link LspReferenceRead Visual') + vim.fn.execute('hi! link LspReferenceText Visual') + vim.fn.execute('hi! link LspReferenceWrite Visual') + vim.api.nvim_create_augroup('lsp_document_highlight', { clear = true }) + vim.api.nvim_create_autocmd('CursorHold', { + buffer = bufnr, + callback = vim.lsp.buf.document_highlight + }) + vim.api.nvim_create_autocmd('CursorMoved', { + buffer = bufnr, + callback = vim.lsp.buf.clear_references + }) + end + -- Auto show current line diagnostics after 300 ms + -- vim.cmd('autocmd CursorHold lua vim.diagnostic.open_float({ scope = "line" })') + -- vim.api.nvim_create_autocmd("CursorHold", { + -- buffer = bufnr, + -- callback = function() + -- vim.diagnostic.open_float({ scope = "line" }) + -- end + -- }) + vim.opt.updatetime = 100 +end + +function P.reload_server_buf(self, name) + local server_spec = self.spec[name] + local ft_map = {} + for _, ft in ipairs(server_spec.filetypes) do + ft_map[ft] = true + end + for _, bufnr in ipairs(vim.api.nvim_list_bufs()) do + if vim.api.nvim_buf_is_loaded(bufnr) then + local buf_ft = vim.api.nvim_get_option_value('filetype', { buf = bufnr }) + if ft_map[buf_ft] then + vim.api.nvim_buf_call( + bufnr, + function() vim.cmd('e') end + ) + end + end + end +end + +function P.filetypes(self) + if not self._filetypes then + self._filetypes = {} + local unique = {} + for _, server_spec in pairs(self.spec) do + for _, ft in ipairs(server_spec.filetypes) do + if not unique[ft] then + table.insert(self._filetypes, ft) + unique[ft] = true + end + end + end + end + + return self._filetypes +end + +function P.language_servers(self) + if not self._language_servers then + self._language_servers = {} + for server, _ in pairs(self.spec) do + table.insert(self._language_servers, server) + end + end + + return self._language_servers +end + +function P.setup_server(self, server) + local lspconfig = require('lspconfig') + local server_spec = self.spec[server] + local cfg = require('lsp.config.' .. server) + cfg.filetypes = server_spec.filetypes + cfg.root_dir = lspconfig.util.find_git_ancestor + cfg.capabilities = self.capabilities + cfg.on_attach = self.on_attach + lspconfig[server].setup(cfg) +end + +function P.setup(self) + self._setup_diagnostic() + P.capabilities = require('cmp_nvim_lsp').default_capabilities() + require("mason-lspconfig").setup_handlers({ + function(name) + self:setup_server(name) + self:reload_server_buf(name) + end + }) +end + +return P diff --git a/lua/lsp/spec.lua b/lua/lsp/spec.lua new file mode 100644 index 0000000..c962740 --- /dev/null +++ b/lua/lsp/spec.lua @@ -0,0 +1,88 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +return { + clangd = { + filetypes = { + 'c', + 'cpp', + 'objc', + 'objcpp', + 'cuda', + 'proto', + } + }, + cmake = { + filetypes = { + 'cmake' + } + }, + diagnosticls = { + filetypes = { + 'python', + 'lua', + 'sh', + } + }, + lua_ls = { + filetypes = { + 'lua' + } + }, + lemminx = { + filetypes = { + 'xml', + 'xsd', + 'xsl', + 'xslt', + 'svg', + } + }, + bashls = { + filetypes = { + 'sh' + } + }, + groovyls = { + filetypes = { + 'groovy' + } + }, + rust_analyzer = { + filetypes = { + 'rust' + } + }, + gopls = { + filetypes = { + "go", + "gomod" + } + }, + golangci_lint_ls = { + filetypes = { + "go", + "gomod" + } + }, + jedi_language_server = { + filetypes = { + 'python' + } + }, + -- pyright = { 'python' }, + -- pylsp = { 'python' }, +} diff --git a/lua/plugins.lua b/lua/plugins.lua new file mode 100644 index 0000000..f1821cf --- /dev/null +++ b/lua/plugins.lua @@ -0,0 +1,213 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +vim.loader.enable() + +local plugins = { + { + 'Mofiqul/vscode.nvim', + priority = 1000, + lazy = false, + config = function() require('config.vscode') end + }, + { + 'rafamadriz/friendly-snippets', + }, + { + 'L3MON4D3/LuaSnip', + config = function() require('config.luasnip') end, + -- dependencies = { 'rafamadriz/friendly-snippets' }, + -- comment out on windows and install jsregexp manually + build = "make install_jsregexp", + version = "2.*", + }, + { + 'windwp/nvim-autopairs', + config = function() require('config.nvim-autopairs') end + }, + { + 'saadparwaiz1/cmp_luasnip', + }, + { + 'hrsh7th/cmp-buffer', + }, + { + 'hrsh7th/cmp-path', + }, + { + 'hrsh7th/cmp-cmdline', + }, + { + 'onsails/lspkind-nvim', + }, + { + 'hrsh7th/nvim-cmp', + -- dependencies = { + -- 'L3MON4D3/LuaSnip', + -- 'windwp/nvim-autopairs', + -- 'saadparwaiz1/cmp_luasnip', + -- 'hrsh7th/cmp-buffer', + -- 'hrsh7th/cmp-path', + -- 'hrsh7th/cmp-cmdline', + -- 'onsails/lspkind-nvim', + -- }, + config = function() require('config.nvim-cmp') end + }, + { + 'hrsh7th/cmp-nvim-lsp', + -- dependencies = { + -- 'hrsh7th/nvim-cmp' + -- }, + }, + { + "williamboman/mason.nvim", + config = function() require('config.mason') end + }, + { + 'williamboman/mason-lspconfig.nvim', + config = function() require('config.mason-lspconfig') end, + -- dependencies = { 'williamboman/mason.nvim' }, + }, + { + 'ray-x/lsp_signature.nvim', + event = "VeryLazy", + config = function() require('config.lsp_signature') end + }, + { + 'neovim/nvim-lspconfig', + config = function() require('lsp'):setup() end, + lazy = true, + ft = require('lsp'):filetypes(), + -- dependencies = { + -- 'williamboman/mason-lspconfig.nvim', + -- 'ray-x/lsp_signature.nvim', + -- 'hrsh7th/cmp-nvim-lsp' + -- }, + }, + { + 'nvim-treesitter/nvim-treesitter', + config = function() require('config.nvim-treesitter') end, + lazy = true, + event = 'VimEnter', + build = ':TSUpdate' + }, + { + 'mfussenegger/nvim-dap', + config = function() require('config.nvim-dap') end, + lazy = true, + ft = require('lsp'):filetypes(), + }, + { + 'rcarriga/nvim-dap-ui', + -- dependencies = { 'mfussenegger/nvim-dap' }, + config = function() require('config.nvim-dap-ui') end + }, + { + 'kyazdani42/nvim-web-devicons' + }, + { + 'tpope/vim-fugitive', + config = function() require('config.fugitive') end, + lazy = true, + event = 'VimEnter' + }, + { + 'rbong/vim-flog', + -- dependencies = { 'tpope/vim-fugitive' }, + config = function() require('config.flog') end + }, + { + 'nvim-lualine/lualine.nvim', + -- dependencies = { 'kyazdani42/nvim-web-devicons', 'vim-fugitive' }, + config = function() require('config.lualine') end, + lazy = true, + event = 'VimEnter' + }, + { + 'akinsho/bufferline.nvim', + -- dependencies = { 'kyazdani42/nvim-web-devicons' }, + config = function() require('config.bufferline') end, + lazy = true, + event = 'VimEnter' + }, + { + 'nvim-lua/plenary.nvim' + }, + { + 'lewis6991/gitsigns.nvim', + -- dependencies = { 'nvim-lua/plenary.nvim' }, + config = function() require('config.gitsigns') end, + lazy = true, + event = 'VimEnter' + }, + { + 'nvim-telescope/telescope.nvim', + -- dependencies = { 'nvim-lua/plenary.nvim' }, + config = function() require('config.telescope') end, + lazy = true, + event = 'VimEnter' + }, + { + 'numToStr/Comment.nvim', + config = function() require('config.comment') end, + lazy = true, + event = 'VimEnter' + }, + { + 'Yggdroot/indentLine', + config = function() require('config.indentLine') end, + lazy = true, + event = 'VimEnter' + }, + { + 'simeji/winresizer', + config = function() require('config.winresizer') end, + lazy = true, + keys = { 'r' } + }, + { + 'sindrets/winshift.nvim', + config = function() require('config.winshift') end, + lazy = true, + keys = { 'm' } + }, + { + 'martinda/Jenkinsfile-vim-syntax', + lazy = true, + ft = { 'jenkinsfile', 'Jenkinsfile' } + }, + { + 'kyazdani42/nvim-tree.lua', + config = function() require('config.nvim-tree') end + }, + { + 'dstein64/vim-startuptime', + lazy = true, + event = 'VimEnter' + }, + { + 'stevearc/aerial.nvim', + config = function() require('config.aerial') end + } +} + +local opts = { + -- defaults = { + -- lazy = true + -- } +} + +require('lazy').setup(plugins, opts) diff --git a/lua/pytest.lua b/lua/pytest.lua new file mode 100644 index 0000000..2250f8b --- /dev/null +++ b/lua/pytest.lua @@ -0,0 +1,74 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +local utils = require('utils') + +M = {} + +local env_ok = false +local dap = nil + +local function check_env() + local debugpy = utils.exec('python -m debugpy --version') + assert(debugpy.rc == 0, 'Python module debugpy is required') + local pytest = utils.exec('python -m pytest --version') + assert(pytest.rc == 0, 'Python module pytest is required') + env_ok = true +end + +local function load_dap() + local ok, dap = pcall(require, 'dap') + assert(ok, 'nvim-dap is required') + return dap +end + +function M.run(args) + assert(type(args) == 'table', 'Args not specified or of wrong type') + if not env_ok then + check_env() + end + if not dap then + dap = load_dap() + dap.adapters.python = { + type = 'executable'; + command = 'python'; + args = { '-m', 'debugpy.adapter' }; + cwd = vim.fn.getcwd(); + } + end + local config = { + name = 'pytest ' .. table.concat(args, ' '), + type = 'python', + request = 'launch', + + -- pythonPath = vim.fn.getcwd() .. '/.venv/bin/python', + module = 'pytest', + -- python = 'python'; + -- program = vim.fn.getcwd() .. '/.venv/bin/pytest'; + args = args, + console = "integratedTerminal", + -- program = "${file}"; + } + -- session = dap.launch(adapter, config) + dap.run(config) + -- List of events described at https://microsoft.github.io/debug-adapter-protocol/specification#Events + -- Also see :h dap-extensions + dap.listeners.after['event_initialized']['pytest.lua'] = function(session, body) + dap.set_exception_breakpoints({ 'userUnhandled' }) + end +end + +return M diff --git a/lua/utils.lua b/lua/utils.lua new file mode 100644 index 0000000..7b27954 --- /dev/null +++ b/lua/utils.lua @@ -0,0 +1,86 @@ +--[[ + Copyright 2023 Oscar Wallberg + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +]] + +M = {} + +M.os_name = vim.loop.os_uname().sysname + +function M.has_value(tab, val) + for _, value in ipairs(tab) do if value == val then return true end end + + return false +end + +---@param cmd table: Array of executable + args +function M.exec(cmd) + local out = vim.fn.system(cmd) + local rc = vim.v.shell_error + + return { out = out, rc = rc } +end + +function M.get_color(group, attr) + return vim.fn.synIDattr(vim.fn.synIDtrans(vim.fn.hlID(group)), attr) +end + +function M.get_hl(name) + local ok, hl = pcall(vim.api.nvim_get_hl_by_name, name, true) + if not ok then return end + for _, key in pairs({ 'foreground', 'background', 'special' }) do + if hl[key] then hl[key] = string.format('#%06x', hl[key]) end + end + return hl +end + +--- Check that an executable is available +--- @param exe string: Array to look for +--- @return boolean +function M.is_available(exe) + return vim.fn.executable(exe) == 1 +end + +--- Check that at least one executable is available +--- @param exes table: Array of exes +--- @return boolean +function M.any_available(exes) + for _, e in ipairs(exes) do + if M.is_available(e) then + return true + end + end + + return false +end + +--- Asserts that an executable is available +--- Raises error if missing. +--- @param exe string: Array to look for +function M.assert_available(exe) + if not M.is_available(exe) then + error("Missing executable '" .. exe .. "'.") + end +end + +--- Asserts that at least one executable is available +--- Raises error if missing. +--- @param exes table: Array of exes +function M.assert_any_available(exes) + if not M.any_available(exes) then + error('At least one of the following is required:\n' .. table.concat(exes, ', ')) + end +end + +return M diff --git a/plugin/packer_compiled.lua b/plugin/packer_compiled.lua new file mode 100644 index 0000000..5c13a7d --- /dev/null +++ b/plugin/packer_compiled.lua @@ -0,0 +1,457 @@ +-- Automatically generated packer.nvim plugin loader code + +if vim.api.nvim_call_function('has', {'nvim-0.5'}) ~= 1 then + vim.api.nvim_command('echohl WarningMsg | echom "Invalid Neovim version for packer.nvim! | echohl None"') + return +end + +vim.api.nvim_command('packadd packer.nvim') + +local no_errors, error_msg = pcall(function() + +_G._packer = _G._packer or {} +_G._packer.inside_compile = true + +local time +local profile_info +local should_profile = false +if should_profile then + local hrtime = vim.loop.hrtime + profile_info = {} + time = function(chunk, start) + if start then + profile_info[chunk] = hrtime() + else + profile_info[chunk] = (hrtime() - profile_info[chunk]) / 1e6 + end + end +else + time = function(chunk, start) end +end + +local function save_profiles(threshold) + local sorted_times = {} + for chunk_name, time_taken in pairs(profile_info) do + sorted_times[#sorted_times + 1] = {chunk_name, time_taken} + end + table.sort(sorted_times, function(a, b) return a[2] > b[2] end) + local results = {} + for i, elem in ipairs(sorted_times) do + if not threshold or threshold and elem[2] > threshold then + results[i] = elem[1] .. ' took ' .. elem[2] .. 'ms' + end + end + if threshold then + table.insert(results, '(Only showing plugins that took longer than ' .. threshold .. ' ms ' .. 'to load)') + end + + _G._packer.profile_output = results +end + +time([[Luarocks path setup]], true) +local package_path_str = "/home/oscar/.cache/nvim/packer_hererocks/2.1.0-beta3/share/lua/5.1/?.lua;/home/oscar/.cache/nvim/packer_hererocks/2.1.0-beta3/share/lua/5.1/?/init.lua;/home/oscar/.cache/nvim/packer_hererocks/2.1.0-beta3/lib/luarocks/rocks-5.1/?.lua;/home/oscar/.cache/nvim/packer_hererocks/2.1.0-beta3/lib/luarocks/rocks-5.1/?/init.lua" +local install_cpath_pattern = "/home/oscar/.cache/nvim/packer_hererocks/2.1.0-beta3/lib/lua/5.1/?.so" +if not string.find(package.path, package_path_str, 1, true) then + package.path = package.path .. ';' .. package_path_str +end + +if not string.find(package.cpath, install_cpath_pattern, 1, true) then + package.cpath = package.cpath .. ';' .. install_cpath_pattern +end + +time([[Luarocks path setup]], false) +time([[try_loadstring definition]], true) +local function try_loadstring(s, component, name) + local success, result = pcall(loadstring(s), name, _G.packer_plugins[name]) + if not success then + vim.schedule(function() + vim.api.nvim_notify('packer.nvim: Error running ' .. component .. ' for ' .. name .. ': ' .. result, vim.log.levels.ERROR, {}) + end) + end + return result +end + +time([[try_loadstring definition]], false) +time([[Defining packer_plugins]], true) +_G.packer_plugins = { + ["Comment.nvim"] = { + config = { "\27LJ\2\n.\0\0\3\0\2\0\0046\0\0\0'\2\1\0B\0\2\1K\0\1\0\19config.comment\frequire\0" }, + loaded = false, + needs_bufread = false, + only_cond = false, + path = "/home/oscar/.local/share/nvim/site/pack/packer/opt/Comment.nvim", + url = "https://github.com/numToStr/Comment.nvim" + }, + ["Jenkinsfile-vim-syntax"] = { + loaded = false, + needs_bufread = true, + only_cond = false, + path = "/home/oscar/.local/share/nvim/site/pack/packer/opt/Jenkinsfile-vim-syntax", + url = "https://github.com/martinda/Jenkinsfile-vim-syntax" + }, + LuaSnip = { + after = { "nvim-cmp", "friendly-snippets" }, + config = { "\27LJ\2\n.\0\0\3\0\2\0\0046\0\0\0'\2\1\0B\0\2\1K\0\1\0\19config.luasnip\frequire\0" }, + loaded = true, + only_config = true, + path = "/home/oscar/.local/share/nvim/site/pack/packer/start/LuaSnip", + url = "https://github.com/L3MON4D3/LuaSnip" + }, + ["aerial.nvim"] = { + config = { "\27LJ\2\n-\0\0\3\0\2\0\0046\0\0\0'\2\1\0B\0\2\1K\0\1\0\18config.aerial\frequire\0" }, + loaded = true, + path = "/home/oscar/.local/share/nvim/site/pack/packer/start/aerial.nvim", + url = "https://github.com/stevearc/aerial.nvim" + }, + ["bufferline.nvim"] = { + config = { "\27LJ\2\n1\0\0\3\0\2\0\0046\0\0\0'\2\1\0B\0\2\1K\0\1\0\22config.bufferline\frequire\0" }, + load_after = {}, + loaded = false, + needs_bufread = false, + only_cond = false, + path = "/home/oscar/.local/share/nvim/site/pack/packer/opt/bufferline.nvim", + url = "https://github.com/akinsho/bufferline.nvim" + }, + ["cmp-buffer"] = { + after_files = { "/home/oscar/.local/share/nvim/site/pack/packer/opt/cmp-buffer/after/plugin/cmp_buffer.lua" }, + load_after = {}, + loaded = true, + needs_bufread = false, + path = "/home/oscar/.local/share/nvim/site/pack/packer/opt/cmp-buffer", + url = "https://github.com/hrsh7th/cmp-buffer" + }, + ["cmp-cmdline"] = { + after_files = { "/home/oscar/.local/share/nvim/site/pack/packer/opt/cmp-cmdline/after/plugin/cmp_cmdline.lua" }, + config = { "\27LJ\2\n2\0\0\3\0\2\0\0046\0\0\0'\2\1\0B\0\2\1K\0\1\0\23config.cmp-cmdline\frequire\0" }, + load_after = {}, + loaded = true, + needs_bufread = false, + path = "/home/oscar/.local/share/nvim/site/pack/packer/opt/cmp-cmdline", + url = "https://github.com/hrsh7th/cmp-cmdline" + }, + ["cmp-nvim-lsp"] = { + after = { "lsp_signature.nvim" }, + after_files = { "/home/oscar/.local/share/nvim/site/pack/packer/opt/cmp-nvim-lsp/after/plugin/cmp_nvim_lsp.lua" }, + load_after = {}, + loaded = true, + needs_bufread = false, + path = "/home/oscar/.local/share/nvim/site/pack/packer/opt/cmp-nvim-lsp", + url = "https://github.com/hrsh7th/cmp-nvim-lsp" + }, + ["cmp-path"] = { + after_files = { "/home/oscar/.local/share/nvim/site/pack/packer/opt/cmp-path/after/plugin/cmp_path.lua" }, + load_after = {}, + loaded = true, + needs_bufread = false, + path = "/home/oscar/.local/share/nvim/site/pack/packer/opt/cmp-path", + url = "https://github.com/hrsh7th/cmp-path" + }, + cmp_luasnip = { + after_files = { "/home/oscar/.local/share/nvim/site/pack/packer/opt/cmp_luasnip/after/plugin/cmp_luasnip.lua" }, + load_after = {}, + loaded = true, + needs_bufread = false, + path = "/home/oscar/.local/share/nvim/site/pack/packer/opt/cmp_luasnip", + url = "https://github.com/saadparwaiz1/cmp_luasnip" + }, + ["friendly-snippets"] = { + config = { "\27LJ\2\n8\0\0\3\0\2\0\0046\0\0\0'\2\1\0B\0\2\1K\0\1\0\29config.friendly-snippets\frequire\0" }, + load_after = {}, + loaded = true, + needs_bufread = false, + path = "/home/oscar/.local/share/nvim/site/pack/packer/opt/friendly-snippets", + url = "https://github.com/rafamadriz/friendly-snippets" + }, + ["gitsigns.nvim"] = { + config = { "\27LJ\2\n/\0\0\3\0\2\0\0046\0\0\0'\2\1\0B\0\2\1K\0\1\0\20config.gitsigns\frequire\0" }, + loaded = false, + needs_bufread = false, + only_cond = false, + path = "/home/oscar/.local/share/nvim/site/pack/packer/opt/gitsigns.nvim", + url = "https://github.com/lewis6991/gitsigns.nvim" + }, + ["impatient.nvim"] = { + config = { "\27LJ\2\n)\0\0\3\0\2\0\0046\0\0\0'\2\1\0B\0\2\1K\0\1\0\14impatient\frequire\0" }, + loaded = true, + path = "/home/oscar/.local/share/nvim/site/pack/packer/start/impatient.nvim", + url = "https://github.com/lewis6991/impatient.nvim" + }, + indentLine = { + after_files = { "/home/oscar/.local/share/nvim/site/pack/packer/opt/indentLine/after/plugin/indentLine.vim" }, + config = { "\27LJ\2\n1\0\0\3\0\2\0\0046\0\0\0'\2\1\0B\0\2\1K\0\1\0\22config.indentLine\frequire\0" }, + loaded = false, + needs_bufread = false, + only_cond = false, + path = "/home/oscar/.local/share/nvim/site/pack/packer/opt/indentLine", + url = "https://github.com/Yggdroot/indentLine" + }, + ["lsp_signature.nvim"] = { + after = { "nvim-lspconfig" }, + load_after = {}, + loaded = true, + needs_bufread = false, + path = "/home/oscar/.local/share/nvim/site/pack/packer/opt/lsp_signature.nvim", + url = "https://github.com/ray-x/lsp_signature.nvim" + }, + ["lspkind-nvim"] = { + load_after = { + ["nvim-lspconfig"] = true + }, + loaded = false, + needs_bufread = false, + path = "/home/oscar/.local/share/nvim/site/pack/packer/opt/lspkind-nvim", + url = "https://github.com/onsails/lspkind-nvim" + }, + ["lualine.nvim"] = { + config = { "\27LJ\2\n.\0\0\3\0\2\0\0046\0\0\0'\2\1\0B\0\2\1K\0\1\0\19config.lualine\frequire\0" }, + load_after = { + ["vim-fugitive"] = true + }, + loaded = false, + needs_bufread = false, + only_cond = false, + path = "/home/oscar/.local/share/nvim/site/pack/packer/opt/lualine.nvim", + url = "https://github.com/nvim-lualine/lualine.nvim" + }, + ["markdown-preview.nvim"] = { + loaded = false, + needs_bufread = false, + only_cond = false, + path = "/home/oscar/.local/share/nvim/site/pack/packer/opt/markdown-preview.nvim", + url = "https://github.com/iamcco/markdown-preview.nvim" + }, + ["nvim-autopairs"] = { + config = { "\27LJ\2\n5\0\0\3\0\2\0\0046\0\0\0'\2\1\0B\0\2\1K\0\1\0\26config.nvim-autopairs\frequire\0" }, + load_after = {}, + loaded = true, + needs_bufread = false, + path = "/home/oscar/.local/share/nvim/site/pack/packer/opt/nvim-autopairs", + url = "https://github.com/windwp/nvim-autopairs" + }, + ["nvim-cmp"] = { + after = { "cmp-buffer", "cmp-nvim-lsp", "cmp-path", "cmp-cmdline", "cmp_luasnip", "nvim-autopairs" }, + config = { "\27LJ\2\n/\0\0\3\0\2\0\0046\0\0\0'\2\1\0B\0\2\1K\0\1\0\20config.nvim-cmp\frequire\0" }, + load_after = {}, + loaded = true, + needs_bufread = false, + path = "/home/oscar/.local/share/nvim/site/pack/packer/opt/nvim-cmp", + url = "https://github.com/hrsh7th/nvim-cmp" + }, + ["nvim-dap"] = { + after = { "nvim-dap-ui" }, + config = { "\27LJ\2\n/\0\0\3\0\2\0\0046\0\0\0'\2\1\0B\0\2\1K\0\1\0\20config.nvim-dap\frequire\0" }, + loaded = true, + only_config = true, + path = "/home/oscar/.local/share/nvim/site/pack/packer/start/nvim-dap", + url = "https://github.com/mfussenegger/nvim-dap" + }, + ["nvim-dap-ui"] = { + config = { "\27LJ\2\n2\0\0\3\0\2\0\0046\0\0\0'\2\1\0B\0\2\1K\0\1\0\23config.nvim-dap-ui\frequire\0" }, + load_after = {}, + loaded = true, + needs_bufread = false, + path = "/home/oscar/.local/share/nvim/site/pack/packer/opt/nvim-dap-ui", + url = "https://github.com/rcarriga/nvim-dap-ui" + }, + ["nvim-lspconfig"] = { + after = { "lspkind-nvim" }, + config = { "\27LJ\2\n*\0\0\3\0\2\0\0046\0\0\0'\2\1\0B\0\2\1K\0\1\0\15config.lsp\frequire\0" }, + load_after = {}, + loaded = false, + needs_bufread = false, + only_cond = false, + path = "/home/oscar/.local/share/nvim/site/pack/packer/opt/nvim-lspconfig", + url = "https://github.com/neovim/nvim-lspconfig" + }, + ["nvim-tree.lua"] = { + config = { "\27LJ\2\n0\0\0\3\0\2\0\0046\0\0\0'\2\1\0B\0\2\1K\0\1\0\21config.nvim-tree\frequire\0" }, + loaded = true, + path = "/home/oscar/.local/share/nvim/site/pack/packer/start/nvim-tree.lua", + url = "https://github.com/kyazdani42/nvim-tree.lua" + }, + ["nvim-treesitter"] = { + config = { "\27LJ\2\n6\0\0\3\0\2\0\0046\0\0\0'\2\1\0B\0\2\1K\0\1\0\27config.nvim-treesitter\frequire\0" }, + loaded = false, + needs_bufread = false, + only_cond = false, + path = "/home/oscar/.local/share/nvim/site/pack/packer/opt/nvim-treesitter", + url = "https://github.com/nvim-treesitter/nvim-treesitter" + }, + ["nvim-web-devicons"] = { + loaded = true, + path = "/home/oscar/.local/share/nvim/site/pack/packer/start/nvim-web-devicons", + url = "https://github.com/kyazdani42/nvim-web-devicons" + }, + ["packer.nvim"] = { + loaded = true, + path = "/home/oscar/.local/share/nvim/site/pack/packer/start/packer.nvim", + url = "https://github.com/wbthomason/packer.nvim" + }, + ["plenary.nvim"] = { + loaded = true, + path = "/home/oscar/.local/share/nvim/site/pack/packer/start/plenary.nvim", + url = "https://github.com/nvim-lua/plenary.nvim" + }, + ["telescope.nvim"] = { + config = { "\27LJ\2\n0\0\0\3\0\2\0\0046\0\0\0'\2\1\0B\0\2\1K\0\1\0\21config.telescope\frequire\0" }, + loaded = false, + needs_bufread = true, + only_cond = false, + path = "/home/oscar/.local/share/nvim/site/pack/packer/opt/telescope.nvim", + url = "https://github.com/nvim-telescope/telescope.nvim" + }, + theme = { + after = { "lualine.nvim", "bufferline.nvim" }, + config = { "\27LJ\2\n-\0\0\3\0\2\0\0046\0\0\0'\2\1\0B\0\2\1K\0\1\0\18config.vscode\frequire\0" }, + loaded = true, + only_config = true, + path = "/home/oscar/.local/share/nvim/site/pack/packer/start/theme", + url = "https://github.com/Mofiqul/vscode.nvim" + }, + ["vim-flog"] = { + config = { "\27LJ\2\n+\0\0\3\0\2\0\0046\0\0\0'\2\1\0B\0\2\1K\0\1\0\16config.flog\frequire\0" }, + loaded = true, + path = "/home/oscar/.local/share/nvim/site/pack/packer/start/vim-flog", + url = "https://github.com/rbong/vim-flog" + }, + ["vim-fugitive"] = { + after = { "lualine.nvim" }, + config = { "\27LJ\2\n/\0\0\3\0\2\0\0046\0\0\0'\2\1\0B\0\2\1K\0\1\0\20config.fugitive\frequire\0" }, + loaded = false, + needs_bufread = true, + only_cond = false, + path = "/home/oscar/.local/share/nvim/site/pack/packer/opt/vim-fugitive", + url = "https://github.com/tpope/vim-fugitive" + }, + ["vim-startuptime"] = { + loaded = false, + needs_bufread = false, + only_cond = false, + path = "/home/oscar/.local/share/nvim/site/pack/packer/opt/vim-startuptime", + url = "https://github.com/dstein64/vim-startuptime" + }, + winresizer = { + config = { "\27LJ\2\n1\0\0\3\0\2\0\0046\0\0\0'\2\1\0B\0\2\1K\0\1\0\22config.winresizer\frequire\0" }, + loaded = true, + path = "/home/oscar/.local/share/nvim/site/pack/packer/start/winresizer", + url = "https://github.com/simeji/winresizer" + }, + ["winshift.nvim"] = { + config = { "\27LJ\2\n/\0\0\3\0\2\0\0046\0\0\0'\2\1\0B\0\2\1K\0\1\0\20config.winshift\frequire\0" }, + loaded = true, + path = "/home/oscar/.local/share/nvim/site/pack/packer/start/winshift.nvim", + url = "https://github.com/sindrets/winshift.nvim" + } +} + +time([[Defining packer_plugins]], false) +-- Config for: vim-flog +time([[Config for vim-flog]], true) +try_loadstring("\27LJ\2\n+\0\0\3\0\2\0\0046\0\0\0'\2\1\0B\0\2\1K\0\1\0\16config.flog\frequire\0", "config", "vim-flog") +time([[Config for vim-flog]], false) +-- Config for: theme +time([[Config for theme]], true) +try_loadstring("\27LJ\2\n-\0\0\3\0\2\0\0046\0\0\0'\2\1\0B\0\2\1K\0\1\0\18config.vscode\frequire\0", "config", "theme") +time([[Config for theme]], false) +-- Config for: impatient.nvim +time([[Config for impatient.nvim]], true) +try_loadstring("\27LJ\2\n)\0\0\3\0\2\0\0046\0\0\0'\2\1\0B\0\2\1K\0\1\0\14impatient\frequire\0", "config", "impatient.nvim") +time([[Config for impatient.nvim]], false) +-- Config for: nvim-tree.lua +time([[Config for nvim-tree.lua]], true) +try_loadstring("\27LJ\2\n0\0\0\3\0\2\0\0046\0\0\0'\2\1\0B\0\2\1K\0\1\0\21config.nvim-tree\frequire\0", "config", "nvim-tree.lua") +time([[Config for nvim-tree.lua]], false) +-- Config for: nvim-dap +time([[Config for nvim-dap]], true) +try_loadstring("\27LJ\2\n/\0\0\3\0\2\0\0046\0\0\0'\2\1\0B\0\2\1K\0\1\0\20config.nvim-dap\frequire\0", "config", "nvim-dap") +time([[Config for nvim-dap]], false) +-- Config for: winresizer +time([[Config for winresizer]], true) +try_loadstring("\27LJ\2\n1\0\0\3\0\2\0\0046\0\0\0'\2\1\0B\0\2\1K\0\1\0\22config.winresizer\frequire\0", "config", "winresizer") +time([[Config for winresizer]], false) +-- Config for: LuaSnip +time([[Config for LuaSnip]], true) +try_loadstring("\27LJ\2\n.\0\0\3\0\2\0\0046\0\0\0'\2\1\0B\0\2\1K\0\1\0\19config.luasnip\frequire\0", "config", "LuaSnip") +time([[Config for LuaSnip]], false) +-- Config for: winshift.nvim +time([[Config for winshift.nvim]], true) +try_loadstring("\27LJ\2\n/\0\0\3\0\2\0\0046\0\0\0'\2\1\0B\0\2\1K\0\1\0\20config.winshift\frequire\0", "config", "winshift.nvim") +time([[Config for winshift.nvim]], false) +-- Config for: aerial.nvim +time([[Config for aerial.nvim]], true) +try_loadstring("\27LJ\2\n-\0\0\3\0\2\0\0046\0\0\0'\2\1\0B\0\2\1K\0\1\0\18config.aerial\frequire\0", "config", "aerial.nvim") +time([[Config for aerial.nvim]], false) +-- Load plugins in order defined by `after` +time([[Sequenced loading]], true) +vim.cmd [[ packadd nvim-cmp ]] + +-- Config for: nvim-cmp +try_loadstring("\27LJ\2\n/\0\0\3\0\2\0\0046\0\0\0'\2\1\0B\0\2\1K\0\1\0\20config.nvim-cmp\frequire\0", "config", "nvim-cmp") + +vim.cmd [[ packadd nvim-autopairs ]] + +-- Config for: nvim-autopairs +try_loadstring("\27LJ\2\n5\0\0\3\0\2\0\0046\0\0\0'\2\1\0B\0\2\1K\0\1\0\26config.nvim-autopairs\frequire\0", "config", "nvim-autopairs") + +vim.cmd [[ packadd cmp-path ]] +vim.cmd [[ packadd cmp-cmdline ]] + +-- Config for: cmp-cmdline +try_loadstring("\27LJ\2\n2\0\0\3\0\2\0\0046\0\0\0'\2\1\0B\0\2\1K\0\1\0\23config.cmp-cmdline\frequire\0", "config", "cmp-cmdline") + +vim.cmd [[ packadd cmp_luasnip ]] +vim.cmd [[ packadd cmp-nvim-lsp ]] +vim.cmd [[ packadd lsp_signature.nvim ]] +vim.cmd [[ packadd cmp-buffer ]] +vim.cmd [[ packadd friendly-snippets ]] + +-- Config for: friendly-snippets +try_loadstring("\27LJ\2\n8\0\0\3\0\2\0\0046\0\0\0'\2\1\0B\0\2\1K\0\1\0\29config.friendly-snippets\frequire\0", "config", "friendly-snippets") + +vim.cmd [[ packadd nvim-dap-ui ]] + +-- Config for: nvim-dap-ui +try_loadstring("\27LJ\2\n2\0\0\3\0\2\0\0046\0\0\0'\2\1\0B\0\2\1K\0\1\0\23config.nvim-dap-ui\frequire\0", "config", "nvim-dap-ui") + +time([[Sequenced loading]], false) +vim.cmd [[augroup packer_load_aucmds]] +vim.cmd [[au!]] + -- Filetype lazy-loads +time([[Defining lazy-load filetype autocommands]], true) +vim.cmd [[au FileType jenkinsfile ++once lua require("packer.load")({'Jenkinsfile-vim-syntax'}, { ft = "jenkinsfile" }, _G.packer_plugins)]] +vim.cmd [[au FileType Jenkinsfile ++once lua require("packer.load")({'Jenkinsfile-vim-syntax'}, { ft = "Jenkinsfile" }, _G.packer_plugins)]] +vim.cmd [[au FileType python ++once lua require("packer.load")({'nvim-lspconfig'}, { ft = "python" }, _G.packer_plugins)]] +vim.cmd [[au FileType sh ++once lua require("packer.load")({'nvim-lspconfig'}, { ft = "sh" }, _G.packer_plugins)]] +vim.cmd [[au FileType lua ++once lua require("packer.load")({'nvim-lspconfig'}, { ft = "lua" }, _G.packer_plugins)]] +vim.cmd [[au FileType rust ++once lua require("packer.load")({'nvim-lspconfig'}, { ft = "rust" }, _G.packer_plugins)]] +vim.cmd [[au FileType cpp ++once lua require("packer.load")({'nvim-lspconfig'}, { ft = "cpp" }, _G.packer_plugins)]] +vim.cmd [[au FileType cmake ++once lua require("packer.load")({'nvim-lspconfig'}, { ft = "cmake" }, _G.packer_plugins)]] +vim.cmd [[au FileType markdown ++once lua require("packer.load")({'markdown-preview.nvim'}, { ft = "markdown" }, _G.packer_plugins)]] +vim.cmd [[au FileType xml ++once lua require("packer.load")({'nvim-lspconfig'}, { ft = "xml" }, _G.packer_plugins)]] +vim.cmd [[au FileType go ++once lua require("packer.load")({'nvim-lspconfig'}, { ft = "go" }, _G.packer_plugins)]] +time([[Defining lazy-load filetype autocommands]], false) + -- Event lazy-loads +time([[Defining lazy-load event autocommands]], true) +vim.cmd [[au VimEnter * ++once lua require("packer.load")({'nvim-treesitter', 'lualine.nvim', 'bufferline.nvim', 'gitsigns.nvim', 'Comment.nvim', 'indentLine', 'vim-fugitive', 'vim-startuptime', 'telescope.nvim'}, { event = "VimEnter *" }, _G.packer_plugins)]] +time([[Defining lazy-load event autocommands]], false) +vim.cmd("augroup END") +vim.cmd [[augroup filetypedetect]] +time([[Sourcing ftdetect script at: /home/oscar/.local/share/nvim/site/pack/packer/opt/Jenkinsfile-vim-syntax/ftdetect/Jenkinsfile.vim]], true) +vim.cmd [[source /home/oscar/.local/share/nvim/site/pack/packer/opt/Jenkinsfile-vim-syntax/ftdetect/Jenkinsfile.vim]] +time([[Sourcing ftdetect script at: /home/oscar/.local/share/nvim/site/pack/packer/opt/Jenkinsfile-vim-syntax/ftdetect/Jenkinsfile.vim]], false) +vim.cmd("augroup END") + +_G._packer.inside_compile = false +if _G._packer.needs_bufread == true then + vim.cmd("doautocmd BufRead") +end +_G._packer.needs_bufread = false + +if should_profile then save_profiles() end + +end) + +if not no_errors then + error_msg = error_msg:gsub('"', '\\"') + vim.api.nvim_command('echohl ErrorMsg | echom "Error in packer_compiled: '..error_msg..'" | echom "Please check your config for correctness" | echohl None') +end