"====================================================================== " init-config.vim " Do some autocommand for by contexts "====================================================================== " Unnamed Buffer ----------------{{{ " Automatically delete unnamed empty buffer when leaving augroup DeleteUnnamedEmptBuffer! au! au BufLeave {} if getline(1, '$') == [''] | setlocal bufhidden=wipe | endif augroup END " }}} " Small Terminal ----------------{{{ augroup TerminalSize au! function! LayoutForSmallTerminal() if &lines < 19 silent! set cmdheight=0 laststatus=0 showtabline=0 signcolumn=no nowrap scrolloff=1 else silent! set cmdheight& laststatus& showtabline=2 signcolumn=yes scrolloff=3 endif endfunction autocmd VimEnter,VimResized * call LayoutForSmallTerminal() augroup END " }}} " X11 ----------------{{{ " Change IM to US when exit to Normal mode autocmd InsertLeave * :silent !fcitx-remote -c &>/dev/null || true " }}} " TMUX ----------------{{{ " 有 tmux 何没有的功能键超时(毫秒) if $TMUX != '' set ttimeoutlen=30 elseif &ttimeoutlen > 80 || &ttimeoutlen <= 0 set ttimeoutlen=80 endif " 防止tmux下vim的背景色显示异常 " Refer: http://sunaku.github.io/vim-256color-bce.html if &term =~ '256color' && $TMUX != '' " disable Background Color Erase (BCE) so that color schemes " render properly when inside 256-color tmux and GNU screen. set t_ut= endif " Ref: https://gist.github.com/andersevenrud/015e61af2fd264371032763d4ed965b6 " You might have to force true color when using regular vim inside tmux as the " colorscheme can appear to be grayscale with 'termguicolors' option enabled. if !has('gui_running') && &term =~ '^\%(screen\|tmux\)' let &t_8f = "\[38;2;%lu;%lu;%lum" let &t_8b = "\[48;2;%lu;%lu;%lum" endif " }}} " KeyCode ----------------{{{ "---------------------------------------------------------------------- " 终端下允许 ALT,详见:http://www.skywind.me/blog/archives/2021 " 记得设置 ttimeout (见 init-basic.vim) 和 ttimeoutlen (上面) "---------------------------------------------------------------------- if has('nvim') == 0 && has('gui_running') == 0 function! s:metacode(key) exec "set =\e".a:key endfunc " set 0-9 for i in range(10) call s:metacode(nr2char(char2nr('0') + i)) endfor " set a-z A-Z for i in range(26) call s:metacode(nr2char(char2nr('a') + i)) call s:metacode(nr2char(char2nr('A') + i)) endfor for c in [',', '.', '/', ';', '{', '}'] call s:metacode(c) endfor for c in ['?', ':', '-', '_', '+', '=', "'"] call s:metacode(c) endfor endif "---------------------------------------------------------------------- " 功能键终端码矫正 "---------------------------------------------------------------------- function! s:key_escape(name, code) if has('nvim') == 0 && has('gui_running') == 0 exec "set ".a:name."=\e".a:code endif endfunc call s:key_escape('', 'OP') call s:key_escape('', 'OQ') call s:key_escape('', 'OR') call s:key_escape('', 'OS') call s:key_escape('', '[1;2P') call s:key_escape('', '[1;2Q') call s:key_escape('', '[1;2R') call s:key_escape('', '[1;2S') call s:key_escape('', '[15;2~') call s:key_escape('', '[17;2~') call s:key_escape('', '[18;2~') call s:key_escape('', '[19;2~') call s:key_escape('', '[20;2~') call s:key_escape('', '[21;2~') call s:key_escape('', '[23;2~') call s:key_escape('', '[24;2~') " }}} " Filetype ----------------{{{ augroup InitFileTypes au! " Filetype for Vim ----------------{{{ " Help page autocmd BufEnter *.txt if &filetype == 'help' | wincmd T | endif " quickfix: hide line number autocmd FileType quickfix setlocal nonumber " }}} " Shebeng: Set filetype from shebeng ----------------{{{ function! s:ApplyShebang() let l:filetype = matchstr(getline(1), '^#!.*[ /]\zs[[:alnum:]]\+$') let l:shebangMatch = #{ node: "javascript" } if l:filetype != "" if has_key(shebangMatch, l:filetype) let l:filetype = shebangMatch[l:filetype] endif echo "filetype from shebang: ".l:filetype execute "set filetype=".l:filetype endif endfunction autocmd BufReadPost * call ApplyShebang() " }}} " Markdown ----------------{{{ augroup Config_Markdown au! au FileType markdown setlocal wrap sw=2 ts=2 au FileType markdown setlocal foldexpr=MarkdownLevel() foldmethod=expr " Fold by heading level function! MarkdownLevel() let hash_num = matchstr(getline(v:lnum), '^#\+') let hash_num_at_top = matchstr(getline(v:lnum-1), '^#\+') if empty(hash_num) if empty(hash_num_at_top) return "=" else return ">"..(len(hash_num_at_top)) endif else return len(hash_num) - 1 endif endfunction augroup END " }}} " HTML ----------------{{{ " Usage: cl(ass) or id to edit html tag attribute function! s:ChangeAttr(pattern) let l:attr = matchstr(getline('.'), a:pattern.'="') if l:attr == '' let l:all_attrs = matchstr(getline('.'), '<[[:alnum:]]\+\zs\s\?[^>]*>\ze') execute 's/'.l:all_attrs.'/ '.a:pattern.'=""'.l:all_attrs.'/' noh normal! 0f"l startinsert else normal! 0 call search(l:attr) normal! f"l noh startinsert endif endfunction autocmd FileType html,markdown nnoremap cl :call ChangeAttr("class") autocmd FileType html,markdown nnoremap id :call ChangeAttr("id") " Reload preview server autocmd BufWrite *.html,*.js,*.css call ReloadServer() function ReloadServer() silent !browser-sync reload &>/dev/null endfunction " }}} " Mail ----------------{{{ autocmd BufRead /tmp/mutt-* set tw=72 " }}} " Password ----------------{{{ " Hide the first line of a file if editing password file " TODO a better way to determine a file is related to password-store, now use " files under /dev/shm as filter autocmd BufRead /dev/shm/*.txt call SetPasswordFile() function SetPasswordFile() setlocal foldminlines=0 setlocal foldmethod=manual function s:custom() return "Password" endfunction setlocal foldtext=s:custom() norm! ggzfl endfunction " }}} " Beancount ----------------{{{ autocmd BufRead,BufNewFile *.bean call PrepareBean() function PrepareBean() set filetype=beancount silent !setsid fava ~/bean/main.bean &>/dev/null autocmd VimLeave * silent !killall fava endfunction " }}} augroup END " }}}