forked from listenerri/ri-vim
-
Notifications
You must be signed in to change notification settings - Fork 0
/
vimrc
956 lines (816 loc) · 31.7 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
" 不兼容vi
" compatible
set nocp
" ##########################vim选项设置:options##########################
" 每一个设置上面都有中文翻译,和完整的设置名称
" 因为大部分设置使用的都是简写
" 允许跨行移动的按键
" whichwrap
set ww=b,s,h,l,<,>,[,]
" 禁止跳转时光标移动到非空字符
" 默认当跳转时光标会移动到那一行的非空字符处
" nostartofline
set nosol
" 输入搜索关键字时跳转到匹配的结果
" 但并未真正跳转,仍需要按enter键才会真正跳转
" 找不到匹配或按esc键则回到光标原来的位置
" incsearch
set is
" 搜索不区分大小写
" ignorecase
set ic
" 搜索智能区分大小写
" 本选项的作用是配合上面不区分大小写的设置
" 这样,只要包含一个大写字母则搜索时区分大小写
" smartcase
set scs
" 多用于C程序中,从一个名叫tags的文件中搜索数据
" 使用CTRL-]快捷键进行跳转到当前光标所在关键字的
" 方法的定义处,CTRL-T跳转回来
"暂不设置
" 光标上下最少保留行数
" 比如当向下移动光标时,光标不会移动到当前编辑区最低部
" 才开始滚动编辑区,这样能保证看到部分连续的上下文
" scrolloff
set so=4
" 同上,但对横向滚动起作用,且只有设置了nowrap(下面)的时候才起作用
" sidescrolloff
set siso=4
" 是否把超出编辑区显示范围的行,按多行显示
" wrap
set wrap
" 显示行数
" number
set nu
" 显示相对行数
" relativenumber
set rnu
" 检测文件类型,载入文件类型插件,载入文件类型缩进
" :filetype
filetype on
filetype plugin on
filetype indent on
" 语法高亮
" :syntax
syntax on
" 设置背景色模式为暗色
" background
set background=dark
" 终端颜色数目为256(兼容更多的颜色主题)
set t_Co=256
" 颜色主题
" 主题的设置应在语法高亮和类型检测后面,否则会出现一些问题
" 执行版本管理之外的配置文件来设置主题,避免因为改完主题而提交代码
" 主题配置文件的为HOME目录下的".vimrc-colorscheme"文件
if filereadable(glob("~/.vimrc-colorscheme"))
source ~/.vimrc-colorscheme
else
colorscheme molokai
endif
" 高亮搜索时匹配到的搜过结果
" hlsearch
set hls
" 高亮光标所在列和行
" cursorcolumn
" cursorline
set cuc
set cul
" 何时有底部的状态行:0,永不;1,至少两个窗口;2,总是显示
" laststatus
set ls=2
" 状态行显示的内容
" statusline
set stl=%t%m%r%h%w%=[%c-%l]%P
" 启动鼠标
" mouse
set mouse=a
" 在状态行显示命令
" showcmd
set sc
" 确认对话框
" 多用于退出时文件已修改但未保存时询问,询问选项有:
" 保存,不保存,取消
" confirm
set cf
" 以下四个选项设置了使用4个空格代替tab制表符
" 文件里制表键代表的空格数
" tabstop
set ts=4
" (自动)缩进时的空格数目
" shiftwidth
set sw=4
" 行首一次性插入或删除sw所设置的空格数
" smarttab
set sta
" 输入制表键时以空格代替
" expandtab
set et
" 自动缩进
" autoindent
set ai
" 智能缩进
" 主要适用于c这样的程序,也可能适用于其他程序
" 另外,对于c程序还有更好但也更严谨,配置更复杂的cindent
" smartindent
set si
" 自动重新读入
" 如果vim发现文件在其他地方被修改了,自动重新读入
" autoread
set ar
" 自动写入(不包含"edit","quit"等命令,如需包含参见autowriteall)
" 当在执行一些跳转,离开本缓冲区的命令时自动写入文件,如:
" :next,:last,:stop,:suspend,CTRL-],CTRL-O,'{A-Z0-9}等
" autowrite
set aw
" 命令行补全菜单
" 在命令行按tab键补全命令时,在命令行上方出现可能的匹配
" 使用tab键或CTRL-P/CTRL-N移动到合适的匹配上
" 上键:文件名/菜单名补全中: 上移到父目录或父菜单
" 下键:文件名/菜单名补全中: 移进子目录和子菜单
" 回车键:菜单补全中,如果光标在句号之后: 移进子菜单
" wildmenu
set wmnu
" 默认左键和右键也是选择匹配,修改按键令其移动光标
cnoremap <Left> <Space><BS><Left>
cnoremap <Right> <Space><BS><Right>
" 编码
" encoding:vim内部使用的编码
" termencoding终端使用的编码(一般与encoding相同)
" fileencoding:当前文件编码(不在此处设置,vim会自动设置)
" fileencodings:可选的文件编码
" utf-8不能放到usc-bom之前,latin1应为最后,default是encoding的值
set enc=utf-8
set tenc=utf-8
set fencs=ucs-bom,utf-8,gbk,gb2312,default,latin1
" 以下设置一些超时时间(超过这个时间后才不在等待后续按键)
" 这样可以避免状态栏提示信息的一点延迟
" 开启映射超迟(默认是开启):自己定义的按键映射比如<leader>y
set timeout
" 设置映射超迟时间(默认是1000)
set timeoutlen=3000
" 开启键码超迟(默认是关闭):比如按ESC键退出插入,命令,可视模式的超时
set ttimeout
" 设置键码超时时间(默认是负数也就是关闭,关闭时由timeoutlen的值管理键码超时)
set ttimeoutlen=100
" 当打开文件时切换当前的工作目录到文件所在的目录下
" 当前工作目录可以通过:pwd命令查看
"set autochdir
" 隐藏已经被:bdelete的buffer
" airline的tabline就不会再显示已经被delete的buffer
set hidden
" 使用view时不使用options,只加载vimrc中默认的配置
set viewoptions-=options
" ##########################GUI:gui##########################
if has("gui_running")
"gui窗口宽高
set guifont=Source\ Code\ Pro\ 11
set lines=28
set columns=120
" gui选项
" guioptions
" m 菜单栏
" g 灰色菜单项
" t 可撕下的菜单
" T 工具栏
" r 右边滚动条总是存在
" R 右边滚动条有垂直分割的窗口时总是存在
" l 左边滚动条总是存在
" L 左边滚动条有垂直分割的窗口时总是存在
" b 底部的水平滚动条,大小为当前文件中的最长行
" h 限制水平滚动条的长度为当前光标所在行,可减少计算量
" 每个选项都可以使用加号"+"和减号"-"来开关
set go-=T
set go-=L
"for mac osx
if has('mac')
"gui字体
set guifont=Monaco:h14
set lines=25
set columns=100
endif
endif
" ##########################按键映射设置:mapkeys##########################
" map:全局的映射,映射之后的按键可以递归(被再次映射)
" noremap:全局的映射,但映射后的按键不可递归(多用于定义一个命令)
" unmap:删除一个映射
" mapclear:删除所有映射
"
" 映射也区分模式,如果上述命令前有如下字符,则该命令只对该模式生效:
" n:normal(正常)模式下
" v:可视模式
" i:插入模式
" c:命令行模式
"
" map可以增加参数或者说选项,可用如下:
" <buffer> : 只在当前buffer生效
" <nowait> : 一旦匹配到可用按键序列立即生效,不等待后续按键,相当于对更长按键映射的一种覆盖
" <silent> : 静默,不在状态栏显示
" <special> :
" <script> :
" <expr> :
" <unique> :
" <nowait>举例:有一个"imap <nowait> ,w week"按键映射,但还有一个"imap ,wl weekly"
" 前一个imap加入了<nowait>的参数,那么输入",w"后就会理解匹配到第一个imap,
" 如果没有<nowait>参数,那么输入",w"后就会等待输入"l",如果输入了"l"那么就会匹配上第二个imap,
" 如果一直没有输入"l",那么就会超时,超时后才会匹配第一个imap
" 设置<leader>为空格键
let mapleader = "\<Space>"
" 更方便的进入命令模式
nnoremap <leader>; :
" 插入模式下快速移动光标
inoremap <C-H> <Left>
inoremap <C-J> <Down>
inoremap <C-K> <Up>
inoremap <C-L> <Right>
" 插入二合字符
" 默认是<C-K>,但已被上面的定义所占用
inoremap <Insert> <C-K>
" 快速移动到行首行尾
" 直接使用map命令从而全局不使用H,L的原功能
map H ^
map L $
" 可视模式下移动到行尾(不包含换行符)
vnoremap L $h
" 复制到系统剪切板
noremap <leader>y "+y
" 复制行到系统剪切板
noremap <leader>Y "+yy
" 剪切到系统剪切板
noremap <leader>d "+d
noremap <leader>x "+x
" 从系统剪切板粘贴
noremap <leader>p "+p
noremap <leader>P "+P
" 保存
nnoremap <leader>w :w<CR>
nnoremap <leader>W :w !sudo tee % > /dev/null<CR>
" :exit 类似于 :wq
nnoremap <leader>e :exit<CR>
" 保证搜索结果高亮,避免下面取消高亮后再次搜索没有高亮
nnoremap n :set hlsearch<CR>n
nnoremap N :set hlsearch<CR>N
nnoremap * :set hlsearch<CR>*
nnoremap # :set hlsearch<CR>#
" 取消搜索的高亮
nnoremap <leader><Space> :set nohlsearch<cr>
" 可视模式下搜索高亮的内容
" 向下搜索
vnoremap / y:set hlsearch<CR>/<C-R>"<CR>
" 向上搜索
vnoremap ? y:set hlsearch<CR>?<C-R>"<CR>
" 窗口切换
nnoremap <C-H> <C-W>h
nnoremap <C-J> <C-W>j
nnoremap <C-K> <C-W>k
nnoremap <C-L> <C-W>l
" 打开当前窗口的位置列表
nnoremap <leader>lo :lopen<cr>
" 关闭当前窗口的位置列表
nnoremap <leader>lc :lclose<cr>
" 跳转到当前窗口位置列表的下一项和前一项
" 当syntastic或ycm检测到语法错误时可使用此映射跳转下一个或前一个错误
nnoremap <leader>ln :lnext<cr>
nnoremap <leader>lp :lprevious<cr>
" 打开当前窗口的quickfix列表
nnoremap <leader>fo :copen<cr>
" 关闭当前窗口的quickfix列表
nnoremap <leader>fc :cclose<cr>
" 跳转到当前窗口quickfix列表的下一项和前一项
nnoremap <leader>fn :cnext<cr>
nnoremap <leader>fp :cprevious<cr>
" 删除当前buffer
" 如果有多个buffer则自动编辑之前的buffer或前一个buffer
" 如果只有当前一个buffer则删除后打开NERDTree(未启用, 如果需要取消下面 "NERDTreeFocus 的注释即可)
nnoremap <leader>q :call CloseCurrentBuffer()<CR>
function! CloseCurrentBuffer()
" 在处理buffer前先关闭预览,quickfix,位置列表这几个窗口,不然会有些问题
pclose
cclose
lclose
let l:bufsInfo = getbufinfo()
let l:bufsNrListed = []
for l:bufInfo in l:bufsInfo
if get(l:bufInfo, "listed") == 1
call add(l:bufsNrListed, get(l:bufInfo, "bufnr"))
endif
endfor
let l:bufsNrListedCount = len(l:bufsNrListed)
if l:bufsNrListedCount <= 1
execute "bw"
"NERDTreeFocus
else
if bufloaded(bufnr("#"))
execute "b#"
else
execute "bp"
endif
execute "bw #"
endif
endfunction
" 删除所有buffer
nnoremap <leader>bc :call CloseListedBuffers()<cr>
" 删除所有buffer,除了当前的
nnoremap <leader>bo :call CloseOtherBuffers()<cr>
" 切换到上一个buffer
nnoremap <leader>bp :bp<cr>
" 切换到下一个buffer
nnoremap <leader>bn :bn<cr>
" 切换到之前的buffer
nnoremap <leader>0 :b#<cr>
function! CloseListedBuffers()
" 在处理buffer前先关闭预览,quickfix,位置列表这几个窗口,不然会有些问题
pclose
cclose
lclose
let l:bufsInfo = getbufinfo()
for l:bufInfo in l:bufsInfo
if get(l:bufInfo, "listed") == 1
let l:bufNr = get(l:bufInfo, "bufnr")
if bufloaded(l:bufNr)
execute "bw" l:bufNr
endif
endif
endfor
NERDTreeFocus
endfunction
function! CloseOtherBuffers()
" 在处理buffer前先关闭预览,quickfix,位置列表这几个窗口,不然会有些问题
pclose
cclose
lclose
let l:bufsInfo = getbufinfo()
for l:bufInfo in l:bufsInfo
if get(l:bufInfo, "listed") == 1
let l:bufNr = get(l:bufInfo, "bufnr")
if l:bufNr != bufnr("%")
if bufloaded(l:bufNr)
execute "bw" l:bufNr
endif
endif
endif
endfor
endfunction
"###########################安装/加载插件:plugins##########################
" 使用vim-plug插件管理器
" vim-plug的简要使用方法:
" 命令:
" :PlugInstall 安装列表中的插件
" :PlugUpdate 安装/升级列表中的插件
" :PlugUpgrade 更新vim-plug这个插件管理器
" :PlugStatus 查看插件状态
" :PlugClean 删除一些未使用的插件,删除前会询问
" 安装或加载插件时的一些选项:
" do 当安装/更新插件后的回调命令:系统命令或定义的一个方法
" 例:Plug '插件', { 'do': './install.py' }
" 例:Plug '插件', { 'do': function('自定义方法名') }
" on 当在vim中执行某个命令时才加载这个插件
" 例:Plug '插件', { 'on': '命令' }
" 例:Plug '插件', { 'on': ['命令1', '命令2'] }
" for 当打开某个类型的文件时才加载这个插件
" 例:Plug '插件', { 'for': '文件类型' }
" 例:Plug '插件', { 'for': ['文件类型1','文件类型2'] }
" 也可以同时使用上述另个选项:
" 例:Plug '插件', { 'on': '命令', 'for': '文件类型' }
" 开始插件加载,括号中的是插件的安装和加载目录
" 每个插件下面的是对这个插件的设置
call plug#begin('~/.vim/vim-plug')
"##########
" fcitx.vim
" 记住fcitx在插入模式的中英状态
" 按ESC键后设置fcitx为英文,进入插入模式后设置为上次离开是的中英状态
" 只适用于unix/linux系统
if has('unix')
Plug 'lilydjwg/fcitx.vim'
endif
"##########
" vinfo
" 在vim中使用linux下info命令
if has('unix')
Plug 'alx741/vinfo'
endif
" smartim
" 功能和上面的fctix.vim插件相同
" 但只适用于mac osx系统
if has('mac')
Plug 'ybian/smartim'
endif
"##############
" vim-signature
" 实现并扩展了vim自身所有的mark功能,每行可以放置多个标记
" 在最左边显示当前行的标记,超过两个标记只显示后两个
Plug 'kshenoy/vim-signature'
" 下面是这个插件的一些按键:
" mx 切换当前行的'x'标记,'x'属于a-zA-Z
" dmx 不管当前光标在哪儿,删除'x'这个标记
" m, 放置下一个可用的标记在当前行
" m. 同上,但如果当前行已存在标记就删除它,如果存在多个就删除第一个
" m- 删除当前行的所有标记
" m<Space> 删除当前buffer的所有标记
" ]` 跳转到下一个标记
" ]' 跳转到下一个标记的行首
" [` 跳转到上一个标记
" [' 跳转到上一个标记的行首
" `] 按标记的字母顺序跳转到下一个标记
" '] 按标记的字母顺序跳转到下一个标记的行首
" `[ 按标记的字母顺序跳转到上一个标记
" '[ 按标记的字母顺序跳转到上一个标记的行首
" m/ 打开一个本地列表窗口来显示当前buffer的所有标记
" 以下为类型标记按键,不同行可以是同一种类型标记,同一行可以既有类型标记又有字母标记
" 其中的数字分别对应:'!@#$%^&*()',每一个符号都是一种类型
" m[0-9] 切换当前行的类型标记
" m<S-[0-9]> 不管光标在哪儿,删除对应的所有此类标记
" ]- 跳转到下一个同类型的标记
" [- 跳转到上一个同类型的标记
" ]= 跳转到下一个类型标记,不管哪种类型
" [= 跳转到上一个类型标记,不管哪种类型
" m? 打开一个本地列表窗口来显示当前buffer的所有类型标记
" m<BS> 删除当前buffer的所有类型标记
"############
" vim-airline
" 高度可定制的状态栏
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'
" 标签栏
let g:airline#extensions#tabline#enabled = 1
" 显示标签栏序号以及标签内有多少窗口
let g:airline#extensions#tabline#tab_nr_type = 2
" 标签栏符号
let g:airline#extensions#tabline#left_sep = ''
let g:airline#extensions#tabline#left_alt_sep = ''
let g:airline#extensions#tabline#right_sep = ''
let g:airline#extensions#tabline#right_alt_sep = ''
" 只显示文件名,不显示路径(:h :p查看相关帮助)
let g:airline#extensions#tabline#fnamemod = ':t'
" 标签栏切换按键(当只有buffer时也可用于切换buffer)
let g:airline#extensions#tabline#buffer_idx_mode = 1
nmap <leader>1 <Plug>AirlineSelectTab1
nmap <leader>2 <Plug>AirlineSelectTab2
nmap <leader>3 <Plug>AirlineSelectTab3
nmap <leader>4 <Plug>AirlineSelectTab4
nmap <leader>5 <Plug>AirlineSelectTab5
nmap <leader>6 <Plug>AirlineSelectTab6
nmap <leader>7 <Plug>AirlineSelectTab7
nmap <leader>8 <Plug>AirlineSelectTab8
nmap <leader>9 <Plug>AirlineSelectTab9
nmap <leader>- <Plug>AirlineSelectPrevTab
nmap <leader>= <Plug>AirlineSelectNextTab
" 主题
let g:airline_theme='minimalist'
" 自定义符号
if !exists('g:airline_symbols')
let g:airline_symbols = {}
endif
" powerline符号
let g:airline_left_sep = ''
let g:airline_left_alt_sep = ''
let g:airline_right_sep = ''
let g:airline_right_alt_sep = ''
let g:airline_symbols.branch = ''
let g:airline_symbols.readonly = ''
let g:airline_symbols.linenr = '☰'
let g:airline_symbols.maxlinenr = ''
" 编辑下列文件类型的文件时显示文字总数
" 多个文件类型用'|'号隔开
" 在 centos 6.10 系统下会导致插件启动报错
"let g:airline#extensions#wordcount#filetypes = '\vtext|mail'
" 显示ycm检查到的错误和警告的数量
let g:airline#extensions#ycm#enabled = 1
let g:airline#extensions#ycm#error_symbol = 'YCM: Ec:'
let g:airline#extensions#ycm#warning_symbol = 'YCM: Wc:'
" 开关airline
nnoremap <leader>at :AirlineToggle<cr>
" 重新加载airline
nnoremap <leader>ar :AirlineRefresh<cr>
" 开关whitespace检查(默认关闭该检查功能)
let g:airline#extensions#whitespace#enabled = 0
nnoremap <leader>aw :AirlineToggleWhitespace<cr>
"##########
" ultisnips
" 快速插入代码片段
" 会在ycm弹出的补全菜单中包含又<snip>字样的补全项
" 这些补全项可以插入一段代码,要插入这种补全项需要输入这一项在补全菜单中的完整文字,
" 或者使用上面ycm定义的上下移动键移动到要使用的代码段,然后按<tab>键,即可展开片段
" 代码引擎
Plug 'SirVer/ultisnips'
" 代码片段
Plug 'honza/vim-snippets'
" 很多虚拟终端不会发送<c-tab>以及<s-tab>到程序,所以应该避免映射这种按键
" 插入模式下使用tab键插入代码片段
let g:UltiSnipsExpandTrigger="<tab>"
" 插入模式下使用s-tab键列出所有的可选片段供选择
let g:UltiSnipsListSnippets="<s-tab>"
" 在展开代码片段后使用tab键跳转需要修改的关键部分(如果有的话)
let g:UltiSnipsJumpForwardTrigger="<tab>"
" 类似上面的定义,但是反向移动
let g:UltiSnipsJumpBackwardTrigger="<s-tab>"
" 可以使用:UltiSnipsEdit命令自定义供补全的代码片段,其保存到下面指定的目录下
let g:UltiSnipsSnippetsDir = '~/.vim/UltiSnips'
" 当使用:UltiSnipsEdit命令时在一个垂直新建的窗口中编写
let g:UltiSnipsEditSplit="vertical"
"###########
" nerdtree
" 文件管理
Plug 'scrooloose/nerdtree'
" 显示隐藏文件(dotfiles)
let NERDTreeShowHidden=1
" 按<F2>开关nerdtree
nnoremap <F2> :NERDTreeToggle<CR>
inoremap <F2> <ESC>:NERDTreeToggle<CR>
"###########
" easymotion
" 快速移动到某一位置
Plug 'easymotion/vim-easymotion'
" 智能大小写
let g:EasyMotion_smartcase = 1
map \ <Plug>(easymotion-prefix)
map <leader>s <Plug>(easymotion-prefix)s
map f <Plug>(easymotion-prefix)f
map F <Plug>(easymotion-prefix)F
map t <Plug>(easymotion-prefix)t
map T <Plug>(easymotion-prefix)T
"##############
" ale
" 异步检查代码插件
Plug 'w0rp/ale', { 'for': ['dosbatch','sh','zsh','python','go'] }
" 用于检查python的工具, pylint
" python2:pylint2, python3:pylint3
let g:ale_python_pylint_executable = 'pylint3'
" 启动golang语法检查
let g:ale_linters = {
\ 'go' : ['gometalinter', 'gofmt'],
\ 'zsh' : ['shellcheck']
\ }
" 修改默认的提示符颜色
" 使用:highlight-link查看link子命令的帮助
hi link ALEErrorSign ErrorMsg
hi link ALEWarningSign WarningMsg
" 强制ale进行语法检查(没什么必要)
nnoremap <leader>ac :ALELint<cr>
"##############
" vim-fswitch
" c/cpp头文件切换
Plug 'derekwyatt/vim-fswitch', { 'for': ['c','cpp'] }
map <f4> :FSHere<cr>
"##############
" YouCompleteMe
" 一个多功能的自动补全插件
" 支持c系列,python,go,TypeScript,JavaScript,rust语言补全,
" 支持文件目录/文件名补全
" 支持从vim的omnifunc接收数据补全
" 支持上下文变量以及tags文件补全
" 支持UltiSnips的snippet补全(一个快速插入整块代码的插件)
" 异常强大,但需要手动编译,编译的时候可以选择性的编译上述特性
" 需要注意的是如果vim-plug更新了YCM,那么就有可能需要重新编译
Plug 'Valloric/YouCompleteMe', { 'for': ['java','c','cpp','dosbatch','sh','zsh','python','html','xhtml','go','javascript'] }
" 为YCM生成ycm_extra_conf文件
Plug 'rdnetto/YCM-Generator', { 'branch': 'stable', 'for': ['java','c','cpp','dosbatch','sh','python','html','xhtml','go'] }
" 只需要输入一个字符就触发补全
let g:ycm_min_num_of_chars_for_completion = 1
" 当没有找到打开的文件或项目的'.ycm_extra_conf.py'时使用哪个作为默认的
let g:ycm_global_ycm_extra_conf = '~/dotfiles/ycm_extra_conf-default.py'
" 加载自定义'.ycm_extra_conf.py'不再询问
let g:ycm_confirm_extra_conf = 0
" 使用ctrl-j或下键或ctrl-n在补全菜单中向下移动
let g:ycm_key_list_select_completion = ['<C-N>']
" 使用ctrl-k或上键或ctrl-p在补全菜单中向上移动
let g:ycm_key_list_previous_completion = ['<C-P>']
" 编辑注释时也自动补全
let g:ycm_complete_in_comments = 1
" 从注释和字符串中收集可补全关键字
let g:ycm_collect_identifiers_from_comments_and_strings = 1
" 将补全项的详细信息放入预览窗口中
let g:ycm_add_preview_to_completeopt = 1
" 当接受补全项之后关闭预览窗口
"let g:ycm_autoclose_preview_window_after_completion = 1
" 当离开插入模式后,自动关闭用于显示补全项详细信息的预览窗口(上面的选项启用时这个选项可能无效)
"let g:ycm_autoclose_preview_window_after_insertion = 1
" 当使用下面定义的GoTo*系列快捷键时使用垂直分割打开新窗口显示数据
"let g:ycm_goto_buffer_command = 'vertical-split'
" 指定ycmd使用的py版本, 必须是编译ycm时所用的以及vim支持的py版本
let g:ycm_server_python_interpreter = 'python3'
" 指定ycm client使用的python版本(也是jedi使用的python版本)
let g:ycm_python_binary_path = 'python3'
" ycm语法检查相关的功能,此功能目前(2019-04-07)支持以下语言:
" C-family, C#, Java, JavaScript, TypeScript
" 注意此功能有可能与其他语法检查插件冲突如:syntastic,ale
" 如果要关闭ycm的语法检查功能就取消注释下面这行配置
"let g:ycm_show_diagnostics_ui = 0
" 自动将错误信息放入位置列表
let g:ycm_always_populate_location_list = 1
" 语法错误或警告时使用的提示字符
let g:ycm_error_symbol = ">>"
let g:ycm_warning_symbol = "??"
" 定义上述提示字符的颜色(默认的看着不舒服)
" 此处没有重新定义颜色组,而是使用了已定义好的"ErrorMsg"或"WarningMsg"组
highlight link YcmErrorSign ErrorMsg
highlight link YcmWarningSign ErrorMsg
" 以下映射对应命令生效的对象一般是光标下的变量或者方法
" 不是所有命令适用于所有语言,具体是否支持应该查阅 YCM 的 README
" 跳转到头文件
nnoremap <leader>gi :YcmCompleter GoToInclude<CR>
" 跳转到声明
nnoremap <leader>gdc :YcmCompleter GoToDeclaration<CR>
" 跳转到定义
nnoremap <leader>gdf :YcmCompleter GoToDefinition<CR>
" 跳转到声明或定义
nnoremap <leader>gg :YcmCompleter GoTo<CR>
" 跳转到引用
nnoremap <leader>grf :YcmCompleter GoToReferences<CR>
" 获取类型信息
nnoremap <leader>gt :YcmCompleter GetType<CR>
" 获取父类信息
nnoremap <leader>gp :YcmCompleter GetParent<CR>
" 获取相关文档
nnoremap <leader>go :YcmCompleter GetDoc<CR>
" 快速修复检测到的语法错误
nnoremap <leader>gf :YcmCompleter FixIt<CR>
" 重构之重命名
nnoremap <leader>grr :YcmCompleter RefactorRename
" 强制进行语法检查
nnoremap <leader>gc :YcmForceCompileAndDiagnostics<CR>
" 打开错误位置列表窗口
nnoremap <leader>ge :YcmDiags<CR>
"####################
" previm
" 执行PrevimOpen命令在浏览器中实时预览所编写的markdown文件
Plug 'kannokanno/previm', { 'for': 'markdown' }
let g:previm_open_cmd = 'xdg-open'
"############
" vim-quickrun
" 快速运行当前文件或选中的行
Plug 'thinca/vim-quickrun', { 'for': ['sh','java','c','cpp','python','go'] }
" 按F5按默认配置快速启动
nmap <F5> <Plug>(quickrun)
" 为了避免运行时无法进行交互
" 所以设置runner为shell, 默认为system
let g:quickrun_config = {
\ "_" : {
\ "runner" : "shell",
\ },
\}
"######
" tagbar
" 以对象的方式显示当前文件中的类,变量,方法,等
Plug 'majutsushi/tagbar', { 'for': ['vim','java','c','cpp','python','go'] }
" 默认按照tag在文件中出现的顺序排序,在tagbar中按s可临时改为使用名字排序
let g:tagbar_sort = 0
" 按<F8>开关tag窗口
nnoremap <F8> :TagbarToggle<CR><C-W>b
nnoremap <leader>t :TagbarShowTag<CR>
" 增加对于golang的支持(方法1)
" 需要安装外部工具: go get -u github.com/jstemmer/gotags
" 使用go安装gotags,安装完成之后可执行文件gotags一般在$HOME/go/bin目录下,需将其加入$PATH环境变量中
let g:tagbar_type_go = {
\ 'ctagstype' : 'go',
\ 'kinds' : [
\ 'p:package',
\ 'i:imports:1',
\ 'c:constants',
\ 'v:variables',
\ 't:types',
\ 'n:interfaces',
\ 'w:fields',
\ 'e:embedded',
\ 'm:methods',
\ 'r:constructor',
\ 'f:functions'
\ ],
\ 'sro' : '.',
\ 'kind2scope' : {
\ 't' : 'ctype',
\ 'n' : 'ntype'
\ },
\ 'scope2kind' : {
\ 'ctype' : 't',
\ 'ntype' : 'n'
\ },
\ 'ctagsbin' : 'gotags',
\ 'ctagsargs' : '-sort -silent'
\ }
" 增加对于golang的支持(方法2)
" 这种方法依赖debian系列的exuberant-ctags包(已经包含了对于golang的tag支持补丁)
" 这种方式虽然简单但是不支持作用于支持, 推荐上一种方式
" let g:tagbar_type_go = {
" \ 'ctagstype': 'go',
" \ 'kinds' : [
" \'p:package',
" \'f:function',
" \'v:variables',
" \'t:type',
" \'c:const'
" \]
" \}
"##############
" vim-qt-assistant
" c/cpp头文件切换
Plug 'listenerri/vim-qt-assistant', { 'for': ['cpp'] }
noremap <f1> :call GetDocFromAssistant()<cr>
"##############
" vim-multiple-cursors
" 实现同时编辑多个位置
" 使用<c-n>开始选择位置, <c-p>取消当前的选择,返回上一个
" <c-x>跳过下一个匹配, <esc>终止操作
" 选择完毕之后可以使用I,A,c,s开始是修改所有选择的位置
Plug 'terryma/vim-multiple-cursors'
"##############
" vim-easygrep
Plug 'listenerri/vim-easygrep', { 'branch': 'ag-recursive-switch' }
" 使用grepprg选项指定的外部命令搜索
"set grepprg=ack
set grepprg=ag\ -U\ $*
let g:EasyGrepCommand = 1
" 设置使用替换命令Replace时的窗口模式
let g:EasyGrepReplaceWindowMode = 2
" 哪些文件或目录需要排除
let g:EasyGrepFilesToExclude = ".svn,.git,build"
" 默认递归搜索
let g:EasyGrepRecursive = 1
" 在结果中列出同一行的多个匹配项
let g:EasyGrepEveryMatch = 1
" 不自动跳转到第一个匹配项
let g:EasyGrepJumpToMatch = 0
" 结果列表窗口在哪里出现
let EasyGrepWindowPosition = "rightbelow"
" 快速设置EasyGrep选项的前缀(默认是'<leader>vy')
" 按下前缀后再按一个代表对应选项的字母就可以切换该选项(如递归,大小写等)
" 具体有哪些字母(选项)可以打开选项列表查看(在选项列表中按?显示更多选项)
let g:EasyGrepOptionPrefix = '<leader>fs'
" 打开选项列表(options list)
nmap <leader>fl <plug>EgMapGrepOptions
" 下面的按键含有大写的表示搜索时使用'whole word'模式
" vnoremap的表示在可视模式下搜索选择的内容
" nnoremap的表示搜索光标下的单词
" f: 搜索并将结果展示在列表中
" a: 搜索并将结果追加在列表中
" r: 搜索并替换(交互模式)
nmap <leader>ff <plug>EgMapGrepCurrentWord_v
vmap <leader>ff <plug>EgMapGrepSelection_v
nmap <leader>fF <plug>EgMapGrepCurrentWord_V
vmap <leader>fF <plug>EgMapGrepSelection_V
nmap <leader>fa <plug>EgMapGrepCurrentWord_a
vmap <leader>fa <plug>EgMapGrepSelection_a
nmap <leader>fA <plug>EgMapGrepCurrentWord_A
vmap <leader>fA <plug>EgMapGrepSelection_A
nmap <leader>fr <plug>EgMapReplaceCurrentWord_r
vmap <leader>fr <plug>EgMapReplaceSelection_r
nmap <leader>fR <plug>EgMapReplaceCurrentWord_R
vmap <leader>fR <plug>EgMapReplaceSelection_R
" NERD-Commenter
" 提供注释功能
Plug 'scrooloose/nerdcommenter', { 'for': ['vim','java','c','cpp','dosbatch','sh','python','html','xhtml','go'] }
map <c-_> <plug>NERDCommenterToggle
" qt相关插件
" qt语法高亮
Plug 'kosl90/qt-highlight-vim'
" qmake语法高亮
Plug 'vim-scripts/qmake--syntax.vim'
" 设置类似pro,pri等文件的filetype为qmake,以激活这个语法高亮插件
au BufReadPost *.pr? setfiletype qmake
" git 插件
Plug 'tpope/vim-fugitive'
" DoxygenToolkit.vim
" doxygen文档注释插件
Plug 'vim-scripts/DoxygenToolkit.vim', { 'for': ['c','cpp','python'] }
let g:DoxygenToolkit_briefTag_pre = "\\brief "
let g:DoxygenToolkit_templateParamTag_pre = "\\tparam "
let g:DoxygenToolkit_paramTag_pre = "\\param "
let g:DoxygenToolkit_returnTag = "\\return "
let g:DoxygenToolkit_throwTag_pre = "\\throw " " @exception is also valid
let g:DoxygenToolkit_fileTag = "\\file "
let g:DoxygenToolkit_authorTag = "\\author "
let g:DoxygenToolkit_dateTag = "\\date "
let g:DoxygenToolkit_versionTag = "\\version "
let g:DoxygenToolkit_blockTag = "\\name "
let g:DoxygenToolkit_classTag = "\\class "
" 添加两个命令用于中英文标记
command! -nargs=0 Doe :call DoxygenCommentFuncEnglish()
command! -nargs=0 Doc :call DoxygenCommentFuncChinese()
function! DoxygenCommentFuncEnglish()
let g:DoxygenToolkit_interCommentTag = "* \\~english "
let g:DoxygenToolkit_interCommentBlock = "* \\~english "
Dox
endfunction
function! DoxygenCommentFuncChinese()
let g:DoxygenToolkit_interCommentTag = "* \\~chinese "
let g:DoxygenToolkit_interCommentBlock = "* \\~chinese "
Dox
endfunction
" 结束插件加载
call plug#end()
" ##########################自动命令设置:autocmds##########################
" 启动vim后如果当前文件不存在则打开NERDTree
function! TryToOpenNERDTree()
if !filereadable(glob("%"))
NERDTree
endif
endfunction
"au VimEnter * call TryToOpenNERDTree()
" 让theme/qss文件使用css的语法高亮(主要针对qt)
au BufReadPost *.theme,*.qss setfiletype css
" 让qrc文件使用xml的语法高亮(主要针对qt)
au BufReadPost *.qrc setfiletype xml
" 启用TermDebug
au Filetype c,cpp packadd termdebug
" 自动保存和恢复一些vim的状态, 如光标位置, 折叠状态等待
au BufWinLeave * silent! mkview
au BufWinEnter * silent! loadview