diff --git a/.ctags b/.ctags new file mode 100644 index 0000000..bbd2033 --- /dev/null +++ b/.ctags @@ -0,0 +1,11 @@ +--langdef=js +--langmap=js:.js +--regex-JavaScript=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*\{/\1/o,object/ + +--regex-JavaScript=/([A-Za-z0-9._$'"()]+)[ \t]*[:][ \t]*function[ \t]*\([^)]*\)/\1/f,function/ + +--regex-JavaScript=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*\[/\1/a,array/ + +--regex-JavaScript=/([^= ]+)[ \t]*=[ \t]*'[^']*'/\1/s,string/ + +--regex-JavaScript=/([^= ]+)[ \t]*=[ \t]*"[^"]*"/\1/s,string/ diff --git a/mklink.sh b/mklink.sh index 1239f0f..ede1e77 100755 --- a/mklink.sh +++ b/mklink.sh @@ -7,6 +7,12 @@ fi ln -sf "`pwd`/.vimrc" "$HOME/.vimrc" +if [ -f "$HOME/.ctags" ]; then + mv "$HOME/.ctags" "$HOME/.ctags.old" +fi + +ln -sf "`pwd`/.ctags" "$HOME/.ctags" + if [ -f "$HOME/.gitconfig" ]; then # backup old file mv "$HOME/.gitconfig" "$HOME/.gitconfig.old" @@ -31,3 +37,24 @@ if [ -f "$HOME/.ssh/config" ]; then fi cp "`pwd`/.ssh/config" "$HOME/.ssh/config" + +if [ ! -d "$HOME/.config" ]; then + mkdir "$HOME/.config" +fi + +if [ -d "$HOME/.config/nvim" ]; then + # backup old file + mv "$HOME/.config/nvim" "$HOME/.config/nvim.old" +fi + +ln -sf "`pwd`/nvim" "$HOME/.config/nvim" + +# install vim and nvim plug +curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ + https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim + +curl -fLo "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/autoload/plug.vim --create-dirs \ + https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim + +## install vim dep +"./vim_dep.sh" diff --git a/nvim/init.vim b/nvim/init.vim new file mode 100644 index 0000000..4372328 --- /dev/null +++ b/nvim/init.vim @@ -0,0 +1,321 @@ +" Specify a directory for plugins +" - For Neovim: stdpath('data') . '/plugged' +" - Avoid using standard Vim directory names like 'plugin' +call plug#begin(stdpath('data').'/plugged') + +" Make sure you use single quotes +Plug 'neovim/nvim-lspconfig' +Plug 'nvim-lua/completion-nvim' + +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 'ctrlpvim/ctrlp.vim' +Plug 'kien/tabman.vim' +Plug 'vim-airline/vim-airline' +" 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' +Plug 'vim-scripts/TaskList.vim' +Plug 'rust-lang/rust.vim' + +" color scheme +Plug 'danilo-augusto/vim-afterglow' + +" 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 +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 font +" set guifont=Hack\ Nerd\ Font:h11 + +set background=dark + +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 afterglow + +" define leader key +let mapleader=";" +filetype indent on +" 開啟檔案類型偵測 +filetype on +" 根據檔案類型載入plugin +filetype plugin on +autocmd BufWritePost $MYVIMRC source $MYVIMRC + +" split window +nmap sw +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'.bashls.setup{} +lua require'lspconfig'.gopls.setup{on_attach=require'completion'.on_attach} +lua require'lspconfig'.rust_analyzer.setup{} +lua require'lspconfig'.tsserver.setup{} + +" 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' +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 + +" Avoid showing message extra message when using completion +set shortmess+=c + +imap (completion_trigger) +imap (completion_smart_tab) +imap (completion_smart_s_tab) + +" -------------------- + +" defx settings +call defx#custom#option('_', { + \ 'winwidth': 40, + \ 'split': 'vertical', + \ 'direction': 'topleft', + \ 'buffer_name': '', + \ 'toggle': 1, + \ 'resume': 1, + \ }) +nmap :Defx +nmap me :Defx +autocmd FileType defx call s:defx_my_settings() +function! s:defx_my_settings() abort + " Define mappings + nnoremap + \ defx#is_directory() ? + \ defx#do_action('open_tree', 'toggle') : + \ defx#do_action('drop') + nnoremap T + \ defx#do_action('open', 'tabe') + nnoremap s + \ defx#do_action('drop', 'vsplit') + nnoremap mc + \ defx#do_action('copy') + nnoremap mm + \ defx#do_action('move') + nnoremap mp + \ defx#do_action('paste') + nnoremap P + \ defx#do_action('preview') + nnoremap o + \ defx#do_action('open_tree', 'toggle') + nnoremap ma + \ defx#do_action('new_file') + nnoremap C + \ defx#do_action('toggle_columns', + \ 'mark:indent:icon:filename:type:size:time') + nnoremap S + \ defx#do_action('toggle_sort', 'time') + nnoremap md + \ defx#do_action('remove') + nnoremap mr + \ defx#do_action('rename') + nnoremap ! + \ defx#do_action('execute_command') + nnoremap x + \ defx#do_action('execute_system') + nnoremap yy + \ defx#do_action('yank_path') + nnoremap . + \ defx#do_action('toggle_ignored_files') + nnoremap ; + \ defx#do_action('repeat') + nnoremap h + \ defx#do_action('cd', ['..']) + nnoremap ~ + \ defx#do_action('cd') + nnoremap q + \ defx#do_action('quit') + nnoremap + \ defx#do_action('toggle_select') . 'j' + nnoremap * + \ defx#do_action('toggle_select_all') + nnoremap j + \ line('.') == line('$') ? 'gg' : 'j' + nnoremap k + \ line('.') == 1 ? 'G' : 'k' + nnoremap r + \ defx#do_action('redraw') + nnoremap + \ defx#do_action('print') + nnoremap cd + \ defx#do_action('change_vim_cwd') +endfunction + +" tagbar +nmap :TagbarToggle + +" 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': ['standard'], + \ 'go': ['gopls'], + \ 'rust': ['analyzer'], + \} +let g:ale_fixers = {'javascript': ['standard']} +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' +\ } + +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 diff --git a/vim_dep.sh b/vim_dep.sh new file mode 100755 index 0000000..43a81d9 --- /dev/null +++ b/vim_dep.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +if type npm > /dev/null; then + npm i -g typescript typescript-language-server jsctags dockerfile-language-server-nodejs +fi + +if type go > /dev/null; then + go get -u -v github.com/sourcegraph/go-langserver + go get -u github.com/jstemmer/gotags + go get -u github.com/cweill/gotests/... +fi + +if type rustup > /dev/null; then + rustup update + rustup component add rls rust-analysis rust-src +fi