"***************************************************************************** """ 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')) Plug 'neovim/nvim-lspconfig' 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' } Plug 'pangloss/vim-javascript' " tagbar " golang install go get -u github.com/jstemmer/gotags Plug 'majutsushi/tagbar' Plug 'w0rp/ale' Plug 'godlygeek/tabular' Plug 'plasticboy/vim-markdown' Plug 'ctrlpvim/ctrlp.vim' Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' } Plug 'junegunn/fzf.vim' " defx file explorer " require python package pynvim " install `pip3 install --user pynvim` " Plug 'Shougo/defx.nvim', { 'do': ':UpdateRemotePlugins' } Plug 'kyazdani42/nvim-web-devicons' " for file icons Plug 'kyazdani42/nvim-tree.lua' Plug 'vim-airline/vim-airline' Plug 'kien/tabman.vim' " for git Plug 'tpope/vim-fugitive' Plug 'christoomey/vim-conflicted' " for mark Plug 'inkarkat/vim-ingo-library' Plug 'inkarkat/vim-mark' Plug 'rking/ag.vim' Plug 'terryma/vim-multiple-cursors' " temp plugin Plug 'tpope/vim-surround' Plug 'buoto/gotests-vim' 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' call plug#end() syntax on set number set tabstop=2 set shiftwidth=2 set expandtab set nofoldenable set pastetoggle= " always show status set laststatus=2 " show cursor position set ruler set cursorline set cursorcolumn set hlsearch " no wrap line set nowrap " enable backspace set backspace=indent,eol,start set encoding=utf-8 set completeopt=menu,menuone,noselect set noswapfile " set guifont=Hack\ Nerd\ Font:h11 set background=dark set termguicolors function! AdaptColorscheme() highlight clear CursorLine highlight Normal ctermbg=none highlight LineNr ctermbg=none highlight Folded ctermbg=none highlight NonText ctermbg=none highlight SpecialKey ctermbg=none highlight VertSplit ctermbg=none highlight SignColumn ctermbg=none endfunction autocmd ColorScheme * call AdaptColorscheme() " colorscheme turtles colorscheme afterglow " define leader key let mapleader=";" filetype indent on " 開啟檔案類型偵測 filetype on " 根據檔案類型載入plugin filetype plugin on " split window nmap sw nmap sww k nmap sws j nmap swa h nmap swd l nnoremap fl :Lines nnoremap fb :BLines nnoremap ff :Files nnoremap fg :GFiles nnoremap f? :GFiles? nnoremap ft :Tags nnoremap fa :Ag nnoremap fc :Commits nmap aa gT nmap dd gt nnoremap me :NvimTreeToggle nnoremap :NvimTreeToggle function! TabCloseRight(bang) let cur=tabpagenr() while cur < tabpagenr('$') exe 'tabclose' . a:bang . ' ' . (cur + 1) endwhile endfunction function! TabCloseLeft(bang) while tabpagenr() > 1 exe 'tabclose' . a:bang . ' 1' endwhile endfunction command! -bang Tabcloseright call TabCloseRight('') command! -bang Tabcloseleft call TabCloseLeft('') " 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) nmap f (easymotion-overwin-f) " s{char}{char} to move to {char}{char} nmap s (easymotion-overwin-f2) " Move to line map L (easymotion-bd-jk) nmap L (easymotion-overwin-line) " Move to word map w (easymotion-bd-w) nmap w (easymotion-overwin-w) " lint let g:ale_linters = { \ 'javascript': [{{js_linter}}], \ 'go': ['gopls'], \ 'rust': ['analyzer'], \} let g:ale_fixers = {'javascript': [{{js_fixer}}]} let g:ale_linters_explicit = 1 let g:ale_lint_on_save = 1 let g:ale_fix_on_save = 1 nmap = (ale_fix) " NERDCommenter let g:NERDSpaceDelims=1 let g:NERDDefaultAlign='left' let g:tagbar_type_go = { \ 'ctagstype' : 'go', \ 'kinds' : [ \ 'p:package', \ 'i:imports:1', \ 'c:constants', \ 'v:variables', \ 't:types', \ 'n:interfaces', \ 'w:fields', \ 'e:embedded', \ 'm:methods', \ 'r:constructor', \ 'f:functions' \ ], \ 'sro' : '.', \ 'kind2scope' : { \ 't' : 'ctype', \ 'n' : 'ntype' \ }, \ 'scope2kind' : { \ 'ctype' : 't', \ 'ntype' : 'n' \ }, \ 'ctagsbin' : 'gotags', \ 'ctagsargs' : '-sort -silent' \ } " vim-go setting 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' let g:go_decls_includes = "func,type" let g:go_highlight_types = 1 let g:go_highlight_fields = 1 let g:go_highlight_functions = 1 let g:go_highlight_function_calls = 1 let g:go_highlight_operators = 1 let g:go_highlight_extra_types = 1 " for rust-vim let g:rust_recommended_style = 0 let g:rustfmt_autosave = 1 let g:syntastic_rust_checkers = ['cargo'] let g:airline#extensions#tabline#enabled = 1 let g:airline#extensions#tabline#show_buffers = 0 let g:airline#extensions#tabline#show_splits = 0 let g:airline#extensions#tabline#show_tabs = 1 let g:airline#extensions#tabline#show_tab_nr = 0 let g:airline#extensions#tabline#show_tab_type = 0 let g:airline#extensions#tabline#close_symbol = '×' let g:airline#extensions#tabline#show_close_button = 0 let g:multi_cursor_use_default_mapping=0 " Default mapping 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 = '' let g:javascript_plugin_jsdoc = 1 " fzf settings " This is the default extra key bindings let g:fzf_action = { \ 'ctrl-t': 'tab split', \ 'ctrl-x': 'split', \ 'ctrl-v': 'vsplit' } " Default fzf layout " - down / up / left / right let g:fzf_layout = { 'down': '~40%' } " Customize fzf colors to match your color scheme let g:fzf_colors = \ { 'fg': ['fg', 'Normal'], \ 'bg': ['bg', 'Normal'], \ 'hl': ['fg', 'Comment'], \ 'fg+': ['fg', 'CursorLine', 'CursorColumn', 'Normal'], \ 'bg+': ['bg', 'CursorLine', 'CursorColumn'], \ 'hl+': ['fg', 'Statement'], \ 'info': ['fg', 'PreProc'], \ 'prompt': ['fg', 'Conditional'], \ 'pointer': ['fg', 'Exception'], \ 'marker': ['fg', 'Keyword'], \ 'spinner': ['fg', 'Label'], \ 'header': ['fg', 'Comment'] } " Enable per-command history. " CTRL-N and CTRL-P will be automatically bound to next-history and " previous-history instead of down and up. If you don't like the change, " explicitly bind the keys to down and up in your $FZF_DEFAULT_OPTS. let g:fzf_history_dir = '~/.local/share/fzf-history' 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'}, }), } require'nvim-tree'.setup { auto_reload_on_write = true, disable_netrw = false, hide_root_folder = false, hijack_cursor = false, hijack_netrw = true, hijack_unnamed_buffer_when_opening = false, ignore_buffer_on_setup = false, open_on_setup = false, open_on_setup_file = false, open_on_tab = false, sort_by = "name", update_cwd = false, view = { width = 40, height = 40, side = "left", preserve_window_proportions = false, number = false, relativenumber = false, signcolumn = "yes", mappings = { custom_only = false, list = { -- user mappings go here }, }, }, renderer = { indent_markers = { enable = false, icons = { corner = "└ ", edge = "│ ", none = " ", }, }, }, hijack_directories = { enable = true, auto_open = true, }, update_focused_file = { enable = false, update_cwd = false, ignore_list = {}, }, ignore_ft_on_setup = {}, system_open = { cmd = nil, args = {}, }, filters = { dotfiles = false, custom = {}, exclude = {}, }, git = { enable = true, ignore = true, timeout = 400, }, actions = { use_system_clipboard = true, change_dir = { enable = true, global = false, }, open_file = { quit_on_open = false, resize_window = false, window_picker = { enable = true, chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890", exclude = { filetype = { "notify", "packer", "qf", "diff", "fugitive", "fugitiveblame" }, buftype = { "nofile", "terminal", "help" }, }, }, }, }, } EOF