#!/usr/bin/env bash set -x sudo apt install -y powerline grip pandoc pandoc virtualenv yarn #vim-airline vim-airline-themes DEST=${1:-/etc/skel}sudo apt-get install -y clang jsonlint bear ccls vim-ale shellcheck # Jupyter - prepare jupyter virtualenv for jupyter-vim sudo apt-get install -y jupyter jupyter-core set pyxversion=3 # downgrading jupyter-client to fix ''Exception 'coroutine' object is not subscriptable' virtualenv -p /usr/bin/python3 ${DEST}/jupyter_virtualenv && \ source ${DEST}/jupyter_virtualenv/bin/activate; pip3 install jupyter && \ pip3 install -Iv jupyter_client==6.1.12 \ deactivate if [[ ! -d "${DEST}/.jupyter" ]]; then jupyter-console --generate-config fi #jupyter-qtconsole --generate-config JUPYTER_CONFIG=${DEST}/.jupyter/jupyter_console_config.py # For console sed -i '/^# c.ZMQTerminalInteractiveShell.include_other_output =.*/ s/.*/&\nc.ZMQTerminalInteractiveShell.include_other_output = True/' ${JUPYTER_CONFIG} #For qtconsole (qt not installed in the virtualenv use when using system jupyter-core jupyter-qtconsole) #JUPYTER_CONFIG=${DEST}/.jupyter/jupyter_qtconsole_config.py #sed -i '/^# c.ConsoleWidget.include_other_output =.*/ s/.*/&\nc.ConsoleWidget.include_other_output = True/' ${JUPYTER_CONFIG} # ale supported programs sudo apt install -y isort mypy pycodestyle pydocstyle python3-pyflakes python3-pylama python3-pylint-flask python3-pylint-django python3-pylint-common python3-pylint-celery #prospector sudo sed -i -e 's/"syntax on/syntax on/' /etc/vim/vimrc sudo sed -i -e 's/"set background=dark/set background=dark/' /etc/vim/vimrc # Macros # Directories for swap, backup and undo mkdir -p ${DEST}/.vim/swap mkdir -p ${DEST}/.vim/backup mkdir -p ${HOME}/.vim/undo # Format json cat > ${DEST}/.vimrc << 'EOF' " Format json nmap =j :%!python -m json.tool EOF # vimrc additions cat > ${DEST}/.vimrc << 'EOF' " enable syntax highlighting syntax enable " persistant undo file in a single location set undodir=${HOME}/.vim/undo// " Maintain undo history between sessions set undofile " Put backup files in a single location with timestamped names "set backupdir=${HOME}/.vim/backup// "au BufWritePre * let &bex = substitute(expand('%:p:h'), '/', ':', 'g') . strftime(';%FT%T') set nobackup " Put swap files in a single location set directory=${HOME}/.vim/swap// " enable mouse set mouse=a set encoding=utf-8 " Show file options above the command line set wildmenu " Don't offer to open certain files/directories set wildignore+=*.bmp,*.gif,*.ico,*.jpg,*.png,*.ico set wildignore+=*.pdf,*.psd set wildignore+=node_modules/*,bower_components/* " `gf` opens file under cursor in a new vertical split nnoremap gf :vertical wincmd f" " Display tabs at the beginning of a line in Python mode as bad. au BufRead, BufNewFile *.py,*.pyw match BadWhitespace /^\t\+/ " Make trailing whitespace be flagged as bad. au BufRead, BufNewFile *.py,*.pyw,*.c,*.h match BadWhitespace /\s\+$/ " Use the below highlight group when displaying bad whitespace is desired. highlight BadWhitespace ctermbg=red guibg=red " add the proper PEP8 indentation au BufNewFile, BufRead *.py \ set tabstop=4 \ set softtabstop=4 \ set shiftwidth=4 \ set textwidth=79 \ set expandtab \ set autoindent \ set fileformat=unix " show a visual line under the cursor's current line set cursorline " show the matching part of the pair for [] {} and () set showmatch " enable all Python syntax highlighting features let python_highlight_all = 1 syntax on " Shortcut to rapidly toggle `set list` nmap l :set list! " Use the same symbols as TextMate for tabstops and EOLs set listchars=tab:▸\ ,eol:¬ " tmux will only forward escape sequences to the terminal if surrounded by a DCS sequence " http://sourceforge.net/mailarchive/forum.php?thread_name=AANLkTinkbdoZ8eNR1X2UobLTeww1jFrvfJxTMfKSq-L%2B%40mail.gmail.com&forum_name=tmux-users if exists('$TMUX') let &t_SI = "\Ptmux;\\]50;CursorShape=1\x7\\\" let &t_EI = "\Ptmux;\\]50;CursorShape=0\x7\\\" else let &t_SI = "\]50;CursorShape=1\x7" let &t_EI = "\]50;CursorShape=0\x7" endif EOF # Xresources-hybrid-reduced-contrast cat > ${DEST}/.Xresources << 'EOF' ! Hybrid Terminal Colours. Uses the palette from Tomorrow-Night: ! http://github.com/chriskempson/tomorrow-theme/blob/master/vim/colors/Tomorrow-Night.vim ! and the reduced contrast background color from Codecademy's online editor: ! https://www.codecademy.com/learn ! vim: ft=xdefaults *background: #232C31 *foreground: #C5C8C6 ! black *color0: #2D3C46 *color8: #425059 ! red *color1: #A54242 *color9: #CC6666 ! green *color2: #8C9440 *color10: #B5BD68 ! yellow *color3: #DE935F *color11: #F0C674 ! blue *color4: #5F819D *color12: #81A2BE ! magenta *color5: #85678F *color13: #B294BB ! cyan *color6: #5E8D87 *color14: #8ABEB7 ! white *color7: #6C7A80 *color15: #C5C8C6 EOF cd ${DEST} || exit sudo apt install -y git # a vi plugin that doesn't install with Vundle git clone https://github.com/joe-skb7/cscope-maps.git ${DEST}vim/bundle/cscope-maps git clone http://github.com/VundleVim/Vundle.vim.git ${DEST}/.vim/bundle/Vundle.vim # Prepend to the .vimrc if [ -f ${DEST}/.vimrc_pending ];then rm ${DEST}/.vimrc_pending fi touch ${DEST}/.vimrc_pending cat > $DEST/.vimrc_pending <<-EOF set nocompatible " be iMproved, required filetype off " required set clipboard=unnamed set relativenumber set number " set the runtime path to include Vundle and initialize set rtp+=$HOME/.vim/bundle/Vundle.vim call vundle#begin() " alternatively, pass a path where Vundle should install plugins "call vundle#begin('$HOME/some/path/here') " let Vundle manage Vundle, required Plugin 'VundleVim/Vundle.vim' " plugin on GitHub repos Plugin 'joonty/vdebug' Plugin 'voldikss/vim-floaterm' Plugin 'tpope/vim-fugitive' Plugin 'jreybert/vimagit' Plugin 'wincent/command-t' Plugin 'tmhedberg/SimpylFold' Plugin 'vim-scripts/indentpython.vim' "Plugin 'Valloric/YouCompleteMe' Plugin 'nvie/vim-flake8' Plugin 'jupyter-vim/jupyter-vim' Plugin 'jnurmine/Zenburn' Plugin 'w0ng/vim-hybrid' Plugin 'altercation/vim-colors-solarized' "Plugin 'kien/ctrlp.vim' Plugin 'ctrlpvim/ctrlp.vim' Plugin 'liuchengxu/vim-which-key' "Plugin 'Lokaltog/powerline', {'rtp': 'powerline/bindings/vim/'} Plugin 'vim-airline/vim-airline' Plugin 'vim-airline/vim-airline-themes' Plugin 'will133/vim-dirdiff' Plugin 'jiangmiao/auto-pairs' Plugin 'mhinz/vim-startify' "Plugin 'mhinz/vim-signify' Plugin 'airblade/vim-gitgutter' Plugin 'airblade/vim-rooter' Plugin 'terryma/vim-multiple-cursors' Plugin 'sudar/vim-arduino-syntax' Plugin 'ekalinin/Dockerfile.vim' Plugin 'mattboehm/vim-unstack' Plugin 'edkolev/tmuxline.vim' Plugin 'tmux-plugins/vim-tmux' Plugin 'christoomey/vim-tmux-navigator' " ai supported coding " After installation and configuration, you will need to authenticate by running " :Codeium Auth, copying the token from your browser and pasting it into API token request. Plugin 'Exafunction/codeium.vim' set statusline+=\{…\}%3{codeium#GetStatusString()} " C related " cscope key mapping: https://github.com/joe-skb7/cscope-maps/blob/master/plugin/cscope_maps.vim#L52 "Plugin 'joe-skb7/cscope-map' " See git clone above Plugin 'bogado/file-line' Plugin 'rickhowe/diffchar.vim' " vim-snipmate Plugin 'MarcWeber/vim-addon-mw-utils' Plugin 'tomtom/tlib_vim' Plugin 'garbas/vim-snipmate' let g:snipMate = { 'snippet_version' : 1 } " Optional: Plugin 'honza/vim-snippets' " requires tmux.conf setting: set -g focus-events on or tmux-plugins/tmux-sensible plugin. Plugin 'tmux-plugins/vim-tmux-focus-events' " text objects - http://github.com/kana/vim-textobj-user/wiki Plugin 'kana/vim-textobj-user' Plugin 'bps/vim-textobj-python' " toggleable panels Plugin 'tpope/vim-vinegar' Plugin 'vim-scripts/taglist.vim' Plugin 'majutsushi/tagbar' Plugin 'preservim/nerdtree' Plugin 'ryanoasis/vim-devicons' Plugin 'tiagofumo/vim-nerdtree-syntax-highlight' Plugin 'tsony-tsonev/nerdtree-git-plugin' Plugin 'jistr/vim-nerdtree-tabs' Plugin 'severin-lemaignan/vim-minimap' nmap :TagbarToggle " Indent guides" Plugin 'preservim/vim-indent-guides' let g:indent_guides_enable_on_vim_startup = 1 " Always use the same virtualenv for vim, regardless of what Python " environment is loaded in the shell from which vim is launched let g:vim_virtualenv_path = "${HOME}/jupyter_virtualenv/" if exists('g:vim_virtualenv_path') pythonx import os; import vim pythonx activate_this = os.path.join(vim.eval("g:vim_virtualenv_path"), 'bin/activate_this.py') pythonx with open(activate_this) as f: exec(f.read(), {'__file__': activate_this}) endif let g:NERDTreeGitStatusWithFlags = 1 let g:NERDTreeIndicatorMapCustom = { \ "Modified" : "✹", \ "Staged" : "✚", \ "Untracked" : "✭", \ "Renamed" : "➜", \ "Unmerged" : "═", \ "Deleted" : "✖", \ "Dirty" : "✗", \ "Clean" : "✔︎", \ 'Ignored' : '☒', \ "Unknown" : "?" \ } let g:minimap_highlight='Visual' let NERDTreeQuitOnOpen=1 let NERDTreeMinimalUI = 1 let NERDTreeDirArrows = 1 " Nerdtree toggle keymap nmap \ :NERDTreeToggle " Nerdtree find keymap nnoremap :NERDTreeFind:vertical let g:NERDTreeMapActivateNode="" let g:NERDTreeMapPreview="" " Stop NERDTree from starting automatically let g:NERDTreeHijackNetrw=0 " Start NERDTree when Vim starts with a directory argument. autocmd StdinReadPre * let s:std_in=1 autocmd VimEnter * if argc() == 1 && isdirectory(argv()[0]) && !exists('s:std_in') | \ execute 'NERDTree' argv()[0] | wincmd p | enew | execute 'cd '.argv()[0] | endif " Exit Vim if NERDTree is the only window left. autocmd BufEnter * if tabpagenr('$') == 1 && winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() | \ quit | endif " 80 characters line set colorcolumn=81 "execute "set colorcolumn=" . join(range(81,335), ',') highlight ColorColumn ctermbg=Black ctermfg=DarkRed " Highlight trailing spaces " http://vim.wikia.com/wiki/Highlight_unwanted_spaces highlight ExtraWhitespace ctermbg=red guibg=red match ExtraWhitespace /\s\+$/ autocmd BufWinEnter * match ExtraWhitespace /\s\+$/ autocmd InsertEnter * match ExtraWhitespace /\s\+\%#\@' Plugin 'saltstack/salt-vim' Plugin 'fatih/vim-go' " CtrlP let g:ctrlp_map = '' let g:ctrlp_cmd = 'CtrlP' " Python Plugin 'hynek/vim-python-pep8-indent' Plugin 'jmcantrell/vim-virtualenv' Plugin 'fisadev/vim-isort' " Automatically sort python imports " Python mode (indentation, doc, refactor, lints, code checking, motion and " operators, highlighting, run and ipdb breakpoints) Plugin 'python-mode/python-mode' Plugin 'vim-syntastic/syntastic' Plugin 'preservim/nerdcommenter' Plugin 'sbdchd/neoformat' " flutter/dart Plugin 'dart-lang/dart-vim-plugin' Plugin 'natebosch/vim-lsc' Plugin 'natebosch/vim-lsc-dart' let g:lsc_auto_map = v:true Plugin 'thosakwe/vim-flutter' " Some of these key choices were arbitrary; " it's just an example. "nnoremap fa :FlutterRun "nnoremap fq :FlutterQuit "nnoremap fr :FlutterHotReload "nnoremap fR :FlutterHotRestart "nnoremap fD :FlutterVisualDebug " COC intellisense engine http://github.com/neoclide/coc.nvim/wiki/Install-coc.nvim Plugin 'neoclide/coc.nvim' Plugin 'tjdevries/coc-zsh' " Neomake is a plugin for Vim/Neovim to asynchronously run programs. Plugin 'neomake/neomake' Plugin 'coddingtonbear/neomake-platformio' Plugin 'maralla/completor.vim' " Asynchronous Lint Engine - syntax checking and semantic errors Plugin 'dense-analysis/ale' let g:ale_linters = { 'cpp': ['clangd'] } let g:ale_fixers = { 'cpp': [ 'clang-format' ] } let g:ale_python_executable='python3' let g:ale_python_flake8_executable = 'python3' let g:ale_python_flake8_options = '-m flake8' " Disable ale lsp so that coc is used let g:ale_disable_lsp = 1 " Rust Plugin 'rust-lang/rust.vim' Plugin 'luochen1990/rainbow' let g:rainbow_active = 1 "0 if you want to enable it later via :RainbowToggle " VSCode like remote container development plugin to support devcontainer.json " based spawning and development in docker containers. Plugin 'jamestthompson3/nvim-remote-containers' " FZF set rtp+=~/.fzf Plugin 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' } " All of your Plugins must be added before the following line call vundle#end() " required filetype plugin indent on " required filetype plugin on set foldenable set foldmethod=marker au FileType sh let g:sh_fold_enabled=5 au FileType sh let g:is_bash=1 au FileType sh set foldmethod=syntax au FileType zsh set foldmethod=syntax . set pyxversion=3 "--------------------------------------- " Flutter menu for vim "call FlutterMenu() "--------------------------------------- " Syntastic " show list of errors and warnings on the current file nmap e :Errors " turn to next or previous errors, after open errors list nmap n :lnext nmap p :lprevious set statusline+=%#warningmsg# set statusline+=%{SyntasticStatuslineFlag()} set statusline+=%* " check also when just opened the file let g:syntastic_check_on_open = 1 let g:syntastic_always_populate_loc_list = 1 let g:syntastic_auto_loc_list = 1 let g:syntastic_enable_signs = 1 " syntastic checker for javascript. " eslint is the only tool support JSX. " If you don't need write JSX, you can use jshint. " And eslint is slow, but not a hindrance let g:syntastic_javascript_checkers = ['jshint'] " let g:syntastic_javascript_checkers = ['eslint'] " syntastic checker for python. " let g:syntastic_python_checkers = ["pylint"] " let g:syntastic_python_checkers = ["flake8"] let g:syntastic_python_checkers = ['prospector'] " don't put icons on the sign column (it hides the vcs status icons of signify) let g:syntastic_enable_signs = 1 " custom icons (enable them if you use a patched font, and enable the previous " setting) let g:syntastic_error_symbol = '✗' let g:syntastic_warning_symbol = '⚠' let g:syntastic_style_error_symbol = '✗' let g:syntastic_style_warning_symbol = '⚠' "---------------------------------------- if has('gui_running') set background=dark silent! colorscheme hybrid else let g:hybrid_custom_term_colors = 1 let g:hybrid_reduced_contrast = 1 " Remove this line if using the default palette. silent! colorscheme hybrid endif silent! call togglebg#map("") " Airline customizations let g:airline#extensions#tabline#enabled = 1 let g:airline_powerline_fonts = 1 " Nerdcommenter customizations " Add spaces after comment delimiters by default let g:NERDSpaceDelims = 1 " Use compact syntax for prettified multi-line comments let g:NERDCompactSexyComs = 1 " Align line-wise comment delimiters flush left instead of following code indentation let g:NERDDefaultAlign = 'left' " Set a language to use its alternate delimiters by default let g:NERDAltDelims_java = 1 " Use one space after # comment character in python, " see http://tinyurl.com/y4hm29o3 let g:NERDAltDelims_python = 1 " Add your own custom formats or override the defaults let g:NERDCustomDelimiters = { 'c': { 'left': '/**','right': '*/' } } " Allow commenting and inverting empty lines (useful when commenting a region) let g:NERDCommentEmptyLines = 1 " Enable trimming of trailing whitespace when uncommenting let g:NERDTrimTrailingWhitespace = 1 " Nerdtree customizations " hide .pyc files let NERDTreeIgnore=['\.pyc$', '\~$'] " Nerdtree toggle keymap nmap \ :NERDTreeToggle " Nerdtree find keymap nnoremap :NERDTreeFind:vertical " Python docstrings for folded code. let g:SimpylFold_docstring_preview=1 " Flag unnecessary whitespace au BufRead, BufNewFile *.py,*.pyw,*.c,*.h match BadWhitespace /\s\+$/lib " toggle between all lines folded and no lines folded. :nnoremap &foldlevel ? 'zM' :'zR' EOF # append the existing vimrc to the plugin additions cat ${DEST}/.vimrc >> ${DEST}/.vimrc_pending # copy it back to the vimrc cp ${DEST}/.vimrc_pending ${DEST}/.vimrc #mv ${DEST}/.vimrc_pending ${DEST}/.vimrc # Install Vundle plugins HOME=${DEST}; vim -V -E -s -c "source ${DEST}/.vimrc" -c "PluginInstall" -c "PluginUpdate" -c "qa!" # Install Coc plugins FIXME HOME=${DEST}; vim -V -E -s -c "source ${DEST}/.vimrc" -c "CocInstall coc-java coc-go coc-python coc-flutter coc-css coc-cssmodules coc-xml coc-json coc-yaml coc-html coc-git coc-docker coc-snippets coc-pairs coc-eslint coc-json coc-prettier coc-tsserver coc-react-refactor" -c "qa!" HOME=${DEST}; vim -V -E -s /tmp/tempdir <<-EOF :source ${DEST}/.vimrc :call coc#util#install() :CocStart :CocInstall coc-java coc-go coc-python coc-flutter coc-css coc-cssmodules coc-xml coc-json coc-yaml coc-html coc-git coc-docker coc-snippets coc-pairs coc-eslint coc-json coc-prettier coc-tsserver coc-react-refactor :qa! EOF xmap a (coc-codeaction-selected) nmap a (coc-codeaction-selected) # Add platformio support to Coc. See: # http://github.com/MaskRay/ccls/wiki/coc.nvim # http://github.com/neoclide/coc.nvim/blob/101175f47c15ff11eb599c617ef895f578f758b8/doc/coc.txt # Configuration is stored at: # `$HOME/.vim/coc-settings.json` or # `$HOME/.config/nvim/coc-settings.json` by default) # or the /etc/skel equivalent which we can edit with jq # Create a Makefile file in the project directory HOME=${DEST} vim -V -E -s /tmp/Makefile.platformio_example <<-EOF # Uncomment lines below if you have problems with $PATH #SHELL := /bin/bash #PATH := /usr/local/bin:$(PATH) all: platformio run upload: platformio run --target upload clean: platformio run --target clean program: platformio run --target program uploadfs: platformio run --target uploadfs update: platformio update EOF sudo apt-get install -y ccls jq # Initialize a project with platformio # # pio init --ide vim # # in the root folder of the project. This command generates a .ccls file which can be read by ccls. #To build the project in vim, simply call :Neomake! any compilation errors will appear in vim. # Editing the coc-settings.json, a jsonc file format that supports comments, using jq # /etc/skel/.vim/bundle/coc.nvim/.vim/coc-settings.json # /home/default/.vim/coc-settings.json # # :CocConfig #{ # "languageserver": { # "golang": { # "command": "gopls", # "rootPatterns": ["go.mod", ".vim/", ".git/", ".hg/"], # "filetypes": ["go"], # "initializationOptions": { # "usePlaceholders": true # } #{ #{ # "languageserver":{ # "ccls": { # "enable": false, # "command": "ccls", # "filetypes": ["c", "cpp", "cuda", "objc", "objcpp"], # "rootPatterns": [".ccls", "compile_commands.json", ".vim/", ".git/", ".hg/"], # "initializationOptions": { # "cache": { # "directory": "/tmp/ccls" # }, # "client": { # "snippetSupport": true # } # } # } #} ## Configure coc-vim to play nicely with clangd #{ # "languageserver": { # "clangd": { # "command": "clangd", # "args": ["--background-index"], # "rootPatterns": [ # "compile_flags.txt", # "compile_commands.json", # ".vim/", # ".git/", # ".hg/" # ], # "filetypes": ["c", "cpp", "objc", "objcpp"] # } # }, # "diagnostic.displayByAle": true #} declare -A COC_OPT COC_OPT[0]='. .languageserver |= .+ {"clangd":{ "command":"clangd", "args":["--background-index"], rootPatterns:["compile_flags.txt", "compile_commands.json", ".vim/", ".git/", ".hg/"], filetypes:["c", "cpp", "objc", "objcpp"]}}' COC_OPT[1]='. .languageserver |= .+ {"golang":{ "command":"gopls", "rootpatterns":["go.mod", ".vim/", ".git/", "hg/"],"filetypes":["go"], "initializationOptions":{"usePlaceholders":true}}}' COC_OPT[2]='. .languageserver |= .+ {"ccls":{ "command":"ccls", rootPatterns:[".ccls", "compile_commands.json", ".vim/", ".git/", ".hg/"], filetypes:["c", "cpp", "cuda", "objc", "objcpp"], "initializationOptions":{"cache":{"directory":"/tmp/ccls"},"client":{"snippetSupport":true}}}}' COC_OPT[3]='.["diagnostic.displayByAle"] = "true"' for ((i = 0; i < ${#COC_OPT[@]}; ++i)); do OPTION="${COC_OPT[$i]}" jq "${OPTION}" ${DEST}/.vim/coc-settings.json > /tmp/coc-settings.json.new && \ mv -b /tmp/coc-settings.json.new ${DEST}/.vim/coc-settings.json done cd "${HOME}"/.vim/bundle/coc.nvim || return yarn install yarn build mkdir -p ${HOME}/.config/coc # Install YouCompleteMe support sudo apt install -y build-essential cmake universal-ctags sudo apt install -y python3-dev python3-dev # semantic support for C-family #cd $HOME/.vim/bundle/YouCompleteMe/ && ./install.py --clang-completer # Python should work automatically #cd $HOME/.vim/bundle/YouCompleteMe/ && ./install.py # Go support - #cd $HOME/.vim/bundle/YouCompleteMe/ && ./install.py --gocode-code --clang-completer # dodgy - searches for dodgy looking lines in Python code # python3-pylint-celery - Pylint plugin for code using the Celery library (Python3) # python3-pylint-django - Pylint plugin for analysing code using Django (Python 3) # python3-pylint-flask - pip install pylint-flask - Pylint plugin for analysing code when using Flask # python3-pylint-plugin-utils - Utilities and helpers for writing Pylint plugins (Python 3) # python3-requirements-detector - finds and lists the requirements of a Python project # python3-setoptconf - retrieve Python3 program settings from a variety of sources