aboutsummaryrefslogtreecommitdiffhomepage
path: root/vim/init/config.vim
blob: 4e1c06cc3d8dfa42483431cb50746b7fba1dd63b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
"======================================================================
" 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 = "\<Esc>[38;2;%lu;%lu;%lum"
  let &t_8b = "\<Esc>[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 <M-".a:key.">=\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('<F1>', 'OP')
call s:key_escape('<F2>', 'OQ')
call s:key_escape('<F3>', 'OR')
call s:key_escape('<F4>', 'OS')
call s:key_escape('<S-F1>', '[1;2P')
call s:key_escape('<S-F2>', '[1;2Q')
call s:key_escape('<S-F3>', '[1;2R')
call s:key_escape('<S-F4>', '[1;2S')
call s:key_escape('<S-F5>', '[15;2~')
call s:key_escape('<S-F6>', '[17;2~')
call s:key_escape('<S-F7>', '[18;2~')
call s:key_escape('<S-F8>', '[19;2~')
call s:key_escape('<S-F9>', '[20;2~')
call s:key_escape('<S-F10>', '[21;2~')
call s:key_escape('<S-F11>', '[23;2~')
call s:key_escape('<S-F12>', '[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 <SID>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: <leader>cl(ass) or <leader>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 <buffer> <leader>cl :call <SID>ChangeAttr("class")<CR>
  autocmd FileType html,markdown nnoremap <buffer> <leader>id :call <SID>ChangeAttr("id")<CR>

  " 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

" }}}