From 523cf1f7dea2c4bc886a72a42559d1e51b88fa69 Mon Sep 17 00:00:00 2001 From: Ivar Fatland Date: Wed, 3 Apr 2024 21:37:50 +0200 Subject: [PATCH] added tab support for split line --- init.lua | 898 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 459 insertions(+), 439 deletions(-) diff --git a/init.lua b/init.lua index 3de80f8..78cd03c 100644 --- a/init.lua +++ b/init.lua @@ -1,75 +1,77 @@ local keymap = { - leader_key = ';', + leader_key = ';', - -- Normal mode -------------------------------------------------------------------------------------- - telescope_search_for_files_in_working_directory = 'd', - telescope_search_for_previously_opened_files = '', - telescope_live_grep = 'g', - telescope_search_help_pages = 'h', + -- Normal mode -------------------------------------------------------------------------------------- + telescope_search_for_files_in_working_directory = 'd', + telescope_search_for_previously_opened_files = '', + telescope_live_grep = 'g', + telescope_search_help_pages = 'h', + telescope_search_current_buffer = 'j', + telescope_search_buffers = 'o', - lsp_rename_symbol = 'rn', - lsp_code_action = 'ca', - lsp_go_to_definition = 'gd', - lsp_go_to_implementation = 'gi', - lsp_show_references = 'gr', - lsp_hovering_documentation = 'K', - lsp_next_diagnostic = 'j', - lsp_hovering_diagnostics = 'k', + lsp_rename_symbol = 'rn', + lsp_code_action = 'ca', + lsp_go_to_definition = 'gd', + lsp_go_to_implementation = 'gi', + lsp_show_references = 'gr', + lsp_hovering_documentation = 'K', + lsp_next_diagnostic = 'j', + lsp_hovering_diagnostics = 'k', - test_execute_script = 'e', + test_execute_script = 'e', - navigation_toggle_file_explorer ='', + navigation_toggle_file_explorer ='', - navigation_move_to_panel_left = '', - navigation_move_to_panel_down = '', - navigation_move_to_panel_up = '', - navigation_move_to_panel_right = '', + navigation_move_to_panel_left = '', + navigation_move_to_panel_down = '', + navigation_move_to_panel_up = '', + navigation_move_to_panel_right = '', - formatting_split_line = "s", - --> Splits the current line with comma separated items in paranthesis into multiple lines. - --> Works on all types of parenthesis, and is aware of strings. + formatting_split_line = "s", + --> Splits the current line with comma separated items in paranthesis into multiple lines. + --> Works on all types of parenthesis, and is aware of strings. - -- Insert / Selection mode -------------------------------------------------------------------------- - snippet_confirm = '', - snippet_jump_forward = '', - snippet_jump_backward = '', - --> Edit snippets for the current file with the custom S command. - --> Follow the printed instructions on failure. + -- Insert / Selection mode -------------------------------------------------------------------------- + snippet_confirm = '', + snippet_jump_forward = '', + snippet_jump_backward = '', + --> Edit snippets for the current file with the custom S command. + --> Follow the printed instructions on failure. - debug_continue = 'r', - debug_run_to_cursor = 'c', - debug_toggle_breakpoint = 'b', - debug_clear_breakpoints = 'B', - debug_step_over = '', - debug_step_into = '', - debug_step_out = '', - debug_state = 's', - debug_terminate = 't', - debug_view_expr_value = 'e', - debug_frames = 'f', + debug_continue = 'r', + debug_run_to_cursor = 'c', + debug_toggle_breakpoint = 'b', + debug_clear_breakpoints = 'B', + debug_step_over = '', + debug_step_into = '', + debug_step_out = '', + debug_state = 's', + debug_terminate = 't', + debug_view_expr_value = 'e', + debug_frames = 'f', } local TAB_WIDTH = 4 +local EXPAND_TAB = false ---@type installed_themes -local colorscheme = 'slate' +--local colorscheme = 'slate' +local colorscheme = 'gruvbox' -vim.o.termguicolors = true -vim.cmd('colorscheme ' .. colorscheme) vim.cmd [[ autocmd VimEnter * NoMatchParen ]] vim.g.mapleader = keymap.leader_key vim.g.maplocalleader = keymap.leader_key -vim.opt.tabstop = TAB_WIDTH -- Character width of a tab -vim.opt.shiftwidth = 0 -- Will always be eual to the tabstop -vim.opt.rnu = true -- Shows relative line numbers -vim.opt.nu = true -- Shows current line number -vim.opt.wrap = false -- Don't wrap the line. Let it go offscreen. +vim.opt.tabstop = TAB_WIDTH-- Character width of a tab +vim.opt.shiftwidth = 0-- Will always be eual to the tabstop +vim.opt.rnu = true-- Shows relative line numbers +vim.opt.nu = true-- Shows current line number +vim.opt.wrap = false-- Don't wrap the line. Let it go offscreen. vim.opt.shiftround = true -vim.opt.expandtab = true -vim.opt.hlsearch = false -- Don't highlight searches -vim.opt.incsearch = true -- Highlight matching patterns as the you are typing it. -vim.opt.scrolloff = 8 -- Always keep 8 lines of code between the cursor and the top/bottom of the screen. +vim.opt.expandtab = EXPAND_TAB +vim.opt.hlsearch = false-- Don't highlight searches +vim.opt.incsearch = true-- Highlight matching patterns as the you are typing it. +vim.opt.scrolloff = 8-- Always keep 8 lines of code between the cursor and the top/bottom of the screen. vim.api.nvim_set_option("clipboard", "unnamedplus") vim.api.nvim_set_keymap('n', keymap.navigation_move_to_panel_left, 'wincmd h', {silent = true}) vim.api.nvim_set_keymap('n', keymap.navigation_move_to_panel_down, 'wincmd j', {silent = true}) @@ -77,267 +79,280 @@ vim.api.nvim_set_keymap('n', keymap.navigation_move_to_panel_up, 'wincmd k< vim.api.nvim_set_keymap('n', keymap.navigation_move_to_panel_right, 'wincmd l', {silent = true}) vim.g.c_syntax_for_h = 1 vim.g.python_indent = { -- Fixes retarded default python indentation. - open_paren = 'shiftwidth()', - nested_paren = 'shiftwidth()', - continue = 'shiftwidth()', - closed_paren_align_last_line = false, - searchpair_timeout = 300, + open_paren = 'shiftwidth()', + nested_paren = 'shiftwidth()', + continue = 'shiftwidth()', + closed_paren_align_last_line = false, + searchpair_timeout = 300, } vim.api.nvim_create_autocmd('TextYankPost', { -- Highlights yanked text. - desc = 'Highlight when yanking text', - group = vim.api.nvim_create_augroup('highlight-yank', {clear = true}), - callback = function() - vim.highlight.on_yank() - end + desc = 'Highlight when yanking text', + group = vim.api.nvim_create_augroup('highlight-yank', {clear = true}), + callback = function() + vim.highlight.on_yank() + end }) vim.o.exrc = true -- Allows project specific .nvim.lua config files. vim.cmd [[ autocmd FileType * set formatoptions-=cro ]] -- Disable automatic comment. local ensure_packer = function() - local fn = vim.fn - local install_path = fn.stdpath('data')..'/site/pack/packer/start/packer.nvim' - if fn.empty(fn.glob(install_path)) > 0 then - fn.system({'git', 'clone', '--depth', '1', 'https://github.com/wbthomason/packer.nvim', install_path}) - vim.cmd [[packadd packer.nvim]] - return true - end - return false + local fn = vim.fn + local install_path = fn.stdpath('data')..'/site/pack/packer/start/packer.nvim' + if fn.empty(fn.glob(install_path)) > 0 then + fn.system({'git', 'clone', '--depth', '1', 'https://github.com/wbthomason/packer.nvim', install_path}) + vim.cmd [[packadd packer.nvim]] + return true + end + return false end local packer_bootstrap = ensure_packer() local function packer_startup(use) - use 'wbthomason/packer.nvim' + use 'wbthomason/packer.nvim' - use 'nvim-tree/nvim-tree.lua' -- File explorer. - use 'nvim-tree/nvim-web-devicons' -- Provides Pretty icons to look at. Makes the plugin above and below pretty. - use 'nvim-lualine/lualine.nvim' -- Provides file information on status bar on the bottom of the wihdow. + use 'nvim-tree/nvim-tree.lua'-- File explorer. + use 'nvim-tree/nvim-web-devicons'-- Provides Pretty icons to look at. Makes the plugin above and below pretty. + use 'nvim-lualine/lualine.nvim'-- Provides file information on status bar on the bottom of the wihdow. - use 'nvim-treesitter/nvim-treesitter' -- Provides syntax highlighting for many lanugages. + use 'nvim-treesitter/nvim-treesitter'-- Provides syntax highlighting for many lanugages. - use 'hrsh7th/nvim-cmp' -- Autocompletion framework - use 'hrsh7th/cmp-nvim-lsp' -- Autocompletion lsp integration - use 'folke/neodev.nvim' -- lsp integration with the nvim lua API + use 'hrsh7th/nvim-cmp'-- Autocompletion framework + use 'hrsh7th/cmp-nvim-lsp'-- Autocompletion lsp integration + use 'folke/neodev.nvim'-- lsp integration with the nvim lua API - use 'dcampos/nvim-snippy' -- Snippet engine Handles the actual - -- pasting of lsp suggestions. As well as custom snippets - -- (Custom snippets are awesome) + use 'dcampos/nvim-snippy'-- Snippet engine Handles the actual + -- pasting of lsp suggestions. As well as custom snippets + -- (Custom snippets are awesome) - use 'dcampos/cmp-snippy' -- nvim-cmp integration + use 'dcampos/cmp-snippy'-- nvim-cmp integration - use {-- LSP - 'williamboman/mason.nvim', - 'williamboman/mason-lspconfig.nvim', - 'neovim/nvim-lspconfig', } + use {-- LSP + 'williamboman/mason.nvim', + 'williamboman/mason-lspconfig.nvim', + 'neovim/nvim-lspconfig', } - use {-- FuzzyFind your way through previously open files, or project files. - 'nvim-telescope/telescope.nvim', - branch = '0.1.x', - requires = { {'nvim-lua/plenary.nvim'} } - } + use {-- FuzzyFind your way through previously open files, or project files. + 'nvim-telescope/telescope.nvim', + branch = '0.1.x', + requires = { {'nvim-lua/plenary.nvim'} } + } - use 'folke/zen-mode.nvim' -- For centering the text on screen giving a better editing experience in full-screen mode. + use 'folke/zen-mode.nvim' -- For centering the text on screen giving a better editing experience in full-screen mode. - use 'michaeljsmith/vim-indent-object' -- Treats lines of the same indentation as a new text object, access with i and I. - use 'tpope/vim-surround' -- Allows you to surround text with tags, quotes and brackets. - use 'tpope/vim-repeat' -- Needed for above plugin to repeat actions. + use 'michaeljsmith/vim-indent-object' -- Treats lines of the same indentation as a new text object, access with i and I. + use 'tpope/vim-surround' -- Allows you to surround text with tags, quotes and brackets. + use 'tpope/vim-repeat' -- Needed for above plugin to repeat actions. - use 'mfussenegger/nvim-dap' - use 'mfussenegger/nvim-dap-python' -- follow instructions or start venv before starting nvim. - use 'theHamsta/nvim-dap-virtual-text' + use 'mfussenegger/nvim-dap' + use 'mfussenegger/nvim-dap-python' -- follow instructions or start venv before starting nvim. + use 'theHamsta/nvim-dap-virtual-text' - if packer_bootstrap then --Comes after packages - require('packer').sync() - end + use "ellisonleao/gruvbox.nvim" + + if packer_bootstrap then --Comes after packages + require('packer').sync() + end + + -- set colors after packer, because colorscheme might be installed + vim.o.termguicolors = true + vim.cmd('colorscheme ' .. colorscheme) + + vim.g.loaded_netrw = 1-- Disables some built in plugin + vim.g.loaded_netrwPlugin = 1--Disables some built in plugin + require'nvim-tree'.setup() + vim.keymap.set('n', keymap.navigation_toggle_file_explorer, 'NvimTreeFindFileToggle', {silent = true}) + + require'lualine'.setup{} + + require('nvim-treesitter.configs').setup { + ensure_installed = 'all', + sync_install = false, + auto_install = true, + highlight = { + enable = true, + additional_vim_regex_highlighting = false, + } + } + + local cmp = require('cmp') + local types = require('cmp.types') + local snippy = require('snippy') + + cmp.setup{ + mapping = { + [''] = { i = cmp.mapping.select_next_item{ behavior = types.cmp.SelectBehavior.Select } }, + [''] = { i = cmp.mapping.select_prev_item{ behavior = types.cmp.SelectBehavior.Select } }, + [keymap.snippet_confirm] = cmp.mapping( + function (_) + cmp.confirm{ select = true } + end, + { "i", "s" } + ), + [keymap.snippet_jump_backward] = cmp.mapping( + function (_) + if snippy.can_jump(-1) then + snippy.previous() + end + end, + { "i", "s" } + ), + [keymap.snippet_jump_forward] = cmp.mapping( + function(_) + if snippy.can_jump(1) then + snippy.next() + end + end, + { "i", "s" } + ), + }, + snippet = { + expand = function(args) + snippy.expand_snippet(args.body) + end, + }, + sources = cmp.config.sources( + { + { name = 'snippy' }, + { name = 'nvim_lsp' }, + }, + {{ name = 'buffer' }} + ) + } + + require('mason').setup() + require('mason-lspconfig').setup{ + ensure_installed = { + 'clangd', + 'kotlin_language_server', + 'ltex', + 'lua_ls', + 'marksman', + 'pyright', + 'rust_analyzer', + 'gopls' + } + } + local capabilities = require('cmp_nvim_lsp').default_capabilities() + require("mason-lspconfig").setup_handlers { + function (server_name) -- default_handler + require("lspconfig")[server_name].setup { + capabilities = capabilities + } + end, + lua_ls = function() + require("neodev").setup{} -- load the neovim api + require("lspconfig").lua_ls.setup { + capabilities = capabilities, + settings = { + Lua = { + runtime = { + version = 'LuaJIT', + }, + workspace = { + checkThirdParty = true, + }, + + } + } + } + end, + } +-- * `Lua.runtime.special`: set the property `love.filesystem.load` to `"loadfile"`; +-- * `Lua.workspace.library`: add element `"${3rd}/love2d/library"` ; + + require("lspconfig").gdscript.setup{ + capabilities = capabilities + } + require('lspconfig').zls.setup{ + capabilities = capabilities + } + vim.keymap.set('n', keymap.lsp_rename_symbol, vim.lsp.buf.rename, {}) + vim.keymap.set('n', keymap.lsp_code_action, vim.lsp.buf.code_action, {}) + vim.keymap.set('n', keymap.lsp_go_to_definition, vim.lsp.buf.definition, {}) + vim.keymap.set('n', keymap.lsp_go_to_implementation, vim.lsp.buf.implementation, {}) + vim.keymap.set('n', keymap.lsp_show_references, require('telescope.builtin').lsp_references, {}) + vim.keymap.set('n', keymap.lsp_hovering_documentation, vim.lsp.buf.hover, {}) + vim.keymap.set('n', keymap.lsp_next_diagnostic, vim.diagnostic.goto_next, {}) + vim.keymap.set('n', keymap.lsp_hovering_diagnostics, vim.diagnostic.open_float, {}) + + local builtin = require('telescope.builtin') + vim.keymap.set('n', keymap.telescope_search_for_files_in_working_directory, builtin.find_files, {}) + vim.keymap.set('n', keymap.telescope_search_for_previously_opened_files, builtin.oldfiles, {}) + vim.keymap.set('n', keymap.telescope_live_grep, builtin.live_grep, {}) + vim.keymap.set('n', keymap.telescope_search_help_pages, builtin.help_tags, {}) + vim.keymap.set('n', keymap.telescope_search_current_buffer, builtin.current_buffer_fuzzy_find, {}) + vim.keymap.set('n', keymap.telescope_search_buffers, builtin.buffers, {}) - vim.g.loaded_netrw = 1 -- Disables some built in plugin - vim.g.loaded_netrwPlugin = 1 -- Disables some built in plugin - require'nvim-tree'.setup() - vim.keymap.set('n', keymap.navigation_toggle_file_explorer, 'NvimTreeFindFileToggle', {silent = true}) + local dap = require'dap' + local widgets = require('dap.ui.widgets') + local my_sidebar = widgets.sidebar(widgets.scopes) + local my_centered = widgets.centered_float(widgets.frames) - require'lualine'.setup{} + vim.api.nvim_create_autocmd('VimEnter', { -- Close the middle window that automatically opens for some reason. + desc = 'Close the window floating in the middle as vim opens.', + group = vim.api.nvim_create_augroup('close-dap-frames', {clear = true}), + callback = function() + my_centered.close() + end + }) --TODO change this if I can. Super hacky. - require('nvim-treesitter.configs').setup { - ensure_installed = 'all', - sync_install = false, - auto_install = true, - highlight = { - enable = true, - additional_vim_regex_highlighting = false, - } - } + vim.keymap.set('n', keymap.debug_continue, dap.continue, {}) + vim.keymap.set('n', keymap.debug_toggle_breakpoint, dap.toggle_breakpoint, {}) + vim.keymap.set('n', keymap.debug_clear_breakpoints, dap.clear_breakpoints, {}) + vim.keymap.set('n', keymap.debug_step_over, dap.step_over, {}) + vim.keymap.set('n', keymap.debug_step_into, dap.step_into, {}) + vim.keymap.set('n', keymap.debug_step_out, dap.step_out, {}) + vim.keymap.set('n', keymap.debug_state, my_sidebar.toggle, {}) + vim.keymap.set('n', keymap.debug_frames, my_centered.toggle, {}) + vim.keymap.set('n', keymap.debug_terminate, dap.terminate, {}) + vim.keymap.set('n', keymap.debug_run_to_cursor, dap.run_to_cursor, {}) + vim.keymap.set('n', keymap.debug_view_expr_value, widgets.hover, {}) - local cmp = require('cmp') - local types = require('cmp.types') - local snippy = require('snippy') - - cmp.setup{ - mapping = { - [''] = { i = cmp.mapping.select_next_item{ behavior = types.cmp.SelectBehavior.Select } }, - [''] = { i = cmp.mapping.select_prev_item{ behavior = types.cmp.SelectBehavior.Select } }, - [keymap.snippet_confirm] = cmp.mapping( - function (_) - cmp.confirm{ select = true } - end, - { "i", "s" } - ), - [keymap.snippet_jump_backward] = cmp.mapping( - function (_) - if snippy.can_jump(-1) then - snippy.previous() - end - end, - { "i", "s" } - ), - [keymap.snippet_jump_forward] = cmp.mapping( - function(_) - if snippy.can_jump(1) then - snippy.next() - end - end, - { "i", "s" } - ), - }, - snippet = { - expand = function(args) - snippy.expand_snippet(args.body) - end, - }, - sources = cmp.config.sources( - { - { name = 'snippy' }, - { name = 'nvim_lsp' }, - }, - {{ name = 'buffer' }} - ) - } - - require('mason').setup() - require('mason-lspconfig').setup{ - ensure_installed = { - 'clangd', - 'kotlin_language_server', - 'csharp_ls', - 'ltex', - 'lua_ls', - 'marksman', - 'pyright', - 'rust_analyzer', - 'gopls' - } - } - local capabilities = require('cmp_nvim_lsp').default_capabilities() - require("mason-lspconfig").setup_handlers { - function (server_name) -- default_handler - require("lspconfig")[server_name].setup { - capabilities = capabilities - } - end, ---Lua.workspace.checkThirdParty - lua_ls = function() - require("neodev").setup{} -- load the neovim api - require("lspconfig").lua_ls.setup { - capabilities = capabilities, - settings = { - Lua = { - runtime = { version = 'LuaJIT' }, - workspace = { checkThirdParty = true }, - } - } - } - end, - } - require("lspconfig").gdscript.setup{ - capabilities = capabilities - } - require('lspconfig').zls.setup{ - capabilities = capabilities - } - vim.keymap.set('n', keymap.lsp_rename_symbol, vim.lsp.buf.rename, {}) - vim.keymap.set('n', keymap.lsp_code_action, vim.lsp.buf.code_action, {}) - vim.keymap.set('n', keymap.lsp_go_to_definition, vim.lsp.buf.definition, {}) - vim.keymap.set('n', keymap.lsp_go_to_implementation, vim.lsp.buf.implementation, {}) - vim.keymap.set('n', keymap.lsp_show_references, require('telescope.builtin').lsp_references, {}) - vim.keymap.set('n', keymap.lsp_hovering_documentation, vim.lsp.buf.hover, {}) - vim.keymap.set('n', keymap.lsp_next_diagnostic, vim.diagnostic.goto_next, {}) - vim.keymap.set('n', keymap.lsp_hovering_diagnostics, vim.diagnostic.open_float, {}) - - local builtin = require('telescope.builtin') - vim.keymap.set('n', keymap.telescope_search_for_files_in_working_directory, builtin.find_files, {}) - vim.keymap.set('n', keymap.telescope_search_for_previously_opened_files, builtin.oldfiles, {}) - vim.keymap.set('n', keymap.telescope_live_grep, builtin.live_grep, {}) - vim.keymap.set('n', keymap.telescope_search_help_pages, builtin.help_tags, {}) + -- More configurations: + -- https://github.com/mfussenegger/nvim-dap/wiki/Debug-Adapter-installation#go + require'dap-python'.setup('~/.virtualenvs/debugpy/bin/python') - local dap = require'dap' - local widgets = require('dap.ui.widgets') - local my_sidebar = widgets.sidebar(widgets.scopes) - local my_centered = widgets.centered_float(widgets.frames) + dap.adapters.gdb = { + type = "executable", + command = "gdb", + args = { "-i", "dap" } + } - vim.api.nvim_create_autocmd('VimEnter', { -- Close the middle window that automatically opens for some reason. - desc = 'Close the window floating in the middle as vim opens.', - group = vim.api.nvim_create_augroup('close-dap-frames', {clear = true}), - callback = function() - my_centered.close() - end - }) --TODO change this if I can. Super hacky. + dap.configurations.c = { + { + name = "Launch", + type = "gdb", + request = "launch", + program = function() + return vim.fn.input('Path to executable: ', vim.fn.getcwd() .. '/', 'file') + end, + cwd = "${workspaceFolder}", + stopAtBeginningOfMainSubprogram = false, + }, + } - vim.keymap.set('n', keymap.debug_continue, dap.continue, {}) - vim.keymap.set('n', keymap.debug_toggle_breakpoint, dap.toggle_breakpoint, {}) - vim.keymap.set('n', keymap.debug_clear_breakpoints, dap.clear_breakpoints, {}) - vim.keymap.set('n', keymap.debug_step_over, dap.step_over, {}) - vim.keymap.set('n', keymap.debug_step_into, dap.step_into, {}) - vim.keymap.set('n', keymap.debug_step_out, dap.step_out, {}) - vim.keymap.set('n', keymap.debug_state, my_sidebar.toggle, {}) - vim.keymap.set('n', keymap.debug_frames, my_centered.toggle, {}) - vim.keymap.set('n', keymap.debug_terminate, dap.terminate, {}) - vim.keymap.set('n', keymap.debug_run_to_cursor, dap.run_to_cursor, {}) - vim.keymap.set('n', keymap.debug_view_expr_value, widgets.hover, {}) + -- nicer debugging. displays variable values inline + -- https://github.com/theHamsta/nvim-dap-virtual-text + require'nvim-dap-virtual-text'.setup{ - -- More configurations: - -- https://github.com/mfussenegger/nvim-dap/wiki/Debug-Adapter-installation#go - require'dap-python'.setup('~/.virtualenvs/debugpy/bin/python') - - - dap.adapters.gdb = { - type = "executable", - command = "gdb", - args = { "-i", "dap" } - } - - dap.configurations.c = { - { - name = "Launch", - type = "gdb", - request = "launch", - program = function() - return vim.fn.input('Path to executable: ', vim.fn.getcwd() .. '/', 'file') - end, - cwd = "${workspaceFolder}", - stopAtBeginningOfMainSubprogram = false, - }, - } - - -- nicer debugging. displays variable values inline - -- https://github.com/theHamsta/nvim-dap-virtual-text - require'nvim-dap-virtual-text'.setup{ - - } + } end ---@param name string ---@return boolean local function file_exists(name) - local f = io.open(name,"r") + local f = io.open(name,"r") - if f~=nil then - f:close() - return true - else - return false - end + if f~=nil then + f:close() + return true + else + return false + end end -- Opens a default .snippets file for the filetype you are currently editing in a horizontal split pane. @@ -346,65 +361,65 @@ end -- If the folder does not exist, the command will print out a helpful error message showing what the path -- should look like. vim.api.nvim_create_user_command( - 'S', - function () - ---@type string - local snippets_path = vim.fn.stdpath('config') .. '/snippets/' .. - vim.api.nvim_buf_get_option(0, "filetype") .. '.snippets' + 'S', + function () + ---@type string + local snippets_path = vim.fn.stdpath('config') .. '/snippets/' .. + vim.api.nvim_buf_get_option(0, "filetype") .. '.snippets' - if not file_exists(snippets_path) then - local file = io.open( snippets_path, 'w' ) - assert( - file ~= nil, - ("io.open('%s', 'w') returned nil.\n"):format(snippets_path) .. - "Make sure the snippets folder in the above path exists." - ) - file:close() - print('created file: ', snippets_path) - end + if not file_exists(snippets_path) then + local file = io.open( snippets_path, 'w' ) + assert( + file ~= nil, + ("io.open('%s', 'w') returned nil.\n"):format(snippets_path) .. + "Make sure the snippets folder in the above path exists." + ) + file:close() + print('created file: ', snippets_path) + end - vim.api.nvim_command(('SnippyEdit %s'):format(snippets_path)) - end, - { nargs = 0 } + vim.api.nvim_command(('SnippyEdit %s'):format(snippets_path)) + end, + { nargs = 0 } ) do - ---Returns function that runs the given script_name in the current working directory. - ---Only implemented for Linux. ( Uses the sh command ) - ---@param script_name string - ---@return fun() - local function get_run_script_function(script_name) - return function() - ---@type "Linux" | "Darwin" | "Windows_NT" - local os_name = vim.loop.os_uname().sysname - if os_name == "Windows_NT" then - error('run_file not implemented for non-unix platforms') - end + ---Returns function that runs the given script_name in the current working directory. + ---Only implemented for Linux. ( Uses the sh command ) + ---@param script_name string + ---@return fun() + local function get_run_script_function(script_name) + return function() + ---@type "Linux" | "Darwin" | "Windows_NT" + local os_name = vim.loop.os_uname().sysname + if os_name == "Windows_NT" then + error('run_file not implemented for non-unix platforms') + end - local run_script_path = vim.fn.getcwd() .. "/" .. script_name - if not file_exists(run_script_path) then - error( - "The run script: '" .. run_script_path .. "' does not exist.\n".. - "All this command does, is to execute that file." - ) - end + local run_script_path = vim.fn.getcwd() .. "/" .. script_name + if not file_exists(run_script_path) then + error( + "The run script: '" .. run_script_path .. "' does not exist.\n".. + "All this command does, is to execute that file." + ) + end - vim.cmd('!sh ' .. run_script_path) - end - end + vim.cmd('!sh ' .. run_script_path) + end + end - -- To create a script that runs when typing the command "er", - -- create a script called ".r.sh" in the current directory. - local alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890' - for i = 1, #alphabet do - local char = alphabet:sub(i, i) - vim.keymap.set( - 'n', - keymap.test_execute_script .. char, - get_run_script_function("." .. char .. ".sh"), - { silent = true } - ) - end + -- To create a script that runs when typing the command "er", + -- create a script called ".r.sh" in the current directory. + local alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890' + for i = 1, #alphabet do + local char = alphabet:sub(i, i) + vim.keymap.set( + 'n', + keymap.test_execute_script .. char, + get_run_script_function("." .. char .. ".sh"), + { silent = true } + ) + end end ---Splits the line under the cursor into multiple lines. @@ -413,148 +428,152 @@ end ---Then formats all comma separated items within that bracket scope, and splits the line into multiple. ---The function is aware for strings starting with ' or ", and keeps track of how deeply nested it is ---in the brackets. ----The function will properly indent all the lines, but only uses spaces to do so. +---The function will properly indent all the lines, taking into consideration the TAB_WHITESPACE and EXPAND_TAB constants. ---It is currently tied to this init.lua file by a couple of variables. Might become a separate package at some point. ---@type function local split_line do - local TAB_WHITESPACE = '' - for _ = 1, TAB_WIDTH do - TAB_WHITESPACE = TAB_WHITESPACE .. ' ' - end + local TAB_WHITESPACE = ' ' + if EXPAND_TAB then + print("expandtab is ACTIVE") + TAB_WHITESPACE = '' + for _ = 1, TAB_WIDTH do + TAB_WHITESPACE = TAB_WHITESPACE .. ' ' + end + end - local get_closing_bracket = function(char) - if char == '(' then return ')' end - if char == '[' then return ']' end - if char == '{' then return '}' end - error("Not an opening bracket") - end + local get_closing_bracket = function(char) + if char == '(' then return ')' end + if char == '[' then return ']' end + if char == '{' then return '}' end + error("Not an opening bracket") + end - ---@param char string - ---@return boolean - local is_opening_bracket = function(char) - return char == '(' or char == '[' or char == '{' - end + ---@param char string + ---@return boolean + local is_opening_bracket = function(char) + return char == '(' or char == '[' or char == '{' + end - split_line = function() - local line = vim.api.nvim_get_current_line() - local _, col = unpack(vim.api.nvim_win_get_cursor(0)) - col = col + 1 -- Doing this to make it 1-indexed + split_line = function() + local line = vim.api.nvim_get_current_line() + local _, col = unpack(vim.api.nvim_win_get_cursor(0)) + col = col + 1 -- Doing this to make it 1-indexed - ---@type integer? - local first_bracket_i = nil - for i = col, #line do - local char = line:sub(i, i) - if is_opening_bracket(char) then - first_bracket_i = i - break - end - end + ---@type integer? + local first_bracket_i = nil + for i = col, #line do + local char = line:sub(i, i) + if is_opening_bracket(char) then + first_bracket_i = i + break + end + end - if not first_bracket_i then - print('No opening brackets found after cursor on this line.') - return - end + if not first_bracket_i then + print('No opening brackets found after cursor on this line.') + return + end - ---@type integer[] - local comma_indexes = {} -- Populate this array - ---@type integer? - local last_bracket_i = nil -- And find this index + ---@type integer[] + local comma_indexes = {} -- Populate this array + ---@type integer? + local last_bracket_i = nil -- And find this index - do - ---@type string[] - local closing_bracket_stack = {} - local icon_to_close_string = '' - local in_string = false + do + ---@type string[] + local closing_bracket_stack = {} + local icon_to_close_string = '' + local in_string = false - for i = first_bracket_i, #line do - local char = line:sub(i,i) + for i = first_bracket_i, #line do + local char = line:sub(i,i) - if in_string then - in_string = not (char == icon_to_close_string) - goto continue - end + if in_string then + in_string = not (char == icon_to_close_string) + goto continue + end - if char == '"' or char == "'" then - icon_to_close_string = char - in_string = true - goto continue - end - -- string handling complete + if char == '"' or char == "'" then + icon_to_close_string = char + in_string = true + goto continue + end + -- string handling complete - if is_opening_bracket( char ) then - table.insert( - closing_bracket_stack, - get_closing_bracket( char ) - ) - end + if is_opening_bracket( char ) then + table.insert( + closing_bracket_stack, + get_closing_bracket( char ) + ) + end - if char == closing_bracket_stack[#closing_bracket_stack] then - table.remove(closing_bracket_stack) - end + if char == closing_bracket_stack[#closing_bracket_stack] then + table.remove(closing_bracket_stack) + end - if #closing_bracket_stack == 1 and char == ',' then - table.insert(comma_indexes, i) - end + if #closing_bracket_stack == 1 and char == ',' then + table.insert(comma_indexes, i) + end - if #closing_bracket_stack == 0 then - last_bracket_i = i - break - end - ::continue:: - end - end + if #closing_bracket_stack == 0 then + last_bracket_i = i + break + end + ::continue:: + end + end - if not last_bracket_i then - print("The first opening bracket found after the cursor was not closed on this line.") - return - end - if #comma_indexes == 0 then - print('No comma separated items within brackets that were opened and closed after the cursor.') - return - end + if not last_bracket_i then + print("The first opening bracket found after the cursor was not closed on this line.") + return + end + if #comma_indexes == 0 then + print('No comma separated items within brackets that were opened and closed after the cursor.') + return + end - ---@type string - local leading_whitespace = string.match(line, "^%s*") - local first_line = line:sub(1, first_bracket_i) - local last_line = leading_whitespace .. line:sub(last_bracket_i, #line) + ---@type string + local leading_whitespace = string.match(line, "^%s*") + local first_line = line:sub(1, first_bracket_i) + local last_line = leading_whitespace .. line:sub(last_bracket_i, #line) - local middle_lines = {} - table.insert( - middle_lines, - line:sub(first_bracket_i+1, comma_indexes[1]) - ) - for i = 1, #comma_indexes-1 do - table.insert( - middle_lines, - line:sub(comma_indexes[i], comma_indexes[i+1]) - ) - end - table.insert( - middle_lines, - line:sub(comma_indexes[#comma_indexes], last_bracket_i-1) - ) + local middle_lines = {} + table.insert( + middle_lines, + line:sub(first_bracket_i+1, comma_indexes[1]) + ) + for i = 1, #comma_indexes-1 do + table.insert( + middle_lines, + line:sub(comma_indexes[i], comma_indexes[i+1]) + ) + end + table.insert( + middle_lines, + line:sub(comma_indexes[#comma_indexes], last_bracket_i-1) + ) - -- Cleanup step - for i, middle_line in ipairs(middle_lines) do - middle_line = middle_line:gsub("^[%s,]*", leading_whitespace .. TAB_WHITESPACE, 1) - middle_line = middle_line:gsub("[%s]*$", '', 1) - middle_lines[i] = middle_line - end + -- Cleanup step + for i, middle_line in ipairs(middle_lines) do + middle_line = middle_line:gsub("^[%s,]*", leading_whitespace .. TAB_WHITESPACE, 1) + middle_line = middle_line:gsub("[%s]*$", '', 1) + middle_lines[i] = middle_line + end - local row, _ = unpack(vim.api.nvim_win_get_cursor(0)) - vim.api.nvim_buf_set_lines(0, row-1, row, false, {first_line}) - vim.api.nvim_buf_set_lines(0, row, row, false, {last_line}) - vim.api.nvim_buf_set_lines(0, row, row, false, middle_lines) - end + local row, _ = unpack(vim.api.nvim_win_get_cursor(0)) + vim.api.nvim_buf_set_lines(0, row-1, row, false, {first_line}) + vim.api.nvim_buf_set_lines(0, row, row, false, {last_line}) + vim.api.nvim_buf_set_lines(0, row, row, false, middle_lines) + end end vim.keymap.set( - 'n', - keymap.formatting_split_line, - split_line, - { silent = true } + 'n', + keymap.formatting_split_line, + split_line, + { silent = true } ) return require('packer').startup(packer_startup) @@ -582,3 +601,4 @@ return require('packer').startup(packer_startup) ---| 'slate' ---| 'torte' ---| 'zellner' +---| 'gruvbox'