aboutsummaryrefslogtreecommitdiffhomepage
path: root/vim
diff options
context:
space:
mode:
authorHsieh Chin Fan <pham@topo.tw>2024-07-30 17:56:29 +0800
committerHsieh Chin Fan <pham@topo.tw>2024-07-30 17:56:29 +0800
commitc680ac2a4b06ebdc2da9a05311f01495c73f9c01 (patch)
treeb4c8f50db4330bf8de0d2af26a9637706cd97f0c /vim
parent9b564fcfeec95ed965252ef4acc6ee42702ded88 (diff)
Update
Diffstat (limited to 'vim')
-rw-r--r--vim/init/basic.vim59
-rw-r--r--vim/init/config.vim63
-rw-r--r--vim/init/keymaps.vim174
-rw-r--r--vim/mini.lua276
4 files changed, 331 insertions, 241 deletions
diff --git a/vim/init/basic.vim b/vim/init/basic.vim
index e18d51f..751b3ac 100644
--- a/vim/init/basic.vim
+++ b/vim/init/basic.vim
@@ -17,57 +17,28 @@ augroup END
17" For Buffer and Tab {{{ 17" For Buffer and Tab {{{
18augroup tabinfo 18augroup tabinfo
19 au! 19 au!
20 let g:tab_group = {}
21 " BufEnter {{{
22 function! AddBufToTabGroup(tab_group)
23 let l:tabId = tabpagenr()
24 let l:bufnr = bufnr()
25
26 if has_key(a:tab_group, l:tabId)
27 for v in a:tab_group[l:tabId]
28 if v == l:bufnr
29 return
30 endif
31 endfor
32 call add(a:tab_group[l:tabId], l:bufnr)
33 else
34 let a:tab_group[l:tabId] = [l:bufnr]
35 endif
36 20
37 endfunc 21 " t:bufs holds buffer numbers
38 autocmd BufWinEnter * if &buflisted | call AddBufToTabGroup(g:tab_group) | endif 22 autocmd BufWinEnter * if &buflisted | call AddBufToTab() | endif
39 " }}} 23 autocmd BufDelete * call RemoveBufFromTabs()
40 " BufDelete {{{
41 function! RemoveBufFromTabGroup(tab_group)
42 let l:tabId = tabpagenr()
43
44 if has_key(a:tab_group, l:tabId)
45 let l:new_tab_group = {}
46
47 for [k, tab_list] in items(a:tab_group)
48 let l:list = []
49 for buf in tab_list
50 if buflisted(buf) > 0 && buf != expand('<abuf>')
51 call add(l:list, buf)
52 end
53 endfor
54 if !empty(l:list)
55 let l:new_tab_group[k] = l:list
56 endif
57 endfor
58 let g:tab_group = l:new_tab_group
59
60 endif
61 24
25 function! AddBufToTab()
26 if !has_key(t:, 'bufs') | let t:['bufs'] = [] | endif
27 call add(t:bufs, bufnr()) | call sort(t:bufs) | call uniq(t:bufs)
28 endfunc
29 function! RemoveBufFromTabs()
30 for tab in gettabinfo()
31 call filter(tab.variables.bufs, "v:val != "..expand('<abuf>'))
32 endfor
62 endfunc 33 endfunc
63 autocmd BufDelete * call RemoveBufFromTabGroup(g:tab_group) 34
64 "}}} 35 nnoremap T :echo t:bufs<CR>
65augroup END 36augroup END
66"}}} 37"}}}
67" GERERNAL {{{ 38" GERERNAL {{{
68 39
69let mapleader = "," " Always use comma as leader key 40let mapleader = "," " Always use comma as leader key
70set nocompatible " Disable vi compatible, today is 20XX 41set nocompatible " Disable vi compatible, today is 2RemoveBufFromTabXX
71set path=.,** " Allow :find with completion 42set path=.,** " Allow :find with completion
72set mouse= " Disable mouse selection 43set mouse= " Disable mouse selection
73set winaltkeys=no " Allow alt key for mapping 44set winaltkeys=no " Allow alt key for mapping
@@ -194,7 +165,7 @@ augroup END
194set foldenable " Allow fold 165set foldenable " Allow fold
195set foldmethod=indent " Fold contents by indent 166set foldmethod=indent " Fold contents by indent
196set foldlevel=2 167set foldlevel=2
197set fillchars+=foldopen:▽,foldsep:│,foldclose:▶ 168set fillchars=fold:\ ,foldopen:▽,foldsep:│,foldclose:▶
198let g:defaut_foldcolumn = "" 169let g:defaut_foldcolumn = ""
199if has('nvim') 170if has('nvim')
200 let g:defaut_foldcolumn = "auto:3" 171 let g:defaut_foldcolumn = "auto:3"
diff --git a/vim/init/config.vim b/vim/init/config.vim
index 4181ad3..9700c61 100644
--- a/vim/init/config.vim
+++ b/vim/init/config.vim
@@ -16,14 +16,15 @@ augroup END
16 16
17augroup TerminalSize 17augroup TerminalSize
18 au! 18 au!
19 function! LayoutForSmallTerminal() 19 function! LayoutForSmallTerminal(bound)
20 if &lines < 19 20 let l:bound = a:bound ? a:bound : 19
21 if &lines < l:bound || g:alacritty_extra_padding
21 silent! set cmdheight=0 laststatus=0 showtabline=0 signcolumn=no nowrap scrolloff=1 22 silent! set cmdheight=0 laststatus=0 showtabline=0 signcolumn=no nowrap scrolloff=1
22 else 23 else
23 silent! set cmdheight& laststatus& showtabline=2 signcolumn=yes scrolloff=3 24 silent! set cmdheight& laststatus& showtabline=2 signcolumn=yes scrolloff=3
24 endif 25 endif
25 endfunction 26 endfunc
26 autocmd VimEnter,VimResized * call LayoutForSmallTerminal() 27 autocmd VimEnter,VimResized * silent call LayoutForSmallTerminal(0)
27augroup END 28augroup END
28 29
29" }}} 30" }}}
@@ -140,30 +141,45 @@ augroup InitFileTypes
140 echo "filetype from shebang: ".l:filetype 141 echo "filetype from shebang: ".l:filetype
141 execute "set filetype=".l:filetype 142 execute "set filetype=".l:filetype
142 endif 143 endif
143 endfunction 144 endfunc
144 autocmd BufReadPost * call <SID>ApplyShebang() 145 autocmd BufReadPost * call <SID>ApplyShebang()
145 " }}} 146 " }}}
146 " Markdown {{{ 147 " Markdown {{{
147 148
148 augroup Config_Markdown 149 augroup Config_Markdown
149 au! 150 au!
150 au FileType markdown setlocal wrap sw=2 ts=2 151 au FileType markdown call InitMarkdown()
151 au FileType markdown setlocal foldexpr=MarkdownLevel() foldmethod=expr 152
153 function! InitMarkdown()
154 setlocal wrap sw=2 ts=2
155 setlocal foldexpr=MarkdownLevel() foldmethod=expr
156 setlocal foldtext=MarkdownFoldTextHeading()
157 syn match Details '^<details>' conceal cchar=▶
158 syn match Summary '<summary>' conceal cchar=
159 syn match SummaryEnd '</summary>' conceal
160 syn match DetailsEnd '^</details>' conceal cchar=E
161 endfunc
152 162
153 " Fold by heading level 163 " Fold by heading level
154 function! MarkdownLevel() 164 function! MarkdownLevel()
155 let hash_num = matchstr(getline(v:lnum), '^#\+') 165 let hash_num = matchstr(getline(v:lnum), '^#\+')
156 let hash_num_at_top = matchstr(getline(v:lnum-1), '^#\+') 166 if !empty(hash_num)
157 if empty(hash_num) 167 " HEADING
158 if empty(hash_num_at_top) 168 " return ">"..(len(hash_num) - 1)
159 return "=" 169 return len(hash_num) == 1 ? 0 : '>1'
160 else
161 return ">"..(len(hash_num_at_top))
162 endif
163 else 170 else
164 return len(hash_num) - 1 171 " Contents
172 return "="
165 endif 173 endif
166 endfunction 174 endfunc
175
176 function! MarkdownFoldTextHeading()
177 let origin = split(MarkdownFoldText()[2:], ' ')
178 let heading = substitute(join(origin[:-3], ' '), '\#', ' ', 'g')
179 let lines = join(origin[-2:], ' ')[1:-2]
180 let spaces = repeat('.', 50 - len(heading) - len(lines))
181 return heading..spaces.." "..lines
182 endfunc
167 183
168 augroup END 184 augroup END
169 185
@@ -186,7 +202,7 @@ augroup InitFileTypes
186 noh 202 noh
187 startinsert 203 startinsert
188 endif 204 endif
189 endfunction 205 endfunc
190 autocmd FileType html,markdown nnoremap <buffer> <leader>cl :call <SID>ChangeAttr("class")<CR> 206 autocmd FileType html,markdown nnoremap <buffer> <leader>cl :call <SID>ChangeAttr("class")<CR>
191 autocmd FileType html,markdown nnoremap <buffer> <leader>id :call <SID>ChangeAttr("id")<CR> 207 autocmd FileType html,markdown nnoremap <buffer> <leader>id :call <SID>ChangeAttr("id")<CR>
192 208
@@ -194,12 +210,12 @@ augroup InitFileTypes
194 autocmd BufWrite *.html,*.js,*.css call ReloadServer() 210 autocmd BufWrite *.html,*.js,*.css call ReloadServer()
195 function! ReloadServer() 211 function! ReloadServer()
196 silent !browser-sync reload &>/dev/null 212 silent !browser-sync reload &>/dev/null
197 endfunction 213 endfunc
198 214
199 " }}} 215 " }}}
200 " Mail {{{ 216 " Mail {{{
201 217
202 autocmd BufRead /tmp/mutt-* set tw=72 218 autocmd BufRead /tmp/mutt-* setlocal tw=72
203 219
204 " }}} 220 " }}}
205 " Password {{{ 221 " Password {{{
@@ -211,12 +227,9 @@ augroup InitFileTypes
211 function SetPasswordFile() 227 function SetPasswordFile()
212 setlocal foldminlines=0 228 setlocal foldminlines=0
213 setlocal foldmethod=manual 229 setlocal foldmethod=manual
214 function s:custom() 230 setlocal foldtext="Password"
215 return "Password"
216 endfunction
217 setlocal foldtext=s:custom()
218 norm! ggzfl 231 norm! ggzfl
219 endfunction 232 endfunc
220 " }}} 233 " }}}
221 " Beancount {{{ 234 " Beancount {{{
222 235
@@ -225,7 +238,7 @@ augroup InitFileTypes
225 set filetype=beancount 238 set filetype=beancount
226 silent !setsid fava ~/bean/main.bean &>/dev/null 239 silent !setsid fava ~/bean/main.bean &>/dev/null
227 autocmd VimLeave * silent !killall fava 240 autocmd VimLeave * silent !killall fava
228 endfunction 241 endfunc
229 242
230 " }}} 243 " }}}
231 244
diff --git a/vim/init/keymaps.vim b/vim/init/keymaps.vim
index 1eb2b20..ce5d315 100644
--- a/vim/init/keymaps.vim
+++ b/vim/init/keymaps.vim
@@ -3,7 +3,7 @@
3"====================================================================== 3"======================================================================
4" vim: sw=2 ts=2 foldmethod=marker foldmarker={{{,}}} 4" vim: sw=2 ts=2 foldmethod=marker foldmarker={{{,}}}
5 5
6" COMMON_MAPPING ----------------{{{ 6" COMMON_MAPPING {{{
7 7
8" Space for searching 8" Space for searching
9map <space> / 9map <space> /
@@ -11,9 +11,6 @@ map <space> /
11" Escape normal mode by <C-c> 11" Escape normal mode by <C-c>
12inoremap <C-c> <Esc>l 12inoremap <C-c> <Esc>l
13 13
14" Search for selected test
15vnoremap * y/\V<C-R>=escape(@",'/\')<CR><CR>
16
17" Set wrap 14" Set wrap
18nnoremap <leader>W :set wrap!<CR> 15nnoremap <leader>W :set wrap!<CR>
19 16
@@ -39,23 +36,6 @@ augroup vimrc_CRfix
39 autocmd CmdwinEnter * nnoremap <buffer> <C-c> <C-c> 36 autocmd CmdwinEnter * nnoremap <buffer> <C-c> <C-c>
40augroup END 37augroup END
41 38
42" In case ALT key is not working
43" execute "set <M-2>=\e2"
44" execute "set <M-1>=\e1"
45" execute "set <M-3>=\e3"
46" execute "set <M-4>=\e4"
47" execute "set <M-5>=\e5"
48" execute "set <M-6>=\e6"
49" execute "set <M-7>=\e7"
50" execute "set <M-8>=\e8"
51" execute "set <M-9>=\e9"
52" execute "set <M-0>=\e0"
53" execute "set <M-f>=\ef"
54" execute "set <M-b>=\eb"
55" execute "set <M-d>=\ed"
56" execute "set <M-l>=\el"
57" execute "set <M-h>=\eh"
58
59" Spell 39" Spell
60nnoremap \s :set spell!<CR>:set spell?<CR> 40nnoremap \s :set spell!<CR>:set spell?<CR>
61nnoremap <leader>ss ]s 41nnoremap <leader>ss ]s
@@ -68,9 +48,22 @@ nnoremap <C-g> 1<C-g>
68vnoremap Tz :!trans -t zh-TW -b<CR> 48vnoremap Tz :!trans -t zh-TW -b<CR>
69vnoremap Te :!trans -t en-US -b<CR> 49vnoremap Te :!trans -t en-US -b<CR>
70 50
51let g:alacritty_extra_padding = 0
52function! ToggleWinPadding()
53 if g:alacritty_extra_padding
54 !alacritty msg config --window-id $WINDOWID --reset
55 else
56 redir => output | hi Normal | redir END
57 let bg_color = matchstr(output, 'guibg=\zs[^\s]\+\ze')
58 exe "!alacritty msg config --window-id $WINDOWID window.padding.x=300 'colors.primary.background=\"\\"..bg_color.."\"'"
59 endif
60
61 let g:alacritty_extra_padding = !g:alacritty_extra_padding
62endfunc
63nnoremap <leader>Z <Cmd>silent call ToggleWinPadding()<CR>
71 64
72" }}} 65" }}}
73" WORKING_DIR ----------------{{{ 66" WORKING_DIR {{{
74 67
75let g:last_path = execute("pwd") 68let g:last_path = execute("pwd")
76augroup SaveLatestDir 69augroup SaveLatestDir
@@ -103,7 +96,7 @@ function! InCaseCdToLatestDir()
103endfunction 96endfunction
104 97
105" }}} 98" }}}
106" MOTION ----------------{{{ 99" MOTION {{{
107 100
108" j/k will move virtual lines (lines that wrap) 101" j/k will move virtual lines (lines that wrap)
109nnoremap <silent> <expr> j (v:count == 0 ? 'gj' : 'j') 102nnoremap <silent> <expr> j (v:count == 0 ? 'gj' : 'j')
@@ -121,7 +114,7 @@ xnoremap iq i"
121xnoremap aq a" 114xnoremap aq a"
122 115
123 116
124" READLINE_FEATURES ----------------{{{ 117" READLINE_FEATURES {{{
125 118
126inoremap <C-f> <Right> 119inoremap <C-f> <Right>
127inoremap <C-b> <Left> 120inoremap <C-b> <Left>
@@ -155,7 +148,7 @@ nnoremap <m-k> gk
155inoremap <m-j> <c-\><c-o>gj 148inoremap <m-j> <c-\><c-o>gj
156inoremap <m-k> <c-\><c-o>gk 149inoremap <m-k> <c-\><c-o>gk
157" }}} 150" }}}
158" JUMP_TO_TABS_WITH_ALT ----------------{{{ 151" JUMP_TO_TABS_WITH_ALT {{{
159 152
160nnoremap <silent><A-1> :tabn 1<CR> 153nnoremap <silent><A-1> :tabn 1<CR>
161nnoremap <silent><A-2> :tabn 2<CR> 154nnoremap <silent><A-2> :tabn 2<CR>
@@ -200,11 +193,29 @@ nnoremap <C-k> ddkP
200nnoremap S S<ESC> 193nnoremap S S<ESC>
201 194
202" }}} 195" }}}
203" MANAGE_VIMRC ----------------{{{ 196" TERMINAL {{{
197" In case ALT key is not working
198" execute "set <M-2>=\e2"
199" execute "set <M-1>=\e1"
200" execute "set <M-3>=\e3"
201" execute "set <M-4>=\e4"
202" execute "set <M-5>=\e5"
203" execute "set <M-6>=\e6"
204" execute "set <M-7>=\e7"
205" execute "set <M-8>=\e8"
206" execute "set <M-9>=\e9"
207" execute "set <M-0>=\e0"
208" execute "set <M-f>=\ef"
209" execute "set <M-b>=\eb"
210" execute "set <M-d>=\ed"
211" execute "set <M-l>=\el"
212" execute "set <M-h>=\eh"
213"}}}
214" MANAGE_VIMRC {{{
204 215
205" source .vimrc 216" source .vimrc
206nnoremap <leader>so V:so<CR> 217nnoremap <leader>so V:so<CR>
207nnoremap <leader><leader>so :source ~/.vimrc<CR> 218nnoremap <leader><leader>so :source %<CR>
208vnoremap so :source<CR> 219vnoremap so :source<CR>
209autocmd! BUFWRITEPOST $MYVIMRC source $MYVIMRC 220autocmd! BUFWRITEPOST $MYVIMRC source $MYVIMRC
210 221
@@ -213,7 +224,7 @@ nnoremap <leader>e :scriptnames<space>
213nnoremap <leader>ee :edit $MYVIMRC<CR> 224nnoremap <leader>ee :edit $MYVIMRC<CR>
214 225
215" }}} 226" }}}
216" MANAGE_BUFFERS ----------------{{{ 227" MANAGE_BUFFERS {{{
217 228
218" Set options 229" Set options
219nnoremap so :set<space> 230nnoremap so :set<space>
@@ -236,19 +247,25 @@ augroup SaveLastBuffer
236augroup END 247augroup END
237nnoremap <leader>l :exe "buffer ".g:lastbuffer<CR> 248nnoremap <leader>l :exe "buffer ".g:lastbuffer<CR>
238 249
239" Use Ctrl-C for buffer delete or quit vim ----------------{{{ 250" Use Ctrl-C for buffer delete or quit vim {{{
240 251
241" Toggle behavior for the last buffer in the last window 252" Toggle behavior for the last buffer in the last window
242let g:quitVimWhenPressingCtrlC = 1 253let g:quitVimWhenPressingCtrlC = 1
243function! ToggleQuit() 254function! ToggleQuit()
244 let g:quitVimWhenPressingCtrlC = g:quitVimWhenPressingCtrlC ? 0 : 1 255 let g:quitVimWhenPressingCtrlC = !g:quitVimWhenPressingCtrlC
245 let message = g:quitVimWhenPressingCtrlC ? "Unlock" : "Lock" 256 let message = g:quitVimWhenPressingCtrlC ? "Unlock" : "Lock"
246 echo message 257 echo message
247endfunction 258endfunction
248nnoremap \q :call ToggleQuit()<CR> 259nnoremap \q :call ToggleQuit()<CR>
249 260
261func! QuitWithCheck()
262 if g:quitVimWhenPressingCtrlC
263 silent! quit
264 else
265 echo "Press \\q to allow quit with <C-c>"
266 endif
267endfunc
250function! CloseBufferSafely() 268function! CloseBufferSafely()
251 let l:bufnr = bufnr()
252 " Ask Saving 269 " Ask Saving
253 if &modified 270 if &modified
254 let answer = confirm("Save changes?", "&Yes\n&No\n&Cancel") 271 let answer = confirm("Save changes?", "&Yes\n&No\n&Cancel")
@@ -257,31 +274,37 @@ function! CloseBufferSafely()
257 if answer == "" | return | endif 274 if answer == "" | return | endif
258 endif 275 endif
259 276
260 if g:tab_group[tabpagenr()] == [l:bufnr] 277 let l:bufnr = bufnr()
261 bdelete 278
279 if len(t:bufs) == 1
280 " Close tab for last buffer
281 tabclose
262 else 282 else
263 bprevious | bd # 283 " Switch to proper buffer
284 let l:next_buf = get(t:bufs, bufnr('#')) ? bufnr('#') : filter(t:bufs, 'v:val != '..l:bufnr)[0]
285 exe "b "..l:next_buf
286 call filter(t:bufs, 'v:val != '..l:bufnr)
264 endif 287 endif
288
289 " Delete buffer if every t:buf doesn't have it
290 for tab in gettabinfo()
291 if get(tab.variables.bufs, l:bufnr) | return | endif
292 endfor
293 exe "bd! "..l:bufnr
294
265endfunction 295endfunction
266func! QuitWithCheck()
267 if g:quitVimWhenPressingCtrlC
268 silent! quit
269 else
270 echo "Press \\q to allow quit with <C-c>"
271 endif
272endfunc
273function! Bye() 296function! Bye()
274 let windows = gettabinfo(tabpagenr())[0]['windows'] 297 let windows = gettabinfo(tabpagenr())[0]['windows']
275 let bufs = getbufinfo({'buflisted': 1})
276 298
277 if len(windows) == 1 && len(bufs) == 1 299 if len(t:bufs) <= 1 && len(windows) == 1
278 call QuitWithCheck() 300 call QuitWithCheck()
279 elseif &diff 301 elseif &diff
280 silent call CloseBuffersForDiff() 302 silent call CloseBuffersForDiff()
281 elseif len(windows) >1 303 elseif len(windows) >1
282 quit 304 quit
283 else 305 else
284 silent! call CloseBufferSafely() 306 call CloseBufferSafely()
307 " silent! call CloseBufferSafely()
285 endif 308 endif
286endfunction 309endfunction
287nnoremap <silent> <C-c> :call Bye()<CR> 310nnoremap <silent> <C-c> :call Bye()<CR>
@@ -325,7 +348,7 @@ nnoremap <C-w>D <Cmd>silent! SwitchDiffForGitHEAD<CR>
325" }}} 348" }}}
326 349
327" }}} 350" }}}
328" MANAGE_WINDOWS ----------------{{{ 351" MANAGE_WINDOWS {{{
329 352
330nnoremap <leader><leader>sb :windo set scrollbind!<CR> 353nnoremap <leader><leader>sb :windo set scrollbind!<CR>
331 354
@@ -361,7 +384,7 @@ elseif has('nvim')
361 tnoremap <m-q> <c-\><c-n> 384 tnoremap <m-q> <c-\><c-n>
362endif 385endif
363" }}} 386" }}}
364" MANAGE_TABS ----------------{{{ 387" MANAGE_TABS {{{
365 388
366" Useful mappings for managing tabs 389" Useful mappings for managing tabs
367map <leader>tn :tabnew<CR> 390map <leader>tn :tabnew<CR>
@@ -395,13 +418,13 @@ function! Tab_MoveRight()
395 endif 418 endif
396endfunc 419endfunc
397" }}} 420" }}}
398" FOLD ----------------{{{ 421" FOLD {{{
399 422
400" Set fold options 423" Set fold options
401nnoremap <leader><leader>fm :<C-\>e'set foldmethod='..&foldmethod<CR> 424nnoremap <leader><leader>fm :<C-\>e'set foldmethod='..&foldmethod<CR>
402nnoremap <leader><leader>fc :<C-\>e'set foldcolumn='..&foldcolumn<CR> 425nnoremap <leader><leader>fc :<C-\>e'set foldcolumn='..&foldcolumn<CR>
403 426
404nnoremap zi zizz 427nnoremap zi zizz:silent exe &foldenable ? "set foldcolumn=auto:3" : "set foldcolumn=0"<CR>
405 428
406" Show fold level when it changes 429" Show fold level when it changes
407nnoremap zm zm:set foldlevel<CR> 430nnoremap zm zm:set foldlevel<CR>
@@ -415,7 +438,9 @@ nnoremap zF :call ToggleUnfoldSelection()<CR>zv
415nnoremap \z :call GrayOutOtherFolds()<CR> 438nnoremap \z :call GrayOutOtherFolds()<CR>
416 439
417" Select current fold 440" Select current fold
441onoremap az :<C-U>silent! keepjumps normal![zV]z<CR>
418xnoremap az :<C-U>silent! keepjumps normal![zV]z<CR> 442xnoremap az :<C-U>silent! keepjumps normal![zV]z<CR>
443onoremap iz :<C-U>silent! keepjumps normal![zjV]zk<CR>
419xnoremap iz :<C-U>silent! keepjumps normal![zjV]zk<CR> 444xnoremap iz :<C-U>silent! keepjumps normal![zjV]zk<CR>
420 445
421" Use l to open fold 446" Use l to open fold
@@ -464,7 +489,7 @@ function! GrayOutOtherFolds()
464endfunction 489endfunction
465 490
466" }}} 491" }}}
467" HIGHLIGHT ----------------{{{ 492" HIGHLIGHT {{{
468 493
469" Disable highlight when <leader><CR> is pressed 494" Disable highlight when <leader><CR> is pressed
470nnoremap <silent> <leader><CR> :noh<CR> 495nnoremap <silent> <leader><CR> :noh<CR>
@@ -497,7 +522,7 @@ nnoremap <silent> <leader>gh :call matchadd('MultiLineHighlight', '\%'.line('.')
497nnoremap <silent> <leader>gH :call clearmatches()<CR> 522nnoremap <silent> <leader>gH :call clearmatches()<CR>
498 523
499" }}} 524" }}}
500" SURROUND ----------------{{{ 525" SURROUND {{{
501 526
502inoremap ' ''<Left> 527inoremap ' ''<Left>
503inoremap " ""<Left> 528inoremap " ""<Left>
@@ -530,14 +555,14 @@ endfunction
530vnoremap <space> :<C-u>call AddSpaceForSelection()<CR> 555vnoremap <space> :<C-u>call AddSpaceForSelection()<CR>
531 556
532" }}} 557" }}}
533" QUICKFIX ----------------{{{ 558" QUICKFIX {{{
534 559
535nnoremap <leader>cn :cn<CR> 560nnoremap <leader>cn :cn<CR>
536nnoremap <leader>cp :cp<CR> 561nnoremap <leader>cp :cp<CR>
537nnoremap <leader>cw :cw 10<CR> 562nnoremap <leader>cw :cw 10<CR>
538 563
539" }}} 564" }}}
540" REDIRECTION_WITH_BUFFER ----------------{{{ 565" REDIRECTION_WITH_BUFFER {{{
541 566
542" Usage: 567" Usage:
543" :Redir hi ............. show the full output of command ':hi' in a scratch window 568" :Redir hi ............. show the full output of command ':hi' in a scratch window
@@ -561,38 +586,23 @@ command! -nargs=1 -complete=command Redir silent call Redir(<q-args>)
561command! -nargs=1 -complete=command R silent call Redir(<q-args>) 586command! -nargs=1 -complete=command R silent call Redir(<q-args>)
562nnoremap <leader>rr :Redir<space> 587nnoremap <leader>rr :Redir<space>
563" }}} 588" }}}
564" QUICK_SUBSTITUTE ----------------{{{ 589" SEARCH/SUBSTITUTE {{{
565 590
566" Usage: Press <TAB> n times for area, and <CR> for substitute 591" Search for selected test
592vnoremap * y/\V<C-R>=escape(@",'/\')<CR><CR>
567 593
568" substitute across file
569vnoremap <leader>s y:%s//<C-R>0/g<LEFT><LEFT> 594vnoremap <leader>s y:%s//<C-R>0/g<LEFT><LEFT>
570 595
571let g:search_not_in_register = 1 596" Usage: Press <TAB> n times for area, and <CR> for substitute
572" When leaving visual mode, resume search_not_in_register 597let g:search_selection = 0
573autocmd Modechanged [vV\x16]*:* let g:search_not_in_register = 1 598" When leaving visual mode, resume search_selection
574 599autocmd Modechanged [vV\x16]*:* let g:search_selection = 0
575function! ExpandSelectionBySearch(sep) 600xmap <expr> <TAB> g:search_selection ? "//e<CR>" : "*:let g:search_selection = 1<CR>gv//e<CR>"
576 if g:search_not_in_register 601xmap <expr> <S-TAB> g:search_selection ? "??<CR>" : "*:let g:search_selection = 1<CR>gv??<CR>"
577 " Save current selection to register, and keep selection 602vnoremap <CR> :s//<C-R>0/g<Left><Left>
578 norm! ygv
579 let g:search_not_in_register = 0
580 endif
581 " Use register s to go to next search, counts/total is displayed in
582 " statusline
583 call feedkeys(a:sep.."\<C-R>0"..a:sep.."e\<CR>")
584endfunction
585function! SubstituteBySearch()
586 " Apply current search for default substitute text
587 call feedkeys(":s//\<C-R>0/g\<Left>\<Left>")
588endfunction
589
590vnoremap <TAB> <Cmd>call ExpandSelectionBySearch('/')<CR>
591vnoremap <S-TAB> <Cmd>call ExpandSelectionBySearch('?')<CR>
592vnoremap <CR> <Cmd>call SubstituteBySearch()<CR>
593 603
594" }}} 604" }}}
595" SIGN ----------------{{{ 605" SIGN {{{
596 606
597nnoremap <leader><leader>sc :<C-\>e'set signcolumn='..&signcolumn<CR> 607nnoremap <leader><leader>sc :<C-\>e'set signcolumn='..&signcolumn<CR>
598 608
@@ -600,7 +610,7 @@ nnoremap <leader>si :exe ":sign place " .. line('.') .. " line=" .. line('.') ..
600nnoremap <leader>sI :exe ":sign unplace * file=" .. expand("%:p")<CR> 610nnoremap <leader>sI :exe ":sign unplace * file=" .. expand("%:p")<CR>
601 611
602" }}} 612" }}}
603" GIT_TIG ----------------{{{ 613" GIT_TIG {{{
604 614
605let g:tig_explorer_keymap_commit_split = '<C-s>' 615let g:tig_explorer_keymap_commit_split = '<C-s>'
606let g:tig_explorer_keymap_commit_vsplit = '<C-v>' 616let g:tig_explorer_keymap_commit_vsplit = '<C-v>'
@@ -609,7 +619,7 @@ nnoremap <C-t>s <Cmd>TigStatus<CR>
609nnoremap <C-t>b <Cmd>TigBlame<CR> 619nnoremap <C-t>b <Cmd>TigBlame<CR>
610 620
611" }}} 621" }}}
612" Tmp: Markdown items (temproray solution) ----------------{{{ 622" Tmp: Markdown items (temproray solution) {{{
613 623
614" Toggle list item in markdown: "- [ ] XXX" -> "XXX" -> "- XXX" -> "- [ ] XXX" 624" Toggle list item in markdown: "- [ ] XXX" -> "XXX" -> "- XXX" -> "- [ ] XXX"
615" autocmd FileType markdown nnoremap <buffer> <leader>i V:!sed -E '/^ *- \[.\]/ { s/^( *)- \[.\] */\1/; q; }; /^ *[^[:space:]-]/ { s/^( *)/\1- /; q; }; /^ *- / { s/^( *)- /\1- [ ] /; q; }'<CR><CR> 625" autocmd FileType markdown nnoremap <buffer> <leader>i V:!sed -E '/^ *- \[.\]/ { s/^( *)- \[.\] */\1/; q; }; /^ *[^[:space:]-]/ { s/^( *)/\1- /; q; }; /^ *- / { s/^( *)- /\1- [ ] /; q; }'<CR><CR>
@@ -618,14 +628,14 @@ nnoremap <C-t>b <Cmd>TigBlame<CR>
618" Toggle task status: "- [ ] " -> "- [x]" -> "- [.] " -> "- [ ] " 628" Toggle task status: "- [ ] " -> "- [x]" -> "- [.] " -> "- [ ] "
619" nnoremap <leader>x V:!sed -E '/^ *- \[ \]/ { s/^( *)- \[ \]/\1- [x]/; q; }; /^ *- \[\x\]/ { s/^( *)- \[\x\]/\1- [.]/; q; }; /^ *- \[\.\]/ { s/^( *)- \[\.\]/\1- [ ]/; q; }'<CR><CR> 629" nnoremap <leader>x V:!sed -E '/^ *- \[ \]/ { s/^( *)- \[ \]/\1- [x]/; q; }; /^ *- \[\x\]/ { s/^( *)- \[\x\]/\1- [.]/; q; }; /^ *- \[\.\]/ { s/^( *)- \[\.\]/\1- [ ]/; q; }'<CR><CR>
620" }}} 630" }}}
621" Tmp: Common system command ----------------{{{ 631" Tmp: Common system command {{{
622" Show date selector 632" Show date selector
623nnoremap <leader>dd :r !sh -c 'LANG=en zenity --calendar --date-format="\%Y.\%m.\%d" 2>/dev/null'<CR><CR> 633nnoremap <leader>dd :r !sh -c 'LANG=en zenity --calendar --date-format="\%Y.\%m.\%d" 2>/dev/null'<CR><CR>
624nnoremap <leader>dD :r !sh -c 'LANG=en zenity --calendar --date-format="\%a \%b \%d" 2>/dev/null'<CR><CR> 634nnoremap <leader>dD :r !sh -c 'LANG=en zenity --calendar --date-format="\%a \%b \%d" 2>/dev/null'<CR><CR>
625nnoremap <leader>dt :r !date +\%H:\%m<CR>A 635nnoremap <leader>dt :r !date +\%H:\%m<CR>A
626 636
627" }}} 637" }}}
628" Tmp: Compile ----------------{{{ 638" Tmp: Compile {{{
629 639
630" 编译运行 C/C++ 项目 640" 编译运行 C/C++ 项目
631" 详细见:http://www.skywind.me/blog/archives/2084 641" 详细见:http://www.skywind.me/blog/archives/2084
diff --git a/vim/mini.lua b/vim/mini.lua
index 15f4c42..6c31590 100644
--- a/vim/mini.lua
+++ b/vim/mini.lua
@@ -327,12 +327,121 @@ require("lazy").setup({
327 vim.keymap.set({ "n", "t" }, "<A-i>", function() 327 vim.keymap.set({ "n", "t" }, "<A-i>", function()
328 vim.cmd("ToggleTerm direction=float") 328 vim.cmd("ToggleTerm direction=float")
329 end, { desc = "terminal toggle floating term" }) 329 end, { desc = "terminal toggle floating term" })
330 vim.keymap.set({ "n", "t" }, "<A-e>", function()
331 zoom()
332 end, { desc = "terminal toggle floating term" })
330 vim.keymap.set({ "n", "t" }, "<A-v>", function() 333 vim.keymap.set({ "n", "t" }, "<A-v>", function()
331 vim.cmd("ToggleTerm direction=horizontal") 334 vim.cmd("ToggleTerm direction=horizontal")
332 end, { desc = "terminal toggle floating term" }) 335 end, { desc = "terminal toggle floating term" })
333 end, 336 end,
334 }, 337 },
335 --}}} 338 --}}}
339-- Markdown: obsidian {{{
340 {
341 "epwalsh/obsidian.nvim",
342 version = "*", -- recommended, use latest release instead of latest commit
343 lazy = false,
344 ft = "markdown",
345 -- Replace the above line with this if you only want to load obsidian.nvim for markdown files in your vault:
346 -- event = {
347 -- -- If you want to use the home shortcut '~' here you need to call 'vim.fn.expand'.
348 -- -- E.g. "BufReadPre " .. vim.fn.expand "~" .. "/my-vault/**.md"
349 -- "BufReadPre path/to/my-vault/**.md",
350 -- "BufNewFile path/to/my-vault/**.md",
351 -- },
352 dependencies = {
353 -- Required.
354 "nvim-lua/plenary.nvim",
355 },
356 config = function()
357 vim.keymap.set("n", "<leader>oo", ":Obsidian", { })
358 vim.keymap.set("n", "<leader>ot", ":ObsidianTags<CR>", { })
359 vim.keymap.set("n", "<leader>os", ":ObsidianSearch<CR>", { })
360 vim.keymap.set("n", "<leader>oq", ":ObsidianQuickSwitch<CR>", { })
361 vim.keymap.set("v", "<leader>on", ":ObsidianLinkNew<CR>", { })
362 vim.keymap.set("n", "<leader>ol", ":ObsidianLinks<CR>", { })
363 require("obsidian").setup({
364 workspaces = {
365 {
366 name = "log",
367 path = "~/log",
368 },
369 },
370 completion = {
371 -- Set to false to disable completion.
372 nvim_cmp = true,
373 -- Trigger completion at 2 chars.
374 min_chars = 2,
375 },
376 mapping = {
377 -- Toggle check-boxes.
378 ["<leader>oc"] = {
379 action = function()
380 return require("obsidian").util.toggle_checkbox()
381 end,
382 opts = { buffer = true },
383 },
384 -- Smart action depending on context, either follow link or toggle checkbox.
385 ["<cr>"] = {
386 action = function()
387 return require("obsidian").util.smart_action()
388 end,
389 opts = { buffer = true, expr = true },
390 },
391 },
392 -- see below for full list of options 👇
393 note_id_func = function(title)
394 return title
395 -- Create note IDs in a Zettelkasten format with a timestamp and a suffix.
396 -- In this case a note with the title 'My new note' will be given an ID that looks
397 -- like '1657296016-my-new-note', and therefore the file name '1657296016-my-new-note.md'
398 -- local suffix = ""
399 -- title = title:gsub(" ", "-"):gsub("[^A-Za-z0-9-]", ""):lower()
400 -- if title ~= nil and title ~= "" then
401 -- -- If title is given, transform it into valid file name.
402 -- suffix = "-" .. title
403 -- else
404 -- -- If title is nil, just add 4 random uppercase letters to the suffix.
405 -- for _ = 1, 4 do
406 -- suffix = suffix .. string.char(math.random(65, 90))
407 -- end
408 -- suffix = "-" .. title
409 -- end
410 -- return tostring(os.time()) .. suffix
411 end,
412 -- Optional, for templates (see below).
413 templates = {
414 folder = "templates",
415 date_format = "%Y-%m-%d",
416 time_format = "%H:%M",
417 -- A map for custom variables, the key should be the variable and the value a function
418 substitutions = {},
419 },
420 })
421 end,
422 },
423-- }}}
424-- Markdown: preview {{{
425 {
426 "iamcco/markdown-preview.nvim",
427 cmd = { "MarkdownPreviewToggle", "MarkdownPreview", "MarkdownPreviewStop" },
428 build = function()
429 vim.fn["mkdp#util#install"]()
430 end,
431 keys = {
432 {
433 "<leader>cp",
434 ft = "markdown",
435 "<cmd>MarkdownPreviewToggle<cr>",
436 desc = "Markdown Preview",
437 },
438 },
439 config = function()
440 vim.cmd([[do FileType]])
441 vim.g.mkdp_browser = 'firefox'
442 end,
443 },
444-- }}}
336 -- lualine {{{ 445 -- lualine {{{
337 { 446 {
338 "nvim-lualine/lualine.nvim", 447 "nvim-lualine/lualine.nvim",
@@ -417,67 +526,67 @@ require("lazy").setup({
417 }, 526 },
418 -- }}} 527 -- }}}
419 528
420 -- lspconfig {{{ 529 -- -- lspconfig {{{
421 -- Use :help lspconfig-all to check servers 530 -- -- Use :help lspconfig-all to check servers
422 { 531 -- {
423 "neovim/nvim-lspconfig", 532 -- "neovim/nvim-lspconfig",
424 lazy = false, 533 -- lazy = false,
425 config = function() 534 -- config = function()
426 local lspconfig = require "lspconfig" 535 -- local lspconfig = require "lspconfig"
427 -- 536 -- --
428 -- typescript 537 -- -- typescript
429 lspconfig.lua_ls.setup {} 538 -- lspconfig.lua_ls.setup {}
430 lspconfig.tsserver.setup {} 539 -- lspconfig.tsserver.setup {}
431 lspconfig.vimls.setup {} 540 -- lspconfig.vimls.setup {}
432 lspconfig.html.setup {} 541 -- lspconfig.html.setup {}
433 -- 542 -- --
434 vim.keymap.set("n", "<leader>F", function() 543 -- vim.keymap.set("n", "<leader>F", function()
435 vim.lsp.buf.format() 544 -- vim.lsp.buf.format()
436 end, { desc = "format files" }) 545 -- end, { desc = "format files" })
437 end, 546 -- end,
438 }, 547 -- },
439 -- }}} 548 -- -- }}}
440 -- Mason {{{ 549 -- -- Mason {{{
441 { 550 -- {
442 "williamboman/mason.nvim", 551 -- "williamboman/mason.nvim",
443 dependencies = { 552 -- dependencies = {
444 "williamboman/mason-lspconfig.nvim", 553 -- "williamboman/mason-lspconfig.nvim",
445 }, 554 -- },
446 config = function() 555 -- config = function()
447 require('mason').setup { 556 -- require('mason').setup {
448 automatically_installation = true, 557 -- automatically_installation = true,
449 ensure_installed = { 558 -- ensure_installed = {
450 "vim-language-server", 559 -- "vim-language-server",
451 "lua-language-server", 560 -- "lua-language-server",
452 "css-lsp", 561 -- "css-lsp",
453 "html-lsp", 562 -- "html-lsp",
454 "prettier", 563 -- "prettier",
455 "stylua", 564 -- "stylua",
456 }, 565 -- },
457 } 566 -- }
458 end 567 -- end
459 }, 568 -- },
460 -- }}} 569 -- -- }}}
461 -- treesitter {{{ 570 -- -- treesitter {{{
462 { 571 -- {
463 "nvim-treesitter/nvim-treesitter", 572 -- "nvim-treesitter/nvim-treesitter",
464 event = { "BufReadPost", "BufNewFile" }, 573 -- event = { "BufReadPost", "BufNewFile" },
465 cmd = { "TSInstall", "TSBufEnable", "TSBufDisable", "TSModuleInfo" }, 574 -- cmd = { "TSInstall", "TSBufEnable", "TSBufDisable", "TSModuleInfo" },
466 build = ":TSUpdate", 575 -- build = ":TSUpdate",
467 config = function() 576 -- config = function()
468 require("nvim-treesitter.configs").setup({ 577 -- require("nvim-treesitter.configs").setup({
469 ensure_installed = { "lua", "luadoc", "printf", "vim", "vimdoc" }, 578 -- ensure_installed = { "lua", "luadoc", "printf", "vim", "vimdoc" },
470 -- 579 -- --
471 highlight = { 580 -- highlight = {
472 enable = true, 581 -- enable = true,
473 use_languagetree = true, 582 -- use_languagetree = true,
474 }, 583 -- },
475 -- 584 -- --
476 indent = { enable = true }, 585 -- indent = { enable = true },
477 }) 586 -- })
478 end, 587 -- end,
479 }, 588 -- },
480 -- }}} 589 -- -- }}}
481 -- nvim-cmp {{{ 590 -- nvim-cmp {{{
482 { 591 {
483 "hrsh7th/nvim-cmp", 592 "hrsh7th/nvim-cmp",
@@ -537,7 +646,6 @@ require("lazy").setup({
537 ["<C-d>"] = cmp.mapping.scroll_docs(-4), 646 ["<C-d>"] = cmp.mapping.scroll_docs(-4),
538 ["<C-f>"] = cmp.mapping.scroll_docs(4), 647 ["<C-f>"] = cmp.mapping.scroll_docs(4),
539 ["<C-Space>"] = cmp.mapping.complete(), 648 ["<C-Space>"] = cmp.mapping.complete(),
540 ["<C-e>"] = cmp.mapping.close(),
541 ['<CR>'] = cmp.mapping.confirm(), 649 ['<CR>'] = cmp.mapping.confirm(),
542 ['<C-c>'] = cmp.mapping.abort(), 650 ['<C-c>'] = cmp.mapping.abort(),
543 } 651 }
@@ -577,7 +685,7 @@ require("lazy").setup({
577 { name = "path" }, 685 { name = "path" },
578 }, 686 },
579 experimental = { 687 experimental = {
580 ghost_text = true, 688 -- ghost_text = true,
581 } 689 }
582 }) 690 })
583 cmp.setup.cmdline(':', { 691 cmp.setup.cmdline(':', {
@@ -675,6 +783,7 @@ require("mini.basics").setup()
675require("mini.misc").setup({ 783require("mini.misc").setup({
676 make_global = { "put", "put_text", "zoom" }, 784 make_global = { "put", "put_text", "zoom" },
677}) 785})
786vim.keymap.set( 'n', '<leader>z', function() zoom() end, { buffer = bufnr, desc = 'zoom' })
678--}}} 787--}}}
679-- mini.extra {{{ 788-- mini.extra {{{
680require("mini.extra").setup() 789require("mini.extra").setup()
@@ -800,10 +909,10 @@ require("mini.visits").setup()
800-- mini.surround {{{ 909-- mini.surround {{{
801require("mini.surround").setup { 910require("mini.surround").setup {
802 mappings = { 911 mappings = {
803 add = 'S' 912 add = 'sa'
804 } 913 }
805} 914}
806vim.keymap.set('v', 's', 'S', { remap = true }) 915vim.keymap.set('v', 's', 'sa', {})
807-- }}} 916-- }}}
808-- mini.indentscope {{{ 917-- mini.indentscope {{{
809require("mini.indentscope").setup() 918require("mini.indentscope").setup()
@@ -957,16 +1066,16 @@ require("mini.pairs").setup()
957-- add { source = "lambdalisue/suda.vim" } 1066-- add { source = "lambdalisue/suda.vim" }
958-- }}} 1067-- }}}
959-- -- true-zen {{{ 1068-- -- true-zen {{{
960-- add({ 1069-- Add({
961-- source = "Pocco81/true-zen.nvim", 1070-- source = "Pocco81/true-zen.nvim",
962-- }) 1071-- })
963-- vim.keymap.set("n", "<leader>z", ":TZAtaraxis<CR>") 1072-- vim.keymap.set("n", "<leader>z", ":TZAtaraxis<CR>")
964-- -- }}} 1073-- -- }}}
965-- -- bufferline {{{ 1074-- bufferline {{{
966Add({ 1075Add({
967 source = "akinsho/bufferline.nvim", 1076 source = "akinsho/bufferline.nvim",
968 depends = { 1077 depends = {
969 "nvim-tree/nvim-web-devicons", -- OPTIONAL: for file icons 1078 "nvim-tree/nvim-web-devicons",
970 "tiagovla/scope.nvim", 1079 "tiagovla/scope.nvim",
971 }, 1080 },
972}) 1081})
@@ -1015,34 +1124,15 @@ require('bufferline').setup{
1015 } 1124 }
1016 }, 1125 },
1017 custom_filter = function (buf_number) 1126 custom_filter = function (buf_number)
1018 local tabId = tostring(vim.fn.tabpagenr()) 1127 for _, p in ipairs(vim.t.bufs) do
1019 if vim.g.tab_group[tabId] then 1128 if p == buf_number then
1020 for _, p in ipairs(vim.g.tab_group[tabId]) do 1129 return true
1021 if p == buf_number then
1022 return true
1023 end
1024 end 1130 end
1025 end 1131 end
1026 return false 1132 return false
1027 end 1133 end
1028 } 1134 }
1029}; 1135};
1030
1031-- require("bufferline").setup({
1032-- options = {
1033-- custom_filter = function(buf_number)
1034-- local tabId = vim.fn.tabpagenr()
1035-- if vim.g.tab_group[tabId] then
1036-- for _, p in ipairs(vim.g.tab_group[tabId]) do
1037-- if p == buf_number then
1038-- return true
1039-- end
1040-- end
1041-- end
1042-- return false
1043-- end
1044-- },
1045-- })
1046-- keymaps {{{ 1136-- keymaps {{{
1047for i = 1, 9, 1 do 1137for i = 1, 9, 1 do
1048 vim.keymap.set("n", string.format("<A-%s>", i), function() 1138 vim.keymap.set("n", string.format("<A-%s>", i), function()
@@ -1058,6 +1148,12 @@ vim.keymap.set("n", "<M-p>", "<Cmd>BufferLineTogglePin<CR>", opts)
1058-- }}} 1148-- }}}
1059-- -- TODO: tabpages 1149-- -- TODO: tabpages
1060-- -- }}} 1150-- -- }}}
1151Add {
1152 source = "chentoast/marks.nvim"
1153}
1154require('marks').setup {
1155}
1156vim.cmd("hi MarkSignHL guifg=#f85e84 guibg=#37343a")
1061 1157
1062-- KEYMAPS {{{ 1158-- KEYMAPS {{{
1063 1159