From f1b16b2fa5aeb589d4a164cb5553e5d84b39ae2a Mon Sep 17 00:00:00 2001 From: Hippolyte Chauvin Date: Thu, 13 Apr 2023 10:21:47 +0200 Subject: [PATCH] Configuration de Neovim --- config/nvim-arch/init.vim | 184 +++++++++++++++ config/nvim-arch/plugin/init.feline.lua | 295 ++++++++++++++++++++++++ 2 files changed, 479 insertions(+) create mode 100644 config/nvim-arch/init.vim create mode 100644 config/nvim-arch/plugin/init.feline.lua diff --git a/config/nvim-arch/init.vim b/config/nvim-arch/init.vim new file mode 100644 index 0000000..beff0dc --- /dev/null +++ b/config/nvim-arch/init.vim @@ -0,0 +1,184 @@ +" Source the default Vim configuration +set runtimepath^=~/.vim runtimepath+=~/.vim/after +let &packpath = &runtimepath +source ~/.vimrc + +" colorscheme +colorscheme tokyonight-night + +" devicons +let g:webdevicons_enable = 1 +let g:webdevicons_enable_nerdtree = 1 +let g:airline_powerline_fonts = 1 + +" nerdtree +nmap :NERDTreeToggle +autocmd VimEnter * NERDTreeFocus | wincmd p +autocmd BufEnter * if tabpagenr('$') == 1 && winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() | quit | endif +autocmd BufEnter * if winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() | quit | endif +autocmd BufWinEnter * if getcmdwintype() == '' | silent NERDTreeMirror | endif + +" coc +packadd coc.nvim + +" May need for Vim (not Neovim) since coc.nvim calculates byte offset by count +" utf-8 byte sequence +set encoding=utf-8 +" Some servers have issues with backup files, see #649 +set nobackup +set nowritebackup + +" Having longer updatetime (default is 4000 ms = 4s) leads to noticeable +" delays and poor user experience +set updatetime=300 + +" Always show the signcolumn, otherwise it would shift the text each time +" diagnostics appear/become resolved +set signcolumn=yes + +" Use tab for trigger completion with characters ahead and navigate +" NOTE: There's always complete item selected by default, you may want to enable +" no select by `"suggest.noselect": true` in your configuration file +" NOTE: Use command ':verbose imap ' to make sure tab is not mapped by +" other plugin before putting this into your config +inoremap + \ coc#pum#visible() ? coc#pum#next(1) : + \ CheckBackspace() ? "\" : + \ coc#refresh() +inoremap coc#pum#visible() ? coc#pum#prev(1) : "\" + +" Make to accept selected completion item or notify coc.nvim to format +" u breaks current undo, please make your own choice +inoremap coc#pum#visible() ? coc#pum#confirm() + \: "\u\\=coc#on_enter()\" + +function! CheckBackspace() abort + let col = col('.') - 1 + return !col || getline('.')[col - 1] =~# '\s' +endfunction + +" Use to trigger completion +if has('nvim') + inoremap coc#refresh() +else + inoremap coc#refresh() +endif + +" Use `[g` and `]g` to navigate diagnostics +" Use `:CocDiagnostics` to get all diagnostics of current buffer in location list +nmap [g (coc-diagnostic-prev) +nmap ]g (coc-diagnostic-next) + +" GoTo code navigation +nmap gd (coc-definition) +nmap gy (coc-type-definition) +nmap gi (coc-implementation) +nmap gr (coc-references) + +" Use K to show documentation in preview window +nnoremap K :call ShowDocumentation() + +function! ShowDocumentation() + if CocAction('hasProvider', 'hover') + call CocActionAsync('doHover') + else + call feedkeys('K', 'in') + endif +endfunction + +" Highlight the symbol and its references when holding the cursor +autocmd CursorHold * silent call CocActionAsync('highlight') + +" Symbol renaming +nmap rn (coc-rename) + +" Formatting selected code +xmap f (coc-format-selected) +nmap f (coc-format-selected) + +augroup mygroup + autocmd! + " Setup formatexpr specified filetype(s) + autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected') + " Update signature help on jump placeholder + autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp') +augroup end + +" Applying code actions to the selected code block +" Example: `aap` for current paragraph +xmap a (coc-codeaction-selected) +nmap a (coc-codeaction-selected) + +" Remap keys for applying code actions at the cursor position +nmap ac (coc-codeaction-cursor) +" Remap keys for apply code actions affect whole buffer +nmap as (coc-codeaction-source) +" Apply the most preferred quickfix action to fix diagnostic on the current line +nmap qf (coc-fix-current) + +" Remap keys for applying refactor code actions +nmap re (coc-codeaction-refactor) +xmap r (coc-codeaction-refactor-selected) +nmap r (coc-codeaction-refactor-selected) + +" Run the Code Lens action on the current line +nmap cl (coc-codelens-action) + +" Map function and class text objects +" NOTE: Requires 'textDocument.documentSymbol' support from the language server +xmap if (coc-funcobj-i) +omap if (coc-funcobj-i) +xmap af (coc-funcobj-a) +omap af (coc-funcobj-a) +xmap ic (coc-classobj-i) +omap ic (coc-classobj-i) +xmap ac (coc-classobj-a) +omap ac (coc-classobj-a) + +" Remap and to scroll float windows/popups +if has('nvim-0.4.0') || has('patch-8.2.0750') + nnoremap coc#float#has_scroll() ? coc#float#scroll(1) : "\" + nnoremap coc#float#has_scroll() ? coc#float#scroll(0) : "\" + inoremap coc#float#has_scroll() ? "\=coc#float#scroll(1)\" : "\" + inoremap coc#float#has_scroll() ? "\=coc#float#scroll(0)\" : "\" + vnoremap coc#float#has_scroll() ? coc#float#scroll(1) : "\" + vnoremap coc#float#has_scroll() ? coc#float#scroll(0) : "\" +endif + +" Use CTRL-S for selections ranges +" Requires 'textDocument/selectionRange' support of language server +nmap (coc-range-select) +xmap (coc-range-select) + +" Add `:Format` command to format current buffer +command! -nargs=0 Format :call CocActionAsync('format') + +" Add `:Fold` command to fold current buffer +command! -nargs=? Fold :call CocAction('fold', ) + +" Add `:OR` command for organize imports of the current buffer +command! -nargs=0 OR :call CocActionAsync('runCommand', 'editor.action.organizeImport') + +" Add (Neo)Vim's native statusline support +" NOTE: Please see `:h coc-status` for integrations with external plugins that +" provide custom statusline: lightline.vim, vim-airline +set statusline^=%{coc#status()}%{get(b:,'coc_current_function','')} + +" Mappings for CoCList +" Show all diagnostics +nnoremap a :CocList diagnostics +" Manage extensions +nnoremap e :CocList extensions +" Show commands +nnoremap c :CocList commands +" Find symbol of current document +nnoremap o :CocList outline +" Search workspace symbols +nnoremap s :CocList -I symbols +" Do default action for next item +nnoremap j :CocNext +" Do default action for previous item +nnoremap k :CocPrev +" Resume latest coc list +nnoremap p :CocListResume + diff --git a/config/nvim-arch/plugin/init.feline.lua b/config/nvim-arch/plugin/init.feline.lua new file mode 100644 index 0000000..c07d83d --- /dev/null +++ b/config/nvim-arch/plugin/init.feline.lua @@ -0,0 +1,295 @@ +---depends om https://github.com/feline-nvim/feline.nvim +local present, feline = pcall(require, "feline") + +if not present then + return +end + +local theme = { + aqua = "#7AB0DF", + bg = "#1C212A", + blue = "#5FB0FC", + cyan = "#70C0BA", + darkred = "#FB7373", + fg = "#C7C7CA", + gray = "#222730", + green = "#79DCAA", + lime = "#54CED6", + orange = "#FFD064", + pink = "#D997C8", + purple = "#C397D8", + red = "#F87070", + yellow = "#FFE59E" +} + +local mode_theme = { + ["NORMAL"] = theme.green, + ["OP"] = theme.cyan, + ["INSERT"] = theme.aqua, + ["VISUAL"] = theme.yellow, + ["LINES"] = theme.darkred, + ["BLOCK"] = theme.orange, + ["REPLACE"] = theme.purple, + ["V-REPLACE"] = theme.pink, + ["ENTER"] = theme.pink, + ["MORE"] = theme.pink, + ["SELECT"] = theme.darkred, + ["SHELL"] = theme.cyan, + ["TERM"] = theme.lime, + ["NONE"] = theme.gray, + ["COMMAND"] = theme.blue, +} + +local component = {} + +component.vim_mode = { + provider = function() + return vim.api.nvim_get_mode().mode:upper() + end, + hl = function() + return { + fg = "bg", + bg = require("feline.providers.vi_mode").get_mode_color(), + style = "bold", + name = "NeovimModeHLColor", + } + end, + left_sep = "block", + right_sep = "block", +} + +component.git_branch = { + provider = "git_branch", + hl = { + fg = "fg", + bg = "bg", + style = "bold", + }, + left_sep = "block", + right_sep = "", +} + +component.git_add = { + provider = "git_diff_added", + hl = { + fg = "green", + bg = "bg", + }, + left_sep = "", + right_sep = "", +} + +component.git_delete = { + provider = "git_diff_removed", + hl = { + fg = "red", + bg = "bg", + }, + left_sep = "", + right_sep = "", +} + +component.git_change = { + provider = "git_diff_changed", + hl = { + fg = "purple", + bg = "bg", + }, + left_sep = "", + right_sep = "", +} + +component.separator = { + provider = "", + hl = { + fg = "bg", + bg = "bg", + }, +} + +component.diagnostic_errors = { + provider = "diagnostic_errors", + hl = { + fg = "red", + }, +} + +component.diagnostic_warnings = { + provider = "diagnostic_warnings", + hl = { + fg = "yellow", + }, +} + +component.diagnostic_hints = { + provider = "diagnostic_hints", + hl = { + fg = "aqua", + }, +} + +component.diagnostic_info = { + provider = "diagnostic_info", +} + +component.lsp = { + provider = function() + if not rawget(vim, "lsp") then + return "" + end + + local progress = vim.lsp.util.get_progress_messages()[1] + if vim.o.columns < 120 then + return "" + end + + local clients = vim.lsp.get_active_clients({ bufnr = 0 }) + if #clients ~= 0 then + if progress then + local spinners = { + "◜ ", + "◠ ", + "◝ ", + "◞ ", + "◡ ", + "◟ ", + } + local ms = vim.loop.hrtime() / 1000000 + local frame = math.floor(ms / 120) % #spinners + local content = string.format("%%<%s", spinners[frame + 1]) + return content or "" + else + return "לּ LSP" + end + end + return "" + end, + hl = function() + local progress = vim.lsp.util.get_progress_messages()[1] + return { + fg = progress and "yellow" or "green", + bg = "gray", + style = "bold", + } + end, + left_sep = "", + right_sep = "block", +} + +component.file_type = { + provider = { + name = "file_type", + opts = { + filetype_icon = true, + }, + }, + hl = { + fg = "fg", + bg = "gray", + }, + left_sep = "block", + right_sep = "block", +} + +component.scroll_bar = { + provider = function() + local chars = { + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + } + local line_ratio = vim.api.nvim_win_get_cursor(0)[1] / vim.api.nvim_buf_line_count(0) + local position = math.floor(line_ratio * 100) + + if position <= 5 then + position = " TOP" + elseif position >= 95 then + position = " BOT" + else + position = chars[math.floor(line_ratio * #chars)] .. position + end + return position + end, + hl = function() + local position = math.floor(vim.api.nvim_win_get_cursor(0)[1] / vim.api.nvim_buf_line_count(0) * 100) + local fg + local style + + if position <= 5 then + fg = "aqua" + style = "bold" + elseif position >= 95 then + fg = "red" + style = "bold" + else + fg = "purple" + style = nil + end + return { + fg = fg, + style = "bold", + bg = "bg", + } + end, + left_sep = "block", + right_sep = "block", +} + +local left = {} +local middle = {} +local right = { + component.vim_mode, + component.file_type, + component.lsp, + component.git_branch, + component.git_add, + component.git_delete, + component.git_change, + component.separator, + component.diagnostic_errors, + component.diagnostic_warnings, + component.diagnostic_info, + component.diagnostic_hints, + component.scroll_bar, +} + +local components = { + active = { + left, + middle, + right, + }, +} + +feline.setup({ + components = components, + theme = theme, + vi_mode_colors = mode_theme, +}) + +---vim:filetype=lua \ No newline at end of file