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 * if &filetype == 'help' | wincmd T | set buflisted | 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
" }}}
|