-
Notifications
You must be signed in to change notification settings - Fork 1
/
vimrc
1361 lines (1139 loc) · 36.5 KB
/
vimrc
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
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
"""""""""""""""""""""""""""""""""""""""""""""""""""""
"
" \ /
" \/ |-- | |
" /\ |-- | |
" / \ |-- |-- |--
"
" New: V8
" Maintainer: Xell Liu <xell DOT liu AT gmail.com>
" Pre {{{1
"""""""""""""""""""""""""""""""""""""""""""""""""""""
" Use third-part macro to track the startup time {{{2
" let g:startup_profile_csv = '/Users/xell/Code/vim/vim_startup_log.csv'
" runtime macros/startup_profile.vim
" }}}
set nocompatible
" }}}
" Xell Global Variables {{{1
" URL {{{2
let g:urlpattern = '[[:alpha:]-]\+:\/\/[^ "' . "'>\\])]\\+"
let g:webbrowser = ''
" let g:webserver_host = 'http://localhost:80/~xell'
let g:webserver_host = 'http://localhost'
let g:webserver_dir = glob('~/Sites')
" }}}
" TODO
" Docs should not be here {{{2
" Specify use what function to look for the output html of doc file
let g:browser_open_rules = {'t2t': 'GetOutputHTML', 'md': 'GetOutputHTML', 'mkd': 'GetOutputHTML', 'markdown': 'GetOutputHTML', 'rst': 'GetOutputHTML', 'mdindex': 'GetOutputHTML'}
" }}}
" }}}
" General Options {{{1
"""""""""""""""""""""""""""""""""""""""""""""""""""""
" General {{{2
" Enable file type detection and indent
filetype plugin indent on
" Viminfo file
exec "set viminfo='50,<1000,c,s500,h"
" Allow backspacing over everything in insert mode
set backspace=indent,eol,start
" Move to previous/next line
set whichwrap+=<,>,[,],l,h
" Use for chinese characters
" It treat a chinese character as a word, and does not add blankspace while joining two lines.
" mM chinese
" l don't auto format textwidth
" ro repeat comments
" c auto format textwidth in comment
" q allow formatting of comments with gq
" t autowrap
set formatoptions=mBlrocq
" Set - comments
set comments-=fb:-
set comments+=:-
" While a file is changed outside Vim, automaitcally read it w/o warning
set autoread
" Triger `autoread` when files changes on disk
" https://unix.stackexchange.com/questions/149209/refresh-changed-content-of-file-opened-in-vim/383044#383044
" https://vi.stackexchange.com/questions/13692/prevent-focusgained-autocmd-running-in-command-line-editing-mode
autocmd FocusGained,BufEnter,CursorHold,CursorHoldI *
\ if mode() !~ '\v(c|r.?|!|t)' && getcmdwintype() == '' | checktime | endif
" Notification after file change
" https://vi.stackexchange.com/questions/13091/autocmd-event-for-autoread
autocmd FileChangedShellPost *
\ echohl Title | echom expand("%:p:t") . " changed on disk. Buffer reloaded." | echohl None
" Set the number of history of : commands and search.
set history=500
" Options in sessions
set sessionoptions=buffers,curdir,folds,globals,help,resize,slash,tabpages,winpos,winsize,localoptions,options
" Set local current directory
set autochdir
" Backup files setting
set nobackup
set writebackup
" Set ctrl-a and ctrl-x target
set nrformats+=alpha
" Always set autoindenting on
set autoindent
" Set tab page max
set tabpagemax=100
" Search in smartcase
set ignorecase smartcase
set incsearch
" Don't wrap while searching
set nowrapscan
" Set general fold method to triple { like
set foldmethod=marker
" Set ignore files when completion
set wildignore=*.o,*.ojb,*.pyc,*.DS_Store,*.db,*.dll,*.exe,*.a
" Expand tab to spaces
set expandtab
set iskeyword+=-
" Set the swap file directory with flat structure
set directory^=$HOME/.vimtmp//
" Use vim internal help when press K
set keywordprg=
" c.f. https://gist.github.com/xge/2422950
set dictionary=/usr/share/dict/words
set complete+=k
set infercase
set exrc
set updatetime=500
set modelineexpr
" }}}
" Filetypes {{{2
" autocmd BufRead *.md ToggleFoldMethod
" Deal with large file
"autocmd BufWinEnter * if line2byte(line("$") + 1) > 200000 | syntax clear | echomsg "Large File" | endif
" Mathematica filetype
let filetype_m = "mma"
" SH filetype, see *sh.vim*
let g:is_bash=1
let g:sh_fold_enabled=3
" 解决crontab -e时,提示crontab: temp file must be edited in place
" https://blog.csdn.net/xuyaqun/article/details/44458987
autocmd filetype crontab setlocal nobackup nowritebackup
" }}}
" IME setting {{{2
" function! s:setim()
" if &imd
" set imd
" set noimd
" echo "Chinese enable."
" else
" set imd
" echo "English only."
" endif
" endfunction
" nmap <D-i> :call <SID>setim()<CR>
" imap <D-i> <Esc>:call <SID>setim()<CR>i
" set imd
" set noimd
" set ims=1
autocmd GUIEnter * set noimd
" http://www.v2ex.com/t/40375
" }}}
" }}}
" Display and Interface {{{1
" General {{{2
" Enable syntax hl
syntax enable
" Language
set langmenu=none
language messages en_US
" Set file encode
set encoding=utf-8
set fileencodings=utf-8,cp936
" In utf-8 files, use twice the width of ASCII characters
set ambiwidth=double
set maxcombine=6
set breakindent
set visualbell
" Invoke enhanced completion mode in command line
set wildmenu
" Highlight the search iterms
set hlsearch
" Show more |more-prompt|
set more
" Don't give Uganda messages in startup screen
set shortmess+=I
" Threshold for reporting number of lines changed
set report=0
" Display as much as possible instead of @
set display=lastline
" Characters to fill the statuslines and vertical separators.
set fillchars=vert:\ ,stl:\ ,stlnc:\ ,fold:-
" Tab width
set tabstop=4
set shiftwidth=4
" Not equal windows splitting
set noequalalways
" Show the cursor position all the time
set ruler
" Display incomplete commands
set showcmd
" Show line number
set number
" Set cursor always in the middle
set scrolloff=8
" Set mouse in normal window
set mouse=a
" No hide mouse
set nomousehide
" Use symbols to fill the blank of tab and eol
set listchars=tab:▸\ ,eol:¬
set termguicolors
" Non-GUI tabline
" http://vim.wikia.com/wiki/Show_tab_number_in_your_tab_line
function MyTabLine() "{{{
let s = ''
let t = tabpagenr()
let i = 1
while i <= tabpagenr('$')
let buflist = tabpagebuflist(i)
let winnr = tabpagewinnr(i)
let s .= '%' . i . 'T'
let s .= (i == t ? '%1*' : '%2*')
let s .= '%#Constant#'
let s .= ' '
let s .= i . ' '
let s .= '%#TabLine#'
let s .= winnr . '/' . tabpagewinnr(i,'$')
let s .= ' %*'
let s .= (i == t ? '%#TabLineSel#' : '%#TabLine#')
let bufnr = buflist[winnr - 1]
let file = bufname(bufnr)
let buftype = getbufvar(bufnr, 'buftype')
if buftype == 'nofile'
if file =~ '\/.'
let file = substitute(file, '.*\/\ze.', '', '')
endif
else
let file = fnamemodify(file, ':p:t')
endif
if file == ''
let file = '[No Name]'
endif
let s .= file
let i = i + 1
endwhile
let s .= '%T%#TabLineFill#%='
let s .= (tabpagenr('$') > 1 ? '%999XX' : 'X')
return s
endfunction "}}}
set tabline=%!MyTabLine()
" }}}
" Foldtext {{{2
" http://www.gregsexton.org/2011/03/improving-the-text-displayed-in-a-fold/
set foldtext=CustomFoldText(0)
function! CustomFoldText(n)
"get first non-blank line
let fs = v:foldstart
while getline(fs) =~ '^\s*$' | let fs = nextnonblank(fs + 1)
endwhile
if fs > v:foldend
let line = getline(v:foldstart)
else
"let line = getline(fs)
let line = substitute(getline(fs), '\t', repeat(' ', &tabstop), 'g')
endif
let w = winwidth(0) - &foldcolumn - (&number ? 8 : 0)
let foldSize = 1 + v:foldend - v:foldstart
let foldSizeStr = " " . foldSize . " lines "
let foldLevelStr = repeat("+--", v:foldlevel - a:n)
let lineCount = line("$")
let foldPercentage = printf("[%.1f", (foldSize*1.0)/lineCount*100) . "%] "
let expansionString = repeat(".", w - strwidth(foldSizeStr.line.foldLevelStr.foldPercentage))
"return line . expansionString . foldSizeStr . foldPercentage . foldLevelStr
return foldLevelStr . line . expansionString . foldSizeStr . foldPercentage
endfunction
"}}}
" Statusline customization {{{2
set laststatus=2
let g:mystatusline1 = '\ %{winnr()}\ %<%f\ %h%y%m%r\ [%{&ff}]\ [%{&fenc}]'
let g:mystatusline2 = '%=%-14.(%l,%c%V%)\ %L\ %P\ '
exec 'set statusline=' . g:mystatusline1 . g:mystatusline2
" Highlight statusbar according to the type of buffer {{{3
let g:aug_vimsb_enable = 1
augroup vimSB
autocmd!
autocmd BufNew,BufEnter,BufRead,BufWrite,TabEnter,TabLeave,WinEnter,WinLeave * if g:aug_vimsb_enable | call <SID>XellBufferStatuslineHighlight() | endif
au QuickfixCmdPost make call xelltoolkit#qf_make_conv()
augroup END
function! s:XellBufferStatuslineHighlight()
let buffername = bufname("%")
if empty(buffername)
highlight! link StatusLine Question
elseif buffername =~ '\%(\.tmp\|0\)$' || expand("%:p") =~ '^\/private\/var'
highlight! link StatusLine WarningMsg
else
highlight! link StatusLine StatusLine
highlight! link StatusLineNC StatusLineNC
endif
endfunction
" }}}
" }}}
colorscheme xell_dark
command! ReloadColorscheme exe "colorscheme" split(execute('colorscheme', '\n'))[0]
" }}}
" Mappings {{{1
"""""""""""""""""""""""""""""""""""""""""""""""""""""
" General {{{2
" Set map leader b de gHiIJK pq tu wxy
let mapleader=","
if exists('&macmeta')
set macmeta
endif
nnoremap Q q:
" }}}
" Movements {{{2
nmap - $
vmap - $h
" For navigate in visible lines
" nmap \ gj
" nmap <BS> gk
"Basic motions
if &term =~? 'xterm'
imap ˙ <Left>
imap ∆ <Down>
imap ˚ <Up>
imap ¬ <Right>
imap – <PageDown>
imap ≠ <PageUp>
imap § <Home>
imap ¢ <End>
else
inoremap <C-h> <Left>
inoremap <C-l> <Right>
imap <A--> <PageDown>
imap <A-=> <PageUp>
imap <A-6> <Home>
imap <A-4> <End>
endif
" Page down and up
map <C-J> <PageDown>
map <C-K> <PageUp>
" Fold move
nnoremap <silent> <Up> :call GoUpFold()<CR>
nnoremap <silent> <Down> zj
function! GoUpFold()
let cur = line('.')
normal gg
let jump = line('.')
while (1)
normal zj
if ((line('.') >= cur) && (jump <= cur)) || (line('.') == jump)
break
else
let jump = line('.')
endif
endwhile
call cursor(jump, 1)
endfunction
" }}}
" Tabs {{{2
" Tab close
nmap <Leader>q :tabclose
" Tab previous and next
noremap <C-H> gT
noremap <C-L> gt
" Switch tabs and windows by numbers
function! s:mapleadernumber()
for i in range(1, 9)
exec 'nmap <Leader>' . i . ' :' . i . 'wincmd w<CR>'
" Work with BetterTouchTool corresponding setting
exec 'nmap <S-F' . i . '> ' . i . 'gt'
endfor
endfunction
call <SID>mapleadernumber()
if &term =~? 'xterm'
" ¡™£¢∞
nmap ¡ :1wincmd w<CR>
nmap ™ :2wincmd w<CR>
nmap £ :3wincmd w<CR>
nmap ¢ :4wincmd w<CR>
nmap ∞ :5wincmd w<CR>
endif
noremap ]f <C-W>gf
" }}}
" Windows {{{2
" Close windows
nmap <Leader>c <C-W>c
nmap <Leader>o <C-W>o
" Open windows
nmap <Leader>wh :topleft vertical split<CR>
nmap <Leader>wj :botright split<CR>
nmap <Leader>wk :topleft split<CR>
nmap <Leader>wl :botright vertical split<CR>
" Split windows
nmap <Leader>s <C-W>s<C-W>j
nmap <Leader>v <C-W>v<C-W>l
" Switch two windows back and forth
noremap <Backspace> <C-W>p
noremap ` <C-W>w
" For switch to split windows
" GUI keys are set up by BetterTouchTool due to the conflict of :terminal
if &term =~? 'xterm'
" equal to map <M-j> <C-W>j ...
map ∆ <C-W>j
map ˚ <C-W>k
map ˙ <C-W>h
map ¬ <C-W>l
map Ô <C-W>J
map <C-W>K
map Ó <C-W>H
map Ò <C-W>L
endif
" Jump among windows clockwise
if &term =~? 'xterm'
noremap ø <C-W>w
endif
" For changing the size of split windows
if &term =~? 'xterm'
" “‘≤≥≠ [],.=
nmap “ <C-W>-
nmap ‘ <C-W>+
" ”’ {}
nmap ” <C-W>-
nmap º <C-W>-
nmap ’ <C-W>+
nmap Ð <C-W>+
nmap ≤ <C-W><
nmap û <C-W><
nmap ≥ <C-W>>
nmap ý <C-W>>
nmap ≠ <C-W>=
else
nmap <M-[> <C-W>-
nmap <M-:> <C-W>-
nmap <M-]> <C-W>+
nmap <M-S-p> <C-W>+
nmap <M-,> <C-W><
nmap <M-{> <C-W><
nmap <M-.> <C-W>>
nmap <M-}> <C-W>>
nmap <M-=> <C-W>=
endif
" }}}
" Visual block, yank, paste {{{2
" Leave cursor in the end of visual block
vnoremap y ygv<Esc>
nnoremap P gP
" Copy and paste according to OS conventions
vnoremap <D-c> "+y
" nvo
noremap <D-v> "+gP
cnoremap <D-v> <C-R>+
inoremap <D-v> <C-R><C-O>+
" }}}
" Search {{{2
" For search highlight
nmap <Leader>ns :let @/=""<CR>
nmap <Leader>nh :nohlsearch<CR>
vmap <Leader>/ y/<C-r>=@"<CR><CR>
" For quickfix
"nmap <Leader>a :cp<CR>
nmap <Leader>a :call <SID>searchupward()<CR>
"nmap <Leader>z :cn<CR>
nmap <Leader>z :call <SID>searchdownward()<CR>
" Search cp cn etc. {{{3
" E533 no more items
function! s:searchupward()
try
cprevious
catch /^Vim\%((\a\+)\)\=:E42/ " catch error E42 No Erros
try
lprevious
catch /^Vim\%((\a\+)\)\=:E776/ " catch error E776 No Location List
echo "No Quickfix or Location list."
catch /^Vim\%((\a\+)\)\=:E553/ " catch error E553 No Location List
echo "No more items"
endtry
endtry
endfunction
function! s:searchdownward()
try
cnext
catch /^Vim\%((\a\+)\)\=:E42/ " catch error E42 No Erros
try
lnext
catch /^Vim\%((\a\+)\)\=:E776/ " catch error E776 No Location List
echo "No Quickfix or Location list."
catch /^Vim\%((\a\+)\)\=:E553/ " catch error E553 No Location List
echo "No more items"
endtry
endtry
endfunction
" }}}
" Find the word under the cursor and jump to location list
"nmap <Leader>l :lv /<c-r>=expand("<cword>")<cr>/ %<cr>:lw<cr>
nmap <Leader>l viw"zy:lv /<C-R>z/ %<CR>:lw<CR>/\c<C-R>z<CR>
vmap <Leader>l "zy:lv /<C-R>z/ %<CR>:lw<CR>/\c<C-R>z<CR>
" TODO use ag
nmap <Leader>L viw"zy:call xelltoolkit#grep_in_lcd_r('','',"<C-R>z")<CR>:cw<CR>/\c<C-R>z<CR>
vmap <Leader>L "zy:call xelltoolkit#grep_in_lcd_r('','',"<C-R>z")<CR>:cw<CR>/\c<C-R>z<CR>
" Look up the visual selection in Google
vmap <D-d> "zy:silent! !open "https://www.google.com/search?q="$(php -r "echo rawurlencode('<C-R>z');")<CR>
" Look up the word under the cursor in Dictionary.app
nmap <silent> <D-d> :silent !open "dict://<cword>"<CR>
" Move to url
nnoremap gn :call xelltoolkit#goto_next_word(g:urlpattern)<CR>
nnoremap gN :call xelltoolkit#goto_pre_word(g:urlpattern)<CR>
" }}}
" Modify texts {{{2
" For insert enter when normal
nmap <S-Enter> i<Enter><Esc>
" For delete the Tab
imap <S-Tab> <BS>
" Move line
nmap <C-Up> ddkP
nmap <C-Down> ddp
" Auto close pairs IMAP
" The latency of IMAP from latex-suite is too long to use.
function! s:imap_jump()
let isfound = search('<++>', 'cW')
if isfound
if col('.') == col('$') - 4
normal 4x
startinsert!
else
normal 4x
startinsert
endif
endif
endfunction
inoremap <D-j> <C-O>:call <SID>imap_jump()<CR>
call xelltoolkit#imap('()', '(<++>)<++>', 0)
call xelltoolkit#imap('[]', '[<++>]<++>', 0)
call xelltoolkit#imap('{}', '{<++>}<++>', 0)
call xelltoolkit#imap('<>', '<<++>><++>', 0)
call xelltoolkit#imap('""', '"<++>"<++>', 0)
call xelltoolkit#imap("''", "'<++>'<++>", 0)
call xelltoolkit#imap('%%', '%<++>%<++>', 0)
" for reference in windows TODO
" augroup MyIMAPs
" autocmd!
" autocmd VimEnter * call IMAP('()', '(<++>)<++>', '')
" autocmd VimEnter * call IMAP('[]', '[<++>]<++>', '')
" autocmd VimEnter * call IMAP('{}', '{<++>}<++>', '')
" autocmd VimEnter * call IMAP('<>', '<<++>><++>', '')
" autocmd VimEnter * call IMAP('""', '"<++>"<++>', '')
" autocmd VimEnter * call IMAP("''", "'<++>'<++>", '')
" autocmd VimEnter * call IMAP('%%', '%<++>%<++>', '')
" augroup END
" }}}
" Dispaly {{{2
nmap <Leader>nn :call <SID>changenumberdisplay()<CR>
function! s:changenumberdisplay()
if &relativenumber
set norelativenumber
else
set relativenumber
endif
endfunction
nnoremap <Space> @=((foldclosed(line('.')) < 0)?'zc':'zo')<CR>
map <Leader>hc :call SetColorColumn()<CR>
function! SetColorColumn()
let col_num = virtcol(".")
let cc_list = split(&cc, ',')
if count(cc_list, string(col_num)) <= 0
execute "set cc+=".col_num
else
execute "set cc-=".col_num
endif
endfunction
" }}}
" Completions {{{2
" Complete tags
inoremap <C-]> <C-x><C-]>
" Complete dictionary
imap <D-d> <C-x><C-K>
" Complete file names
imap <D-f> <C-x><C-F>
" Complete whole lines
imap <D-l> <C-x><C-L>
" }}}
" Special {{{2
" Edit vimrc
nmap <Leader>rce :exec 'e ' . substitute(system('readlink ' . $MYVIMRC), '\(\s\|\n\)\+$', '', '')<CR>
" Reload vimrc
nmap <Leader>rcl :so $MYVIMRC<CR>
" Edit gvimrc
nmap <Leader>rcge :exec 'e ' . substitute(system('readlink ' . $MYGVIMRC), '\(\s\|\n\)\+$', '', '')<CR>
" Reload gvimrc
nmap <Leader>rcgl :so $MYGVIMRC<CR>
" }}}
" }}}
" Commands and Others {{{1
" Wipe out designated named registers
function! WipeDesignatedNamedRegisters()
registers abcdefghijklmnopqrstuvwxyz
let to_be_wiped_out = input("Please enter the named registers to be wiped out\n")
echo to_be_wiped_out
for c in split(to_be_wiped_out, '\zs')
silent! call setreg(c, '')
endfor
echo "Done!\n"
registers abcdefghijklmnopqrstuvwxyz
endfunction
" diff two windows
command! -nargs=0 Diffthis call <SID>difftwowindows()
function! s:difftwowindows()
diffthis
exec "normal \<C-w>w"
diffthis
endfunction
" Spell cjk
command! -nargs=0 Spell call <SID>spell_check()
function! s:spell_check()
if &spell
setlocal nospell
else
setlocal spell spelllang=en_us,cjk
" https://stackoverflow.com/questions/18196399/exclude-capitalized-words-from-vim-spell-check
syn match myExCapitalWords +\<\w*[A-Z]\K*\>\|'s+ contains=@NoSpell
endif
endfunction
augroup vimStartup
au!
" When editing a file, always jump to the last known cursor position.
" Don't do it when the position is invalid, when inside an event handler
" (happens when dropping a file on gvim) and for a commit message (it's
" likely a different one than last time).
autocmd BufReadPost *
\ if line("'\"") >= 1 && line("'\"") <= line("$") && &ft !~# 'commit'
\ | exe "normal! g`\""
\ | endif
augroup END
com! Pwd exec 'cd' expand('%:p:h')
" Xell Other
" TODO https://github.com/tpope/vim-eunuch
"delete the current file
com! Rm call xelltoolkit#delete_file()
"delete the file and quit the buffer (quits vim if this was the last file)
com! RM call xelltoolkit#delete_file() <Bar> bd!
com! URL call xelltoolkit#get_copy(xelltoolkit#get_file_url())
" Define command WhatSyntax for looking up syntax
command! -nargs=0 -bar WhatSyntax echomsg synIDattr(synID(line("."),col("."),0),"name") synIDattr(synIDtrans(synID(line("."),col("."),0)),"name") synIDattr(synID(line("."),col("."),1),"name") synIDattr(synIDtrans(synID(line("."),col("."),1)),"name")
" Capitalization of the current line
" Capitalize all words in titles of publications and documents, except a, an, the, at, by, for, in, of, on, to, up, and, as, but, or, and nor.
" https://taptoe.wordpress.com/2013/02/06/vim-capitalize-every-first-character-of-every-word-in-a-sentence/
command! -nargs=0 Capitalize s/\v^\a|\:\s\a|<%(a>|an>|and>|as>|at>|but>|by>|for>|in>|nor>|of>|on>|or>|the>|to>|up>)@!\a/\U&/g
" Bonly {{{2
" https://github.com/schickling/vim-bufonly
command! -nargs=? -complete=buffer -bang Bonly
\ :call BufOnly('<args>', '<bang>')
function! BufOnly(buffer, bang)
if a:buffer == ''
" No buffer provided, use the current buffer.
let buffer = bufnr('%')
elseif (a:buffer + 0) > 0
" A buffer number was provided.
let buffer = bufnr(a:buffer + 0)
else
" A buffer name was provided.
let buffer = bufnr(a:buffer)
endif
if buffer == -1
echohl ErrorMsg
echomsg "No matching buffer for" a:buffer
echohl None
return
endif
let last_buffer = bufnr('$')
let delete_count = 0
let n = 1
while n <= last_buffer
if n != buffer && buflisted(n)
if a:bang == '' && getbufvar(n, '&modified')
echohl ErrorMsg
echomsg 'No write since last change for buffer'
\ n '(add ! to override)'
echohl None
else
silent exe 'bdel' . a:bang . ' ' . n
if ! buflisted(n)
let delete_count = delete_count+1
endif
endif
endif
let n = n+1
endwhile
if delete_count == 1
echomsg delete_count "buffer deleted"
elseif delete_count > 1
echomsg delete_count "buffers deleted"
endif
endfunction
" }}}
" }}}
" Abbrevs {{{1
"""""""""""""""""""""""""""""""""""""""""""""""""""""
ca xs mks! ~/Documents/xs1.vim
ca xl so ~/Documents/xs1.vim
" Must in /etc/sudoers set username ALL=(ALL) NOPASSWD:ALL
cab sudow silent w !sudo tee %
cmap w!! w !sudo tee % >/dev/null
cab xfn echo expand("%:p")
"Insert date and time
iab xdate <C-r>=strftime("%Y-%m-%d %H:%M:%S")<CR>
" }}}
" Scripts {{{1
"""""""""""""""""""""""""""""""""""""""""""""""""""""
" XellNotes {{{2
let g:xell_notes_root = fnameescape(glob('~/Library/Mobile\ Documents/iCloud~md~obsidian/Documents/Notes'))
" TODO FIXME
let g:xell_notes_ex_root = fnameescape(glob('~/Library/Mobile\ Documents/iCloud~md~obsidian/Documents/Notes\ Preview'))
" TODO it should not be connected with ffs
" i.e. ffs should be more general, not focusing with notes
let g:xell_notes_default_ext = 'md'
" TODO FIXME
let g:xell_notes_temp_ext = ['tempnote', 'md'][1]
" }}}
" Blockdiff {{{2
vmap ,d1 :call BlockDiff_GetBlock1()<CR>
vmap ,d2 :call BlockDiff_GetBlock2()<CR>
" }}}
" BufExplorer {{{2
let g:bufExplorerShowUnlisted=1
" }}}
" Colorizer {{{2
nmap <silent> <S-D-F6> <Plug>Colorizer
let g:colorizer_startup = 0
" }}}
" Emmet {{{2
let g:user_emmet_leader_key = '<D-e>'
" If you want to complete tags using |omnifunc| then add this.
let g:use_emmet_complete_tag = 1
" Enable just for html/css
let g:user_emmet_install_global = 0
autocmd FileType html,css EmmetInstall
" }}}
" Edit Existing {{{2
packadd! editexisting
" }}}
" FFS {{{2
" TODO
" nmap <Leader><Leader><Leader> :call FFS()<CR>
let g:ffs_forbiden_path = ['/Users/xell', '/Users/xell/Library', '/Users/xell/Codes', '/Users/xell/Documents', '/Applications', '/Library']
" }}}
" Fugitive {{{2
nmap <Leader>gs :Gstatus<CR>
nmap <Leader>gd :Gvdiff<CR>
nmap <Leader>gD :Gdiff<CR>
let g:fugitive_summary_format = '(%ci) %s'
if &loadplugins
let g:mystatusline_fugitive = '\ %{Fugitive_statusline_mod()}'
exec 'set statusline=' . g:mystatusline1 . g:mystatusline_fugitive . g:mystatusline2
endif
function! Fugitive_statusline_mod()
if exists("*fugitive#statusline")
return substitute(fugitive#statusline(), '\[Git\|\]', '', 'g')
else
return ''
endif
endfunction
" }}}
" FuzzyFinder {{{2
let g:fuf_modesDisable = ['aroundmrufile', 'mrucmd', 'dir', 'bookmark', 'taggedfile', 'line', 'quickfix']
let g:fuf_keyPreview = '<C-H>'
let g:fuf_keyOpenTabpage = '<C-Return>'
" Usage : ,fe n:
" nmap <Leader>fe :FufFile<CR>
let g:fuf_abbrevMap = {
\ "^v:" : ['$VIM/**/',],
\ "^n:" : [g:xell_notes_root . '/'],
\ }
" nmap <Leader>ff :FufMruFile<CR>
" All file in current directory recursively
" nmap <Leader>fd :FufCoverageFile<CR>
" nmap <Leader>ft :FufTag<CR>
" nmap <Leader>fh :FufHelp<CR><C-E>
" nmap <Leader>fb :FufBuffer<CR>
" nmap <Leader>fc :call fuf#givencmd#launch('', 0, '>', <SID>getAllCommands())<CR>
function! s:getAllCommands()
redir => commands
silent command
redir END
return map((split(commands, "\n")[3:]),
\ '":" . matchstr(v:val, ''^....\zs\S*'')')
endfunction
" All user vimfiles
" nmap <Leader>fg :call <SID>fuf_vimfiles()<CR>
function! s:fuf_vimfiles()
exec "call fuf#givenfile#launch('', 0, '>', split(glob('" . split(&rtp, ',')[0] . "/**/*'), \"\\n\"))"
endfunction
" nmap <Leader>fn :call <SID>fuf_notes()<CR>
function! s:fuf_notes()
exec "call fuf#givenfile#launch('', 0, '>', split(glob('" . g:xell_notes_root . "/**/*'), \"\\n\"))"
endfunction
" }}}
" fzf {{{2
" https://github.com/junegunn/fzf#as-vim-plugin
" https://github.com/junegunn/fzf/blob/master/README-VIM.md
set rtp+=/usr/local/opt/fzf
let g:fzf_buffers_jump = 1
let g:fzf_layout = { 'up': '~20%' }
nmap <D-p> :Files<CR>
nmap <Leader>ft :Tags<CR>
nmap <Leader>fh :Helptags<CR>
nmap <Leader>fb :Buffers<CR>
nmap <Leader>fc :Commands<CR>
nmap <Leader>fl :BLines<CR>
nmap <Leader>fL :Lines<CR>
nmap <Leader>fm :Marks<CR>
nmap <Leader>fw :Windows<CR>
nmap <Leader>fv :Files ~/.vim<CR>
nmap <Leader>fn :Files <C-R>=g:xell_notes_root<CR><CR>
" https://github.com/junegunn/fzf.vim/issues/54
" https://github.com/junegunn/fzf.vim/issues/228
" https://github.com/junegunn/fzf.vim/commit/8ea2e872d7ac7492b86bcca16ccd5d5021663efb
command! -bang -nargs=* AG call fzf#vim#ag(<q-args>, '-S', {'options': '--bind ctrl-a:select-all,ctrl-d:deselect-all,ctrl-j:page-down,ctrl-k:page-up'}, <bang>0)
nmap <D-F> :AG<CR>
nmap <Leader>ff :FZFMru<CR>
" Mapping selecting mappings
nmap <leader><tab> <plug>(fzf-maps-n)
xmap <leader><tab> <plug>(fzf-maps-x)
omap <leader><tab> <plug>(fzf-maps-o)
" Insert mode completion
" TODO supertab
imap <c-x><c-k> <plug>(fzf-complete-word)
imap <c-x><c-f> <plug>(fzf-complete-path)
imap <c-x><c-j> <plug>(fzf-complete-file-ag)
imap <c-x><c-l> <plug>(fzf-complete-line)
" Advanced customization using autoload functions
" inoremap <expr> <c-x><c-k> fzf#vim#complete#word({'left': '20'})
" https://github.com/junegunn/fzf/blob/master/README-VIM.md
" https://github.com/junegunn/fzf.vim/issues/586
" https://github.com/junegunn/fzf.vim/issues/185
" An action can be a reference to a function that processes selected lines
function! s:build_quickfix_list(lines)
call setqflist(map(copy(a:lines), '{ "filename": v:val }'))
copen
cc