dotfiles

personal configuration files and scripts
git clone https://tongong.net/git/dotfiles.git
Log | Files | Refs | README

init.vim (7112B)


      1 "###  OPTIONS  ###############################################################
      2 syntax on
      3 filetype plugin on
      4 set nocompatible
      5 
      6 " 4 is the best tab size; change my mind
      7 set tabstop=4 softtabstop=4 shiftwidth=4
      8 set expandtab
      9 set smartindent
     10 
     11 set foldmethod=indent
     12 set foldlevelstart=20
     13 
     14 " interface
     15 set number
     16 call matchadd('ColorColumn', '\%80v.', 100) " color column
     17 set signcolumn=yes
     18 set noshowmode " not needed because of statusline
     19 set fillchars=eob:\ ,
     20 set shortmess+=I
     21 " necessary to color the active line number
     22 " this breaks fold highlighting when you are in the fold line which is a
     23 " really annoying bug
     24 set cursorline
     25 
     26 " use persistent history.
     27 " -> these are reset for /dev/shm to keep pass secure (see #autocommands)
     28 if !isdirectory(expand("~/.vim/undo-dir"))
     29     call mkdir(expand("~/.vim/undo-dir"), "", 0700)
     30 endif
     31 set undodir=~/.vim/undo-dir
     32 set undofile
     33 set nobackup
     34 set noswapfile
     35 
     36 " search
     37 set incsearch
     38 set nohlsearch
     39 set ignorecase
     40 set smartcase
     41 
     42 set noerrorbells
     43 set hidden " keep buffers open in background
     44 set scrolloff=8
     45 set updatetime=100 " for vim-gitgutter
     46 
     47 set completeopt=menu,menuone,noselect,preview
     48 set pumheight=10
     49 
     50 "###  PLUGINS  ###############################################################
     51 call plug#begin('~/.vim/plugged')
     52 
     53 Plug 'airblade/vim-gitgutter'
     54 Plug 'axvr/zepl.vim'
     55 Plug 'embear/vim-localvimrc'
     56 Plug 'godlygeek/tabular'
     57 Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
     58 Plug 'junegunn/fzf.vim'
     59 Plug 'junegunn/goyo.vim'
     60 Plug 'mbbill/undotree'
     61 Plug 'tpope/vim-commentary'
     62 Plug 'tpope/vim-fugitive'
     63 
     64 Plug 'ARM9/arm-syntax-vim'
     65 Plug 'ap/vim-css-color'
     66 Plug 'guns/vim-clojure-static'
     67 Plug 'tpope/vim-classpath'
     68 Plug 'tpope/vim-fireplace'
     69 Plug 'https://git.sr.ht/~sircmpwn/hare.vim'
     70 
     71 Plug 'nvim-treesitter/nvim-treesitter', {'do': ':TSUpdate'}
     72 
     73 Plug 'neovim/nvim-lspconfig'
     74 Plug 'hrsh7th/cmp-nvim-lsp'
     75 Plug 'hrsh7th/cmp-path'
     76 Plug 'hrsh7th/nvim-cmp'
     77 Plug 'hrsh7th/cmp-vsnip'
     78 Plug 'hrsh7th/vim-vsnip'
     79 
     80 call plug#end()
     81 
     82 
     83 "###  SETTINGS  ##############################################################
     84 colorscheme dim
     85 
     86 " statusline
     87 lua require("statusline")
     88 
     89 " spell check toggle
     90 let g:myLangList = ["nospell", "de_de", "en_us"]
     91 function! ToggleSpell()
     92     let b:myLang = b:myLang + 1
     93     if b:myLang >= len(g:myLangList) | let b:myLang = 0 | endif
     94     if b:myLang == 0
     95         setlocal nospell
     96     else
     97         execute "setlocal spell spelllang=".get(g:myLangList, b:myLang)
     98     endif
     99     echo "spell checking language:" g:myLangList[b:myLang]
    100 endfunction
    101 function! InitToggleSpell()
    102     if !exists("b:myLang")
    103         if &spell
    104             let b:myLang = index(g:myLangList, &spelllang)
    105         else
    106             let b:myLang = 0
    107         endif
    108     endif
    109 endfunction
    110 
    111 " zepl.vim
    112 runtime zepl/contrib/python.vim  " enable the python contrib module.
    113 let g:repl_config = {
    114             \   "javascript": { "cmd": "node" },
    115             \   "haskell": { "cmd": "ghci" },
    116             \   "scheme": { "cmd": "racket" },
    117             \   "python": {
    118             \     "cmd": "python",
    119             \     "formatter": function("zepl#contrib#python#formatter")
    120             \   }
    121             \ }
    122 
    123 let g:notes_dir = $NOTES_DIR
    124 source $HOME/.config/nvim/notes.vim
    125 
    126 source $HOME/.config/nvim/init-private.vim
    127 
    128 lua require("config")
    129 
    130 "###  REMAPS  ################################################################
    131 let mapleader = " "
    132 " without this gitgutter overwrites <leader>h... making <leader>h unusable
    133 let g:gitgutter_map_keys = 0
    134 
    135 nnoremap <leader>n :new .<CR>
    136 nnoremap <leader>h :wincmd h<CR>
    137 nnoremap <leader>j :wincmd j<CR>
    138 nnoremap <leader>k :wincmd k<CR>
    139 nnoremap <leader>l :wincmd l<CR>
    140 nnoremap <leader>u :UndotreeToggle<CR>
    141 nnoremap <leader>b :Buffers<CR>
    142 nnoremap <leader>f :Files<CR>
    143 nnoremap <leader>m :History<CR>
    144 nnoremap <leader>v :BCommits<CR>
    145 nnoremap <leader>g :G
    146 nnoremap <leader>w :w<CR>
    147 nnoremap <leader>r :Goyo<CR>
    148 nnoremap <leader>s :call ToggleSpell()<CR>
    149 nnoremap <leader>a ggVG
    150 nnoremap <leader>R :source $MYVIMRC<CR>
    151 " from LukeSmith's dotfiles
    152 " Compile document, be it groff/LaTeX/markdown/etc.
    153 nnoremap <leader>c :w! \| !compiler "<c-r>%"<CR>
    154 " Open corresponding .pdf/.html or preview
    155 nnoremap <leader>p :!opout <c-r>%<CR><CR>
    156 " switch to most recent file
    157 nnoremap <leader><leader> <c-^>
    158 " open repl
    159 nnoremap <leader>z :bo 10 Repl<CR>
    160 nnoremap Q gqq
    161 " the ^ key is not reachable on qwertz keyboards
    162 noremap 0 ^
    163 nmap <return> za
    164 nmap <leader><return> zR
    165 
    166 nmap <Leader>ii <Plug>(GitGutterPreviewHunk)
    167 nmap <Leader>is <Plug>(GitGutterStageHunk)
    168 nmap <Leader>iu <Plug>(GitGutterUndoHunk)
    169 nmap <Leader>io <Plug>(GitGutterNextHunk)
    170 
    171 " fix gx (see https://github.com/vim/vim/issues/4738)
    172 nmap gx yiW:!xdg-open <cWORD><CR> <C-r>" & <CR><CR>
    173 
    174 " exit terminal mode
    175 tnoremap <Esc> <Esc><C-\><C-n>
    176 
    177 " why would you use gf instead of gF?
    178 nmap gf gF
    179 
    180 " I always get these wrong
    181 command! W w
    182 command! Wq wq
    183 command! WQ wq
    184 command! Q q
    185 
    186 noremap zj :call NextClosedFold('j')<cr>
    187 noremap zk :call NextClosedFold('k')<cr>
    188 
    189 function! NextClosedFold(dir)
    190     let cmd = 'norm!z' . a:dir
    191     let view = winsaveview()
    192     let [l0, l, open] = [0, view.lnum, 1]
    193     while l != l0 && open
    194         exe cmd
    195         let [l0, l] = [l, line('.')]
    196         let open = foldclosed(l) < 0
    197     endwhile
    198     if open
    199         call winrestview(view)
    200     endif
    201 endfunction
    202 
    203 " snippets for autocomplete
    204 imap <expr> <Tab>   vsnip#jumpable(1)   ? '<Plug>(vsnip-jump-next)'      : '<Tab>'
    205 smap <expr> <Tab>   vsnip#jumpable(1)   ? '<Plug>(vsnip-jump-next)'      : '<Tab>'
    206 imap <expr> <S-Tab> vsnip#jumpable(-1)  ? '<Plug>(vsnip-jump-prev)'      : '<S-Tab>'
    207 smap <expr> <S-Tab> vsnip#jumpable(-1)  ? '<Plug>(vsnip-jump-prev)'      : '<S-Tab>'
    208 
    209 
    210 "###  AUTOCOMMANDS  ##########################################################
    211 fun! TrimWhitespace()
    212     let l:save = winsaveview()
    213     keeppatterns %s/\s\+$//e
    214     call winrestview(l:save)
    215 endfun
    216 
    217 
    218 " remember folding
    219 set viewoptions=cursor,folds,slash,unix
    220 source $HOME/.config/nvim/restore-view.vim
    221 
    222 augroup main
    223     autocmd!
    224     autocmd BufWritePre         *           call TrimWhitespace()
    225     autocmd BufEnter            *           call InitToggleSpell()
    226     " clear colon commands
    227     autocmd CmdlineLeave        :           echo ''
    228 
    229     " filetypes
    230     autocmd BufRead,BufNewFile  *.md        setlocal filetype=markdown
    231     autocmd BufRead,BufNewFile  *.remark    setlocal filetype=markdown
    232     autocmd BufRead,BufNewFile  *.elm       setlocal tabstop=2 softtabstop=2 shiftwidth=2
    233     " do not keep history for pass
    234     autocmd BufEnter            /dev/shm/*  setlocal undofile&
    235     autocmd BufRead,BufNewFile  *.s,*.S     setlocal filetype=arm " = armv6/7
    236     autocmd FileType arm                    setlocal commentstring=//\ %s
    237     autocmd BufRead,BufNewFile  *.clj       nnoremap <buffer> <leader>c :w! \| Require<CR>
    238 
    239     " Don't screw up folds when inserting text that might affect them, until
    240     " leaving insert mode. Foldmethod is local to the window.
    241     autocmd InsertEnter         *           let w:last_fdm=&foldmethod | setlocal foldmethod=manual
    242     autocmd InsertLeave         *           let &l:foldmethod=w:last_fdm
    243 augroup END