Tool configuration

created : Tue, 07 Apr 2020 20:36:45 +0900
modified : Sat, 27 Jun 2020 15:16:51 +0900
linux tool

- Neovim

- `.vimrc`

        " vim-bootstrap 
        
        "*****************************************************************************
        "" Vim-PLug core
        "*****************************************************************************
        let vimplug_exists=expand('~/.config/nvim/autoload/plug.vim')
        
        let g:vim_bootstrap_langs = "c,html,javascript,python"
        let g:vim_bootstrap_editor = "nvim"				" nvim or vim
        
        if !filereadable(vimplug_exists)
          if !executable("curl")
            echoerr "You have to install curl or first install vim-plug yourself!"
            execute "q!"
          endif
          echo "Installing Vim-Plug..."
          echo ""
          silent exec "!\curl -fLo " . 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 install packages
        "*****************************************************************************
        if has('nvim')
          Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' }
          Plug 'wokalski/autocomplete-flow'
          Plug 'zchee/deoplete-clang' 
        else
          Plug 'Shougo/deoplete.nvim'
          Plug 'roxma/nvim-yarp'
          Plug 'roxma/vim-hug-neovim-rpc'
        endif
        let g:deoplete#enable_at_startup = 1
        
        Plug 'vimwiki/vimwiki'
        Plug 'sakhnik/nvim-gdb', { 'do': ':!./install.sh \| UpdateRemotePlugins' }
        "let g:vimwiki_list = [{'path': '~/workspace/vimwiki'}]
        Plug 'scrooloose/nerdtree'
        Plug 'jistr/vim-nerdtree-tabs'
        Plug 'Xuyuanp/nerdtree-git-plugin'
        Plug 'qpkorr/vim-bufkill'
        Plug 'tpope/vim-commentary'
        Plug 'tpope/vim-fugitive'
        Plug 'vim-airline/vim-airline'
        Plug 'vim-airline/vim-airline-themes'
        Plug 'airblade/vim-gitgutter'
        Plug 'vim-scripts/grep.vim'
        Plug 'vim-scripts/CSApprox'
        Plug 'Raimondi/delimitMate'
        Plug 'majutsushi/tagbar'
        Plug 'w0rp/ale'
        Plug 'Yggdroot/indentLine'
        Plug 'avelino/vim-bootstrap-updater'
        Plug 'sheerun/vim-polyglot'
        Plug 'tpope/vim-rhubarb' " required by fugitive to :Gbrowse
        Plug 'easymotion/vim-easymotion'
        
        if isdirectory('/usr/local/opt/fzf')
          Plug '/usr/local/opt/fzf' | Plug 'junegunn/fzf.vim'
        else
          Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --bin' }
          Plug 'junegunn/fzf.vim'
        endif
        let g:make = 'gmake'
        if exists('make')
                let g:make = 'make'
        endif
        Plug 'Shougo/vimproc.vim', {'do': g:make}
        
        "" Vim-Session
        Plug 'xolox/vim-misc'
        Plug 'xolox/vim-session'
        
        "" Snippets
        Plug 'SirVer/ultisnips'
        Plug 'honza/vim-snippets'
        
        "" Color
        Plug 'dracula/vim', { 'as': 'dracula' }
        "Plug 'dracula/dracula-theme'
        "Plug 'tomasr/molokai'
        "let g:gruvbox_italic=1 
        "Plug 'morhetz/gruvbox'
        
        "*****************************************************************************
        "" Custom bundles
        "*****************************************************************************
        
        " c
        Plug 'vim-scripts/c.vim', {'for': ['c', 'cpp']}
        Plug 'ludwig/split-manpage.vim'
        
        
        " html
        "" HTML Bundle
        Plug 'hail2u/vim-css3-syntax'
        Plug 'gorodinskiy/vim-coloresque'
        Plug 'tpope/vim-haml'
        Plug 'mattn/emmet-vim'
        
        
        " javascript
        "" Javascript Bundle
        Plug 'jelera/vim-javascript-syntax'
        
        
        " python
        "" Python Bundle
        Plug 'davidhalter/jedi-vim'
        Plug 'raimon49/requirements.txt.vim', {'for': 'requirements'}
        
        
        "*****************************************************************************
        "*****************************************************************************
        
        "" Include user's extra bundle
        if filereadable(expand("~/.config/nvim/local_bundles.vim"))
          source ~/.config/nvim/local_bundles.vim
        endif
        
        call plug#end()
        
        " Required:
        filetype plugin indent on
        
        
        "*****************************************************************************
        "" Basic Setup
        "*****************************************************************************"
        "" Encoding
        set encoding=utf-8
        set fileencoding=utf-8
        set fileencodings=utf-8
        
        
        "" Fix backspace indent
        set backspace=indent,eol,start
        
        "" Tabs. May be overridden by autocmd rules
        set tabstop=2
        set softtabstop=0
        set shiftwidth=2
        set expandtab
        
        "" Map leader to ,
        let mapleader=','
        
        "" Enable hidden buffers
        set hidden
        
        "" Searching
        set hlsearch
        set incsearch
        set ignorecase
        set smartcase
        
        set fileformats=unix,dos,mac
        
        if exists('$SHELL')
            set shell=$SHELL
        else
            set shell=/bin/sh
        endif
        
        " session management
        let g:session_directory = "~/.config/nvim/session"
        let g:session_autoload = "no"
        let g:session_autosave = "no"
        let g:session_command_aliases = 1
        
        "*****************************************************************************
        "" Visual Settings
        "*****************************************************************************
        syntax on
        set ruler
        set number
        
        let no_buffers_menu=1
        silent! colorscheme molokai
        
        set mousemodel=popup
        set t_Co=256
        set guioptions=egmrti
        set gfn=Monospace\ 10
        
        if has("gui_running")
          if has("gui_mac") || has("gui_macvim")
            set guifont=Menlo:h12
            set transparency=7
          endif
        else
          let g:CSApprox_loaded = 1
        
          " IndentLine
          let g:indentLine_enabled = 1
          let g:indentLine_concealcursor = 0
          let g:indentLine_char = '┆'
          let g:indentLine_faster = 1
        
          
        endif
        
        
        
        "" Disable the blinking cursor.
        set gcr=a:blinkon0
        set scrolloff=3
        
        "" Status bar
        set laststatus=2
        
        "" Use modeline overrides
        set modeline
        set modelines=10
        
        set title
        set titleold="Terminal"
        set titlestring=%F
        
        set statusline=%F%m%r%h%w%=(%{&ff}/%Y)\ (line\ %l\/%L,\ col\ %c)\
        
        " Search mappings: These will make it so that going to the next one in a
        " search will center on the line it's found in.
        nnoremap n nzzzv
        nnoremap N Nzzzv
        
        if exists("*fugitive#statusline")
          set statusline+=%{fugitive#statusline()}
        endif
        
        " vim-airline
        let g:airline_theme = 'dracula'
        let g:airline#extensions#branch#enabled = 1
        let g:airline#extensions#ale#enabled = 1
        let g:airline#extensions#tabline#enabled = 1
        let g:airline#extensions#tagbar#enabled = 1
        let g:airline_skip_empty_sections = 1
        
        "*****************************************************************************
        "" Abbreviations
        "*****************************************************************************
        "" no one is really happy until you have this shortcuts
        cnoreabbrev W! w!
        cnoreabbrev Q! q!
        cnoreabbrev Qall! qall!
        cnoreabbrev Wq wq
        cnoreabbrev Wa wa
        cnoreabbrev wQ wq
        cnoreabbrev WQ wq
        cnoreabbrev W w
        cnoreabbrev Q q
        cnoreabbrev Qall qall
        
        "" NERDTree configuration
        let g:NERDTreeChDirMode=2
        let g:NERDTreeIgnore=['\.rbc$', '\~$', '\.pyc$', '\.db$', '\.sqlite$', '__pycache__']
        let g:NERDTreeSortOrder=['^__\.py$', '\/$', '*', '\.swp$', '\.bak$', '\~$']
        let g:NERDTreeShowBookmarks=1
        let g:nerdtree_tabs_focus_on_files=1
        let g:NERDTreeMapOpenInTabSilent = '<RightMouse>'
        let g:NERDTreeWinSize = 30
        set wildignore+=*/tmp/*,*.so,*.swp,*.zip,*.pyc,*.db,*.sqlite
        nnoremap <silent> <F2> :NERDTreeFind<CR>
        nnoremap <silent> <F3> :NERDTreeToggle<CR>
        
        " grep.vim
        let Grep_Default_Options = '-IR'
        let Grep_Skip_Files = '*.log *.db'
        let Grep_Skip_Dirs = '.git node_modules'
        
        
        
        "*****************************************************************************
        "" Commands
        "*****************************************************************************
        " remove trailing whitespaces
        command! FixWhitespace :%s/\s\+$//e
        
        "*****************************************************************************
        "" Functions
        "*****************************************************************************
        if !exists('*s:setupWrapping')
          function s:setupWrapping()
            set wrap
            set wm=2
            set textwidth=79
          endfunction
        endif
        
        "*****************************************************************************
        "" Autocmd Rules
        "*****************************************************************************
        "" The PC is fast enough, do syntax highlight syncing from start unless 200 lines
        augroup vimrc-sync-fromstart
          autocmd!
          autocmd BufEnter * :syntax sync maxlines=200
        augroup END
        
        "" Remember cursor position
        augroup vimrc-remember-cursor-position
          autocmd!
          autocmd BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g`\"" | endif
        augroup END
        
        "" txt
        augroup vimrc-wrapping
          autocmd!
          autocmd BufRead,BufNewFile *.txt call s:setupWrapping()
        augroup END
        
        "" make/cmake
        augroup vimrc-make-cmake
          autocmd!
          autocmd FileType make setlocal noexpandtab
          autocmd BufNewFile,BufRead CMakeLists.txt setlocal filetype=cmake
        augroup END
        
        set autoread
        
        "*****************************************************************************
        "" Mappings
        "*****************************************************************************
        
        
        "" Tabs
        nnoremap <Tab> gt
        nnoremap <S-Tab> gT
        nnoremap <silent> <S-t> :tabnew<CR>
        
        
        "" fzf.vim
        set wildmode=list:longest,list:full
        set wildignore+=*.o,*.obj,.git,*.rbc,*.pyc,__pycache__
        let $FZF_DEFAULT_COMMAND =  "find * -path '*/\.*' -prune -o -path 'node_modules/**' -prune -o -path 'target/**' -prune -o -path 'dist/**' -prune -o  -type f -print -o -type l -print 2> /dev/null"
        
        " The Silver Searcher
        if executable('ag')
          let $FZF_DEFAULT_COMMAND = 'ag --hidden --ignore .git -g ""'
          set grepprg=ag\ --nogroup\ --nocolor
        endif
        
        " ripgrep
        if executable('rg')
          let $FZF_DEFAULT_COMMAND = 'rg --files --hidden --follow --glob "!.git/*"'
          set grepprg=rg\ --vimgrep
          command! -bang -nargs=* Find call fzf#vim#grep('rg --column --line-number --no-heading --fixed-strings --ignore-case --hidden --follow --glob "!.git/*" --color "always" '.shellescape(<q-args>).'| tr -d "\017"', 1, <bang>0)
        endif
        
        cnoremap <C-P> <C-R>=expand("%:p:h") . "/" <CR>
        
        " snippets
        let g:UltiSnipsExpandTrigger="<tab>"
        let g:UltiSnipsJumpForwardTrigger="<tab>"
        let g:UltiSnipsJumpBackwardTrigger="<c-b>"
        let g:UltiSnipsEditSplit="vertical"
        
        " ale
        let g:ale_linters = {'javascript' : ['eslint']}
        
        " Tagbar
        nmap <silent> <F4> :TagbarToggle<CR>
        let g:tagbar_autofocus = 1
        
        " Disable visualbell
        set noerrorbells visualbell t_vb=
        if has('autocmd')
          autocmd GUIEnter * set visualbell t_vb=
        endif
        
        "" Copy/Paste/Cut
        if has('unnamedplus')
          set clipboard=unnamed,unnamedplus
        endif
        
        noremap YY "+y<CR>
        noremap <leader>p "+gP<CR>
        noremap XX "+x<CR>
        
        if has('macunix')
          " pbcopy for OSX copy/paste
          vmap <C-x> :!pbcopy<CR>
          vmap <C-c> :w !pbcopy<CR><CR>
        endif
        
        
        
        "" Switching windows
        noremap <C-j> <C-w>j
        noremap <C-k> <C-w>k
        noremap <C-l> <C-w>l
        noremap <C-h> <C-w>h
        
        "" Vmap for maintain Visual Mode after shifting > and <
        vmap < <gv
        vmap > >gv
        
        "" Move visual block
        vnoremap J :m '>+1<CR>gv=gv
        vnoremap K :m '<-2<CR>gv=gv
        
        
        "*****************************************************************************
        "" Custom configs
        "*****************************************************************************
        
        " c
        autocmd FileType c setlocal tabstop=2 shiftwidth=2 expandtab 
        autocmd FileType c let g:loaded_nvimgdb = 1
        autocmd FileType cpp setlocal tabstop=2 shiftwidth=2 expandtab 
        autocmd FileType cpp let g:loaded_nvimgdb = 1
        
        
        " html
        " for html files, 2 spaces
        autocmd Filetype html setlocal ts=2 sw=2 expandtab
        
        
        " javascript
        let g:javascript_enable_domhtmlcss = 1
        
        " vim-javascript
        augroup vimrc-javascript
          autocmd!
          autocmd FileType javascript setl tabstop=2|setl shiftwidth=2|setl expandtab softtabstop=2
        augroup END
        
        
        " python
        " vim-python
        augroup vimrc-python
          autocmd!
          autocmd FileType python setlocal expandtab shiftwidth=2 tabstop=4 colorcolumn=79
              \ formatoptions+=croq softtabstop=2
              \ cinwords=if,elif,else,for,while,try,except,finally,def,class,with
        augroup END
        
        " jedi-vim
        let g:jedi#popup_on_dot = 0
        let g:jedi#goto_assignments_command = "<leader>g"
        let g:jedi#goto_definitions_command = "<leader>d"
        let g:jedi#documentation_command = "K"
        let g:jedi#usages_command = "<leader>n"
        let g:jedi#rename_command = "<leader>r"
        let g:jedi#show_call_signatures = "0"
        let g:jedi#completions_command = "<C-Space>"
        let g:jedi#smart_auto_mappings = 0
        
        " ale
        :call extend(g:ale_linters, {
            \'python': ['flake8'], })
        
        " vim-airline
        let g:airline#extensions#virtualenv#enabled = 1
        
        " Syntax highlight
        " Default highlight is better than polyglot
        let g:polyglot_disabled = ['python']
        let python_highlight_all = 1
        
        
        
        "*****************************************************************************
        "*****************************************************************************
        
        "" Include user's local vim config
        if filereadable(expand("~/.config/nvim/local_init.vim"))
          source ~/.config/nvim/local_init.vim
        endif
        
        "*****************************************************************************
        "" Convenience variables
        "*****************************************************************************
        
        " vim-airline
        if !exists('g:airline_symbols')
          let g:airline_symbols = {}
        endif
        
        if !exists('g:airline_powerline_fonts')
          let g:airline#extensions#tabline#left_sep = ' '
          let g:airline#extensions#tabline#left_alt_sep = '|'
          let g:airline_left_sep          = '▶'
          let g:airline_left_alt_sep      = '»'
          let g:airline_right_sep         = '◀'
          let g:airline_right_alt_sep     = '«'
          let g:airline#extensions#branch#prefix     = '⤴' "➔, ➥, ⎇
          let g:airline#extensions#readonly#symbol   = '⊘'
          let g:airline#extensions#linecolumn#prefix = '¶'
          let g:airline#extensions#paste#symbol      = 'ρ'
          let g:airline_symbols.linenr    = '␊'
          let g:airline_symbols.branch    = '⎇'
          let g:airline_symbols.paste     = 'ρ'
          let g:airline_symbols.paste     = 'Þ'
          let g:airline_symbols.paste     = '∥'
          let g:airline_symbols.whitespace = 'Ξ'
        else
          let g:airline#extensions#tabline#left_sep = ''
          let g:airline#extensions#tabline#left_alt_sep = ''
        
          " powerline symbols
          let g:airline_left_sep = ''
          let g:airline_left_alt_sep = ''
          let g:airline_right_sep = ''
          let g:airline_right_alt_sep = ''
          let g:airline_symbols.branch = ''
          let g:airline_symbols.readonly = ''
          let g:airline_symbols.linenr = ''
        endif
        
        let g:deoplete#sources#clang#libclang_path='/usr/lib/llvm-6.0/lib/libclang.so'
        " grep.vim
        nnoremap <silent> <leader>f :Rgrep<CR>
        " terminal emulation
        nnoremap <silent> <leader>sh :terminal<CR>
        "" Open current line on GitHub
        nnoremap <Leader>o :.Gbrowse<CR>
        "" Clean search (highlight)
        nnoremap <silent> <leader><space> :noh<cr>
        "" Buffer nav
        noremap <leader>z :bp<CR>
        noremap <leader>q :bp<CR>
        noremap <leader>x :bn<CR>
        noremap <leader>w :bn<CR>
        
        "" Close buffer
        noremap <leader>c :bd<CR>
        
        nnoremap <silent> <leader>b :Buffers<CR>
        nnoremap <silent> <leader>e :FZF -m<CR>
        "Recovery commands from history through FZF
        nmap <leader>y :History:<CR>
        "" Set working directory
        nnoremap <leader>. :lcd %:p:h<CR>
        
        "" Opens an edit command with the path of the currently edited file filled in
        noremap <Leader>e :e <C-R>=expand("%:p:h") . "/" <CR>
        
        "" Opens a tab edit command with the path of the currently edited file filled
        noremap <Leader>te :tabe <C-R>=expand("%:p:h") . "/" <CR>
        "" Split
        noremap <Leader>h :<C-u>split<CR>
        noremap <Leader>v :<C-u>vsplit<CR>
        
        "" Git
        noremap <Leader>ga :Gwrite<CR>
        noremap <Leader>gc :Gcommit<CR>
        noremap <Leader>gsh :Gpush<CR>
        noremap <Leader>gll :Gpull<CR>
        noremap <Leader>gs :Gstatus<CR>
        noremap <Leader>gb :Gblame<CR>
        noremap <Leader>gd :Gvdiff<CR>
        noremap <Leader>gr :Gremove<CR>
        
        " session management
        nnoremap <leader>so :OpenSession<Space>
        nnoremap <leader>ss :SaveSession<Space>
        nnoremap <leader>sd :DeleteSession<CR>
        nnoremap <leader>sc :CloseSession<CR>
        color dracula
        
        
        if filereadable(expand(".local.vim"))
          source .local.vim
        endif
        
        set undofile
        set undodir=/home/lmu/.config/nvim/.vimundo