From 9fab3f125da615a0729b66e938c9972717aa86f3 Mon Sep 17 00:00:00 2001 From: Buliway Date: Tue, 1 Jul 2025 06:09:09 +0300 Subject: [PATCH] new neovim config for arch linux --- README.md | 263 ++------------------------- ftplugin/nix.lua | 4 + ftplugin/proto.lua | 4 + init.lua | 105 +++++++++++ lua/custom/plugins/clip_history.lua | 14 ++ lua/custom/plugins/colorizer.lua | 63 +++++++ lua/custom/plugins/git.lua | 5 + lua/custom/plugins/golang.lua | 28 +++ lua/custom/plugins/rust.lua | 9 + lua/custom/plugins/symbol_usage.lua | 80 ++++++++ lua/custom/sessions.lua | 48 ++++- lua/kickstart/plugins/autoformat.lua | 23 ++- lua/kickstart/plugins/autopairs.lua | 8 +- lua/kickstart/plugins/completion.lua | 153 ++++++++++------ lua/kickstart/plugins/debug.lua | 148 +++++++++++++++ lua/kickstart/plugins/file-tree.lua | 29 +-- lua/kickstart/plugins/gitsigns.lua | 8 + lua/kickstart/plugins/lint.lua | 44 ++++- lua/kickstart/plugins/lsp.lua | 217 ++++++++++++++++++++-- lua/kickstart/plugins/mini.lua | 37 ++++ lua/kickstart/plugins/telescope.lua | 57 +++++- lua/kickstart/plugins/themes.lua | 113 ++++++++++++ lua/kickstart/plugins/treesitter.lua | 48 ++++- lua/kickstart/plugins/which-key.lua | 13 +- lua/kickstart/settings.lua | 147 ++++++++++++++- 25 files changed, 1295 insertions(+), 373 deletions(-) create mode 100644 ftplugin/nix.lua create mode 100644 ftplugin/proto.lua create mode 100644 lua/custom/plugins/clip_history.lua create mode 100644 lua/custom/plugins/colorizer.lua create mode 100644 lua/custom/plugins/git.lua create mode 100644 lua/custom/plugins/golang.lua create mode 100644 lua/custom/plugins/rust.lua create mode 100644 lua/custom/plugins/symbol_usage.lua create mode 100644 lua/kickstart/plugins/debug.lua diff --git a/README.md b/README.md index 63fc628..01aa0f4 100644 --- a/README.md +++ b/README.md @@ -4,258 +4,23 @@ Первый запуск конфига может быть долгим. Не прерывай этот процесс, пока не появится меню плагин манагера. -Надо скачать: -- `neovim` -- `git` -- `ripgrep` -- `fd` -- `unzip` -- `npm` (на некоторых дистрах он отдельно, на некоторых является частью `nodejs`, на всякий качаю оба пакета) -- Что-то для буфера обмена. На X11 это `xclip`, на Wayland это `wl-clipboard`. На маке и винде не знаю что надо качать. -- Любой nerd font. У меня это `JetBrainsMono Nerd Font Mono` +```sh +sudo pacman -Sy neovim git ripgrep fd unzip npm gcc ttf-jetbrains-mono-nerd noto-fonts-emoji go rustup ueberzugpp +``` +К этим пакетам добавь `wl-clipboard` если ты на wayland или `xclip`, если на X11 +Если тебе не нужна поддержка языков программирования `go` и `rust`, то удали соответствующие пакеты из списка. Для поддержки `rust` надо дописать это в терминал, чтоб скачать ласт версию языка: +```sh +rustup default stable +``` Установить этот конфиг на Linux или Mac можно так: ```sh -git clone --branch server --single-branch --depth 1 https://github.com/Buliway/kickstart.nvim.git "${XDG_CONFIG_HOME:-$HOME/.config}"/nvim +git clone --branch arch --single-branch --depth 1 https://github.com/Buliway/kickstart.nvim.git "${XDG_CONFIG_HOME:-$HOME/.config}"/nvim ``` -# kickstart.nvim - -## Introduction - -A starting point for Neovim that is: - -* Small -* Single-file -* Completely Documented - -**NOT** a Neovim distribution, but instead a starting point for your configuration. - -## Installation - -### Install Neovim - -Kickstart.nvim targets *only* the latest -['stable'](https://github.com/neovim/neovim/releases/tag/stable) and latest -['nightly'](https://github.com/neovim/neovim/releases/tag/nightly) of Neovim. -If you are experiencing issues, please make sure you have the latest versions. - -### Install External Dependencies - -External Requirements: -- Basic utils: `git`, `make`, `unzip`, C Compiler (`gcc`) -- [ripgrep](https://github.com/BurntSushi/ripgrep#installation) -- Clipboard tool (xclip/xsel/win32yank or other depending on the platform) -- A [Nerd Font](https://www.nerdfonts.com/): optional, provides various icons - - if you have it set `vim.g.have_nerd_font` in `init.lua` to true -- Emoji fonts (Ubuntu only, and only if you want emoji!) `sudo apt install fonts-noto-color-emoji` -- Language Setup: - - If you want to write Typescript, you need `npm` - - If you want to write Golang, you will need `go` - - etc. - -> [!NOTE] -> See [Install Recipes](#Install-Recipes) for additional Windows and Linux specific notes -> and quick install snippets - -### Install Kickstart - -> [!NOTE] -> [Backup](#FAQ) your previous configuration (if any exists) - -Neovim's configurations are located under the following paths, depending on your OS: - -| OS | PATH | -| :- | :--- | -| Linux, MacOS | `$XDG_CONFIG_HOME/nvim`, `~/.config/nvim` | -| Windows (cmd)| `%localappdata%\nvim\` | -| Windows (powershell)| `$env:LOCALAPPDATA\nvim\` | - -#### Recommended Step - -[Fork](https://docs.github.com/en/get-started/quickstart/fork-a-repo) this repo -so that you have your own copy that you can modify, then install by cloning the -fork to your machine using one of the commands below, depending on your OS. - -> [!NOTE] -> Your fork's URL will be something like this: -> `https://github.com//kickstart.nvim.git` - -You likely want to remove `lazy-lock.json` from your fork's `.gitignore` file -too - it's ignored in the kickstart repo to make maintenance easier, but it's -[recommended to track it in version control](https://lazy.folke.io/usage/lockfile). - -#### Clone kickstart.nvim - -> [!NOTE] -> If following the recommended step above (i.e., forking the repo), replace -> `nvim-lua` with `` in the commands below - -
Linux and Mac - -```sh -git clone https://github.com/nvim-lua/kickstart.nvim.git "${XDG_CONFIG_HOME:-$HOME/.config}"/nvim -``` - -
- -
Windows - -If you're using `cmd.exe`: - -``` -git clone https://github.com/nvim-lua/kickstart.nvim.git "%localappdata%\nvim" -``` - -If you're using `powershell.exe` - -``` -git clone https://github.com/nvim-lua/kickstart.nvim.git "${env:LOCALAPPDATA}\nvim" -``` - -
- -### Post Installation - -Start Neovim - -```sh -nvim -``` - -That's it! Lazy will install all the plugins you have. Use `:Lazy` to view -the current plugin status. Hit `q` to close the window. - -#### Read The Friendly Documentation - -Read through the `init.lua` file in your configuration folder for more -information about extending and exploring Neovim. That also includes -examples of adding popularly requested plugins. - -> [!NOTE] -> For more information about a particular plugin check its repository's documentation. - - -### Getting Started - -[The Only Video You Need to Get Started with Neovim](https://youtu.be/m8C0Cq9Uv9o) - -### FAQ - -* What should I do if I already have a pre-existing Neovim configuration? - * You should back it up and then delete all associated files. - * This includes your existing init.lua and the Neovim files in `~/.local` - which can be deleted with `rm -rf ~/.local/share/nvim/` -* Can I keep my existing configuration in parallel to kickstart? - * Yes! You can use [NVIM_APPNAME](https://neovim.io/doc/user/starting.html#%24NVIM_APPNAME)`=nvim-NAME` - to maintain multiple configurations. For example, you can install the kickstart - configuration in `~/.config/nvim-kickstart` and create an alias: - ``` - alias nvim-kickstart='NVIM_APPNAME="nvim-kickstart" nvim' - ``` - When you run Neovim using `nvim-kickstart` alias it will use the alternative - config directory and the matching local directory - `~/.local/share/nvim-kickstart`. You can apply this approach to any Neovim - distribution that you would like to try out. -* What if I want to "uninstall" this configuration: - * See [lazy.nvim uninstall](https://lazy.folke.io/usage#-uninstalling) information -* Why is the kickstart `init.lua` a single file? Wouldn't it make sense to split it into multiple files? - * The main purpose of kickstart is to serve as a teaching tool and a reference - configuration that someone can easily use to `git clone` as a basis for their own. - As you progress in learning Neovim and Lua, you might consider splitting `init.lua` - into smaller parts. A fork of kickstart that does this while maintaining the - same functionality is available here: - * [kickstart-modular.nvim](https://github.com/dam9000/kickstart-modular.nvim) - * Discussions on this topic can be found here: - * [Restructure the configuration](https://github.com/nvim-lua/kickstart.nvim/issues/218) - * [Reorganize init.lua into a multi-file setup](https://github.com/nvim-lua/kickstart.nvim/pull/473) - -### Install Recipes - -Below you can find OS specific install instructions for Neovim and dependencies. - -After installing all the dependencies continue with the [Install Kickstart](#Install-Kickstart) step. - -#### Windows Installation - -
Windows with Microsoft C++ Build Tools and CMake -Installation may require installing build tools and updating the run command for `telescope-fzf-native` - -See `telescope-fzf-native` documentation for [more details](https://github.com/nvim-telescope/telescope-fzf-native.nvim#installation) - -This requires: - -- Install CMake and the Microsoft C++ Build Tools on Windows - -```lua -{'nvim-telescope/telescope-fzf-native.nvim', build = 'cmake -S. -Bbuild -DCMAKE_BUILD_TYPE=Release && cmake --build build --config Release && cmake --install build --prefix build' } -``` -
-
Windows with gcc/make using chocolatey -Alternatively, one can install gcc and make which don't require changing the config, -the easiest way is to use choco: - -1. install [chocolatey](https://chocolatey.org/install) -either follow the instructions on the page or use winget, -run in cmd as **admin**: -``` -winget install --accept-source-agreements chocolatey.chocolatey -``` - -2. install all requirements using choco, exit the previous cmd and -open a new one so that choco path is set, and run in cmd as **admin**: -``` -choco install -y neovim git ripgrep wget fd unzip gzip mingw make -``` -
-
WSL (Windows Subsystem for Linux) - -``` -wsl --install -wsl -sudo add-apt-repository ppa:neovim-ppa/unstable -y -sudo apt update -sudo apt install make gcc ripgrep unzip git xclip neovim -``` -
- -#### Linux Install -
Ubuntu Install Steps - -``` -sudo add-apt-repository ppa:neovim-ppa/unstable -y -sudo apt update -sudo apt install make gcc ripgrep unzip git xclip neovim -``` -
-
Debian Install Steps - -``` -sudo apt update -sudo apt install make gcc ripgrep unzip git xclip curl - -# Now we install nvim -curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim-linux-x86_64.tar.gz -sudo rm -rf /opt/nvim-linux-x86_64 -sudo mkdir -p /opt/nvim-linux-x86_64 -sudo chmod a+rX /opt/nvim-linux-x86_64 -sudo tar -C /opt -xzf nvim-linux-x86_64.tar.gz - -# make it available in /usr/local/bin, distro installs to /usr/bin -sudo ln -sf /opt/nvim-linux-x86_64/bin/nvim /usr/local/bin/ -``` -
-
Fedora Install Steps - -``` -sudo dnf install -y gcc make git ripgrep fd-find unzip neovim -``` -
- -
Arch Install Steps - -``` -sudo pacman -S --noconfirm --needed gcc make git ripgrep fd unzip neovim -``` -
+Если надо больше информации по установке и настройке, то вот доп источники: +- [kickstart.nvim](https://github.com/nvim-lua/kickstart.nvim) - Оригинальный конфиг, который я взял за основу и немного дополнил. В их readme много дополнительной информации. +- [The Only Video You Need to Get Started with Neovim](https://youtu.be/m8C0Cq9Uv9o) - Гайд по `kickstart.nvim`. Название видео говорит как есть. Мне очень сильно помогло создать свой конфиг. +- [0 to LSP : Neovim RC From Scratch](https://youtu.be/w7i4amO_zaE) - Старый гайд по настройке NeoVim с нуля. Некоторые настройки и плагины больше не актуальны, но мне понравилось видеть логику и рассуждения человека при составлении конфига с нуля. +В этом конфиге я выключил плагин для дебага. Этот конфиг я использую на запасных системах, где мне не нужен дебаг и я не хочу качать дополнительные пакеты для него. Если нужен дебаг, то можно раскомментировать нужные строки в `init.lua`. Не уверен надо ли докачивать какие-то пакеты для этого. diff --git a/ftplugin/nix.lua b/ftplugin/nix.lua new file mode 100644 index 0000000..55de27d --- /dev/null +++ b/ftplugin/nix.lua @@ -0,0 +1,4 @@ +vim.bo.expandtab = true +vim.bo.tabstop = 2 +vim.bo.shiftwidth = 2 +vim.bo.softtabstop = 2 diff --git a/ftplugin/proto.lua b/ftplugin/proto.lua new file mode 100644 index 0000000..55de27d --- /dev/null +++ b/ftplugin/proto.lua @@ -0,0 +1,4 @@ +vim.bo.expandtab = true +vim.bo.tabstop = 2 +vim.bo.shiftwidth = 2 +vim.bo.softtabstop = 2 diff --git a/init.lua b/init.lua index 07df716..75d4778 100644 --- a/init.lua +++ b/init.lua @@ -1,6 +1,11 @@ +-- [[ Базовые настройки. Не плагины ]] require 'kickstart.settings' +require 'custom.terminal' require 'custom.sessions' +-- [[ Install `lazy.nvim` plugin manager ]] +-- See `:help lazy.nvim.txt` or https://github.com/folke/lazy.nvim for more info +-- git clone https://github.com/folke/lazy.nvim.git ~/.local/share/nvim/lazy/lazy.nvim local lazypath = vim.fn.stdpath 'data' .. '/lazy/lazy.nvim' if not (vim.uv or vim.loop).fs_stat(lazypath) then local lazyrepo = 'https://github.com/folke/lazy.nvim.git' @@ -11,21 +16,118 @@ if not (vim.uv or vim.loop).fs_stat(lazypath) then end ---@diagnostic disable-next-line: undefined-field vim.opt.rtp:prepend(lazypath) +-- [[ Configure and install plugins ]] +-- +-- To check the current status of your plugins, run +-- :Lazy +-- +-- You can press `?` in this menu for help. Use `:q` to close the window +-- +-- To update plugins you can run +-- :Lazy update +-- +-- NOTE: Here is where you install your plugins. require('lazy').setup({ + + --------------------------------------------- + -- Установлены из коробки в kickstart.nvim -- + --------------------------------------------- + + -- Git integration for buffers require 'kickstart.plugins.gitsigns', + + -- Useful plugin to show you pending keybinds. require 'kickstart.plugins.which-key', + + -- Fuzzy Finder (files, lsp, etc) require 'kickstart.plugins.telescope', + + -- LSP Plugins require 'kickstart.plugins.lsp', + + -- Autoformat require 'kickstart.plugins.autoformat', + + -- Autocompletion require 'kickstart.plugins.completion', + + -- Themes require 'kickstart.plugins.themes', + + -- Highlight todo, notes, etc in comments require 'kickstart.plugins.todo-comments', + + -- Collection of various small independent plugins/modules require 'kickstart.plugins.mini', + + -- Highlight, edit, and navigate code require 'kickstart.plugins.treesitter', + + -- Debug your code via Debug Adapter Protocol + -- require 'kickstart.plugins.debug', + + -- Add indentation guides even on blank lines require 'kickstart.plugins.indent_line', + + -- Linting require 'kickstart.plugins.lint', + + -- Autopairs require 'kickstart.plugins.autopairs', + + -- Browse the file system require 'kickstart.plugins.file-tree', + + ------------------------------------- + -- Установил руками под свои нужды -- + ------------------------------------- + + -- Supercharge your Rust experience in Neovim + require 'custom.plugins.rust', + + -- Feature-Rich Go Plugin for Neovim + require 'custom.plugins.golang', + + -- Plugins for git + require 'custom.plugins.git', + + -- Plugins for color highlight + require 'custom.plugins.colorizer', + + -- Symbol usage plugin + require 'custom.plugins.symbol_usage', + + -- Adding history for nvim clipboard + require 'custom.plugins.clip_history', + + -- Autoformat markdown tables + { + 'Kicamon/markdown-table-mode.nvim', + config = function() + require('markdown-table-mode').setup { + filetype = { + '*.md', + }, + options = { + insert = true, -- when typing "|" + insert_leave = true, -- when leaving insert + pad_separator_line = false, -- add space in separator line + alig_style = 'default', -- default, left, center, right + }, + } + end, + }, + + -- NOTE: The import below can automatically add your own plugins, configuration, etc from `lua/custom/plugins/*.lua` + -- This is the easiest way to modularize your config. + -- + -- Uncomment the following line and add your plugins to `lua/custom/plugins/*.lua` to get going. + -- { import = 'custom.plugins' }, + -- + -- For additional information with loading, sourcing and examples see `:help lazy.nvim-🔌-plugin-spec` + -- Or use telescope! + -- In normal mode type `sh` then write `lazy.nvim-plugin` + -- you can continue same window with `sr` which resumes last telescope search }, { ui = { -- If you are using a Nerd Font: set icons to an empty table which will use the @@ -47,3 +149,6 @@ require('lazy').setup({ }, }, }) + +-- The line beneath this is called `modeline`. See `:help modeline` +-- vim: ts=2 sts=2 sw=2 et diff --git a/lua/custom/plugins/clip_history.lua b/lua/custom/plugins/clip_history.lua new file mode 100644 index 0000000..65eec75 --- /dev/null +++ b/lua/custom/plugins/clip_history.lua @@ -0,0 +1,14 @@ +-- Adding history for nvim clipboard + +return { + { + 'AckslD/nvim-neoclip.lua', + dependencies = { + { 'nvim-telescope/telescope.nvim' }, + }, + config = function() + require('neoclip').setup() + vim.keymap.set('n', 'sc', ':Telescope neoclip', { desc = '[S]earch [C]lip history' }) + end, + }, +} diff --git a/lua/custom/plugins/colorizer.lua b/lua/custom/plugins/colorizer.lua new file mode 100644 index 0000000..5be4349 --- /dev/null +++ b/lua/custom/plugins/colorizer.lua @@ -0,0 +1,63 @@ +-- A high-performance color highlighter + +return { + { + 'catgoose/nvim-colorizer.lua', + event = 'BufReadPre', + opts = { -- set to setup table + filetypes = { '*' }, -- Filetype options. Accepts table like `user_default_options` + buftypes = {}, -- Buftype options. Accepts table like `user_default_options` + -- Boolean | List of usercommands to enable. See User commands section. + user_commands = true, -- Enable all or some usercommands + lazy_load = false, -- Lazily schedule buffer highlighting setup function + user_default_options = { + names = true, -- "Name" codes like Blue or red. Added from `vim.api.nvim_get_color_map()` + names_opts = { -- options for mutating/filtering names. + lowercase = true, -- name:lower(), highlight `blue` and `red` + camelcase = true, -- name, highlight `Blue` and `Red` + uppercase = false, -- name:upper(), highlight `BLUE` and `RED` + strip_digits = false, -- ignore names with digits, + -- highlight `blue` and `red`, but not `blue3` and `red4` + }, + -- Expects a table of color name to #RRGGBB value pairs. # is optional + -- Example: { cool = "#107dac", ["notcool"] = "ee9240" } + -- Set to false to disable, for example when setting filetype options + names_custom = false, -- Custom names to be highlighted: table|function|false + RGB = true, -- #RGB hex codes + RGBA = true, -- #RGBA hex codes + RRGGBB = true, -- #RRGGBB hex codes + RRGGBBAA = false, -- #RRGGBBAA hex codes + AARRGGBB = false, -- 0xAARRGGBB hex codes + rgb_fn = false, -- CSS rgb() and rgba() functions + hsl_fn = false, -- CSS hsl() and hsla() functions + css = false, -- Enable all CSS *features*: + -- names, RGB, RGBA, RRGGBB, RRGGBBAA, AARRGGBB, rgb_fn, hsl_fn + css_fn = false, -- Enable all CSS *functions*: rgb_fn, hsl_fn + -- Tailwind colors. boolean|'normal'|'lsp'|'both'. True sets to 'normal' + tailwind = false, -- Enable tailwind colors + tailwind_opts = { -- Options for highlighting tailwind names + update_names = false, -- When using tailwind = 'both', update tailwind names from LSP results. See tailwind section + }, + -- parsers can contain values used in `user_default_options` + sass = { enable = false, parsers = { 'css' } }, -- Enable sass colors + -- Highlighting mode. 'background'|'foreground'|'virtualtext' + mode = 'background', -- Set the display mode + -- Virtualtext character to use + virtualtext = '■', + -- Display virtualtext inline with color. boolean|'before'|'after'. True sets to 'after' + virtualtext_inline = false, + -- Virtualtext highlight mode: 'background'|'foreground' + virtualtext_mode = 'foreground', + -- update color values even if buffer is not focused + -- example use: cmp_menu, cmp_docs + always_update = false, + -- hooks to invert control of colorizer + hooks = { + -- called before line parsing. Accepts boolean or function that returns boolean + -- see hooks section below + disable_line_highlight = false, + }, + }, + }, + }, +} diff --git a/lua/custom/plugins/git.lua b/lua/custom/plugins/git.lua new file mode 100644 index 0000000..238bd5e --- /dev/null +++ b/lua/custom/plugins/git.lua @@ -0,0 +1,5 @@ +return { + { + 'sindrets/diffview.nvim', + }, +} diff --git a/lua/custom/plugins/golang.lua b/lua/custom/plugins/golang.lua new file mode 100644 index 0000000..1df6504 --- /dev/null +++ b/lua/custom/plugins/golang.lua @@ -0,0 +1,28 @@ +-- Feature-Rich Go Plugin for Neovim + +return { + { + 'ray-x/go.nvim', + dependencies = { -- optional packages + 'ray-x/guihua.lua', + 'neovim/nvim-lspconfig', + 'nvim-treesitter/nvim-treesitter', + }, + config = function() + require('go').setup { + tag_options = '', -- sets options sent to gomodifytags, i.e., json=omitempty + } + vim.keymap.set({ 'n' }, 'gta', ':GoAddTag', { desc = '[G]o [T]ag [A]dd' }) + vim.keymap.set({ 'n' }, 'gtr', ':GoRmTag', { desc = '[G]o [T]ag [R]emove' }) + vim.keymap.set({ 'n' }, 'gs', ':GoFillStruct', { desc = '[G]o fill [S]truct' }) + vim.keymap.set({ 'n' }, 'gc', ':GoFillSwitch', { desc = '[G]o fill Switch [C]ase' }) + -- Go Fix Plurals - change func foo(b int, a int, r int) -> func foo(b, a, r int) + vim.keymap.set({ 'n' }, 'gp', ':GoFixPlurals', { desc = '[G]o fix [P]lurals' }) + vim.keymap.set({ 'n' }, 'ge', ':GoIfErr', { desc = '[G]o if [E]rr' }) + vim.keymap.set({ 'n' }, 'gi', ':GoImports', { desc = '[G]o [I]mports' }) + end, + event = { 'CmdlineEnter' }, + ft = { 'go', 'gomod' }, + -- build = ':lua require("go.install").update_all_sync()' -- if you need to install/update all binaries + }, +} diff --git a/lua/custom/plugins/rust.lua b/lua/custom/plugins/rust.lua new file mode 100644 index 0000000..058de05 --- /dev/null +++ b/lua/custom/plugins/rust.lua @@ -0,0 +1,9 @@ +-- Supercharge your Rust experience in Neovim + +return { + { + 'mrcjkb/rustaceanvim', + version = '^6', -- Recommended + lazy = false, -- This plugin is already lazy + }, +} diff --git a/lua/custom/plugins/symbol_usage.lua b/lua/custom/plugins/symbol_usage.lua new file mode 100644 index 0000000..dcae661 --- /dev/null +++ b/lua/custom/plugins/symbol_usage.lua @@ -0,0 +1,80 @@ +-- Symbol usage plugin + +local SymbolKind = vim.lsp.protocol.SymbolKind + +local function h(name) + return vim.api.nvim_get_hl(0, { name = name }) +end + +-- hl-groups can have any name +vim.api.nvim_set_hl(0, 'SymbolUsageRounding', { fg = h('CursorLine').bg, italic = true }) +vim.api.nvim_set_hl(0, 'SymbolUsageContent', { bg = h('CursorLine').bg, fg = h('Comment').fg, italic = true }) +vim.api.nvim_set_hl(0, 'SymbolUsageRef', { fg = h('Function').fg, bg = h('CursorLine').bg, italic = true }) +vim.api.nvim_set_hl(0, 'SymbolUsageDef', { fg = h('Type').fg, bg = h('CursorLine').bg, italic = true }) +vim.api.nvim_set_hl(0, 'SymbolUsageImpl', { fg = h('@keyword').fg, bg = h('CursorLine').bg, italic = true }) + +local function text_format(symbol) + local res = {} + + local round_start = { '', 'SymbolUsageRounding' } + local round_end = { '', 'SymbolUsageRounding' } + + -- Indicator that shows if there are any other symbols in the same line + local stacked_functions_content = symbol.stacked_count > 0 and ('+%s'):format(symbol.stacked_count) or '' + + if symbol.references then + local usage = symbol.references <= 1 and 'usage' or 'usages' + local num = symbol.references == 0 and 'no' or symbol.references + table.insert(res, round_start) + table.insert(res, { '󰌹 ', 'SymbolUsageRef' }) + table.insert(res, { ('%s %s'):format(num, usage), 'SymbolUsageContent' }) + table.insert(res, round_end) + end + + if symbol.definition then + if #res > 0 then + table.insert(res, { ' ', 'NonText' }) + end + table.insert(res, round_start) + table.insert(res, { '󰳽 ', 'SymbolUsageDef' }) + table.insert(res, { symbol.definition .. ' defs', 'SymbolUsageContent' }) + table.insert(res, round_end) + end + + if symbol.implementation then + if #res > 0 then + table.insert(res, { ' ', 'NonText' }) + end + table.insert(res, round_start) + table.insert(res, { '󰡱 ', 'SymbolUsageImpl' }) + table.insert(res, { symbol.implementation .. ' impls', 'SymbolUsageContent' }) + table.insert(res, round_end) + end + + if stacked_functions_content ~= '' then + if #res > 0 then + table.insert(res, { ' ', 'NonText' }) + end + table.insert(res, round_start) + table.insert(res, { ' ', 'SymbolUsageImpl' }) + table.insert(res, { stacked_functions_content, 'SymbolUsageContent' }) + table.insert(res, round_end) + end + + return res +end + +return { + { + 'Wansmer/symbol-usage.nvim', + event = 'LspAttach', -- need run before LspAttach if you use nvim 0.9. On 0.10 use 'LspAttach' + config = function() + require('symbol-usage').setup { + filetypes = {}, + log = { enabled = false, level = 'INFO', stdout = {}, log_file = {}, notify = {} }, + text_format = text_format, + kinds = { SymbolKind.Function, SymbolKind.Method, SymbolKind.Class, SymbolKind.Struct, SymbolKind.Variable, SymbolKind.Constant }, + } + end, + }, +} diff --git a/lua/custom/sessions.lua b/lua/custom/sessions.lua index 3248da3..82ec3c9 100644 --- a/lua/custom/sessions.lua +++ b/lua/custom/sessions.lua @@ -1,37 +1,61 @@ +-- Add auto-sessions to mini.sessions plugin +-- Session names are generated dynamically based on the project directory and Git branch (if available) +-- Auto-save session on exit will only work if there is an active session in the project, +-- which can be set up, for example, via a custom key binding +-- When starting `nvim` with no arguments, will try to save session on exit +-- Whet starting `nvim .` (or another directory), will try to save session on exit +-- When starting `nvim some_file.txt` (or multiple files), won't do anything + +-- Generate session name per project and per git branch for mini.sessions local function get_git_branch() local branch = vim.fn.systemlist('git branch --show-current')[1] or '' return (vim.v.shell_error == 0 and branch ~= '') and branch or nil end + local function session_name() - local cwd = vim.fn.getcwd() + local cwd = vim.fn.getcwd() -- current working directory local branch = get_git_branch() local name = cwd + local sha = vim.fn.sha256(name) + if branch then sha = sha .. '-' .. branch end + return sha end + +-- Auto save session per project and per git branch on exit local function should_save_session() + -- argc() returns the number of command line arguments local argc = vim.fn.argc() + + -- Case 1: nvim with no arguments if argc == 0 then return true end + + -- Case 2: nvim . (argument is a directory) if argc == 1 then - local first_arg = vim.fn.argv(0) + local first_arg = vim.fn.argv(0) -- Get the first argument return vim.fn.isdirectory(first_arg) == 1 end + return false end + local function session_exist() local session_dir = vim.fn.stdpath 'data' .. '/session/' local session_path = session_dir .. session_name() return vim.fn.filereadable(session_path) == 1 end + local function save_session() if not should_save_session() then - return + return -- Do not save if there were files in the arguments end + local name = session_name() require('mini.sessions').write(name) print('💾 Session Saved: ' .. name) @@ -41,41 +65,47 @@ vim.api.nvim_create_autocmd('VimLeavePre', { desc = 'Auto save session on exit if session exists', callback = function() if not session_exist() then - return + return -- Do not autosave session if there is no session in the project end save_session() end, }) + +-- Session restore local function restore_session() if not should_save_session() then return end if not session_exist() then - return + return -- Do not restore session if there is no session in the project end + local name = session_name() require('mini.sessions').read(name) print('💾 Session Restored: ' .. name) end + vim.api.nvim_create_autocmd('User', { - pattern = 'VeryLazy', + pattern = 'VeryLazy', -- Lazy.nvim event desc = 'Auto restore session after plugin load', callback = function() + -- Adding a small delay for stability vim.defer_fn(function() restore_session() end, 50) end, nested = true, }) -vim.keymap.set('n', '', function() - restore_session() -end, { desc = 'Restore session' }) + +-- Session delete vim.keymap.set('n', 'Sd', function() local name = session_name() require('mini.sessions').delete(name) print('💾 Session Deleted: ' .. name) end, { desc = '[S]ession [D]elete' }) + +-- Session create vim.keymap.set('n', 'Sc', function() save_session() end, { desc = '[S]ession [C]reate' }) diff --git a/lua/kickstart/plugins/autoformat.lua b/lua/kickstart/plugins/autoformat.lua index ce8d1b2..447bd77 100644 --- a/lua/kickstart/plugins/autoformat.lua +++ b/lua/kickstart/plugins/autoformat.lua @@ -20,20 +20,29 @@ return { opts = { notify_on_error = false, format_on_save = function(bufnr) + -- Disable "format_on_save lsp_fallback" for languages that don't + -- have a well standardized coding style. You can add additional + -- languages here or re-enable it for the disabled ones. local disable_filetypes = { c = true, cpp = true } - local lsp_format_opt if disable_filetypes[vim.bo[bufnr].filetype] then - lsp_format_opt = 'never' + return nil else - lsp_format_opt = 'fallback' + return { + timeout_ms = 5000, + lsp_format = 'fallback', + } end - return { - timeout_ms = 5000, - lsp_format = lsp_format_opt, - } end, formatters_by_ft = { lua = { 'stylua' }, + go = { 'gofmt', 'injected' }, + -- ['*'] = { 'injected' }, -- enables injected-lang formatting for all filetypes + + -- Conform can also run multiple formatters sequentially + -- python = { "isort", "black" }, + -- + -- You can use 'stop_after_first' to run the first available formatter from the list + -- javascript = { "prettierd", "prettier", stop_after_first = true }, }, formatters = {}, }, diff --git a/lua/kickstart/plugins/autopairs.lua b/lua/kickstart/plugins/autopairs.lua index 3eaa44a..c5461f1 100644 --- a/lua/kickstart/plugins/autopairs.lua +++ b/lua/kickstart/plugins/autopairs.lua @@ -1,11 +1,5 @@ return { 'windwp/nvim-autopairs', event = 'InsertEnter', - dependencies = { 'hrsh7th/nvim-cmp' }, - config = function() - require('nvim-autopairs').setup {} - local cmp_autopairs = require 'nvim-autopairs.completion.cmp' - local cmp = require 'cmp' - cmp.event:on('confirm_done', cmp_autopairs.on_confirm_done()) - end, + opts = {}, } diff --git a/lua/kickstart/plugins/completion.lua b/lua/kickstart/plugins/completion.lua index 85a1dcb..35fead9 100644 --- a/lua/kickstart/plugins/completion.lua +++ b/lua/kickstart/plugins/completion.lua @@ -1,17 +1,26 @@ return { { - 'hrsh7th/nvim-cmp', - event = 'InsertEnter', + 'saghen/blink.cmp', + event = 'VimEnter', + version = '1.*', dependencies = { + -- Snippet Engine { 'L3MON4D3/LuaSnip', + version = '2.*', build = (function() + -- Build Step is needed for regex support in snippets. + -- This step is not supported in many windows environments. + -- Remove the below condition to re-enable on windows. if vim.fn.has 'win32' == 1 or vim.fn.executable 'make' == 0 then return end return 'make install_jsregexp' end)(), dependencies = { + -- `friendly-snippets` contains a variety of premade snippets. + -- See the README about individual language/framework/plugin snippets: + -- https://github.com/rafamadriz/friendly-snippets { 'rafamadriz/friendly-snippets', config = function() @@ -19,60 +28,96 @@ return { end, }, }, + opts = {}, }, - 'saadparwaiz1/cmp_luasnip', - 'hrsh7th/cmp-nvim-lsp', - 'hrsh7th/cmp-path', - 'hrsh7th/cmp-nvim-lsp-signature-help', + 'folke/lazydev.nvim', }, - config = function() - local cmp = require 'cmp' - local luasnip = require 'luasnip' - luasnip.config.setup {} - cmp.setup { - preselect = cmp.PreselectMode.None, - snippet = { - expand = function(args) - luasnip.lsp_expand(args.body) - end, + --- @module 'blink.cmp' + --- @type blink.cmp.Config + opts = { + keymap = { + -- No, but seriously. Please read `:help ins-completion`, it is really good! + -- + -- All presets have the following mappings: + -- /: move to right/left of your snippet expansion + -- : Open menu or open docs if already open + -- / or /: Select next/previous item + -- : Hide menu + -- : Toggle signature help + -- + -- See :h blink-cmp-config-keymap for defining your own keymap + -- preset = 'default', + + -- For more advanced Luasnip keymaps (e.g. selecting choice nodes, expansion) see: + -- https://github.com/L3MON4D3/LuaSnip?tab=readme-ov-file#keymaps + + -- Удалил все сток бинды и добавил сам что надо + -- https://cmp.saghen.dev/configuration/keymap.html + preset = 'none', + + -- Open menu or open docs if already open + [''] = { 'show', 'show_documentation', 'hide_documentation' }, + -- Hide menu + [''] = { 'hide' }, + -- Accept the completion + [''] = { 'select_and_accept' }, + [''] = { 'select_and_accept' }, + + -- Select next/previous item + [''] = { 'select_next', 'fallback' }, + [''] = { 'select_prev', 'fallback' }, + + -- Scroll the documentation window [b]ack / [f]orward + [''] = { 'scroll_documentation_up', 'fallback' }, + [''] = { 'scroll_documentation_down', 'fallback' }, + + -- Think of as moving to the right of your snippet expansion. + -- So if you have a snippet that's like: + -- function $name($args) + -- $body + -- end + -- + -- will move you to the right of each of the expansion locations. + -- is similar, except moving you backwards. + [''] = { 'snippet_forward', 'fallback' }, + [''] = { 'snippet_backward', 'fallback' }, + + -- Toggle signature help + [''] = { 'show_signature', 'hide_signature', 'fallback' }, + }, + + appearance = { + -- 'mono' (default) for 'Nerd Font Mono' or 'normal' for 'Nerd Font' + -- Adjusts spacing to ensure icons are aligned + nerd_font_variant = 'mono', + }, + + completion = { + -- By default, you may press `` to show the documentation. + -- Optionally, set `auto_show = true` to show the documentation after a delay. + documentation = { auto_show = true, auto_show_delay_ms = 500 }, + }, + + sources = { + default = { 'lsp', 'path', 'snippets', 'lazydev' }, + providers = { + lazydev = { module = 'lazydev.integrations.blink', score_offset = 100 }, }, - completion = { completeopt = 'menu,menuone,noinsert' }, - mapping = cmp.mapping.preset.insert { - [''] = cmp.mapping.select_next_item(), - [''] = cmp.mapping.select_prev_item(), - [''] = cmp.mapping(function(fallback) - cmp.close() - fallback() - end, { 'i', 'c' }), - [''] = cmp.mapping(function(fallback) - cmp.close() - fallback() - end, { 'i', 'c' }), - [''] = cmp.mapping.scroll_docs(-4), - [''] = cmp.mapping.scroll_docs(4), - [''] = cmp.mapping.complete {}, - [''] = cmp.mapping(function() - if luasnip.expand_or_locally_jumpable() then - luasnip.expand_or_jump() - end - end, { 'i', 's' }), - [''] = cmp.mapping(function() - if luasnip.locally_jumpable(-1) then - luasnip.jump(-1) - end - end, { 'i', 's' }), - }, - sources = { - { - name = 'lazydev', - group_index = 0, - }, - { name = 'nvim_lsp' }, - { name = 'luasnip' }, - { name = 'path' }, - { name = 'nvim_lsp_signature_help' }, - }, - } - end, + }, + + snippets = { preset = 'luasnip' }, + + -- Blink.cmp includes an optional, recommended rust fuzzy matcher, + -- which automatically downloads a prebuilt binary when enabled. + -- + -- By default, we use the Lua implementation instead, but you may enable + -- the rust implementation via `'prefer_rust_with_warning'` + -- + -- See :h blink-cmp-config-fuzzy for more information + fuzzy = { implementation = 'lua' }, + + -- Shows a signature help window while you type arguments for a function + signature = { enabled = true }, + }, }, } diff --git a/lua/kickstart/plugins/debug.lua b/lua/kickstart/plugins/debug.lua new file mode 100644 index 0000000..d4c267b --- /dev/null +++ b/lua/kickstart/plugins/debug.lua @@ -0,0 +1,148 @@ +-- debug.lua +-- +-- Shows how to use the DAP plugin to debug your code. +-- +-- Primarily focused on configuring the debugger for Go, but can +-- be extended to other languages as well. That's why it's called +-- kickstart.nvim and not kitchen-sink.nvim ;) + +return { + -- NOTE: Yes, you can install new plugins here! + 'mfussenegger/nvim-dap', + -- NOTE: And you can specify dependencies as well + dependencies = { + -- Creates a beautiful debugger UI + 'rcarriga/nvim-dap-ui', + + -- Required dependency for nvim-dap-ui + 'nvim-neotest/nvim-nio', + + -- Installs the debug adapters for you + 'williamboman/mason.nvim', + 'jay-babu/mason-nvim-dap.nvim', + + -- Add your own debuggers here + 'leoluz/nvim-dap-go', + }, + keys = { + -- Basic debugging keymaps, feel free to change to your liking! + { + '', + function() + require('dap').continue() + end, + desc = 'Debug: Start/Continue', + }, + { + '', + function() + require('dap').step_into() + end, + desc = 'Debug: Step Into', + }, + { + '', + function() + require('dap').step_over() + end, + desc = 'Debug: Step Over', + }, + { + '', + function() + require('dap').step_out() + end, + desc = 'Debug: Step Out', + }, + { + 'b', + function() + require('dap').toggle_breakpoint() + end, + desc = 'Debug: Toggle Breakpoint', + }, + { + 'B', + function() + require('dap').set_breakpoint(vim.fn.input 'Breakpoint condition: ') + end, + desc = 'Debug: Set Breakpoint', + }, + -- Toggle to see last session result. Without this, you can't see session output in case of unhandled exception. + { + '', + function() + require('dapui').toggle() + end, + desc = 'Debug: See last session result.', + }, + }, + config = function() + local dap = require 'dap' + local dapui = require 'dapui' + + require('mason-nvim-dap').setup { + -- Makes a best effort to setup the various debuggers with + -- reasonable debug configurations + -- automatic_installation = true, + + -- You can provide additional configuration to the handlers, + -- see mason-nvim-dap README for more information + handlers = {}, + + -- You'll need to check that you have the required things installed + -- online, please don't ask me how to install them :) + ensure_installed = { -- Скачать через mason (не надо) + -- Update this to ensure that you have the debuggers for the langs you want + -- 'delve', + }, + } + + -- Dap UI setup + -- For more information, see |:help nvim-dap-ui| + dapui.setup { + -- Set icons to characters that are more likely to work in every terminal. + -- Feel free to remove or use ones that you like more! :) + -- Don't feel like these are good choices. + icons = { expanded = '▾', collapsed = '▸', current_frame = '*' }, + controls = { + icons = { + pause = '⏸', + play = '▶', + step_into = '⏎', + step_over = '⏭', + step_out = '⏮', + step_back = 'b', + run_last = '▶▶', + terminate = '⏹', + disconnect = '⏏', + }, + }, + } + + -- Change breakpoint icons + -- vim.api.nvim_set_hl(0, 'DapBreak', { fg = '#e51400' }) + -- vim.api.nvim_set_hl(0, 'DapStop', { fg = '#ffcc00' }) + -- local breakpoint_icons = vim.g.have_nerd_font + -- and { Breakpoint = '', BreakpointCondition = '', BreakpointRejected = '', LogPoint = '', Stopped = '' } + -- or { Breakpoint = '●', BreakpointCondition = '⊜', BreakpointRejected = '⊘', LogPoint = '◆', Stopped = '⭔' } + -- for type, icon in pairs(breakpoint_icons) do + -- local tp = 'Dap' .. type + -- local hl = (type == 'Stopped') and 'DapStop' or 'DapBreak' + -- vim.fn.sign_define(tp, { text = icon, texthl = hl, numhl = hl }) + -- end + + dap.listeners.after.event_initialized['dapui_config'] = dapui.open + dap.listeners.before.event_terminated['dapui_config'] = dapui.close + dap.listeners.before.event_exited['dapui_config'] = dapui.close + + -- Install golang specific config + require('dap-go').setup { + delve = { + -- On Windows delve must be run attached or it crashes. + -- See https://github.com/leoluz/nvim-dap-go/blob/main/README.md#configuring + detached = vim.fn.has 'win32' == 0, + }, + } + end, +} diff --git a/lua/kickstart/plugins/file-tree.lua b/lua/kickstart/plugins/file-tree.lua index 9befc4f..17c0ddb 100644 --- a/lua/kickstart/plugins/file-tree.lua +++ b/lua/kickstart/plugins/file-tree.lua @@ -1,25 +1,32 @@ +-- Neo-tree is a Neovim plugin to browse the file system +-- Не умеет работать со сессиями +-- https://github.com/nvim-neo-tree/neo-tree.nvim + return { { 'nvim-neo-tree/neo-tree.nvim', - version = '*', + branch = 'v3.x', dependencies = { 'nvim-lua/plenary.nvim', - 'nvim-tree/nvim-web-devicons', + 'nvim-tree/nvim-web-devicons', -- not strictly required, but recommended 'MunifTanjim/nui.nvim', - -- { -- Optional image support in preview window: See `# Preview Mode` for more information - -- '3rd/image.nvim', - -- build = false, -- so that it doesn't build the rock - -- opts = { - -- backend = 'ueberzug', -- or "kitty" - -- processor = 'magick_cli', -- or "magick_rock" - -- }, - -- }, + { -- Optional image support in preview window: See `# Preview Mode` for more information + '3rd/image.nvim', + build = false, -- so that it doesn't build the rock + opts = { + backend = 'ueberzug', -- or "kitty" + processor = 'magick_cli', -- or "magick_rock" + }, + }, }, - cmd = 'Neotree', + lazy = false, -- neo-tree will lazily load itself keys = { { '\\', ':Neotree reveal', desc = 'NeoTree reveal', silent = true }, }, + ---@module "neo-tree" + ---@type neotree.Config? opts = { + close_if_last_window = true, filesystem = { window = { mappings = { diff --git a/lua/kickstart/plugins/gitsigns.lua b/lua/kickstart/plugins/gitsigns.lua index fa16f93..2b54f83 100644 --- a/lua/kickstart/plugins/gitsigns.lua +++ b/lua/kickstart/plugins/gitsigns.lua @@ -11,11 +11,14 @@ return { }, on_attach = function(bufnr) local gitsigns = require 'gitsigns' + local function map(mode, l, r, opts) opts = opts or {} opts.buffer = bufnr vim.keymap.set(mode, l, r, opts) end + + -- Navigation map('n', ']c', function() if vim.wo.diff then vim.cmd.normal { ']c', bang = true } @@ -23,6 +26,7 @@ return { gitsigns.nav_hunk 'next' end end, { desc = 'Jump to next git [c]hange' }) + map('n', '[c', function() if vim.wo.diff then vim.cmd.normal { '[c', bang = true } @@ -30,12 +34,16 @@ return { gitsigns.nav_hunk 'prev' end end, { desc = 'Jump to previous git [c]hange' }) + + -- Actions + -- visual mode map('v', 'hs', function() gitsigns.stage_hunk { vim.fn.line '.', vim.fn.line 'v' } end, { desc = 'stage git hunk' }) map('v', 'hr', function() gitsigns.reset_hunk { vim.fn.line '.', vim.fn.line 'v' } end, { desc = 'reset git hunk' }) + -- normal mode map('n', 'hs', gitsigns.stage_hunk, { desc = 'git [s]tage hunk' }) map('n', 'hr', gitsigns.reset_hunk, { desc = 'git [r]eset hunk' }) map('n', 'hS', gitsigns.stage_buffer, { desc = 'git [S]tage buffer' }) diff --git a/lua/kickstart/plugins/lint.lua b/lua/kickstart/plugins/lint.lua index 507a1e6..a46d852 100644 --- a/lua/kickstart/plugins/lint.lua +++ b/lua/kickstart/plugins/lint.lua @@ -4,11 +4,53 @@ return { event = { 'BufReadPre', 'BufNewFile' }, config = function() local lint = require 'lint' - lint.linters_by_ft = {} + lint.linters_by_ft = { + -- markdown = { 'markdownlint' }, + -- go = { 'golangcilint' }, + -- proto = { 'buf_lint' }, -- Крашит + } + + -- To allow other plugins to add linters to require('lint').linters_by_ft, + -- instead set linters_by_ft like this: + -- lint.linters_by_ft = lint.linters_by_ft or {} + -- lint.linters_by_ft['markdown'] = { 'markdownlint' } + -- + -- However, note that this will enable a set of default linters, + -- which will cause errors unless these tools are available: + -- { + -- clojure = { "clj-kondo" }, + -- dockerfile = { "hadolint" }, + -- inko = { "inko" }, + -- janet = { "janet" }, + -- json = { "jsonlint" }, + -- markdown = { "vale" }, + -- rst = { "vale" }, + -- ruby = { "ruby" }, + -- terraform = { "tflint" }, + -- text = { "vale" } + -- } + -- + -- You can disable the default linters by setting their filetypes to nil: + -- lint.linters_by_ft['clojure'] = nil + -- lint.linters_by_ft['dockerfile'] = nil + -- lint.linters_by_ft['inko'] = nil + -- lint.linters_by_ft['janet'] = nil + -- lint.linters_by_ft['json'] = nil + -- lint.linters_by_ft['markdown'] = nil + -- lint.linters_by_ft['rst'] = nil + -- lint.linters_by_ft['ruby'] = nil + -- lint.linters_by_ft['terraform'] = nil + -- lint.linters_by_ft['text'] = nil + + -- Create autocommand which carries out the actual linting + -- on the specified events. local lint_augroup = vim.api.nvim_create_augroup('lint', { clear = true }) vim.api.nvim_create_autocmd({ 'BufEnter', 'BufWritePost', 'InsertLeave' }, { group = lint_augroup, callback = function() + -- Only run the linter in buffers that you can modify in order to + -- avoid superfluous noise, notably within the handy LSP pop-ups that + -- describe the hovered symbol using Markdown. if vim.opt_local.modifiable:get() then lint.try_lint() end diff --git a/lua/kickstart/plugins/lsp.lua b/lua/kickstart/plugins/lsp.lua index 497bc19..06e27a3 100644 --- a/lua/kickstart/plugins/lsp.lua +++ b/lua/kickstart/plugins/lsp.lua @@ -1,22 +1,34 @@ +-- LSP Plugins + return { { + -- `lazydev` configures Lua LSP for your Neovim config, runtime and plugins + -- used for completion, annotations and signatures of Neovim apis 'folke/lazydev.nvim', ft = 'lua', opts = { library = { + -- Load luvit types when the `vim.uv` word is found { path = 'luvit-meta/library', words = { 'vim%.uv' } }, }, }, }, { 'Bilal2453/luvit-meta', lazy = true }, { + -- Main LSP Configuration 'neovim/nvim-lspconfig', dependencies = { - { 'williamboman/mason.nvim', config = true }, + -- Automatically install LSPs and related tools to stdpath for Neovim + { 'williamboman/mason.nvim', config = true }, -- NOTE: Must be loaded before dependants 'williamboman/mason-lspconfig.nvim', 'WhoIsSethDaniel/mason-tool-installer.nvim', + + -- Useful status updates for LSP. + -- NOTE: `opts = {}` is the same as calling `require('fidget').setup({})` { 'j-hui/fidget.nvim', opts = {} }, - 'hrsh7th/cmp-nvim-lsp', + + -- Allows extra capabilities provided by blink.cmp + 'saghen/blink.cmp', }, config = function() vim.api.nvim_create_autocmd('LspAttach', { @@ -26,28 +38,80 @@ return { mode = mode or 'n' vim.keymap.set(mode, keys, func, { buffer = event.buf, desc = 'LSP: ' .. desc }) end - map('gd', require('telescope.builtin').lsp_definitions, '[G]oto [D]efinition') - map('gr', require('telescope.builtin').lsp_references, '[G]oto [R]eferences') - map('gI', require('telescope.builtin').lsp_implementations, '[G]oto [I]mplementation') - map('D', require('telescope.builtin').lsp_type_definitions, 'Type [D]efinition') - map('ss', require('telescope.builtin').lsp_document_symbols, 'Document [S]ymbols') - map('ws', require('telescope.builtin').lsp_dynamic_workspace_symbols, '[W]orkspace [S]ymbols') - map('rn', vim.lsp.buf.rename, '[R]e[n]ame') - map('ca', vim.lsp.buf.code_action, '[C]ode [A]ction', { 'n', 'x' }) - map('gD', vim.lsp.buf.declaration, '[G]oto [D]eclaration') + + -- Rename the variable under your cursor. + -- Most Language Servers support renaming across files, etc. + map('grn', vim.lsp.buf.rename, '[R]e[n]ame') + + -- Execute a code action, usually your cursor needs to be on top of an error + -- or a suggestion from your LSP for this to activate. + map('gra', vim.lsp.buf.code_action, '[G]oto Code [A]ction', { 'n', 'x' }) + + -- Find references for the word under your cursor. + map('grr', require('telescope.builtin').lsp_references, '[G]oto [R]eferences') + + -- Jump to the implementation of the word under your cursor. + -- Useful when your language has ways of declaring types without an actual implementation. + map('gri', require('telescope.builtin').lsp_implementations, '[G]oto [I]mplementation') + + -- Jump to the definition of the word under your cursor. + -- This is where a variable was first declared, or where a function is defined, etc. + -- To jump back, press . + map('grd', require('telescope.builtin').lsp_definitions, '[G]oto [D]efinition') + + -- WARN: This is not Goto Definition, this is Goto Declaration. + -- For example, in C this would take you to the header. + map('grD', vim.lsp.buf.declaration, '[G]oto [D]eclaration') + + -- Fuzzy find all the symbols in your current document. + -- Symbols are things like variables, functions, types, etc. + map('gO', require('telescope.builtin').lsp_document_symbols, 'Open Document Symbols') + -- Было ds [D]ocument [S]ymbols + -- map('ss', require('telescope.builtin').lsp_document_symbols, 'Document [S]ymbols') + + -- Fuzzy find all the symbols in your current workspace. + -- Similar to document symbols, except searches over your entire project. + map('gW', require('telescope.builtin').lsp_dynamic_workspace_symbols, 'Open Workspace Symbols') + + -- Jump to the type of the word under your cursor. + -- Useful when you're not sure what type a variable is and you want to see + -- the definition of its *type*, not where it was *defined*. + map('grt', require('telescope.builtin').lsp_type_definitions, '[G]oto [T]ype Definition') + + -- This function resolves a difference between neovim nightly (version 0.11) and stable (version 0.10) + ---@param client vim.lsp.Client + ---@param method vim.lsp.protocol.Method + ---@param bufnr? integer some lsp support methods only in specific files + ---@return boolean + local function client_supports_method(client, method, bufnr) + if vim.fn.has 'nvim-0.11' == 1 then + return client:supports_method(method, bufnr) + else + return client.supports_method(method, { bufnr = bufnr }) + end + end + + -- The following two autocommands are used to highlight references of the + -- word under your cursor when your cursor rests there for a little while. + -- See `:help CursorHold` for information about when this is executed + -- + -- When you move your cursor, the highlights will be cleared (the second autocommand). local client = vim.lsp.get_client_by_id(event.data.client_id) - if client and client.supports_method(vim.lsp.protocol.Methods.textDocument_documentHighlight) then + -- if client and client.supports_method(vim.lsp.protocol.Methods.textDocument_documentHighlight) then + if client and client_supports_method(client, vim.lsp.protocol.Methods.textDocument_documentHighlight, event.buf) then local highlight_augroup = vim.api.nvim_create_augroup('kickstart-lsp-highlight', { clear = false }) vim.api.nvim_create_autocmd({ 'CursorHold', 'CursorHoldI' }, { buffer = event.buf, group = highlight_augroup, callback = vim.lsp.buf.document_highlight, }) + vim.api.nvim_create_autocmd({ 'CursorMoved', 'CursorMovedI' }, { buffer = event.buf, group = highlight_augroup, callback = vim.lsp.buf.clear_references, }) + vim.api.nvim_create_autocmd('LspDetach', { group = vim.api.nvim_create_augroup('kickstart-lsp-detach', { clear = true }), callback = function(event2) @@ -56,13 +120,21 @@ return { end, }) end - if client and client.supports_method(vim.lsp.protocol.Methods.textDocument_inlayHint) then + + -- The following code creates a keymap to toggle inlay hints in your + -- code, if the language server you are using supports them + -- + -- This may be unwanted, since they displace some of your code + -- if client and client.supports_method(vim.lsp.protocol.Methods.textDocument_inlayHint) then + if client and client_supports_method(client, vim.lsp.protocol.Methods.textDocument_inlayHint, event.buf) then map('th', function() vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled { bufnr = event.buf }) end, '[T]oggle Inlay [H]ints') end end, }) + + -- Change diagnostic symbols in the sign column (gutter) if vim.g.have_nerd_font then local signs = { ERROR = '', WARN = '', INFO = '', HINT = '' } local diagnostic_signs = {} @@ -71,9 +143,72 @@ return { end vim.diagnostic.config { signs = { text = diagnostic_signs } } end - local capabilities = vim.lsp.protocol.make_client_capabilities() - capabilities = vim.tbl_deep_extend('force', capabilities, require('cmp_nvim_lsp').default_capabilities()) + + -- LSP servers and clients are able to communicate to each other what features they support. + -- By default, Neovim doesn't support everything that is in the LSP specification. + -- When you add blink.cmp, luasnip, etc. Neovim now has *more* capabilities. + -- So, we create new capabilities with blink.cmp, and then broadcast that to the servers. + local capabilities = require('blink.cmp').get_lsp_capabilities() + + -- Enable the following language servers + -- Feel free to add/remove any LSPs that you want here. They will automatically be installed. + -- + -- Add any additional override configuration in the following tables. Available keys are: + -- - cmd (table): Override the default command used to start the server + -- - filetypes (table): Override the default list of associated filetypes for the server + -- - capabilities (table): Override fields in capabilities. Can be used to disable certain LSP features. + -- - on_attach (func): Функция, которая вызывается, когда LSP подключается к буферу + -- - settings (table): Override the default settings passed when initializing the server. + -- For example, to see the options for `lua_ls`, you could go to: https://luals.github.io/wiki/settings/ + local cap_css = vim.lsp.protocol.make_client_capabilities() + cap_css.textDocument.completion.completionItem.snippetSupport = true + local cap_html = vim.lsp.protocol.make_client_capabilities() + cap_html.textDocument.completion.completionItem.snippetSupport = true + local cap_json = vim.lsp.protocol.make_client_capabilities() + cap_json.textDocument.completion.completionItem.snippetSupport = true local servers = { + -- Golang + gopls = { + completion = { + unimported = false, + }, + }, + templ = {}, + + -- Frontend + tailwindcss = {}, + ts_ls = {}, + htmx = {}, + emmet_language_server = { + filetypes = { + 'templ', + 'css', + 'eruby', + 'html', + 'javascript', + 'javascriptreact', + 'less', + 'sass', + 'scss', + 'pug', + 'typescriptreact', + }, + }, + cssls = { + capabilities = cap_css, + }, + html = { + capabilities = cap_html, + on_attach = function(client, bufnr) + -- Отключаем форматирование для файлов .templ + local ft = vim.api.nvim_buf_get_option(bufnr, 'filetype') + if ft == 'templ' then + client.server_capabilities.documentFormattingProvider = false + end + end, + }, + + -- Lua lua_ls = { settings = { Lua = { @@ -83,20 +218,70 @@ return { }, }, }, - bashls = {}, + -- C/C++ + clangd = { + filetypes = { 'c', 'cpp', 'objc', 'objcpp', 'cuda' }, -- Удалил "proto" + }, + cmake = {}, + + -- Python + pyright = {}, + ruff = { + on_attach = function(client, bufnr) -- Выключить форматирование + client.server_capabilities.documentFormattingProvider = false + end, + }, + + -- Rust + rust_analyzer = {}, + + -- Bash + bashls = { + on_attach = function(client, bufnr) + local filename = vim.api.nvim_buf_get_name(bufnr) + if filename:match '/%.env$' or filename:match '/%.env%..+$' then + client.stop() -- отключить LSP только для .env + end + end, + }, + + -- JSON + jsonls = { + capabilities = cap_json, + }, + + -- Other taplo = {}, + vimls = {}, yamlls = {}, + protols = {}, } + + -- Ensure the servers and tools above are installed + -- To check the current status of installed tools and/or manually install + -- other tools, you can run + -- :Mason + -- + -- You can press `g?` for help in this menu. require('mason').setup() + + -- You can add other tools here that you want Mason to install + -- for you, so that they are available from within Neovim. local ensure_installed = vim.tbl_keys(servers or {}) vim.list_extend(ensure_installed, { 'stylua', -- Used to format Lua code }) require('mason-tool-installer').setup { ensure_installed = ensure_installed } + require('mason-lspconfig').setup { + ensure_installed = {}, -- explicitly set to an empty table (Kickstart populates installs via mason-tool-installer) + automatic_installation = false, handlers = { function(server_name) local server = servers[server_name] or {} + -- This handles overriding only values explicitly passed + -- by the server configuration above. Useful when disabling + -- certain features of an LSP (for example, turning off formatting for ts_ls) server.capabilities = vim.tbl_deep_extend('force', {}, capabilities, server.capabilities or {}) require('lspconfig')[server_name].setup(server) end, diff --git a/lua/kickstart/plugins/mini.lua b/lua/kickstart/plugins/mini.lua index 4179456..920623a 100644 --- a/lua/kickstart/plugins/mini.lua +++ b/lua/kickstart/plugins/mini.lua @@ -2,24 +2,61 @@ return { { 'echasnovski/mini.nvim', config = function() + -- Better Around/Inside textobjects + -- + -- Examples: + -- - va) - [V]isually select [A]round [)]paren + -- - yinq - [Y]ank [I]nside [N]ext [Q]uote + -- - ci' - [C]hange [I]nside [']quote require('mini.ai').setup { n_lines = 500 } + + -- Add/delete/replace surroundings (brackets, quotes, etc.) + -- + -- - saiw) - [S]urround [A]dd [I]nner [W]ord [)]Paren + -- - sd' - [S]urround [D]elete [']quotes + -- - sr)' - [S]urround [R]eplace [)] ['] require('mini.surround').setup() + + -- Sessions require('mini.sessions').setup { + -- Whether to read default session if Neovim opened without file arguments autoread = false, + + -- Whether to write currently read session before quitting Neovim autowrite = false, + + -- Whether to force possibly harmful actions (meaning depends on function) force = { read = false, write = true, delete = true }, + + -- Hook functions for actions. Default `nil` means 'do nothing'. hooks = { + -- Before successful action pre = { read = nil, write = nil, delete = nil }, + -- After successful action post = { read = nil, write = nil, delete = nil }, }, + + -- Whether to print session path after action verbose = { read = false, write = true, delete = true }, } + + -- Simple and easy statusline. + -- You could remove this setup call if you don't like it, + -- and try some other statusline plugin local statusline = require 'mini.statusline' + -- set use_icons to true if you have a Nerd Font statusline.setup { use_icons = vim.g.have_nerd_font } + + -- You can configure sections in the statusline by overriding their + -- default behavior. For example, here we set the section for + -- cursor location to LINE:COLUMN ---@diagnostic disable-next-line: duplicate-set-field statusline.section_location = function() return '%2l:%-2v' end + + -- ... and there is more! + -- Check out: https://github.com/echasnovski/mini.nvim end, }, } diff --git a/lua/kickstart/plugins/telescope.lua b/lua/kickstart/plugins/telescope.lua index 964cbfd..4b21dd7 100644 --- a/lua/kickstart/plugins/telescope.lua +++ b/lua/kickstart/plugins/telescope.lua @@ -2,24 +2,60 @@ return { { 'nvim-telescope/telescope.nvim', event = 'VimEnter', - branch = '0.1.x', dependencies = { 'nvim-lua/plenary.nvim', - { + { -- If encountering errors, see telescope-fzf-native README for installation instructions 'nvim-telescope/telescope-fzf-native.nvim', + + -- `build` is used to run some command when the plugin is installed/updated. + -- This is only run then, not every time Neovim starts up. build = 'make', + + -- `cond` is a condition used to determine whether this plugin should be + -- installed and loaded. cond = function() return vim.fn.executable 'make' == 1 end, }, { 'nvim-telescope/telescope-ui-select.nvim' }, + + -- Useful for getting pretty icons, but requires a Nerd Font. { 'nvim-tree/nvim-web-devicons', enabled = vim.g.have_nerd_font }, }, config = function() + -- Telescope is a fuzzy finder that comes with a lot of different things that + -- it can fuzzy find! It's more than just a "file finder", it can search + -- many different aspects of Neovim, your workspace, LSP, and more! + -- + -- The easiest way to use Telescope, is to start by doing something like: + -- :Telescope help_tags + -- + -- After running this command, a window will open up and you're able to + -- type in the prompt window. You'll see a list of `help_tags` options and + -- a corresponding preview of the help. + -- + -- Two important keymaps to use while in Telescope are: + -- - Insert mode: + -- - Normal mode: ? + -- + -- This opens a window that shows you all of the keymaps for the current + -- Telescope picker. This is really useful to discover what Telescope can + -- do as well as how to actually do it! + + -- [[ Configure Telescope ]] + -- See `:help telescope` and `:help telescope.setup()` require('telescope').setup { + -- You can put your default mappings / updates / etc. in here + -- All the info you're looking for is in `:help telescope.setup()` + -- + -- defaults = { + -- mappings = { + -- i = { [''] = 'to_fuzzy_refine' }, + -- }, + -- }, pickers = { colorscheme = { - enable_preview = true, + enable_preview = true, -- Themes preview }, }, extensions = { @@ -28,8 +64,12 @@ return { }, }, } + + -- Enable Telescope extensions if they are installed pcall(require('telescope').load_extension, 'fzf') pcall(require('telescope').load_extension, 'ui-select') + + -- See `:help telescope.builtin` local builtin = require 'telescope.builtin' vim.keymap.set('n', 'sh', builtin.help_tags, { desc = '[S]earch [H]elp' }) vim.keymap.set('n', 'sk', builtin.keymaps, { desc = '[S]earch [K]eymaps' }) @@ -42,19 +82,28 @@ return { vim.keymap.set('n', 's.', builtin.oldfiles, { desc = '[S]earch Recent Files ("." for repeat)' }) vim.keymap.set('n', '', function() builtin.buffers { sort_mru = true, ignore_current_buffer = true } - end, { desc = '[ ] Find etisting buffers' }) + end, { desc = '[ ] Find existing buffers' }) vim.keymap.set('n', 'st', ':Telescope colorscheme', { desc = '[S]earch [T]hemes' }) + + -- Slightly advanced example of overriding default behavior and theme vim.keymap.set('n', '/', function() + -- You can pass additional configuration to Telescope to change the theme, layout, etc. builtin.current_buffer_fuzzy_find(require('telescope.themes').get_dropdown { + -- winblend = 10, previewer = false, }) end, { desc = '[/] Fuzzily search in current buffer' }) + + -- It's also possible to pass additional configuration options. + -- See `:help telescope.builtin.live_grep()` for information about particular keys vim.keymap.set('n', 's/', function() builtin.live_grep { grep_open_files = true, prompt_title = 'Live Grep in Open Files', } end, { desc = '[S]earch [/] in Open Files' }) + + -- Shortcut for searching your Neovim configuration files vim.keymap.set('n', 'sn', function() builtin.find_files { cwd = vim.fn.stdpath 'config' } end, { desc = '[S]earch [N]eovim files' }) diff --git a/lua/kickstart/plugins/themes.lua b/lua/kickstart/plugins/themes.lua index 46aa231..2974dc9 100644 --- a/lua/kickstart/plugins/themes.lua +++ b/lua/kickstart/plugins/themes.lua @@ -1,4 +1,83 @@ +-- You can easily change to a different colorscheme. +-- If you want to see what colorschemes are already installed, you can use `:Telescope colorscheme`. + +-- Чтоб сменить стандартную тему, надо раскомментировать vim.cmd.colorscheme под именем темы +-- и закомментировать это же у прошлой темы + +-- В lazy.nvim параметр priority определяет порядок загрузки плагинов. +-- Чем выше значение priority, тем раньше загружается плагин. +-- Это особенно важно для тем, поскольку они часто требуют загрузки до других плагинов, +-- чтобы корректно применить стили. + +-- https://dotfyle.com/neovim/colorscheme/top + return { + { + 'folke/tokyonight.nvim', + priority = 1000, + init = function() + -- 'tokyonight-storm', 'tokyonight-moon', 'tokyonight-day', 'tokyonight-night' + -- vim.cmd.colorscheme 'tokyonight-night' + vim.cmd.hi 'Comment gui=none' -- Убрать курсив у коммента в коде + end, + }, + { + 'rose-pine/neovim', + name = 'rose-pine', + priority = 1000, + init = function() + -- 'rose-pine-moon', 'rose-pine-main', 'rose-pine-dawn' + -- vim.cmd.colorscheme 'rose-pine-main' + end, + }, + { + 'loctvl842/monokai-pro.nvim', + priority = 1000, + config = function() + -- 'monokai-pro', 'monokai-pro-classic', 'monokai-pro-default', 'monokai-pro-machine', + -- 'monokai-pro-octagon', 'monokai-pro-spectrum', 'monokai-pro-ristretto' + -- vim.cmd.colorscheme 'monokai-pro' + end, + }, + { + 'catppuccin/nvim', + name = 'catppuccin', + priority = 1000, + config = function() + -- 'catppuccin', 'catppuccin-latte', 'catppuccin-frappe', + -- 'catppuccin-macchiato', 'catppuccin-mocha' + -- vim.cmd.colorscheme 'catppuccin' + end, + }, + { + 'rebelot/kanagawa.nvim', + priority = 1000, + config = function() + -- 'kanagawa-wave', 'kanagawa-dragon', 'kanagawa-lotus', + -- vim.cmd.colorscheme 'kanagawa-dragon' + end, + }, + { + 'EdenEast/nightfox.nvim', + priority = 1000, + config = function() + -- 'nightfox', 'dayfox', 'dawnfox', 'duskfox' + -- 'nordfox', 'terafox', 'carbonfox' + -- vim.cmd.colorscheme 'carbonfox' + end, + }, + { + 'AlexvZyl/nordic.nvim', + priority = 1000, + config = function() + -- vim.cmd.colorscheme 'nordic' + end, + }, + + ---------------------------------------------------------- + -- Не дают выбрать тему нормально -- + -- Приходится конфиг переписывать ради выбора расцветок -- + ---------------------------------------------------------- { 'ellisonleao/gruvbox.nvim', priority = 1000, @@ -53,4 +132,38 @@ return { vim.cmd.colorscheme 'gruvbox' end, }, + { + 'sainnhe/everforest', + priority = 1000, + init = function() + -- 'hard', 'medium', 'soft' + vim.g.everforest_background = 'hard' + vim.g.everforest_better_performance = 1 + -- vim.g.everforest_enable_italic = true + -- vim.cmd.colorscheme 'everforest' + end, + }, + { + 'sainnhe/sonokai', + priority = 1000, + init = function() + -- Очень разные темы + -- 'default', 'atlantis', 'andromeda', 'shusia', 'maia', 'espresso' + vim.g.sonokai_style = 'shusia' + vim.g.sonokai_better_performance = 1 + -- vim.g.sonokai_enable_italic = true + -- vim.cmd.colorscheme 'sonokai' + end, + }, + { + 'sainnhe/edge', + priority = 1000, + init = function() + -- 'default', 'aura', 'neon' + vim.g.edge_style = 'default' + vim.g.edge_better_performance = 1 + -- vim.g.edge_enable_italic = true + -- vim.cmd.colorscheme 'edge' + end, + }, } diff --git a/lua/kickstart/plugins/treesitter.lua b/lua/kickstart/plugins/treesitter.lua index 325df5c..0c80789 100644 --- a/lua/kickstart/plugins/treesitter.lua +++ b/lua/kickstart/plugins/treesitter.lua @@ -8,30 +8,39 @@ return { 'nvim-treesitter/nvim-treesitter-context', config = function() require('treesitter-context').setup { - enable = true, - multiwindow = false, - max_lines = 0, - min_window_height = 0, + enable = true, -- Enable this plugin (Can be enabled/disabled later via commands) + multiwindow = false, -- Enable multiwindow support. + max_lines = 0, -- How many lines the window should span. Values <= 0 mean no limit. + min_window_height = 0, -- Minimum editor window height to enable context. Values <= 0 mean no limit. line_numbers = true, - multiline_threshold = 3, - trim_scope = 'outer', - mode = 'cursor', + multiline_threshold = 3, -- Maximum number of lines to show for a single context + trim_scope = 'outer', -- Which context lines to discard if `max_lines` is exceeded. Choices: 'inner', 'outer' + mode = 'cursor', -- Line used to calculate context. Choices: 'cursor', 'topline' + -- Separator between context and content. Should be a single character string, like '-'. + -- When separator is set, the context will only show up when there are at least 2 lines above cursorline. separator = nil, - zindex = 20, - on_attach = nil, + zindex = 20, -- The Z-index of the context window + on_attach = nil, -- (fun(buf: integer): boolean) return false to disable attaching } vim.keymap.set('n', 'gp', function() require('treesitter-context').go_to_context(vim.v.count1) end, { silent = true, desc = '[G]oto context ([P]arent)' }) end, }, + -- { + -- 'nvim-treesitter/nvim-treesitter-textobjects', + -- }, }, build = ':TSUpdate', - main = 'nvim-treesitter.configs', + main = 'nvim-treesitter.configs', -- Sets main module to use for opts + -- [[ Configure Treesitter ]] See `:help nvim-treesitter` opts = { ensure_installed = { 'bash', + 'c', + 'cpp', 'diff', + 'html', 'lua', 'luadoc', 'markdown', @@ -39,19 +48,38 @@ return { 'query', 'vim', 'vimdoc', + 'css', + 'javascript', + 'typescript', 'json', 'csv', + 'go', + 'nix', + 'python', + 'rust', + 'sql', + 'templ', 'toml', 'yaml', 'cmake', 'printf', }, + -- Autoinstall languages that are not installed auto_install = true, highlight = { enable = true, + -- Some languages depend on vim's regex highlighting system (such as Ruby) for indent rules. + -- If you are experiencing weird indenting issues, add the language to + -- the list of additional_vim_regex_highlighting and disabled languages for indent. additional_vim_regex_highlighting = { 'ruby' }, }, indent = { enable = true, disable = { 'ruby' } }, }, + -- There are additional nvim-treesitter modules that you can use to interact + -- with nvim-treesitter. You should go explore a few and see what interests you: + -- + -- - Incremental selection: Included, see `:help nvim-treesitter-incremental-selection-mod` + -- - Show your current context: https://github.com/nvim-treesitter/nvim-treesitter-context + -- - Treesitter + textobjects: https://github.com/nvim-treesitter/nvim-treesitter-textobjects }, } diff --git a/lua/kickstart/plugins/which-key.lua b/lua/kickstart/plugins/which-key.lua index 8bcb4be..4a67b59 100644 --- a/lua/kickstart/plugins/which-key.lua +++ b/lua/kickstart/plugins/which-key.lua @@ -1,10 +1,13 @@ return { { 'folke/which-key.nvim', - event = 'VimEnter', + event = 'VimEnter', -- Sets the loading event to 'VimEnter' opts = { icons = { + -- set icon mappings to true if you have a Nerd Font mappings = vim.g.have_nerd_font, + -- If you are using a Nerd Font: set icons.keys to an empty table which will use the + -- default which-key.nvim defined Nerd Font icons, otherwise define a string table keys = vim.g.have_nerd_font and {} or { Up = ' ', Down = ' ', @@ -37,12 +40,14 @@ return { }, }, + -- Document existing key chains spec = { - { 'c', group = '[C]ode', mode = { 'n', 'x' } }, - { 'r', group = '[R]ename' }, + -- { 'c', group = '[C]ode', mode = { 'n', 'x' } }, + -- { 'd', group = '[D]ocument' }, + -- { 'r', group = '[R]ename' }, { 's', group = '[S]earch' }, { 'S', group = '[S]ession' }, - { 'w', group = '[W]orkspace' }, + -- { 'w', group = '[W]orkspace' }, { 't', group = '[T]oggle' }, { 'g', group = '[G]olang' }, { 'gt', group = '[G]olang [T]ag' }, diff --git a/lua/kickstart/settings.lua b/lua/kickstart/settings.lua index 2eefd81..503ffd1 100644 --- a/lua/kickstart/settings.lua +++ b/lua/kickstart/settings.lua @@ -1,57 +1,202 @@ +-- Set as the leader key +-- See `:help mapleader` +-- NOTE: Must happen before plugins are loaded (otherwise wrong leader will be used) vim.g.mapleader = ' ' vim.g.maplocalleader = ' ' + +-- Set to true if you have a Nerd Font installed and selected in the terminal vim.g.have_nerd_font = true + +-- [[ Setting options ]] +-- See `:help vim.opt` +-- NOTE: You can change these options as you wish! +-- For more options, you can see `:help option-list` + +-- Make line numbers default vim.opt.number = true +-- You can also add relative line numbers, to help with jumping. vim.opt.relativenumber = true + +-- Табуляция в 4 символа vim.opt.tabstop = 4 vim.opt.shiftwidth = 4 vim.opt.softtabstop = 4 +-- Юзать пробелы вместо табов vim.opt.expandtab = true + +-- yaml lsp за меня решают сколько пробелов мне надо. Это фикс +-- Их параметры конфига для переназначения не работают. Пришлось костыль сделать vim.cmd [[ - autocmd FileType yaml setlocal shiftwidth=4 tabstop=4 softtabstop=4 expandtab + autocmd FileType yaml setlocal shiftwidth=2 tabstop=2 softtabstop=2 expandtab ]] + +-- Комментировать .proto код биндом +vim.api.nvim_create_autocmd('FileType', { + pattern = 'proto', + callback = function() + vim.bo.commentstring = '// %s' + end, +}) +-- Комментировать .sql код биндом +vim.api.nvim_create_autocmd('FileType', { + pattern = 'sql', + callback = function() + vim.bo.commentstring = '-- %s' + end, +}) + +-- Fix .sqlfluff highlight +vim.api.nvim_create_autocmd({ 'BufRead', 'BufNewFile' }, { + pattern = '*.sqlfluff', + command = 'set filetype=toml', +}) + +-- Disable netrw for file tree +vim.g.loaded_netrw = 1 +vim.g.loaded_netrwPlugin = 1 +-- optionally enable 24-bit colour +-- vim.opt.termguicolors = true + +-- Enable mouse mode, can be useful for resizing splits for example! vim.opt.mouse = 'a' + +-- Don't show the mode, since it's already in the status line vim.opt.showmode = false + +-- greatest remap ever vim.keymap.set('x', 'p', '"_dP', { desc = '[P]aste' }) + +-- Sync clipboard between OS and Neovim. +-- Schedule the setting after `UiEnter` because it can increase startup-time. +-- Remove this option if you want your OS clipboard to remain independent. +-- See `:help 'clipboard'` +-- vim.schedule(function() +-- vim.opt.clipboard = 'unnamedplus' +-- end) + +-- Use system clipboard via y/d, but Neovim clipboard via just y/d vim.keymap.set('n', 'y', '"+y', { desc = '[Y]ank to system clipboard' }) vim.keymap.set('v', 'y', '"+y', { desc = '[Y]ank to system clipboard' }) +-- vim.keymap.set('n', 'Y', '"+Y', { desc = '[Y]ank to system clipboard' }) vim.keymap.set('n', 'd', '"+d', { desc = '[D]elete to system clipboard' }) vim.keymap.set('v', 'd', '"+d', { desc = '[D]elete to system clipboard' }) + +-- Change `K` hover documentation size vim.lsp.handlers['textDocument/hover'] = vim.lsp.with(vim.lsp.handlers.hover, { + -- border = 'rounded', max_width = 80, + -- max_height = 15, }) + +-- Move lines in visual mode vim.keymap.set('v', '', ":m '>+1gv=gv") vim.keymap.set('v', '', ":m '>+1gv=gv") vim.keymap.set('v', '', ":m '<-2gv=gv") vim.keymap.set('v', '', ":m '<-2gv=gv") + +-- Enable break indent vim.opt.breakindent = true + +-- Save undo history vim.opt.undofile = true + +-- Disable swap file vim.opt.swapfile = false + +-- Settings for sessions vim.o.sessionoptions = 'blank,buffers,curdir,folds,help,tabpages,winsize,winpos,terminal,localoptions' + +-- Highlight a vertical line at the specified column to encourage keeping lines within this limit vim.opt.colorcolumn = '100' + +-- Case-insensitive searching UNLESS \C or one or more capital letters in the search term vim.opt.ignorecase = true vim.opt.smartcase = true + +-- Keep signcolumn on by default vim.opt.signcolumn = 'yes' + +-- Decrease update time vim.opt.updatetime = 250 + +-- Decrease mapped sequence wait time +-- Displays which-key popup sooner vim.opt.timeoutlen = 300 + +-- Configure how new splits should be opened vim.opt.splitright = true vim.opt.splitbelow = true + +-- Sets how neovim will display certain whitespace characters in the editor. +-- See `:help 'list'` +-- and `:help 'listchars'` vim.opt.list = true vim.opt.listchars = { tab = '» ', trail = '·', nbsp = '␣' } + +-- Preview substitutions live, as you type! vim.opt.inccommand = 'split' + +-- Show which line your cursor is on vim.opt.cursorline = true + +-- Minimal number of screen lines to keep above and below the cursor. vim.opt.scrolloff = 10 + +-- if performing an operation that would fail due to unsaved changes in the buffer (like `:q`), +-- instead raise a dialog asking if you wish to save the current file(s) +-- See `:help 'confirm'` +-- vim.opt.confirm = true + +-- [[ Basic Keymaps ]] +-- See `:help vim.keymap.set()` + +-- Clear highlights on search when pressing in normal mode +-- See `:help hlsearch` vim.keymap.set('n', '', 'nohlsearch') + +-- Diagnostic keymaps vim.keymap.set('n', 'q', vim.diagnostic.setloclist, { desc = 'Open diagnostic [Q]uickfix list' }) + +-- Exit terminal mode in the builtin terminal with a shortcut that is a bit easier +-- for people to discover. Otherwise, you normally need to press , which +-- is not what someone will guess without a bit more experience. +-- +-- NOTE: This won't work in all terminal emulators/tmux/etc. Try your own mapping +-- or just use to exit terminal mode vim.keymap.set('t', '', '', { desc = 'Exit terminal mode' }) + +-- TIP: Disable arrow keys in normal mode +-- vim.keymap.set('n', '', 'echo "Use h to move!!"') +-- vim.keymap.set('n', '', 'echo "Use l to move!!"') +-- vim.keymap.set('n', '', 'echo "Use k to move!!"') +-- vim.keymap.set('n', '', 'echo "Use j to move!!"') + +-- Keybinds to make split navigation easier. +-- Use CTRL+ to switch between windows +-- +-- See `:help wincmd` for a list of all window commands vim.keymap.set('n', '', '', { desc = 'Move focus to the left window' }) vim.keymap.set('n', '', '', { desc = 'Move focus to the right window' }) vim.keymap.set('n', '', '', { desc = 'Move focus to the lower window' }) vim.keymap.set('n', '', '', { desc = 'Move focus to the upper window' }) +-- Use CTRL+arrows to switch between windows vim.keymap.set('n', '', '', { desc = 'Move focus to the left window' }) vim.keymap.set('n', '', '', { desc = 'Move focus to the right window' }) vim.keymap.set('n', '', '', { desc = 'Move focus to the lower window' }) vim.keymap.set('n', '', '', { desc = 'Move focus to the upper window' }) + +-- NOTE: Some terminals have colliding keymaps or are not able to send distinct keycodes +-- vim.keymap.set("n", "", "H", { desc = "Move window to the left" }) +-- vim.keymap.set("n", "", "L", { desc = "Move window to the right" }) +-- vim.keymap.set("n", "", "J", { desc = "Move window to the lower" }) +-- vim.keymap.set("n", "", "K", { desc = "Move window to the upper" }) + +-- [[ Basic Autocommands ]] +-- See `:help lua-guide-autocommands` + +-- Highlight when yanking (copying) text +-- Try it with `yap` in normal mode +-- See `:help vim.highlight.on_yank()` vim.api.nvim_create_autocmd('TextYankPost', { desc = 'Highlight when yanking (copying) text', group = vim.api.nvim_create_augroup('kickstart-highlight-yank', { clear = true }),