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
235
236
237
238
239
240
241
242
243
244
245
246
247
|
"======================================================================
" 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(bound)
let l:bound = a:bound ? a:bound : 19
if &lines < l:bound || g:alacritty_extra_padding
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
endfunc
autocmd VimEnter,VimResized * silent call LayoutForSmallTerminal(0)
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
endfunc
autocmd BufReadPost * call <SID>ApplyShebang()
" }}}
" Markdown {{{
augroup Config_Markdown
au!
au FileType markdown call InitMarkdown()
function! InitMarkdown()
setlocal wrap sw=2 ts=2
setlocal foldexpr=MarkdownLevel() foldmethod=expr
setlocal foldtext=MarkdownFoldTextHeading()
syn match Details '^<details>' conceal cchar=▶
syn match Summary '<summary>' conceal cchar=
syn match SummaryEnd '</summary>' conceal
syn match DetailsEnd '^</details>' conceal cchar=E
endfunc
" Fold by heading level
function! MarkdownLevel()
let hash_num = matchstr(getline(v:lnum), '^#\+')
if !empty(hash_num)
" HEADING
" return ">"..(len(hash_num) - 1)
return len(hash_num) == 1 ? 0 : '>1'
else
" Contents
return "="
endif
endfunc
function! MarkdownFoldTextHeading()
let origin = split(MarkdownFoldText()[2:], ' ')
let heading = substitute(join(origin[:-3], ' '), '\#', ' ', 'g')
let lines = join(origin[-2:], ' ')[1:-2]
let spaces = repeat('.', 50 - len(heading) - len(lines))
return heading..spaces.." "..lines
endfunc
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
endfunc
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
endfunc
" }}}
" Mail {{{
autocmd BufRead /tmp/mutt-* setlocal 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
setlocal foldtext="Password"
norm! ggzfl
endfunc
" }}}
" 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
endfunc
" }}}
augroup END
" }}}
|