From 1970054228b3a9a3a8fc99af723ee13c147e7747 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karel=20Ko=C4=8D=C3=AD?= Date: Sun, 25 Feb 2024 22:49:55 +0100 Subject: Migrate from vim to nvim --- config/nvim/ftplugin/c.vim | 7 ++ config/nvim/ftplugin/cpp.vim | 8 ++ config/nvim/ftplugin/json.vim | 1 + config/nvim/ftplugin/lua.vim | 2 + config/nvim/ftplugin/nix.vim | 5 + config/nvim/ftplugin/python.vim | 2 + config/nvim/ftplugin/sh.vim | 2 + config/nvim/ftplugin/tex.vim | 1 + config/nvim/init.vim | 131 +++++++++++++++++++++++++ config/nvim/lua/mytelescope.lua | 205 ++++++++++++++++++++++++++++++++++++++++ config/nvim/lua/plugins.lua | 97 +++++++++++++++++++ config/nvim/selene-vim.yml | 5 + config/nvim/selene.toml | 4 + 13 files changed, 470 insertions(+) create mode 100644 config/nvim/ftplugin/c.vim create mode 100644 config/nvim/ftplugin/cpp.vim create mode 100644 config/nvim/ftplugin/json.vim create mode 100644 config/nvim/ftplugin/lua.vim create mode 100644 config/nvim/ftplugin/nix.vim create mode 100644 config/nvim/ftplugin/python.vim create mode 100644 config/nvim/ftplugin/sh.vim create mode 100644 config/nvim/ftplugin/tex.vim create mode 100644 config/nvim/init.vim create mode 100644 config/nvim/lua/mytelescope.lua create mode 100644 config/nvim/lua/plugins.lua create mode 100644 config/nvim/selene-vim.yml create mode 100644 config/nvim/selene.toml (limited to 'config') diff --git a/config/nvim/ftplugin/c.vim b/config/nvim/ftplugin/c.vim new file mode 100644 index 0000000..3769d80 --- /dev/null +++ b/config/nvim/ftplugin/c.vim @@ -0,0 +1,7 @@ +let b:ale_linters = ['cppcheck', 'flawfinder'] +let b:ale_fixers = ['clang-format', 'remove_trailing_lines', 'trim_whitespace'] +let g:ale_c_parse_compile_commands = 1 +let g:ale_c_clangd_options = '--header-insertion=never' + +nmap :ALENext +nmap :ALEPrevious diff --git a/config/nvim/ftplugin/cpp.vim b/config/nvim/ftplugin/cpp.vim new file mode 100644 index 0000000..89944ea --- /dev/null +++ b/config/nvim/ftplugin/cpp.vim @@ -0,0 +1,8 @@ +" This is for C but vim defines *.h as cpp type so here we have it +let b:ale_linters = ['ccls', 'cppcheck', 'flawfinder'] +let b:ale_fixers = ['clang-format', 'remove_trailing_lines', 'trim_whitespace'] +let g:ale_cpp_ccls_init_options = {'cache': {'directory': '/tmp/ccls/cache'}} +let g:ale_cpp_parse_compile_commands = 1 + +nmap :ALENext +nmap :ALEPrevious diff --git a/config/nvim/ftplugin/json.vim b/config/nvim/ftplugin/json.vim new file mode 100644 index 0000000..829a37e --- /dev/null +++ b/config/nvim/ftplugin/json.vim @@ -0,0 +1 @@ +let b:ale_fixers = ['jq'] diff --git a/config/nvim/ftplugin/lua.vim b/config/nvim/ftplugin/lua.vim new file mode 100644 index 0000000..733962a --- /dev/null +++ b/config/nvim/ftplugin/lua.vim @@ -0,0 +1,2 @@ +let b:ale_linters = ['luacheck', 'selene', 'luac'] +let b:ale_fixers = ['stylua', 'remove_trailing_lines', 'trim_whitespace'] diff --git a/config/nvim/ftplugin/nix.vim b/config/nvim/ftplugin/nix.vim new file mode 100644 index 0000000..48be358 --- /dev/null +++ b/config/nvim/ftplugin/nix.vim @@ -0,0 +1,5 @@ +let b:ale_linters = ['nix', 'statix'] +let b:ale_fixers = ['alejandra', 'remove_trailing_lines', 'trim_whitespace'] + +nmap :ALENext +nmap :ALEPrevious diff --git a/config/nvim/ftplugin/python.vim b/config/nvim/ftplugin/python.vim new file mode 100644 index 0000000..94b035a --- /dev/null +++ b/config/nvim/ftplugin/python.vim @@ -0,0 +1,2 @@ +let b:ale_linters = ['pylint', 'mypy', 'pydocstyle'] +let b:ale_fixers = ['isort', 'black', 'remove_trailing_lines', 'trim_whitespace'] diff --git a/config/nvim/ftplugin/sh.vim b/config/nvim/ftplugin/sh.vim new file mode 100644 index 0000000..8cc42e2 --- /dev/null +++ b/config/nvim/ftplugin/sh.vim @@ -0,0 +1,2 @@ +let b:ale_linters = ['shell', 'shellcheck'] +let b:ale_fixers = ['shfmt', 'trim_whitespace', 'remove_trailing_lines'] diff --git a/config/nvim/ftplugin/tex.vim b/config/nvim/ftplugin/tex.vim new file mode 100644 index 0000000..5eb1926 --- /dev/null +++ b/config/nvim/ftplugin/tex.vim @@ -0,0 +1 @@ +let b:ale_linters = ['lacheck'] diff --git a/config/nvim/init.vim b/config/nvim/init.vim new file mode 100644 index 0000000..b538453 --- /dev/null +++ b/config/nvim/init.vim @@ -0,0 +1,131 @@ +augroup user_config + autocmd! + autocmd BufWritePost init.vim source +augroup end + +lua require('plugins') +augroup packer_user_config + autocmd! + autocmd BufWritePost plugins.lua source | PackerCompile +augroup end + + +set exrc +set secure +set title + +set hidden +set undofile +set undodir=~/.cache/nvim-undo// +set directory=$HOME/.cache/nvim// +set hlsearch +set wildmode=longest:full,full +set wildmenu +set modeline +set encoding=utf-8 + + +set backspace=indent,eol,start + +colorscheme nord +let g:lightline = { 'colorscheme': 'nord' } + +set number +set colorcolumn=80 +set textwidth=80 + + +" Tabs setting. In default we want 4 spaces tab, but allows also 8 spaced tabs +set noexpandtab +set tabstop=4 +set shiftwidth=4 +set softtabstop=4 +function TabToogle() + if &tabstop != 4 + set tabstop=4 + set shiftwidth=4 + set softtabstop=4 + echom 'Tab stop set to 4' + else + set tabstop=8 + set shiftwidth=8 + set softtabstop=8 + echom 'Tab stop set to 8' + endif + " Soft tab stop is here only for possibility of expandtab +endfunction +command TabToogle call TabToogle() + +" Translate word under cursor +nnoremap d :! sdcv -n + +" netrw configuration +cabbrev E Explore +let g:netrw_banner=0 +let g:netrw_liststyle=1 +let g:netrw_list_hide='\(^\|\s\s\)\zs\.\S\+,' +function GitIgnore() + " Possibly find and include all lower .gitignore files? + let g:netrw_list_hide='\(^\|\s\s\)\zs\.\S\+,' . netrw_gitignore#Hide() +endfunction +command GitIgnore call GitIgnore() +" Some fast buffer switching and opening of new files +nnoremap :Explore +nnoremap l :bnext +nnoremap h :bprev + +" Setup gitgutter +set updatetime=100 +highlight GitGutterAdd ctermfg=2 +highlight GitGutterChange ctermfg=3 +highlight GitGutterDelete ctermfg=1 + +" Setup table-mode to markdown compliant +" Note: to start use "\ t m" +let g:table_mode_corner='|' + +" Open tagbar with +nmap :TagbarOpen fc + +" Spell checking +map :setlocal spell! +function LangToggle() + if &spelllang !=? 'en_us' + setlocal spelllang=en_us + echo 'spelllang=en_us' + else + setlocal spelllang=cs + echo 'spelllang=cs' + endif +endfunction +setlocal spelllang=en_us +map :call LangToggle() + +" NERDCommenter +let g:NERDCreateDefaultMappings = 1 + +" UltiSnips triggers +let g:UltiSnipsExpandTrigger='' +let g:UltiSnipsJumpForwardTrigger='' +let g:UltiSnipsJumpBackwardTrigger='' + +" ALE +let g:ale_set_baloons = 1 +let g:ale_floating_preview = 1 +let g:ale_use_neovim_diagnostics_api = 1 +nmap f (ale_fix) + +" Telescope +nnoremap :Telescope buffers +nnoremap ":lua require'telescope.builtin'.git_files{}".expand('%:h')."/" +nnoremap :Telescope lsp_document_symbols +nmap ] :Telescope lsp_definitions +nmap ] :Telescope lsp_type_definitions +nmap [ :Telescope lsp_implementations +nmap [ :Telescope lsp_references + +" Copy line location +" TODO this should work but it doesn't for some reason +" nmap c :let @+=expand("%:p") . ":" . line(".") +nmap c :exec "!wl-copy '" . expand("%:p") . ":" . line(".") . "'" + diff --git a/config/nvim/lua/mytelescope.lua b/config/nvim/lua/mytelescope.lua new file mode 100644 index 0000000..c4fe3a7 --- /dev/null +++ b/config/nvim/lua/mytelescope.lua @@ -0,0 +1,205 @@ +local layout = require("nui.layout") +local popup = require("nui.popup") + +local actions = require("telescope.actions") + +local tslayout = require("telescope.pickers.layout") + +return require("telescope").setup({ + defaults = { + mappings = { + i = { + [""] = actions.close, + [""] = actions.move_selection_next, + [""] = actions.move_selection_previous, + [""] = false, + }, + }, + + create_layout = function(picker) + local border = { + results = { + top_left = "┌", + top = "─", + top_right = "┬", + right = "│", + bottom_right = "", + bottom = "", + bottom_left = "", + left = "│", + }, + results_patch = { + minimal = { + top_left = "┌", + top_right = "┐", + }, + horizontal = { + top_left = "┌", + top_right = "┬", + }, + vertical = { + top_left = "├", + top_right = "┤", + }, + }, + prompt = { + top_left = "├", + top = "─", + top_right = "┤", + right = "│", + bottom_right = "┘", + bottom = "─", + bottom_left = "└", + left = "│", + }, + prompt_patch = { + minimal = { + bottom_right = "┘", + }, + horizontal = { + bottom_right = "┴", + }, + vertical = { + bottom_right = "┘", + }, + }, + preview = { + top_left = "┌", + top = "─", + top_right = "┐", + right = "│", + bottom_right = "┘", + bottom = "─", + bottom_left = "└", + left = "│", + }, + preview_patch = { + minimal = {}, + horizontal = { + bottom = "─", + bottom_left = "", + bottom_right = "┘", + left = "", + top_left = "", + }, + vertical = { + bottom = "", + bottom_left = "", + bottom_right = "", + left = "│", + top_left = "┌", + }, + }, + } + + local results = popup({ + focusable = false, + border = { + style = border.results, + text = { + top = picker.results_title, + top_align = "center", + }, + }, + win_options = { + winhighlight = "Normal:Normal", + }, + }) + + local prompt = popup({ + enter = true, + border = { + style = border.prompt, + text = { + top = picker.prompt_title, + top_align = "center", + }, + }, + win_options = { + winhighlight = "Normal:Normal", + }, + }) + + local preview = popup({ + focusable = false, + border = { + style = border.preview, + text = { + top = picker.preview_title, + top_align = "center", + }, + }, + }) + + local box_by_kind = { + vertical = layout.Box({ + layout.Box(preview, { grow = 1 }), + layout.Box(results, { grow = 1 }), + layout.Box(prompt, { size = 3 }), + }, { dir = "col" }), + horizontal = layout.Box({ + layout.Box({ + layout.Box(results, { grow = 1 }), + layout.Box(prompt, { size = 3 }), + }, { dir = "col", size = "50%" }), + layout.Box(preview, { size = "50%" }), + }, { dir = "row" }), + minimal = layout.Box({ + layout.Box(results, { grow = 1 }), + layout.Box(prompt, { size = 3 }), + }, { dir = "col" }), + } + + local function get_box() + local height, width = vim.o.lines, vim.o.columns + local box_kind = "horizontal" + if width < 100 then + box_kind = "vertical" + if height < 40 then + box_kind = "minimal" + end + elseif width < 120 then + box_kind = "minimal" + end + return box_by_kind[box_kind], box_kind + end + + local function prepare_layout_parts(layout, box_type) + layout.results = tslayout.Window(results) + results.border:set_style(border.results_patch[box_type]) + + layout.prompt = tslayout.Window(prompt) + prompt.border:set_style(border.prompt_patch[box_type]) + + if box_type == "minimal" then + layout.preview = nil + else + layout.preview = tslayout.Window(preview) + preview.border:set_style(border.preview_patch[box_type]) + end + end + + local box, box_kind = get_box() + local layout = layout({ + relative = "editor", + position = "50%", + size = { + height = "60%", + width = "90%", + }, + }, box) + + layout.picker = picker + prepare_layout_parts(layout, box_kind) + + local layout_update = layout.update + function layout:update() + local box, box_kind = get_box() + prepare_layout_parts(layout, box_kind) + layout_update(self, box) + end + + return tslayout(layout) + end, + }, +}) diff --git a/config/nvim/lua/plugins.lua b/config/nvim/lua/plugins.lua new file mode 100644 index 0000000..b60f913 --- /dev/null +++ b/config/nvim/lua/plugins.lua @@ -0,0 +1,97 @@ +local install_path = vim.fn.stdpath("data") .. "/site/pack/packer/start/packer.nvim" +if vim.fn.empty(vim.fn.glob(install_path)) > 0 then + vim.fn.system({ "git", "clone", "--depth", "1", "https://github.com/wbthomason/packer.nvim", install_path }) + vim.cmd([[packadd packer.nvim]]) +end + +require("packer").startup(function(use) + use("wbthomason/packer.nvim") + -- Visual + use("shaunsingh/nord.nvim") + use("MunifTanjim/nui.nvim") + use({ "nvim-treesitter/nvim-treesitter", run = ":TSUpdate" }) + use("lukas-reineke/indent-blankline.nvim") + use("itchyny/lightline.vim") + -- Files navigation + use("nvim-lua/plenary.nvim") + use("nvim-telescope/telescope.nvim") + -- Git + use("tpope/vim-fugitive") + use("airblade/vim-gitgutter") + use({ + "harrisoncramer/gitlab.nvim", + requires = { + "MunifTanjim/nui.nvim", + "nvim-lua/plenary.nvim", + "sindrets/diffview.nvim", + "stevearc/dressing.nvim", -- Recommended but not required. Better UI for pickers. + "nvim-tree/nvim-web-devicons", -- Recommended but not required. Icons in discussion tree. + }, + run = function() + require("gitlab.server").build(true) + end, + }) + -- Programming + use("neovim/nvim-lspconfig") + use("p00f/clangd_extensions.nvim") + use("w0rp/ale") + use("maximbaz/lightline-ale") + use("SirVer/ultisnips") + use("honza/vim-snippets") + use("craigemery/vim-autotag") + use("scrooloose/nerdcommenter") + -- Movement, format and others + use("tpope/vim-surround") + use("tpope/vim-repeat") + use("dhruvasagar/vim-table-mode") + +-- Indent blanklike character specificaiton +local highlight = { "CursorColumn", "Whitespace" } +require("ibl").setup({ + indent = { highlight = highlight, char = "" }, + whitespace = { + highlight = highlight, + remove_blankline_trail = false, + }, + scope = { enabled = false }, +}) +-- Treesitter +require("nvim-treesitter.configs").setup({ + ensure_installed = { + "c", + "lua", + "kconfig", + "make", + "markdown", + "meson", + "ninja", + "ini", + "gitcommit", + "git_rebase", + "git_config", + "nix", + "python", + "toml", + "vim", + "vimdoc", + "yaml", + }, + highlight = { + enable = true, + additional_vim_regex_highlighting = false, + }, +}) + +-- LSP +local lspconfig = require("lspconfig") +lspconfig.clangd.setup({}) +lspconfig.rnix.setup({}) +lspconfig.pylsp.setup({}) +lspconfig.bashls.setup({}) + +-- Telescope +require('mytelescope') + +-- Gitlab +require("diffview").setup() +require("gitlab").setup() diff --git a/config/nvim/selene-vim.yml b/config/nvim/selene-vim.yml new file mode 100644 index 0000000..53daa57 --- /dev/null +++ b/config/nvim/selene-vim.yml @@ -0,0 +1,5 @@ +--- +base: lua51 +globals: + vim: + any: true diff --git a/config/nvim/selene.toml b/config/nvim/selene.toml new file mode 100644 index 0000000..39b4859 --- /dev/null +++ b/config/nvim/selene.toml @@ -0,0 +1,4 @@ +std = "selene-vim" + +[lints] +mixed_table = "allow" -- cgit v1.2.3