diff --git a/nvim/init.vim b/nvim/init.vim index e04a25e..f0203d0 100644 --- a/nvim/init.vim +++ b/nvim/init.vim @@ -1,15 +1,39 @@ -" Specify a directory for plugins -" - For Neovim: stdpath('data') . '/plugged' -" - Avoid using standard Vim directory names like 'plugin' -call plug#begin(stdpath('data').'/plugged') +"***************************************************************************** +""" Vim-Plug core +"***************************************************************************** +let vimplug_exists=expand('~/.config/nvim/autoload/plug.vim') +let curl_exists=expand('curl') + +if !filereadable(vimplug_exists) + if !executable(curl_exists) + echoerr "You have to install curl or first install vim-plug yourself!" + execute "q!" + endif + echo "Installing Vim-Plug..." + echo "" + silent exec "!"curl_exists" -fLo " . shellescape(vimplug_exists) . " --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim" + let g:not_finish_vimplug = "yes" + + autocmd VimEnter * PlugInstall +endif + +" Required: +call plug#begin(expand('~/.config/nvim/plugged')) -" Make sure you use single quotes Plug 'neovim/nvim-lspconfig' -Plug 'nvim-lua/completion-nvim' +Plug 'hrsh7th/nvim-cmp' +Plug 'hrsh7th/cmp-nvim-lsp' +Plug 'hrsh7th/cmp-buffer' +Plug 'hrsh7th/cmp-path' +Plug 'hrsh7th/cmp-cmdline' +" For vsnip users. +Plug 'hrsh7th/cmp-vsnip' +Plug 'hrsh7th/vim-vsnip' Plug 'tomasr/molokai' Plug 'scrooloose/nerdcommenter' Plug 'vim-scripts/DrawIt' + Plug 'easymotion/vim-easymotion' Plug 'mattn/emmet-vim' Plug 'fatih/vim-go', { 'do': ':GoUpdateBinaries' } @@ -18,10 +42,23 @@ Plug 'pangloss/vim-javascript' " golang install go get -u github.com/jstemmer/gotags Plug 'majutsushi/tagbar' Plug 'w0rp/ale' +Plug 'connorholyday/vim-snazzy' +Plug 'hzchirs/vim-material' +Plug 'kadekillary/Turtles' +Plug 'phanviet/vim-monokai-pro' +Plug 'sickill/vim-monokai' Plug 'godlygeek/tabular' +Plug 'plasticboy/vim-markdown' Plug 'ctrlpvim/ctrlp.vim' -Plug 'kien/tabman.vim' + +" defx file explorer +" require python package pynvim +" install `pip3 install --user pynvim` +Plug 'Shougo/defx.nvim', { 'do': ':UpdateRemotePlugins' } + Plug 'vim-airline/vim-airline' +Plug 'kien/tabman.vim' + " for git Plug 'tpope/vim-fugitive' Plug 'christoomey/vim-conflicted' @@ -32,23 +69,19 @@ Plug 'inkarkat/vim-mark' Plug 'rking/ag.vim' Plug 'terryma/vim-multiple-cursors' -Plug 'vim-scripts/TaskList.vim' -Plug 'rust-lang/rust.vim' + +" temp plugin +Plug 'tpope/vim-surround' Plug 'buoto/gotests-vim' - -" color scheme +Plug 'chr4/nginx.vim' +Plug 'cespare/vim-toml' +Plug 'zah/nim.vim' +Plug 'rust-lang/rust.vim' Plug 'danilo-augusto/vim-afterglow' +Plug 'vim-scripts/TaskList.vim' +Plug 'google/vim-jsonnet' +Plug 'github/copilot.vim' -" defx explorer -if has('nvim') - Plug 'Shougo/defx.nvim', { 'do': ':UpdateRemotePlugins' } -else - Plug 'Shougo/defx.nvim' - Plug 'roxma/nvim-yarp' - Plug 'roxma/vim-hug-neovim-rpc' -endif - -" Initialize plugin system call plug#end() syntax on @@ -57,7 +90,6 @@ set tabstop=2 set shiftwidth=2 set expandtab set nofoldenable - set pastetoggle= " always show status set laststatus=2 @@ -71,7 +103,8 @@ set nowrap " enable backspace set backspace=indent,eol,start set encoding=utf-8 -" set font +set completeopt=menu,menuone,noselect + " set guifont=Hack\ Nerd\ Font:h11 set background=dark @@ -87,8 +120,11 @@ function! AdaptColorscheme() highlight SignColumn ctermbg=none endfunction autocmd ColorScheme * call AdaptColorscheme() + +" colorscheme turtles colorscheme afterglow + " define leader key let mapleader=";" filetype indent on @@ -96,7 +132,6 @@ filetype indent on filetype on " 根據檔案類型載入plugin filetype plugin on -autocmd BufWritePost $MYVIMRC source $MYVIMRC " split window nmap sw @@ -104,49 +139,25 @@ nmap sww k nmap sws j nmap swa h nmap swd l + nmap aa gT nmap dd gt -nnoremap gd lua vim.lsp.buf.definition() -nnoremap gt tab splitlua vim.lsp.buf.definition() -nnoremap p lua vim.lsp.buf.hover() -nnoremap gr lua vim.lsp.buf.references() -nnoremap i lua vim.lsp.buf.implementation() -nnoremap gs split \| lua vim.lsp.buf.definition() -nnoremap gv vsplit \| lua vim.lsp.buf.definition() -nnoremap grn lua vim.lsp.buf.rename() - -" initialize lsp -lua require'lspconfig'.gopls.setup{on_attach=require'completion'.on_attach} -lua require'lspconfig'.rust_analyzer.setup{on_attach=require'completion'.on_attach} -lua require'lspconfig'.tsserver.setup{on_attach=require'completion'.on_attach} - -" autocomplete setting -" -------------------- -let g:completion_enable_auto_popup = 0 -let g:completion_trigger_character = ['.', '::'] - -function! s:check_back_space() abort - let col = col('.') - 1 - return !col || getline('.')[col - 1] =~ '\s' +function! TabCloseRight(bang) + let cur=tabpagenr() + while cur < tabpagenr('$') + exe 'tabclose' . a:bang . ' ' . (cur + 1) + endwhile endfunction -" Use and to navigate through popup menu -inoremap - \ pumvisible() ? "\" : - \ "\" -inoremap pumvisible() ? "\" : "\" -" Set completeopt to have a better completion experience -set completeopt=menuone,noinsert,noselect +function! TabCloseLeft(bang) + while tabpagenr() > 1 + exe 'tabclose' . a:bang . ' 1' + endwhile +endfunction -" Avoid showing message extra message when using completion -set shortmess+=c - -imap (completion_trigger) -imap (completion_smart_tab) -imap (completion_smart_s_tab) - -" -------------------- +command! -bang Tabcloseright call TabCloseRight('') +command! -bang Tabcloseleft call TabCloseLeft('') " defx settings call defx#custom#option('_', { @@ -225,6 +236,12 @@ endfunction " tagbar nmap :TagbarToggle +nmap :%!jq . + +" NeoComplete +let g:neocomplete#enable_at_startup = 1 + +let g:airline_powerline_fonts = 1 " f{char} to move to {char} map f (easymotion-bd-f) @@ -240,11 +257,12 @@ nmap w (easymotion-overwin-w) " lint let g:ale_linters = { - \ 'javascript': ['standard'], + \ 'javascript': ['eslint'], \ 'go': ['gopls'], \ 'rust': ['analyzer'], \} -let g:ale_fixers = {'javascript': ['standard']} +let g:ale_fixers = {'javascript': ['prettier']} +let g:ale_linters_explicit = 1 let g:ale_lint_on_save = 1 let g:ale_fix_on_save = 1 nmap = (ale_fix) @@ -281,6 +299,9 @@ let g:tagbar_type_go = { \ 'ctagsargs' : '-sort -silent' \ } +" vim-go setting +autocmd FileType go nmap tgd (go-def-tab) +autocmd FileType go nmap err (go-iferr) let g:go_fmt_fail_silently = 1 let g:go_fmt_command = "goimports" let g:go_def_mode = 'godef' @@ -319,3 +340,87 @@ let g:multi_cursor_skip_key = '' let g:multi_cursor_quit_key = '' let g:javascript_plugin_jsdoc = 1 + +lua << EOF + +local nvlsp = require'lspconfig' + +-- Add additional capabilities supported by nvim-cmp +local capabilities = vim.lsp.protocol.make_client_capabilities() +capabilities = require('cmp_nvim_lsp').update_capabilities(capabilities) + +-- Use an on_attach function to only map the following keys +-- after the language server attaches to the current buffer +local on_attach = function(client, bufnr) + local function buf_set_keymap(...) vim.api.nvim_buf_set_keymap(bufnr, ...) end + local function buf_set_option(...) vim.api.nvim_buf_set_option(bufnr, ...) end + + -- Enable completion triggered by + buf_set_option('omnifunc', 'v:lua.vim.lsp.omnifunc') + + -- Mappings. + local opts = { noremap=true, silent=true } + + -- See `:help vim.lsp.*` for documentation on any of the below functions + -- buf_set_keymap('n', 'gD', 'lua vim.lsp.buf.declaration()', opts) + buf_set_keymap('n', 'gd', 'lua vim.lsp.buf.definition()', opts) + buf_set_keymap('n', 'gt', 'tab splitlua vim.lsp.buf.definition()', opts) + buf_set_keymap('n', 'K', 'lua vim.lsp.buf.hover()', opts) + -- buf_set_keymap('n', 'gi', 'lua vim.lsp.buf.implementation()', opts) + buf_set_keymap('n', '', 'lua vim.lsp.buf.signature_help()', opts) + -- buf_set_keymap('n', 'wa', 'lua vim.lsp.buf.add_workspace_folder()', opts) + -- buf_set_keymap('n', 'wr', 'lua vim.lsp.buf.remove_workspace_folder()', opts) + -- buf_set_keymap('n', 'wl', 'lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))', opts) + buf_set_keymap('n', 'D', 'lua vim.lsp.buf.type_definition()', opts) + buf_set_keymap('n', 'rn', 'lua vim.lsp.buf.rename()', opts) + buf_set_keymap('n', 'ca', 'lua vim.lsp.buf.code_action()', opts) + buf_set_keymap('n', 'gr', 'lua vim.lsp.buf.references()', opts) + buf_set_keymap('n', 'ge', 'lua vim.lsp.diagnostic.show_line_diagnostics()', opts) + -- buf_set_keymap('n', '[d', 'lua vim.lsp.diagnostic.goto_prev()', opts) + -- buf_set_keymap('n', ']d', 'lua vim.lsp.diagnostic.goto_next()', opts) + -- buf_set_keymap('n', 'q', 'lua vim.lsp.diagnostic.set_loclist()', opts) + -- buf_set_keymap('n', 'f', 'lua vim.lsp.buf.formatting()', opts) + +end + +nvlsp['gopls'].setup{ + capabilities = capabilities, + on_attach = on_attach, +} +nvlsp['tsserver'].setup{ + capabilities = capabilities, + on_attach = on_attach, + } +nvlsp['rust_analyzer'].setup{ + capabilities = capabilities, + on_attach = on_attach, + } + +-- nvim-cmp setup +local cmp = require 'cmp' +cmp.setup { + mapping = { + [''] = cmp.mapping.confirm({ + -- behavior = cmp.ConfirmBehavior.Insert, + select = true, + }), + -- [''] = cmp.mapping(cmp.mapping.select_next_item(), { 'i', 's' }), + }, + snippet = { + -- REQUIRED - you must specify a snippet engine + expand = function(args) + vim.fn["vsnip#anonymous"](args.body) -- For `vsnip` users. + -- require('luasnip').lsp_expand(args.body) -- For `luasnip` users. + -- vim.fn["UltiSnips#Anon"](args.body) -- For `ultisnips` users. + -- require'snippy'.expand_snippet(args.body) -- For `snippy` users. + end, + }, + sources = cmp.config.sources({ + { name = 'nvim_lsp' }, + }, { + {name = 'buffer'}, + }), +} + +EOF +