"__ _(_)_ __ ___ _ __ ___ " "\ \ / / | '_ ` _ \| '__/ __|" " \ V /| | | | | | | | | (__ " " \_/ |_|_| |_| |_|_| \___|" "================ "General Settings "================ "{{{ "source system defaults if filereadable(expand('$VIMRUNTIME/defaults.vim')) unlet! g:skip_defaults_vim source $VIMRUNTIME/defaults.vim endif "encoding/format set encoding=utf-8 set fileformats=unix,dos,mac "tab/indent set tabstop=4 set softtabstop=4 set shiftwidth=4 set expandtab set autoindent "status bar set showcmd set wildmenu set ruler set laststatus=2 "search set incsearch set hlsearch set ignorecase set smartcase "file/buffer set autoread set autowrite set confirm "cursor behaviour set virtualedit=block set backspace=indent,eol,start set scrolloff=2 set sidescrolloff=4 "window behaviour (ltr) set splitbelow set splitright "input/timeout set esckeys set timeoutlen=1000 "for mappings set ttimeoutlen=20 "for keycodes "drawing set lazyredraw set regexpengine=1 set redrawtime=10000 "display set background=dark set number set wrap set foldmethod=marker set listchars=tab:→\ ,extends:›,precedes:‹,nbsp:·,space:·,trail:·,eol:¬ " set list "syntax/filetype/matchit syntax on filetype plugin indent on runtime macros/matchit.vim "os/gui dependent settings "--------------- if has('win32') let &runtimepath.=",$HOME/.vim" endif if has("gui_running") set guioptions -=m set guioptions -=T if has("gui_gtk2") set guifont=Inconsolata\ 12 elseif has("gui_macvim") set guifont=Menlo\ Regular:h14 elseif has("gui_win32") set guifont=Consolas:h10 " set guifont=Cascadia\ Code:h10 "start full-screened augroup WINGUI autocmd! GUIEnter * simalt ~x augroup END endif endif "file cleanup "------------ "swap let mySwapDir = expand("$HOME/.vim/.swap") if !isdirectory(mySwapDir) silent! call mkdir(mySwapDir, "p") endif let &directory=mySwapDir "undo if has('persistent_undo') let myUndoDir = expand("$HOME/.vim/.undo") if !isdirectory(myUndoDir) silent! call mkdir(myUndoDir, "p") endif let &undodir=myUndoDir set undofile endif "backup if has('writebackup') let myBackupDir = expand("$HOME/.vim/.backup") if !isdirectory(myBackupDir) silent! call mkdir(myBackupDir, "p") endif let &backupdir=myBackupDir set backup endif "}}} "======== "Keybinds "======== "{{{ "leader key let mapleader=' ' "---------------- "regular keybinds "---------------- "paste and search nnoremap :noh :let @/ = "" nnoremap i :set invpaste "toggles nnoremap lb :call ToggleLineBreak() nnoremap wr :call ToggleWrap() nnoremap cc :call ToggleColorColumn() "dates nnoremap ts "=strftime("%F %T%z") nnoremap dt :r !date "rc files nnoremap rc :vsplit $MYVIMRC nnoremap so :source $MYVIMRC nnoremap rcl :vsplit ~/.config/vimrc nnoremap rcft :vsplit $HOME/.vim/after/ftplugin/ "windows nnoremap cl :close "formatting tools nnoremap =j :%!python -m json.tool "abbrevations inoreabbrev #!! "#!/usr/bin/env" "--------------- "plugin keybinds "--------------- "netrw nnoremap e :call ToggleNetrw() "vim-plug nnoremap pi :source $MYVIMRC :PlugInstall nnoremap pu :source $MYVIMRC :PlugUpdate nnoremap pc :source $MYVIMRC :PlugClean "openbrowser nnoremap ob :OpenBrowser nnoremap obs :OpenBrowserSearch nmap gx (openbrowser-smart-search) vmap gx (openbrowser-smart-search) "ale nnoremap at :ALEToggle nmap af (ale_fix) nmap aK (ale_hover) nmap an (ale_next_wrap) nmap ap (ale_previous_wrap) "lsp function! s:on_lsp_buffer_enabled() abort setlocal omnifunc=lsp#complete setlocal signcolumn=yes if exists('+tagfunc') | setlocal tagfunc=lsp#tagfunc | endif nmap gd (lsp-definition) nmap gs (lsp-document-symbol-search) nmap gS (lsp-workspace-symbol-search) nmap gr (lsp-references) nmap gi (lsp-implementation) nmap gt (lsp-type-definition) nmap [g (lsp-previous-diagnostic) nmap ]g (lsp-next-diagnostic) nmap gp (lsp-previous-diagnostic) nmap gn (lsp-next-diagnostic) nmap K (lsp-hover) nmap pdf (lsp-peek-definition) nmap pdc (lsp-peek-declaration) nmap pdi (lsp-peek-implementation) nmap ca (lsp-code-action) nmap cl (lsp-code-lens) nmap rn (lsp-rename) nmap ls (lsp-status) nmap lt (lsp-stop-server) nmap di (lsp-document-diagnostics) nmap df (lsp-document-format) inoremap lsp#scroll(+4) inoremap lsp#scroll(-4) " highlight lspReference ctermfg=red guifg=red ctermbg=green guibg=green " refer to doc to add more commands " https://github.com/prabirshrestha/vim-lsp#supported-commands endfunction "vim-emmet let g:user_emmet_leader_key = '' "git-gutter nnoremap ggt :GitGutterToggle "vim-fugitive nnoremap gw :Gwrite nnoremap gl :Glog nnoremap gs :Git nnoremap gd :Gdiffsplit nnoremap gp :Gpush nnoremap ga :Git add % nnoremap ga. :Git add . nnoremap gc :Git commit "fzf nnoremap gf :GitFiles nnoremap f :Files nnoremap b :Buffers nnoremap h :Helptags nnoremap m :Maps nnoremap rg :Rg "}}} "================== "Plugins (vim-plug) "================== "{{{ "vim-plug paths let plugDir = expand("$HOME/.vim/autoload/plug.vim") let pluginDir = expand("$HOME/.vim/plugged") let plugRemote = "https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim" "ensure vim-plug is installed on VimEnter if empty(glob(plugDir)) silent execute "!curl -fLo " . shellescape(expand(plugDir)) . " --create-dirs " . shellescape(plugRemote) autocmd VimEnter * PlugInstall --sync | source $MYVIMRC endif "pre plugin settings "------------------- "(none for now) "load plugins "------------ call plug#begin(pluginDir) Plug 'junegunn/vim-plug' " ==== quality of life ==== "normal mode keybinds Plug 'tpope/vim-commentary' Plug 'tpope/vim-surround' Plug 'tpope/vim-unimpaired' "command mode keybinds Plug 'tpope/vim-rsi' Plug 'tpope/vim-eunuch' Plug 'tpope/vim-repeat' " ==== external tools ==== "git Plug 'tpope/vim-fugitive' Plug 'tpope/vim-rhubarb' Plug 'tpope/vim-dispatch' Plug 'airblade/vim-gitgutter' "fzf Plug 'junegunn/fzf', { 'do': { -> fzf#install() } } Plug 'junegunn/fzf.vim' "browser plugins Plug 'tyru/open-browser.vim' Plug 'iamcco/markdown-preview.nvim', { 'do': { -> mkdp#util#install() }, 'for': ['markdown', 'vim-plug']} " ==== specific language support ==== "go Plug 'fatih/vim-go' "ruby Plug 'vim-ruby/vim-ruby' "html Plug 'mattn/emmet-vim' "markdown Plug 'plasticboy/vim-markdown' Plug 'godlygeek/tabular' "toml Plug 'cespare/vim-toml' " ==== general language support ==== "linting and lsp Plug 'dense-analysis/ale' Plug 'prabirshrestha/vim-lsp' Plug 'mattn/vim-lsp-settings' " ==== misc editor plugins ==== Plug 'editorconfig/editorconfig-vim' Plug 'flazz/vim-colorschemes' call plug#end() "post plugin settings "-------------------- "netrw let g:netrw_banner = 0 let g:netrw_winsize = 24 let g:netrw_liststyle = 3 let g:netrw_preview = 1 let g:netrw_alto = 0 let g:netrw_usetab = 1 let g:netrw_browsex_viewer = "xdg-open" let g:NetrwIsOpen = 0 "for toggle function let g:netrw_nogx = 1 "ale let g:ale_linters = { \ 'python': ['flake8', 'pylint'], \ 'javascript': ['eslint'], \ 'ruby': ['rubocop'], \ 'markdown': ['mdl', 'write-good'] \} let g:ale_fixers = { \ '*': ['remove_trailing_lines', 'trim_whitespace'], \ 'python': ['yapf', 'black'], \ 'javascript': ['prettier', 'eslint'], \ 'ruby': ['rubocop'], \ 'css': ['prettier'], \ 'scss': ['prettier'], \ 'html': ['prettier'], \ 'markdown': ['prettier'] \} let g:ale_sign_error = 'W>' let g:ale_sign_warning = 'E>' let g:ale_lint_on_save = 1 let g:ale_fix_on_save_ignore = 1 highlight clear SignColumn "vim-lsp let g:lsp_format_sync_timeout = 1000 let g:lsp_diagnostics_enabled = 0 let g:lsp_document_highlight_enabled = 0 "vim-lsp-settings specific configs " let g:lsp_settings = { " \ 'pyls-all': { " \ 'workspace_config': { " \ 'pyls': { " \ 'configurationSources': ['flake8'] " \ } " \ } " \ } " \} " let g:lsp_settings_filetype_python = ['pyls-all', 'pyright-langserver', 'jedi-language-server'] "vim-markdown let g:vim_markdown_folding_disabled = 1 let g:vim_markdown_toc_autofit = 1 let g:vim_markdown_conceal = 0 let g:vim_markdown_frontmatter = 1 "}}} "======== "Commands "======== "{{{ "common typos and abbreviations cnoremap w!! w !sudo tee % > /dev/null command! W w !sudo tee % > /dev/null command! Q q command! WQ wq command! Q1 q! "useful shortcut commands command! Trim %s/\s\+$// "}}} "========= "Functions "========= "{{{ "toggle functions "---------------- function! ToggleColorColumn() if &cc == '' set cc=80 else set cc= endif endfunction function! ToggleLineBreak() if &lbr == '' set fo+=t "Autowraps text with textwidth set fo-=l "Wraps long lines in --insert-- mode set lbr else set fo-=t set fo+=l set lbr! endif endfunction function! ToggleWrap() if &wrap == '' set wrap else set nowrap endif endfunction function! ToggleNetrw() "make netrw toggleable if g:NetrwIsOpen let i = bufnr("$") while (i >= 1) if (getbufvar(i, "&filetype") == "netrw") silent exe "bwipeout " . i endif let i-=1 endwhile let g:NetrwIsOpen=0 else let g:NetrwIsOpen=1 silent Lexplore endif endfunction "}}} "============ "Autocommands "============ "{{{ if has("autocmd") "language specific filetype functions (run by autocmds) "------------------ function FT_python() setlocal autoindent setlocal formatprg=yapf iabbr false False iabbr true True xnoremap r :'<,'>:w !python3 endfunction function FT_ruby() setlocal autoindent setlocal formatprg=rubocop endfunction function FT_go() set noexpandtab setlocal formatprg=gofmt let g:go_auto_type_info = 1 let g:go_imports_autosave = 1 endfunction function FT_html() syntax sync fromstart endfunction function FT_markdown() setlocal spell endfunction function FT_halftab() setlocal tabstop=2 softtabstop=2 shiftwidth=2 expandtab endfunction "language specific autocmds "-------------------------- augroup language_ft_group autocmd! autocmd FileType python call FT_python() autocmd FileType ruby,eruby call FT_ruby() autocmd FileType go call FT_go() autocmd FileType html call FT_html() autocmd FileType markdown call FT_markdown() autocmd FileType sh,ruby,bash,html,css,scss,javascript,json,toml,yaml call FT_halftab() autocmd BufNewFile,BufRead *html*,*css*,*js* EmmetInstall augroup END "lsp autocmds "------------ augroup lsp_install autocmd! autocmd User lsp_buffer_enabled call s:on_lsp_buffer_enabled() augroup END augroup lsp_ft_group autocmd! " autoformat with LSP " autocmd BufWritePre *.rs call execute('LspDocumentFormatSync') augroup END "global autocmds "----------------- augroup global autocmd! "keep equal proportions when windows resized autocmd VimResized * wincmd = "save cursor position in a file autocmd BufReadPost * if line("'\"") > 1 && line("'\"") \ <= line("$") | exe "normal! g'\"" | endif augroup END endif "}}} "============== "Local settings "============== "{{{ "source local vimrc if filereadable(expand("~/.config/vimrc")) source ~/.config/vimrc endif "}}} "colorschemes " {{{ " colorscheme 1989 " colorscheme PaperColor " colorscheme gruvbox " colorscheme jellybeans " colorscheme molokai " colorscheme Benokai " colorscheme Monokai " colorscheme badwolf " colorscheme wombat256 " colorscheme yuejiu " colorscheme wargrey " colorscheme Tomorrow-Night-Bright " colorscheme monokai-phoenix " }}}