"""""""""""""""""""""""""""""""" " Download vim-plug """""""""""""""""""""""""""""""" if has('nvim') if ! filereadable(system('echo -n "$HOME/.config/nvim/autoload/plug.vim"')) silent !mkdir -p $HOME/.config/nvim/autoload/ silent !curl --silent "https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim" > $HOME/.config/nvim/autoload/plug.vim autocmd VimEnter * PlugInstall endif endif """""""""""""""""""""""""""""""" " Default settings nvim """""""""""""""""""""""""""""""" let g:python3_host_prog = expand('/usr/bin/python3') let g:loaded_python_provider = 0 let g:python_host_prog = '' set autoindent set expandtab set softtabstop=4 set shiftwidth=4 set tabstop=4 set nocompatible set noshowmode set noerrorbells set nowrap set hidden set cmdheight=1 set encoding=utf-8 set undofile set scrolloff=8 set termguicolors set t_BE= au BufWritePre * let &bex = '@' . strftime("%F.%H:%M") filetype plugin indent on syntax on " Disable by default indent line " let g:indentLine_enabled = 0 " ansible let g:ansible_extra_keywords_highlight = 1 " line numbers set number set ruler set title " indent set backspace=indent,eol,start "set list listchars=nbsp:¬,tab:»·,trail:·,extends:> set list listchars=tab:\│\ ,trail:· let g:indentLine_char_list = ['│', '│', '│', '│'] " editing runtime! macros/matchit.vim " visual feedback set laststatus=2 set showmode set showcmd " off mouse set mouse-=a " disable pcspkr beep set visualbell set t_vb= " searching set smartcase set ic " cursor set guicursor= set guicursor+=a:blinkon0 let &t_SI = "\[6 q" let &t_SR = "\[6 q" let &t_EI = "\[6 q" """""""""""""""""""""""""""""""" " Plugins """""""""""""""""""""""""""""""" call plug#begin('~/.config/nvim/plugged') " Markdown Plug 'tpope/vim-markdown' " Live-preview Plug 'nmante/vim-latex-live-preview' " Goyo plugin for writing mutt mail Plug 'junegunn/goyo.vim' " Themes Plug 'gruvbox-community/gruvbox', { 'as': 'gruvbox'} Plug 'Mofiqul/dracula.nvim' " Fzf plugin Plug 'junegunn/fzf.vim' Plug 'junegunn/fzf' " CSS Plug 'ap/vim-css-color' " Copilot Plug 'github/copilot.vim' " PyRight Plug 'sakhnik/nvim-gdb', { 'do': ':!./install.sh' } " Ansible yaml Plug 'pearofducks/ansible-vim', { 'do': './UltiSnips/generate.sh' } Plug 'Yggdroot/indentLine' " Terraform Plug 'hashivim/vim-terraform' " GoLang Plug 'fatih/vim-go' " Multiple cursors Plug 'terryma/vim-multiple-cursors' " Enable gentoo-syntax in vim Plug 'gentoo/gentoo-syntax' Plug 'tpope/vim-commentary' Plug 'tpope/vim-surround' Plug 'junegunn/vim-easy-align' " Git tool Plug 'tpope/vim-fugitive' " Prettier Plug 'prettier/vim-prettier', { 'do': 'yarn install --frozen-lockfile --production' } " Debug Plug 'puremourning/vimspector' Plug 'mfussenegger/nvim-dap' " LSP Plug 'neovim/nvim-lspconfig' Plug 'hrsh7th/nvim-cmp' Plug 'hrsh7th/cmp-buffer' Plug 'hrsh7th/cmp-path' Plug 'hrsh7th/cmp-cmdline' Plug 'hrsh7th/cmp-nvim-lsp' Plug 'saadparwaiz1/cmp_luasnip' Plug 'L3MON4D3/LuaSnip' Plug 'sbdchd/neoformat' Plug 'hrsh7th/cmp-vsnip' Plug 'hrsh7th/vim-vsnip' Plug 'hrsh7th/vim-vsnip-integ' " Telescope Plug 'nvim-lua/plenary.nvim' Plug 'nvim-telescope/telescope.nvim' " Tree Plug 'nvim-tree/nvim-web-devicons' Plug 'nvim-tree/nvim-tree.lua' " SHFMT Plug 'z0mbix/vim-shfmt', { 'for': 'sh' } " Mikrotik Plug 'zainin/vim-mikrotik' Plug 'nvim-treesitter/nvim-treesitter' Plug 'nvim-treesitter/nvim-treesitter-context' call plug#end() " LUA lua<lua vim.lsp.buf.declaration()', opts) vim.api.nvim_buf_set_keymap(bufnr, 'n', 'gd', 'lua vim.lsp.buf.definition()', opts) vim.api.nvim_buf_set_keymap(bufnr, 'n', 'K', 'lua vim.lsp.buf.hover()', opts) vim.api.nvim_buf_set_keymap(bufnr, 'n', 'gi', 'lua vim.lsp.buf.implementation()', opts) vim.api.nvim_buf_set_keymap(bufnr, 'n', 'ge', 'lua vim.diagnostic.setqflist()', opts) --vim.api.nvim_buf_set_keymap(bufnr, 'n', 'wa', 'lua vim.lsp.buf.add_workspace_folder()', opts) --vim.api.nvim_buf_set_keymap(bufnr, 'n', 'wr', 'lua vim.lsp.buf.remove_workspace_folder()', opts) --vim.api.nvim_buf_set_keymap(bufnr, 'n', 'wl', 'lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))', opts) --vim.api.nvim_buf_set_keymap(bufnr, 'n', 'D', 'lua vim.lsp.buf.type_definition()', opts) vim.api.nvim_buf_set_keymap(bufnr, 'n', 'rn', 'lua vim.lsp.buf.rename()', opts) vim.api.nvim_buf_set_keymap(bufnr, 'n', 'ca', 'lua vim.lsp.buf.code_action()', opts) vim.api.nvim_buf_set_keymap(bufnr, 'n', 'gr', 'lua vim.lsp.buf.references()', opts) --vim.api.nvim_buf_set_keymap(bufnr, 'n', 'f', 'lua vim.lsp.buf.formatting()', opts) end -- LSP settings (for overriding per client) local handlers = { ["textDocument/hover"] = vim.lsp.with(vim.lsp.handlers.hover, {border = border}), ["textDocument/signatureHelp"] = vim.lsp.with(vim.lsp.handlers.signature_help, {border = border }), } -- Use a loop to conveniently call 'setup' on multiple servers and -- map buffer local keybindings when the language server attaches local servers = { 'pyright', 'bashls', 'yamlls', 'ansiblels', 'gopls', 'solargraph', 'terraformls', 'tflint' } for _, lsp in pairs(servers) do require('lspconfig')[lsp].setup { on_attach = on_attach, handlers=handlers, capabilities = capabilities, flags = { debounce_text_changes = 150, } } end -- Handlers when you are in the insert mode you see the errors vim.lsp.handlers["textDocument/publishDiagnostics"] = vim.lsp.with(vim.lsp.diagnostic.on_publish_diagnostics, {update_in_insert = true}) -- Setup a yamlls plugin require'lspconfig'.yamlls.setup{ settings = { json = { schemas = { ["https://raw.githubusercontent.com/quantumblacklabs/kedro/develop/static/jsonschema/kedro-catalog-0.17.json"]= "conf/**/*catalog*", ["https://json.schemastore.org/github-workflow.json"] = "/.github/workflows/*", ["https://github.com/ansible/schemas/blob/main/f/ansible.json"] = "*.yaml,*.yml" } }, yaml = { keyOrdering = false }, } } -- Setup GoLang require'lspconfig'.gopls.setup { cmd = {"gopls", "serve"}, filetypes = {"go", "gomod"}, on_attach = on_attach, handlers=handlers, capabilities = capabilities, settings = { gopls = { analyses = { unusedparams = true, }, staticcheck = true, linksInHover = false, codelenses = { generate = true, gc_details = true, regenerate_cgo = true, tidy = true, upgrade_depdendency = true, vendor = true, }, usePlaceholders = true, }, }, } -- luasnip setup local luasnip = require 'luasnip' -- nvim-cmp setup local cmp = require 'cmp' cmp.setup { snippet = { expand = function(args) luasnip.lsp_expand(args.body) end, }, mapping = cmp.mapping.preset.insert({ [''] = cmp.mapping.scroll_docs(-4), [''] = cmp.mapping.scroll_docs(4), [''] = cmp.mapping.complete(), [''] = cmp.mapping.confirm { behavior = cmp.ConfirmBehavior.Replace, select = true, }, [''] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_next_item() elseif luasnip.expand_or_jumpable() then luasnip.expand_or_jump() else fallback() end end, { 'i', 's' }), [''] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_prev_item() elseif luasnip.jumpable(-1) then luasnip.jump(-1) else fallback() end end, { 'i', 's' }), }), sources = { { name = 'nvim_lsp' }, { name = 'luasnip' }, { name = 'vsnip' }, { name = 'ultisnips' }, { name = 'snippy' }, { name = 'path' }, { name = 'buffer' } }, } cmp.setup.cmdline(':', { mapping = cmp.mapping.preset.cmdline(), sources = cmp.config.sources({ { name = 'path' } }, { { name = 'cmdline' } }) }) cmp.setup.cmdline('/', { mapping = cmp.mapping.preset.cmdline(), sources = { { name = 'buffer' } } }) require("nvim-tree").setup({ }) require'treesitter-context'.setup{} EOF " Added popout window to see diagnostic set updatetime=250 autocmd! CursorHold,CursorHoldI * lua vim.diagnostic.open_float(nil, {focus=false, scope="cursor"}) " Neoformat let g:neoformat_try_formatprg = 1 let g:neoformat_basic_format_trim = 1 let g:neoformat_only_msg_on_error = 1 " autocmd BufWritePre * silent! undojoin | Neoformat let g:neoformat_python_black = { \ 'exe': 'black', \ 'stdin': 1, \ 'args': ['--line-length', '80', '-q', '-'], \ } let g:neoformat_enabled_python = ['black'] " Terraform let g:terraform_fmt_on_save=1 let g:terraform_align=1 function! s:check_back_space() abort let col = col('.') - 1 return !col || getline('.')[col - 1] =~# '\s' endfunction " Enable show hidden in NerdTree let NERDTreeShowHidden=1 " latex let g:tex_flavor = "latex" " Debug let g:vimspector_enable_mappings = 'VISUAL_STUDIO' let g:vimspector_install_gadgets = [ 'debugpy', 'vscode-go', 'CodeLLDB', 'vscode-node-debug2' ] """""""""""""""""""""""""""""""" " Theme """""""""""""""""""""""""""""""" "colorscheme gruvbox "colorscheme default colorscheme dracula let g:gruvbox_invert_selection='0' let g:gruvbox_contrast_dark = 'hard' set background=dark "hi Normal ctermbg=NONE hi Pmenu ctermfg=NONE ctermbg=236 cterm=NONE guifg=NONE guibg=#64666d gui=NONE hi PmenuSel ctermfg=NONE ctermbg=246 cterm=NONE guifg=NONE guibg=#204a87 gui=NONE hi CursorLine cterm=NONE term=NONE ctermbg=NONE guibg=NONE hi CursorLine ctermbg=235 hi DiffAdd cterm=BOLD ctermfg=NONE ctermbg=22 hi DiffDelete cterm=BOLD ctermfg=NONE ctermbg=52 hi DiffChange cterm=BOLD ctermfg=NONE ctermbg=23 hi DiffText cterm=BOLD ctermfg=NONE ctermbg=23 set t_ZH="\e[3m" set t_ZR="\e[23m" highlight Comment cterm=italic gui=italic highlight htmlArg gui=italic cterm=italic " columne set textwidth=80 set colorcolumn=80 highlight ColorColumn ctermbg=236 """""""""""""""""""""""""""""""" " Status Line """""""""""""""""""""""""""""""" function! GitBranch() return system("git rev-parse --abbrev-ref HEAD 2>/dev/null | tr -d '\n'") endfunction function! StatuslineGit() let l:branchname = GitBranch() return strlen(l:branchname) > 0?' '.l:branchname.' ':'' endfunction set statusline= set statusline+=%#IncSearch# set statusline+=%{&filetype!=#''?'\ \ ['.&filetype.']\ ':'\ '} set statusline+=%{&modified?'[+]\ ':''} set statusline+=%#CursorLineNr# set statusline+=\ %F set statusline+=%= "Right side settings set statusline+=%#CursorLineNr# set statusline+=%{StatuslineGit()} set statusline+=%#Search# set statusline+=\ %l/%L set statusline+=\ [%c] " Disable godoc keys let g:go_doc_keywordprg_enabled = 0 set completeopt-=preview """""""""""""""""""""""""""""""" " Keyboard shortcuts """""""""""""""""""""""""""""""" let mapleader = "\" nmap 2 :w! " Adding print message autocmd FileType python nmap f i print("--------DEBUG--------")print()print("--------END DEBUG--------") autocmd FileType sh nmap f i echo -e "--------DEBUG--------"echo -e ""echo -e "--------END DEBUG--------" " Adding commentary xmap c Commentary nmap c Commentary omap c Commentary nmap c CommentaryLine xmap Commentary nmap Commentary omap Commentary nmap CommentaryLine " Better tab vnoremap > vnoremap < " Better word nmap yw vey " Select all text nmap ggG " Telescope nmap e Telescope buffers nmap w Telescope find_files nmap q Telescope live_grep nmap g Telescope git_branches nmap a Telescope diagnostics " Resize window nnoremap :vertical resize +5 nnoremap :vertical resize -5 nnoremap :res -5 nnoremap :res +5 " Split window nnoremap _ :vsp nnoremap - :split " Reload file nnoremap :edit nnoremap :edit! inoremap pumvisible() ? "\" : "\" " Moving line up or down using alt nnoremap :m-2 nnoremap :m+ inoremap :m-2 inoremap :m+ vnoremap :m '>+1gv=gv vnoremap :m '<-2gv=gv nnoremap Ż :m-2 nnoremap ∆ :m+ vnoremap ∆ :m '>+1gv=gv vnoremap Ż :m '<-2gv=gv nnoremap :m-2 nnoremap :m+ inoremap :m-2 inoremap :m+ vnoremap :m '>+1gv=gv vnoremap :m '<-2gv=gv " Better replace nnoremap s :%s//g vnoremap s :s//g " Better adding into begging and ending line vnoremap F $A vnoremap f 0I " Better management of tabs nnoremap :tabnew nnoremap :tabprevious nnoremap :tabnext inoremap :tabpreviousi inoremap :tabnexti nnoremap k :tabprevious nnoremap j :tabnext inoremap :tabnew " Better moving nnoremap J } nnoremap K { vnoremap J } vnoremap K { " Copy into system noremap y "*y noremap p "*p " Code map Vgaip= " Multiple cursors let g:multi_cursor_start_word_key = '' let g:multi_cursor_select_all_word_key = '' let g:multi_cursor_start_key = 'g' let g:multi_cursor_select_all_key = 'g' let g:multi_cursor_next_key = '' let g:multi_cursor_prev_key = '' let g:multi_cursor_skip_key = '' let g:multi_cursor_quit_key = '' " Others nnoremap ee :!mupdf $(echo % \| sed 's/tex$/pdf/') & disown map :NvimTreeToggle nnoremap r :NvimTreeRefresh nnoremap n :NvimTreeFindFile nnoremap :Goyo cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' edit! map :setlocal spell! spelllang=en_gb map :setlocal spell! spelllang=pl " Human Errors :command! W w :command! Q q :command! Wq wq """""""""""""""""""""""""""""""" " Custom functions """""""""""""""""""""""""""""""" lua < /dev/null " | redraw! autocmd BufWritePost *.tex silent! execute "!latexmk -pdf -silent % > /dev/null" | redraw! autocmd BufWritePost *.tex silent! execute "!rm -rf *.fls *.ilg *.nav *.snm *.toc *.idx *.lof *.lot *.synctex.gz *.aux *.fdb_latexmk *.fls *.log *.out > /dev/null" | redraw! autocmd BufWritePost *.tex silent! execute "!pkill -HUP mupdf > /dev/null" | redraw! " Mutt autocmd BufRead,BufNewFile /tmp/neomutt* let g:goyo_width=80 autocmd BufRead,BufNewFile /tmp/neomutt* :Goyo autocmd BufRead,BufNewFile /tmp/neomutt* map ZZ :Goyo\|x! autocmd BufRead,BufNewFile /tmp/neomutt* map ZQ :Goyo\|q! " Yaml autocmd BufRead,BufNewFile *.yaml let g:indentLine_enabled = 1 autocmd BufRead,BufNewFile *.yaml let g:indentLine_char = '⦙' au BufRead,BufNewFile *.yaml,*.yml if search('hosts:\|tasks:', 'nw') | set ft=yaml.ansible | endif autocmd BufWritePre * silent! undojoin | Neoformat prettier " GoLang autocmd BufRead *.go set noexpandtab autocmd BufWritePre *.go lua go_org_imports() let g:go_def_mapping_enabled = 0 let g:go#fmt#autosave = v:true " Conf au BufNewFile,BufRead *.conf setfiletype conf " Mikrotik au BufNewFile,BufRead *.mikrotik setfiletype routeros " Ebuild au BufNewFile,BufRead,BufWritePre *.ebuild let g:shfmt_extra_args = '-ci -sr -s' " Terrafrom autocmd BufWritePre *.tf lua vim.lsp.buf.formatting_sync() autocmd BufWritePre *.tfvars lua vim.lsp.buf.formatting_sync() " Automatically deletes all trailing whitespace and newlines at end of file on save. autocmd BufWritePre * %s/\s\+$//e autocmd BufWritepre * %s/\n\+\%$//e " Source: https://vi.stackexchange.com/questions/20077/automatically-highlight-all-occurrences-of-the-selected-text-in-visual-mode " highlight the visual selection after pressing enter. xnoremap "*y:silent! let searchTerm = '\V'.substitute(escape(@*, '\/'), "\n", '\\n', "g") let @/ = searchTerm echo '/'.@/ call histadd("search", searchTerm) set hls """""""""""""""""""""""""""""""" " FZF """""""""""""""""""""""""""""""" let $FZF_DEFAULT_COMMAND = 'find . -type f -not -path "*/\.git/*" -not -path "*/\.local/share/nvim/*" -not -path "./Library/*" ' command! -bang -nargs=* Find call fzf#vim#grep('rg --column --line-number --no-heading --fixed-strings --ignore-case --hidden --follow --color "always" '.shellescape(), 1, 0) command! -bang -nargs=* FindCurrentWord call fzf#vim#grep('rg --column --line-number --no-heading --fixed-strings --ignore-case --hidden --follow --color "always" '.shellescape(expand('')), 1, 0) set grepprg=rg\ --vimgrep