diff --git a/nvim/ftplugin/proto.lua b/nvim/ftplugin/proto.lua new file mode 100644 index 0000000..55de27d --- /dev/null +++ b/nvim/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/nvim/init.lua b/nvim/init.lua index bab56e1..6df1593 100644 --- a/nvim/init.lua +++ b/nvim/init.lua @@ -1,6 +1,7 @@ -- [[ Базовые настройки. Не плагины ]] 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 @@ -87,9 +88,6 @@ require('lazy').setup({ -- Feature-Rich Go Plugin for Neovim require 'custom.plugins.golang', - -- Automated session manager - require 'custom.plugins.sessions', - -- Plugins for git require 'custom.plugins.git', diff --git a/nvim/lazy-lock.json b/nvim/lazy-lock.json index a93642c..dd7d15b 100644 --- a/nvim/lazy-lock.json +++ b/nvim/lazy-lock.json @@ -1,57 +1,56 @@ { "LuaSnip": { "branch": "master", "commit": "c9b9a22904c97d0eb69ccb9bab76037838326817" }, - "auto-session": { "branch": "main", "commit": "021b64ed7d4ac68a37be3ad28d8e1cba5bec582c" }, - "catppuccin": { "branch": "main", "commit": "f67b886d65a029f12ffa298701fb8f1efd89295d" }, + "catppuccin": { "branch": "main", "commit": "5b5e3aef9ad7af84f463d17b5479f06b87d5c429" }, "cmp-nvim-lsp": { "branch": "main", "commit": "99290b3ec1322070bcfb9e846450a46f6efa50f0" }, "cmp-path": { "branch": "main", "commit": "91ff86cd9c29299a64f968ebb45846c485725f23" }, "cmp_luasnip": { "branch": "master", "commit": "98d9cb5c2c38532bd9bdb481067b20fea8f32e90" }, - "conform.nvim": { "branch": "master", "commit": "70019124aa4f2e6838be9fbd2007f6d13b27a96d" }, + "conform.nvim": { "branch": "master", "commit": "db8a4a9edb217067b1d7a2e0362c74bfe9cc944d" }, "diffview.nvim": { "branch": "main", "commit": "4516612fe98ff56ae0415a259ff6361a89419b0a" }, - "edge": { "branch": "master", "commit": "12ff979b43e3660053e14cd65101d5928e56f422" }, - "everforest": { "branch": "master", "commit": "84fbfc99c9853408682f104063a7ef4465dae46a" }, - "fidget.nvim": { "branch": "main", "commit": "9238947645ce17d96f30842e61ba81147185b657" }, + "edge": { "branch": "master", "commit": "04b2e25fa08b81e071ad512bdec6e5af114b01b3" }, + "everforest": { "branch": "master", "commit": "29d1f4f8b63dc91db277e977068f912939c8cae8" }, + "fidget.nvim": { "branch": "main", "commit": "d9ba6b7bfe29b3119a610892af67602641da778e" }, "friendly-snippets": { "branch": "main", "commit": "efff286dd74c22f731cdec26a70b46e5b203c619" }, - "gitsigns.nvim": { "branch": "main", "commit": "5f808b5e4fef30bd8aca1b803b4e555da07fc412" }, - "go.nvim": { "branch": "master", "commit": "c6d5ca26377d01c4de1f7bff1cd62c8b43baa6bc" }, - "gruvbox-material": { "branch": "master", "commit": "e41451337d33997aff4c078a83165a9f66e2d38d" }, - "gruvbox.nvim": { "branch": "main", "commit": "68c3460a5d1d1a362318960035c9f3466d5011f5" }, + "gitsigns.nvim": { "branch": "main", "commit": "4c40357994f386e72be92a46f41fc1664c84c87d" }, + "go.nvim": { "branch": "master", "commit": "6ad080424f4b96a584cf591721e8e13c102cce4e" }, + "gruvbox-material": { "branch": "master", "commit": "146f40fd42cbef30fed69b4ef51329aeeaceb909" }, + "gruvbox.nvim": { "branch": "main", "commit": "15958f5ee43e144856cd2084ce6c571bfdb44504" }, "guihua.lua": { "branch": "master", "commit": "d783191eaa75215beae0c80319fcce5e6b3beeda" }, - "image.nvim": { "branch": "master", "commit": "f1163cc2f6fff5b0de7c23c7502eee0df23a3e0e" }, - "indent-blankline.nvim": { "branch": "master", "commit": "259357fa4097e232730341fa60988087d189193a" }, - "kanagawa.nvim": { "branch": "master", "commit": "18ae5771b22d8f913ef541c827a8180b4cb12c8a" }, - "lazy.nvim": { "branch": "main", "commit": "7e6c863bc7563efbdd757a310d17ebc95166cef3" }, - "lazydev.nvim": { "branch": "main", "commit": "8620f82ee3f59ff2187647167b6b47387a13a018" }, - "luvit-meta": { "branch": "main", "commit": "55709f183b0742a7e4f47688c284f81148ad4dc0" }, - "markdown-table-mode.nvim": { "branch": "main", "commit": "870d0449c1c78c673faa9637a63036f9537b4caa" }, - "mason-lspconfig.nvim": { "branch": "main", "commit": "97d9f1d3ad205dece6bcafd1d71cf1507608f3c7" }, - "mason-nvim-dap.nvim": { "branch": "main", "commit": "8b9363d83b5d779813cdd2819b8308651cec2a09" }, - "mason-tool-installer.nvim": { "branch": "main", "commit": "c5e07b8ff54187716334d585db34282e46fa2932" }, - "mason.nvim": { "branch": "main", "commit": "e2f7f9044ec30067bc11800a9e266664b88cda22" }, - "mini.nvim": { "branch": "main", "commit": "b1af49d98233180c6045e81f4aef5b663d032b62" }, - "monokai-pro.nvim": { "branch": "master", "commit": "6c15e36834a624a32f46c6db8f9fc063995b24b6" }, - "neo-tree.nvim": { "branch": "main", "commit": "a77af2e764c5ed4038d27d1c463fa49cd4794e07" }, - "nightfox.nvim": { "branch": "main", "commit": "595ffb8f291fc4a9bef3201a28b7c0379a41cdee" }, - "nordic.nvim": { "branch": "main", "commit": "1ee4044077059b34eacd18d93613495a602c131f" }, - "nui.nvim": { "branch": "main", "commit": "53e907ffe5eedebdca1cd503b00aa8692068ca46" }, - "nvim-autopairs": { "branch": "master", "commit": "b464658e9b880f463b9f7e6ccddd93fb0013f559" }, - "nvim-cmp": { "branch": "main", "commit": "8c82d0bd31299dbff7f8e780f5e06d2283de9678" }, - "nvim-dap": { "branch": "master", "commit": "0e673accbb512e1e191dfb4fecea89cc38c1bcdd" }, - "nvim-dap-go": { "branch": "main", "commit": "6aa88167ea1224bcef578e8c7160fe8afbb44848" }, - "nvim-dap-ui": { "branch": "master", "commit": "e94d98649dccb6a3884b66aabc2e07beb279e535" }, - "nvim-lint": { "branch": "master", "commit": "dfa45de973c3ce7bd1b9a6d346f896a68ad07e44" }, - "nvim-lspconfig": { "branch": "master", "commit": "8121483b8132b7053120fafd83728178fb3febf6" }, - "nvim-nio": { "branch": "master", "commit": "a428f309119086dc78dd4b19306d2d67be884eee" }, - "nvim-treesitter": { "branch": "master", "commit": "622a4a6ba76d1de52b72a965159213ae655b4ac7" }, - "nvim-treesitter-context": { "branch": "master", "commit": "d0dd7ce5a9d0be1f28086e818e52fdc5c78975df" }, - "nvim-web-devicons": { "branch": "master", "commit": "5740b7382429d20b6ed0bbdb0694185af9507d44" }, - "plenary.nvim": { "branch": "master", "commit": "2d9b06177a975543726ce5c73fca176cedbffe9d" }, - "rose-pine": { "branch": "main", "commit": "91548dca53b36dbb9d36c10f114385f759731be1" }, - "rustaceanvim": { "branch": "master", "commit": "0a1876b970ab946be3f4d341e9d743a5d62d646a" }, - "sonokai": { "branch": "master", "commit": "836ad3994d3d0eaea68126cabddf6319508584e8" }, - "telescope-fzf-native.nvim": { "branch": "main", "commit": "dae2eac9d91464448b584c7949a31df8faefec56" }, + "image.nvim": { "branch": "master", "commit": "6ffafab2e98b5bda46bf227055aa84b90add8cdc" }, + "indent-blankline.nvim": { "branch": "master", "commit": "e10626f7fcd51ccd56d7ffc00883ba7e0aa28f78" }, + "kanagawa.nvim": { "branch": "master", "commit": "cfd67b0e1eeaa04302b8c7eb072253d24bf22d84" }, + "lazy.nvim": { "branch": "main", "commit": "6c3bda4aca61a13a9c63f1c1d1b16b9d3be90d7a" }, + "lazydev.nvim": { "branch": "main", "commit": "2367a6c0a01eb9edb0464731cc0fb61ed9ab9d2c" }, + "luvit-meta": { "branch": "main", "commit": "1df30b60b1b4aecfebc785aa98943db6c6989716" }, + "markdown-table-mode.nvim": { "branch": "main", "commit": "fe207ea7cef615ccaf2c0f1257c58ffa0a50a9f5" }, + "mason-lspconfig.nvim": { "branch": "main", "commit": "1a31f824b9cd5bc6f342fc29e9a53b60d74af245" }, + "mason-nvim-dap.nvim": { "branch": "main", "commit": "09220b99d63d5363f219daa2785242ee5fddba7f" }, + "mason-tool-installer.nvim": { "branch": "main", "commit": "5639d58a3d11ff7c05c8e31e159bfedae55d7961" }, + "mason.nvim": { "branch": "main", "commit": "fc98833b6da5de5a9c5b1446ac541577059555be" }, + "mini.nvim": { "branch": "main", "commit": "f6fe169821506a59b2407e3c7a3327562600e0e3" }, + "monokai-pro.nvim": { "branch": "master", "commit": "872f774303f79416000e8049630052f4124d9534" }, + "neo-tree.nvim": { "branch": "main", "commit": "16854ed5559b940f69a6f7138906ebb22c15c553" }, + "nightfox.nvim": { "branch": "main", "commit": "ba47d4b4c5ec308718641ba7402c143836f35aa9" }, + "nordic.nvim": { "branch": "main", "commit": "62acfd4eb008153180670daf81874eb47dd37739" }, + "nui.nvim": { "branch": "main", "commit": "8d3bce9764e627b62b07424e0df77f680d47ffdb" }, + "nvim-autopairs": { "branch": "master", "commit": "68f0e5c3dab23261a945272032ee6700af86227a" }, + "nvim-cmp": { "branch": "main", "commit": "c27370703e798666486e3064b64d59eaf4bdc6d5" }, + "nvim-dap": { "branch": "master", "commit": "8228cb00ab0850e483f8d58cc39cc580c05738d6" }, + "nvim-dap-go": { "branch": "main", "commit": "8763ced35b19c8dc526e04a70ab07c34e11ad064" }, + "nvim-dap-ui": { "branch": "master", "commit": "bc81f8d3440aede116f821114547a476b082b319" }, + "nvim-lint": { "branch": "master", "commit": "6e9dd545a1af204c4022a8fcd99727ea41ffdcc8" }, + "nvim-lspconfig": { "branch": "master", "commit": "fd26f8626c03b424f7140d454031d1dcb8d23513" }, + "nvim-nio": { "branch": "master", "commit": "21f5324bfac14e22ba26553caf69ec76ae8a7662" }, + "nvim-treesitter": { "branch": "master", "commit": "ffd284c4706d91c0d94916995f584b22ce89afcb" }, + "nvim-treesitter-context": { "branch": "master", "commit": "198720b4016af04c9590f375d714d5bf8afecc1a" }, + "nvim-web-devicons": { "branch": "master", "commit": "ab4cfee554e501f497bce0856788d43cf2eb93d7" }, + "plenary.nvim": { "branch": "master", "commit": "857c5ac632080dba10aae49dba902ce3abf91b35" }, + "rose-pine": { "branch": "main", "commit": "7718965bdd1526b233f082da17e88b8bde7a7e6e" }, + "rustaceanvim": { "branch": "master", "commit": "2b0f0b7e03751cf8ed123322f9b02d8f73fa9df7" }, + "sonokai": { "branch": "master", "commit": "9679341d4141ed81376f2bdf5e69b78dc348d212" }, + "telescope-fzf-native.nvim": { "branch": "main", "commit": "2a5ceff981501cff8f46871d5402cd3378a8ab6a" }, "telescope-ui-select.nvim": { "branch": "master", "commit": "6e51d7da30bd139a6950adf2a47fda6df9fa06d2" }, "telescope.nvim": { "branch": "0.1.x", "commit": "a0bbec21143c7bc5f8bb02e0005fa0b982edc026" }, - "todo-comments.nvim": { "branch": "main", "commit": "ae0a2afb47cf7395dc400e5dc4e05274bf4fb9e0" }, - "tokyonight.nvim": { "branch": "main", "commit": "7bb270adaa7692c2c33befc35f5567fc596a2504" }, - "which-key.nvim": { "branch": "main", "commit": "1f8d414f61e0b05958c342df9b6a4c89ce268766" } + "todo-comments.nvim": { "branch": "main", "commit": "304a8d204ee787d2544d8bc23cd38d2f929e7cc5" }, + "tokyonight.nvim": { "branch": "main", "commit": "057ef5d260c1931f1dffd0f052c685dcd14100a3" }, + "which-key.nvim": { "branch": "main", "commit": "370ec46f710e058c9c1646273e6b225acf47cbed" } } diff --git a/nvim/lua/custom/plugins/sessions.lua b/nvim/lua/custom/plugins/sessions.lua deleted file mode 100644 index ba4d10d..0000000 --- a/nvim/lua/custom/plugins/sessions.lua +++ /dev/null @@ -1,16 +0,0 @@ --- A small automated session manager for Neovim - -return { - { - 'rmagatti/auto-session', - lazy = false, - - ---enables autocomplete for opts - ---@module "auto-session" - ---@type AutoSession.Config - opts = { - suppressed_dirs = { '~/', '~/Projects', '~/Downloads', '/' }, - -- log_level = 'debug', - }, - }, -} diff --git a/nvim/lua/custom/sessions.lua b/nvim/lua/custom/sessions.lua new file mode 100644 index 0000000..137e627 --- /dev/null +++ b/nvim/lua/custom/sessions.lua @@ -0,0 +1,113 @@ +-- 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() -- current working directory + local branch = get_git_branch() + local name = cwd + + if branch then + name = name .. '-' .. branch + end + + local sha = vim.fn.sha256(name) + + 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) -- 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 -- Do not save if there were files in the arguments + end + + local name = session_name() + require('mini.sessions').write(name) + print('💾 Session Saved: ' .. name) +end + +vim.api.nvim_create_autocmd('VimLeavePre', { + callback = function() + if not session_exist() then + 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 -- 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', -- 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, +}) + +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/nvim/lua/kickstart/plugins/lint.lua b/nvim/lua/kickstart/plugins/lint.lua index 7e7b595..af03a34 100644 --- a/nvim/lua/kickstart/plugins/lint.lua +++ b/nvim/lua/kickstart/plugins/lint.lua @@ -8,6 +8,7 @@ return { -- markdown = { 'markdownlint' }, sql = { 'sqlfluff' }, go = { 'golangcilint' }, + -- proto = { 'buf_lint' }, -- Не надо, хватает lsp } -- To allow other plugins to add linters to require('lint').linters_by_ft, diff --git a/nvim/lua/kickstart/plugins/mini.lua b/nvim/lua/kickstart/plugins/mini.lua index 22f7f19..1cfade1 100644 --- a/nvim/lua/kickstart/plugins/mini.lua +++ b/nvim/lua/kickstart/plugins/mini.lua @@ -19,6 +19,29 @@ return { -- - 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 diff --git a/nvim/lua/kickstart/plugins/which-key.lua b/nvim/lua/kickstart/plugins/which-key.lua index 8fd2e8e..652f894 100644 --- a/nvim/lua/kickstart/plugins/which-key.lua +++ b/nvim/lua/kickstart/plugins/which-key.lua @@ -63,6 +63,7 @@ return { -- { 'd', group = '[D]ocument' }, { 'r', group = '[R]ename' }, { 's', group = '[S]earch' }, + { 'S', group = '[S]ession' }, { 'w', group = '[W]orkspace' }, { 't', group = '[T]oggle' }, { 'g', group = '[G]olang' },