diff --git a/README.md b/README.md index a35a752..67fe7a7 100644 --- a/README.md +++ b/README.md @@ -3,21 +3,27 @@ Collection of tracked dotfiles and supporting install scripts. Tested on and compatible with: * Ubuntu 18.04 + * Ubuntu 20.04 ## Install wget https://raw.githubusercontent.com/andrejusk/dotfiles/master/bootstrap.sh -qO - | bash -_Running the above without reading through repository is strongly discouraged._ - ## Stack Shell: 🐟 fish (+ fisher) +Editor: nvim (+ vim-plug) + Tools: +* aws * docker (+ docker-compose) -* keybase -* screenfetch +* firebase +* terraform Languages: +* java +* node (+ yarn, nvm) * python (+ poetry, pyenv) +* ruby + diff --git a/bash/.bashrc b/bash/.bashrc index 7c9b322..6e946ea 100644 --- a/bash/.bashrc +++ b/bash/.bashrc @@ -79,5 +79,7 @@ if ! shopt -oq posix; then fi fi + +export NVM_DIR="$HOME/.config/nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion diff --git a/install/00-apt-pkglist b/install/00-apt-pkglist index 1f7e10e..2597133 100644 --- a/install/00-apt-pkglist +++ b/install/00-apt-pkglist @@ -4,6 +4,7 @@ neovim net-tools openssh-client openssh-server +ruby-full software-properties-common tmux diff --git a/install/05-vim.sh b/install/05-vim.sh deleted file mode 100755 index 46e1ac6..0000000 --- a/install/05-vim.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env bash - -vim_source="$dotfiles_dir/vim" -vim_target="$XDG_CONFIG_HOME/nvim" -link_folder "$vim_source" "$vim_target" -echo "vim dotfiles are linked" - -sh -c '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' -nvim -E PlugInstall -c q - -nvim --version - diff --git a/install/13-nvm.sh b/install/13-nvm.sh index ba801fe..2f2276a 100755 --- a/install/13-nvm.sh +++ b/install/13-nvm.sh @@ -9,9 +9,11 @@ if not_installed "nvm"; then run "https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.2/install.sh" \ "bash" source "$NVM_DIR/nvm.sh" - nvm alias default lts - nvm default - + nvm install --lts + nvm install node + nvm install iojs + nvm alias default lts/erbium + fi printf "nvm is installed, upgrading...\n" diff --git a/install/14-yarn.sh b/install/14-yarn.sh index edaf4ab..e1c4efb 100755 --- a/install/14-yarn.sh +++ b/install/14-yarn.sh @@ -5,7 +5,7 @@ if not_installed "yarn"; then echo "Installing yarn..." - # Install nvm + # Install yarn curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list update diff --git a/install/16-vim.sh b/install/16-vim.sh new file mode 100755 index 0000000..16e45f4 --- /dev/null +++ b/install/16-vim.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash + +vim_source="$dotfiles_dir/vim" +vim_target="$XDG_CONFIG_HOME/nvim" +link_folder "$vim_source" "$vim_target" +echo "vim dotfiles are linked" + +mkdir -p "$XDG_DATA_HOME/nvim/backup" +plug_target="$XDG_DATA_HOME/nvim/site/autoload/plug.vim" +if [ ! -f $plug_target ]; then + sh -c 'curl -fLo "$plug_target" --create-dirs \ + https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim' +fi +nvim -E PlugInstall -c q +nvim -E PluginInstall -c q + +sudo pip3 install neovim +sudo yarn global add neovim +sudo gen install neovim + +nvim --version + diff --git a/vim/init.vim b/vim/init.vim index 2b802f7..2344dae 100644 --- a/vim/init.vim +++ b/vim/init.vim @@ -1,37 +1,462 @@ -set termguicolors +scriptencoding utf-8 +source $XDG_CONFIG_HOME/nvim/plugins.vim -call plug#begin() -Plug 'tpope/vim-sensible' +" ============================================================================ " +" === EDITING OPTIONS === " +" ============================================================================ " -Plug 'tpope/vim-fugitive' -Plug 'APZelos/blamer.nvim' +" Remap leader key to , +let g:mapleader=',' -Plug 'tpope/vim-surround' +" Yank and paste with the system clipboard +set clipboard=unnamed -if has('nvim') - Plug 'Shougo/denite.nvim', { 'do': ':UpdateRemotePlugins' } -else - Plug 'Shougo/denite.nvim' - Plug 'roxma/nvim-yarp' - Plug 'roxma/vim-hug-neovim-rpc' +" Hides buffers instead of closing them +set hidden + +" === TAB/Space settings === " +" Insert spaces when TAB is pressed. +set expandtab + +" do not wrap long lines by default +set nowrap + +" Only one line for command line +set cmdheight=1 + + +" ============================================================================ " +" === PLUGIN SETUP === " +" ============================================================================ " + +" Wrap in try/catch to avoid errors on initial install before plugin is available +try +" === Denite setup ===" +" Use ripgrep for searching current directory for files +" By default, ripgrep will respect rules in .gitignore +" --files: Print each file that would be searched (but don't search) +" --glob: Include or exclues files for searching that match the given glob +" (aka ignore .git files) +" +call denite#custom#var('file/rec', 'command', ['rg', '--files', '--glob', '!.git']) + +" Use ripgrep in place of "grep" +call denite#custom#var('grep', 'command', ['rg']) + +" Custom options for ripgrep +" --vimgrep: Show results with every match on it's own line +" --hidden: Search hidden directories and files +" --heading: Show the file name above clusters of matches from each file +" --S: Search case insensitively if the pattern is all lowercase +call denite#custom#var('grep', 'default_opts', ['--hidden', '--vimgrep', '--heading', '-S']) + +" Recommended defaults for ripgrep via Denite docs +call denite#custom#var('grep', 'recursive_opts', []) +call denite#custom#var('grep', 'pattern_opt', ['--regexp']) +call denite#custom#var('grep', 'separator', ['--']) +call denite#custom#var('grep', 'final_opts', []) + +" Remove date from buffer list +call denite#custom#var('buffer', 'date_format', '') + +" Custom options for Denite +" auto_resize - Auto resize the Denite window height automatically. +" prompt - Customize denite prompt +" direction - Specify Denite window direction as directly below current pane +" winminheight - Specify min height for Denite window +" highlight_mode_insert - Specify h1-CursorLine in insert mode +" prompt_highlight - Specify color of prompt +" highlight_matched_char - Matched characters highlight +" highlight_matched_range - matched range highlight +let s:denite_options = {'default' : { +\ 'split': 'floating', +\ 'start_filter': 1, +\ 'auto_resize': 1, +\ 'source_names': 'short', +\ 'prompt': 'λ ', +\ 'highlight_matched_char': 'QuickFixLine', +\ 'highlight_matched_range': 'Visual', +\ 'highlight_window_background': 'Visual', +\ 'highlight_filter_background': 'DiffAdd', +\ 'winrow': 1, +\ 'vertical_preview': 1 +\ }} + +" Loop through denite options and enable them +function! s:profile(opts) abort + for l:fname in keys(a:opts) + for l:dopt in keys(a:opts[l:fname]) + call denite#custom#option(l:fname, l:dopt, a:opts[l:fname][l:dopt]) + endfor + endfor +endfunction + +call s:profile(s:denite_options) +catch + echo 'Denite not installed. It should work after running :PlugInstall' +endtry + +" === Coc.nvim === " +" use for trigger completion and navigate to next complete item +function! s:check_back_space() abort + let col = col('.') - 1 + return !col || getline('.')[col - 1] =~ '\s' +endfunction + +inoremap + \ pumvisible() ? "\" : + \ check_back_space() ? "\" : + \ coc#refresh() + +"Close preview window when completion is done. +autocmd! CompleteDone * if pumvisible() == 0 | pclose | endif + +" === NeoSnippet === " +" Map as shortcut to activate snippet if available +imap (neosnippet_expand_or_jump) +smap (neosnippet_expand_or_jump) +xmap (neosnippet_expand_target) + +" Load custom snippets from snippets folder +let g:neosnippet#snippets_directory='~/.config/nvim/snippets' + +" Hide conceal markers +let g:neosnippet#enable_conceal_markers = 0 + +" === NERDTree === " +" Show hidden files/directories +let g:NERDTreeShowHidden = 1 + +" Remove bookmarks and help text from NERDTree +let g:NERDTreeMinimalUI = 1 + +" Custom icons for expandable/expanded directories +let g:NERDTreeDirArrowExpandable = '' +let g:NERDTreeDirArrowCollapsible = '' + +" Hide certain files and directories from NERDTree +let g:NERDTreeIgnore = ['^\.DS_Store$', '^tags$', '\.git$[[dir]]', '\.idea$[[dir]]', '\.sass-cache$'] + +" Wrap in try/catch to avoid errors on initial install before plugin is available +try + +" === Vim airline ==== " +" Enable extensions +let g:airline_extensions = ['branch', 'hunks', 'coc'] + +" Update section z to just have line number +let g:airline_section_z = airline#section#create(['linenr']) + +" Do not draw separators for empty sections (only for the active window) > +let g:airline_skip_empty_sections = 1 + +" Smartly uniquify buffers names with similar filename, suppressing common parts of paths. +let g:airline#extensions#tabline#formatter = 'unique_tail' + +" Custom setup that removes filetype/whitespace from default vim airline bar +let g:airline#extensions#default#layout = [['a', 'b', 'c'], ['x', 'z', 'warning', 'error']] + +" Customize vim airline per filetype +" 'nerdtree' - Hide nerdtree status line +" 'list' - Only show file type plus current line number out of total +let g:airline_filetype_overrides = { + \ 'nerdtree': [ get(g:, 'NERDTreeStatusline', ''), '' ], + \ 'list': [ '%y', '%l/%L'], + \ } + +" Enable powerline fonts +let g:airline_powerline_fonts = 1 + +" Enable caching of syntax highlighting groups +let g:airline_highlighting_cache = 1 + +" Define custom airline symbols +if !exists('g:airline_symbols') + let g:airline_symbols = {} endif -call plug#end() +" Don't show git changes to current file in airline +let g:airline#extensions#hunks#enabled=0 -" Define mappings +catch + echo 'Airline not installed. It should work after running :PlugInstall' +endtry + +" === echodoc === " +" Enable echodoc on startup +let g:echodoc#enable_at_startup = 1 + +" === vim-javascript === " +" Enable syntax highlighting for JSDoc +let g:javascript_plugin_jsdoc = 1 + +" === vim-jsx === " +" Highlight jsx syntax even in non .jsx files +let g:jsx_ext_required = 0 + +" === javascript-libraries-syntax === " +let g:used_javascript_libs = 'underscore,requirejs,chai,jquery' + +" === Signify === " +let g:signify_sign_delete = '-' + + +" ============================================================================ " +" === UI === " +" ============================================================================ " + +" Enable true color support +set termguicolors + +" Vim airline theme +let g:airline_theme='codedark' + +" Change vertical split character to be a space (essentially hide it) +set fillchars+=vert:. + +" Set preview window to appear at bottom +set splitbelow + +" Don't dispay mode in command line (airilne already shows it) +set noshowmode + +" Set floating window to be slightly transparent +set winbl=10 + +" ============================================================================ " +" === CUSTOM COLORSCHEME CHANGES === " +" ============================================================================ " +" +" Add custom highlights in method that is executed every time a colorscheme is sourced +" See https://gist.github.com/romainl/379904f91fa40533175dfaec4c833f2f for details +function! TrailingSpaceHighlights() abort + " Hightlight trailing whitespace + highlight Trail ctermbg=red guibg=red + call matchadd('Trail', '\s\+$', 100) +endfunction + +function! s:custom_jarvis_colors() + " coc.nvim color changes + hi link CocErrorSign WarningMsg + hi link CocWarningSign Number + hi link CocInfoSign Type + + " Make background transparent for many things + hi Normal ctermbg=NONE guibg=NONE + hi NonText ctermbg=NONE guibg=NONE + hi LineNr ctermfg=NONE guibg=NONE + hi SignColumn ctermfg=NONE guibg=NONE + hi StatusLine guifg=#16252b guibg=#6699CC + hi StatusLineNC guifg=#16252b guibg=#16252b + + " Try to hide vertical spit and end of buffer symbol + hi VertSplit gui=NONE guifg=#17252c guibg=#17252c + hi EndOfBuffer ctermbg=NONE ctermfg=NONE guibg=#17252c guifg=#17252c + + " Customize NERDTree directory + hi NERDTreeCWD guifg=#99c794 + + " Make background color transparent for git changes + hi SignifySignAdd guibg=NONE + hi SignifySignDelete guibg=NONE + hi SignifySignChange guibg=NONE + + " Highlight git change signs + hi SignifySignAdd guifg=#99c794 + hi SignifySignDelete guifg=#ec5f67 + hi SignifySignChange guifg=#c594c5 +endfunction + +autocmd! ColorScheme * call TrailingSpaceHighlights() +autocmd! ColorScheme codedark call s:custom_jarvis_colors() + +" Call method on window enter +augroup WindowManagement + autocmd! + autocmd WinEnter * call Handle_Win_Enter() +augroup END + +" Change highlight group of preview window when open +function! Handle_Win_Enter() + if &previewwindow + setlocal winhighlight=Normal:MarkdownError + endif +endfunction + +" Editor theme +set background=dark +try + colorscheme codedark +catch + colorscheme slate +endtry + + +" ============================================================================ " +" === KEY MAPPINGS === " +" ============================================================================ " + +" === Denite shorcuts === " +" ; - Browser currently open buffers +" t - Browse list of files in current directory +" g - Search current directory for occurences of given term and close window if no results +" j - Search current directory for occurences of word under cursor +nmap ; :Denite buffer +nmap t :DeniteProjectDir file/rec +nnoremap g :Denite grep:. -no-empty +nnoremap j :DeniteCursorWord grep:. + +" Define mappings while in 'filter' mode +" - Switch to normal mode inside of search results +" - Exit denite window in any mode +" - Open currently selected file in any mode +" - Open currently selected file in a new tab +" - Open currently selected file a vertical split +" - Open currently selected file in a horizontal split +autocmd FileType denite-filter call s:denite_filter_my_settings() +function! s:denite_filter_my_settings() abort + imap + \ (denite_filter_quit) + inoremap + \ denite#do_map('quit') + nnoremap + \ denite#do_map('quit') + inoremap + \ denite#do_map('do_action') + inoremap + \ denite#do_map('do_action', 'tabopen') + inoremap + \ denite#do_map('do_action', 'vsplit') + inoremap + \ denite#do_map('do_action', 'split') +endfunction + +" Define mappings while in denite window +" - Opens currently selected file +" q or - Quit Denite window +" d - Delete currenly selected file +" p - Preview currently selected file +" or i - Switch to insert mode inside of filter prompt +" - Open currently selected file in a new tab +" - Open currently selected file a vertical split +" - Open currently selected file in a horizontal split autocmd FileType denite call s:denite_my_settings() function! s:denite_my_settings() abort nnoremap \ denite#do_map('do_action') + nnoremap q + \ denite#do_map('quit') + nnoremap + \ denite#do_map('quit') nnoremap d \ denite#do_map('do_action', 'delete') nnoremap p \ denite#do_map('do_action', 'preview') - nnoremap q - \ denite#do_map('quit') nnoremap i \ denite#do_map('open_filter_buffer') - nnoremap - \ denite#do_map('toggle_select').'j' + nnoremap + \ denite#do_map('open_filter_buffer') + nnoremap + \ denite#do_map('do_action', 'tabopen') + nnoremap + \ denite#do_map('do_action', 'vsplit') + nnoremap + \ denite#do_map('do_action', 'split') endfunction + +" === Nerdtree shorcuts === " +" n - Toggle NERDTree on/off +" f - Opens current file location in NERDTree +nmap n :NERDTreeToggle +nmap f :NERDTreeFind + +" - PageDown +" - - PageUp +noremap +noremap - + +" Quick window switching +nmap h +nmap j +nmap k +nmap l + +" === coc.nvim === " +" dd - Jump to definition of current symbol +" dr - Jump to references of current symbol +" dj - Jump to implementation of current symbol +" ds - Fuzzy search current project symbols +nmap dd (coc-definition) +nmap dr (coc-references) +nmap dj (coc-implementation) +nnoremap ds :CocList -I -N --top symbols + +" === vim-better-whitespace === " +" y - Automatically remove trailing whitespace +nmap y :StripWhitespace + +" === Search shorcuts === " +" h - Find and replace +" / - Claer highlighted search terms while preserving history +map h :%s/// +nmap / :nohlsearch + +" === Easy-motion shortcuts ===" +" w - Easy-motion highlights first word letters bi-directionally +map w (easymotion-bd-w) + +" Allows you to save files you opened without write permissions via sudo +cmap w!! w !sudo tee % + +" === vim-jsdoc shortcuts ===" +" Generate jsdoc for function under cursor +nmap z :JsDoc + +" Delete current visual selection and dump in black hole buffer before pasting +" Used when you want to paste over something without it getting copied to +" Vim's default buffer +vnoremap p "_dP + + +" ============================================================================ " +" === MISC. === " +" ============================================================================ " + +" Automaticaly close nvim if NERDTree is only thing left open +autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif + +" === Search === " +" ignore case when searching +set ignorecase + +" if the search string has an upper case letter in it, the search will be case sensitive +set smartcase + +" Automatically re-read file if a change was detected outside of vim +set autoread + +" Enable line numbers +set number + +" Enable spellcheck for markdown files +autocmd BufRead,BufNewFile *.md setlocal spell + +" Set backups +if has('persistent_undo') + set undofile + set undolevels=3000 + set undoreload=10000 +endif +set backupdir=$XDG_DATA_HOME/nvim/backup " Don't put backups in current dir +set backup +set noswapfile + +" Reload icons after init source +if exists('g:loaded_webdevicons') + call webdevicons#refresh() +endif + +" Disable deprecated python2 provider +let g:loaded_python_provider = 0 + diff --git a/vim/plugins.vim b/vim/plugins.vim new file mode 100644 index 0000000..a708682 --- /dev/null +++ b/vim/plugins.vim @@ -0,0 +1,90 @@ + +" ============================================================================ " +" === PLUGINS === " +" ============================================================================ " + +" check whether vim-plug is installed and install it if necessary +let plugpath = expand(':p:h'). '/autoload/plug.vim' +if !filereadable(plugpath) + if executable('curl') + let plugurl = 'https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim' + call system('curl -fLo ' . shellescape(plugpath) . ' --create-dirs ' . plugurl) + if v:shell_error + echom "Error downloading vim-plug. Please install it manually.\n" + exit + endif + else + echom "vim-plug not installed. Please install it manually or install curl.\n" + exit + endif +endif + +call plug#begin('~/.config/nvim/plugged') + +" === Editing Plugins === " +" Trailing whitespace highlighting & automatic fixing +Plug 'ntpeters/vim-better-whitespace' + +" auto-close plugin +Plug 'rstacruz/vim-closer' + +" Improved motion in Vim +Plug 'easymotion/vim-easymotion' + +" Intellisense Engine +Plug 'neoclide/coc.nvim', {'branch': 'release'} + +" Denite - Fuzzy finding, buffer management +Plug 'Shougo/denite.nvim' + +" Snippet support +Plug 'Shougo/neosnippet' +Plug 'Shougo/neosnippet-snippets' + +" Print function signatures in echo area +Plug 'Shougo/echodoc.vim' + +" === Git Plugins === " +" Enable git changes to be shown in sign column +Plug 'mhinz/vim-signify' +Plug 'tpope/vim-fugitive' + +" === Javascript Plugins === " +" Typescript syntax highlighting +Plug 'HerringtonDarkholme/yats.vim' + +" ReactJS JSX syntax highlighting +Plug 'mxw/vim-jsx' + +" Generate JSDoc commands based on function signature +Plug 'heavenshell/vim-jsdoc' + +" === Syntax Highlighting === " + +" Syntax highlighting for nginx +Plug 'chr4/nginx.vim' + +" Syntax highlighting for javascript libraries +Plug 'othree/javascript-libraries-syntax.vim' + +" Improved syntax highlighting and indentation +Plug 'othree/yajs.vim' + +" === UI === " +" File explorer +Plug 'scrooloose/nerdtree' + +" Colorscheme +Plug 'tomasiser/vim-code-dark' + +" Customized vim status line +Plug 'vim-airline/vim-airline' +Plug 'vim-airline/vim-airline-themes' + +" Icons +Plug 'ryanoasis/vim-devicons' +Plug 'tiagofumo/vim-nerdtree-syntax-highlight' + +" Initialize plugin system +call plug#end() +