forked from aben1188/vim
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path_vimrc
1101 lines (972 loc) · 37.4 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
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 以下为Vim插件管理工具Vundle的设置(要求放在vimrc的最前面)
set nocompatible " be iMproved, required
filetype off " required
" set the runtime path to include Vundle and initialize
set runtimepath+=$VIM/vimfiles/bundle/Vundle.vim |" Vundle.vim为文件夹
" 插件的安装路径(若不指定vundle#begin()中的路径,默认为C:\users\***\.vim)
call vundle#begin('$VIM/vimfiles/bundle')
"set runtimepath+=$HOME/vimfiles/bundle/Vundle.vim/
"call vundle#begin('$HOME/vimfiles/bundle/')
"call vundle#begin()
"call vundle#begin('$USERPROFILE/vimfiles/bundle/')
" alternatively, pass a path where Vundle should install plugins
"call vundle#begin('~/some/path/here')
" let Vundle manage Vundle, required
Plugin 'VundleVim/Vundle.vim'
"" The following are examples of different formats supported.
"" Keep Plugin commands between vundle#begin/end.
"" plugin on GitHub repo
Plugin 'scrooloose/nerdtree'
" 需先安装powerline、airline专用字体(已下载保存,Everything搜索即可找到)
Plugin 'vim-airline/vim-airline'
Plugin 'vim-airline/vim-airline-themes'
" 插件easymotion默认的快捷键
" <LEADER><LEADER>w:跳转到当前光标后的某个单词
" <LEADER><LEADER>b:跳转到当前光标前的某个单词
" <LEADER><LEADER>s:双向跳转到所输入的单个字符(单个字母或单个汉字)
" <LEADER><LEADER>j:跳转到光标下面的某行
" <LEADER><LEADER>k:跳转到光标上面的某行
Plugin 'easymotion/vim-easymotion'
Plugin 'bsdelf/bufferhint'
" ShowMarks provides a visual representation of the location marks
" by placing a sign in the leftmost column of the buffer.
" The sign indicates the label of the mark and its location.
" ShowMarks的快捷键
" <LEADER>mt - Toggle whether marks are displayed or not.
" <LEADER>mo - Turn ShowMarks on, and displays marks.
" <LEADER>mh - Clear mark on current line.
" <LEADER>ma - Clear all marks.
" <LEADER>mm - Places next available mark.
" ShowMarks的配置(Configuration)
" Don't open ShowMarks with CursorHold autocommand.
"let g:showmarks_auto_toggle=0
" Disable default key mappings.
"let g:showmarks_no_mappings=1
" Only handle 'abcdBA' marks. When using :ShowMarksPlaceMark,
" marks earlier in this list take precedence over latters.
"let g:showmarks_include="abcdBA"
" Don't use ShowMarks with help files.
"let g:showmarks_ignore_type="h"
" Display lowercase marks with a ">" suffix.
"let g:showmarks_textlower="\t>"
" Highlight entire line where a lowercase mark is on.
"let g:showmarks_hlline_lower=1
Plugin 'bootleq/ShowMarks'
Plugin 'tpope/vim-surround'
"Plugin 'tpope/vim-fugitive'
"" plugin from http://vim-scripts.org/vim/scripts.html
"Plugin 'L9'
"" Git plugin not hosted on GitHub
"Plugin 'git://git.wincent.com/command-t.git'
"" git repos on your local machine (i.e. when working on your own plugin)
"Plugin 'file:///home/gmarik/path/to/plugin'
"" The sparkup vim script is in a subdirectory of this repo called vim.
"" Pass the path to set the runtimepath properly.
"Plugin 'rstacruz/sparkup', {'rtp': 'vim'}
"" Install L9 and avoid a Naming conflict if you've already installed a
"" different version somewhere else.
"Plugin 'ascenator/L9', {'name': 'newL9'}
" All of your Plugins must be added before the following line
call vundle#end() " required
filetype plugin indent on " required
" To ignore plugin indent changes, instead use:
"filetype plugin on
"
" Brief help
" :PluginList - lists configured plugins
" :PluginInstall - installs plugins; append `!` to update or just :PluginUpdate
" :PluginSearch foo - searches for foo; append `!` to refresh local cache
" :PluginClean - confirms removal of unused plugins; append `!` to auto-approve removal
" 注:要删除一个由Vundle管理的插件,需要先删除或注释掉“Plugin '插件名'”,然
" 后再执行:PluginClean命令,才会将不再由Vundle管理的插件删除,否则无法删除
"
" see :h vundle for more details or wiki for FAQ
" Put your non-Plugin stuff after this line
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 以上为Vim插件管理工具Vundle的设置
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"**************************************************************
"set nocompatible
source $VIMRUNTIME/vimrc_example.vim
source $VIMRUNTIME/mswin.vim
behave mswin
set diffexpr=MyDiff()
function MyDiff()
let opt='-a --binary '
if &diffopt=~ 'icase' | let opt=opt . '-i ' | endif
if &diffopt=~ 'iwhite' | let opt=opt . '-b ' | endif
let arg1=v:fname_in
if arg1=~ ' ' | let arg1='"' . arg1 . '"' | endif
let arg2=v:fname_new
if arg2=~ ' ' | let arg2='"' . arg2 . '"' | endif
let arg3=v:fname_out
if arg3=~ ' ' | let arg3='"' . arg3 . '"' | endif
let eq=''
if $VIMRUNTIME=~ ' '
if &sh=~ '\<cmd'
let cmd='""' . $VIMRUNTIME . '\diff"'
let eq='"'
else
let cmd=substitute($VIMRUNTIME, ' ', '" ', '') . '\diff"'
endif
else
let cmd=$VIMRUNTIME . '\diff'
endif
silent execute '!' . cmd . ' ' . opt . arg1 . ' ' . arg2 . ' > ' . arg3 . eq
endfunction
"**************************************************************
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" General
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
set runtimepath+=$vim/vim74/plugin
" Sets how many lines of history VIM has to remember
set history=200
" Enable filetype plugins
" filetype命令:Vim会检测要编辑的文件类型。这是通过检查文件名完成的,
" 有时候也检查文本里是否包含特定的文本。每次一个新的或者已经存在的
" 文件被编辑时,Vim会试图识别文件的类型,并设置filetype选项。同时,
" 也触发FileType事件。该事件可以设置语法高亮、特定选项等等。
"filetype plugin on
"filetype indent on
" 文件在Vim外被改动时自动重新读入;但文件在外部被删除则不重新读入
set autoread
" With a map leader it's possible to do extra key combinations
" like <LEADER>w saves the current file
let mapleader="\<space>"
" 设置窗口启动位置:x轴 y轴【左上角为:x=0 y=0】
winpos 930 675
" 设置窗口大小:行和列
"let windowlines=25
"let windowcolumns=86
"set lines=25
"set comlumns=86
"set lines=&windowlines columns=&windowcolumns
set lines=25 columns=86
" 光标上下移动时,屏幕上保留的最少屏幕行数
set scrolloff=2
" 增强模式命令行补全,按下wildchar(默认<Tab>)启动补全
set wildmenu
" Height of the command bar
"set cmdheight=2
" 命令行窗口高度(屏幕行数)
set cmdwinheight=20
" A buffer becomes hidden when it is abandoned
set hidden
" Configure backspace so it acts as it should act
set whichwrap+=<,>,h,l
" Ignore case when searching
set ignorecase
" When searching try to be smart about cases
set smartcase
" Don't redraw while executing macros (good performance config)
set lazyredraw
" Show matching brackets when text indicator is over them
set showmatch
" How many tenths of a second to blink when matching brackets
set matchtime=1
" No annoying sound on errors
set noerrorbells
set novisualbell
set t_vb=
set timeoutlen=800
" don't add two spaces after ., ?, !
set nojoinspaces
"" set g as default when substitute
"set gdefault
" 定义使用<C-A>和<C-X>(Windows下已分别改为<C-I>和<C-D>)命令加减数值时使用的
" 基底:alpha,如果包含,单个字母会被递增和递减,这可用于使用字母索引的列表
" a)、b)等等;octal,如果包含,零开始的数值认为是八进制,如在"007"上用C-A
" 得到"010";hex,如果包含,"0x"或"0X"开头的数值认为是十六进制,如在"0x100"
" 上用C-X得到"0x0ff"。以1-9开始的数值总被认为是十进制的。octal与hex默认包含。
set nrformats+=alpha
" 高亮显示光标所在行
set cursorline
" 高亮显示光标所在列【简写:设置 cuc;取消 nocuc】
"set cursorcolumn
" Default Colors for CursorLine
"highlight CursorLineNr guifg=red
" 这一行跟某未知脚本有冲突,放到
" colorshceme文件(desert.vim)中才解决
"highlight LineNr guifg=Brown
" Change Color when entering Insert Mode
" au[tocmd] [group] {event} {pat} [nested] {cmd}:把{cmd}加到Vim在匹配{pat}
" 模式的文件执行{event}事件时自动执行的命令列表中。Vim总把{cmd}加到已有的
" 自动命令之后,这样保证自动命令的执行顺序与其定义的顺序相同。
autocmd InsertEnter * highlight LineNr guifg=Red
autocmd InsertEnter * set cursorcolumn
autocmd InsertEnter * highlight statusline guifg=Red
" Revert Color to default when leaving Insert Mode
autocmd InsertLeave * highlight LineNr guifg=#909194
autocmd InsertLeave * set nocursorcolumn
autocmd InsertLeave * highlight statusline guifg=NONE
" 设置光标不闪烁
set gcr=a:block-blinkon0
" 添加行号
set number
" 添加相对行号
set relativenumber
" 下列移动命令移动光标时,不回到行首第一个非空白字符,
" 而是尽量保持在同一列上(如果可能的话):
" C-B、C-F、C-D、C-U、G、H、M、L、gg、d、<<、>>、带计数的%、
" 缓冲区改变命令(CTRL-^、:bnext、:bNext等)、:25、:+、:-等
set nostartofline
"" 设置默认编码
"set encoding=utf-8
"set fileencodings=utf-8,chinese,latin-1
"if has("win32")
" set fileencoding=chinese
"else
" set fileencoding=utf-8
"endif
"
"" 解决菜单乱码
"source $VIMRUNTIME/delmenu.vim
"source $VIMRUNTIME/menu.vim
"
"" 解决console输出乱码
"language messages zh_CN.utf-8
" 配置多语言环境,解决中文乱码问题
if has("multi_byte")
" Vim内部使用的编码
set encoding=utf-8
" Windows下的gVim其键盘输入和屏幕显示均不依赖termencoding
"set termencoding=utf-8
" 自动排版时的格式选项
set formatoptions+=mM
" 读文件时Vim自动侦测文件编码方式的编码列表项,
" prc(等同于chinese)即Windows下的cp936、Unix下的euc-cn
set fileencodings=ucs-bom,utf-8,prc,gb18030,taiwan,japan,korea,latin1
" 处理CJK东亚二义性宽度字符类 (East Asian Width Class Ambiguous)
" 例如,欧元符号、注册记号、版权记号、希腊字母、西里尔字母等等
if v:lang=~? '^/(zh/)/|/(ja/)/|/(ko/)'
set ambiwidth=double
endif
if has("win32")
" 解决菜单乱码
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
" 解决console输出乱码
language messages zh_CN.utf-8
endif
else
echoerr "Sorry, this version of (g)vim was not compiled with +multi_byte"
endif
" 改配色,默认的白色太过刺眼
"colorscheme desert
"colorscheme morning
"colorscheme evening
colorscheme dracula
" 打开语法高亮功能(dracula颜色方案需要打开)
" syntax on会覆盖已有的颜色,而syntax enable会保持当前已有的色彩设置,
" 只设置没有设置过的组;这样不管在使用此命令的前后,都可设置自己喜欢的颜色。
syntax on
"syntax enable
" 可视模式下选择文本时即使不进行复制、删除等操作,
" 也自动将选择文本保存到"*寄存器(系统剪贴板,
" windows系统中,与"+寄存器等同),因此可少一个步骤
"set guioptions+=a
" 指定Vim窗口顶部每个标签页标签的内容
set guitablabel=%M\ %t
" 使"*寄存器(系统剪贴板寄存器)等效于""无名寄存器(Vim默认寄存器),
" 以便与Windows共用剪贴板;不过,在实际使用过程中发现,
" Vim中的删除操作可直接粘贴于其他程序,复制操作却不行;
" 而其他程序中的复制、删除操作,则均可在Vim中直接粘贴。
set clipboard=unnamed
" 快捷键映射 {
" facilitate screen move
" 滚动整屏
"nnoremap <S-CR> :let b:curPos=getpos(".")<CR> <C-F> :call setpos(".", b:curPos)<CR> :unlet b:curPos<CR>
"nnoremap <S-CR> <C-F>zz
nnoremap <S-CR> <C-D><C-D>
"nnoremap <S-BS> :let b:curPos=getpos(".")<CR> <C-B> :call setpos(".", b:curPos)<CR> :unlet b:curPos<CR>
"nnoremap <S-BS> <C-B>zz
nnoremap <S-BS> <C-U><C-U>
" 滚动半屏
nnoremap <C-CR> <C-D>
nnoremap <C-BS> <C-U>
nnoremap <C-J> <C-D>
nnoremap <C-K> <C-U>
"nnoremap <SPACE><SPACE> <C-D>
"nnoremap <S-SPACE><SPACE> <C-U>
" 滚动一行
nnoremap <C-S-CR> <C-E>gj
nnoremap <C-S-BS> <C-Y>gk
"nnoremap <DOWN> <C-E>
"nnoremap <UP> <C-Y>
" 移动光标,不滚屏(<CR>普通模式下为向下移动光标,但<BS>为逐字符移动光标)
nnoremap <BS> k
" redo重做命令
nnoremap U <C-R>
" Treat long lines as break lines(按显示行逐行移动,而非按文本行),
" 并且设定为文本逐行滚动,而非光标逐行移动(光标相对屏幕的位置
" 固定不动,按F3可切换这两种方式)
noremap j <C-E>gj
noremap k <C-Y>gk
" go to older jump position(contrast with Tab or C-I)
noremap <S-TAB> <C-O>
" 命令模式下,移动到当前行行首、行尾、行中
nnoremap <C-H> ^
nnoremap <C-L> $
noremap 0 ^
noremap - :call cursor(line("."), col("$")/2)<CR>
noremap = $
" 将命令行前导符由冒号:改为分号;
"nnoremap ; :
" 插入模式、命令行模式下移动、删除
inoremap <C-H> <LEFT>
inoremap <C-J> <DOWN>
inoremap <C-K> <UP>
inoremap <C-L> <RIGHT>
inoremap <C-D> <DELETE>
cnoremap <C-H> <LEFT>
cnoremap <C-J> <DOWN>
cnoremap <C-K> <UP>
cnoremap <C-L> <RIGHT>
cnoremap <C-D> <DELETE>
" 由于Windows下的<C-A>已被映射为全选功能,因此需重映射
" 注:默认<C-A>为增加光标所在字符的数值或字母,<C-X>反之
noremap <C-I> <C-A> |" I,Increase
noremap <C-D> <C-X> |" D,Decrease
" 插入模式下,回车为ESC;Shift+回车为回车
"inoremap <S-CR> <CR>
"inoremap <CR> <ESC>
" i、v、c模式下,jj返回正常模式
inoremap jj <ESC>
" 插入模式下,复制上、下行对应列字符
inoremap <C-BS> <C-Y>
inoremap <C-CR> <C-E>
" 切换标签页,与Windows中标签页切换的常规操作相同
nnoremap <C-TAB> gt
nnoremap <C-S-TAB> gT
" 分屏操作(多窗口操作)
" 由于VimScript中的注释以一个双引号开始,有时容易与
" 双引号字符串中的双引号混淆(有些命令后不能跟注释,因为
" 字符串优先于注释),因此,可在命令行后面的注释前加上
" 命令分隔符|(用于分隔放在单行上的多条Ex命令语句),以免出错
noremap ,c <C-W>c |" 关闭窗口
noremap ,s <C-W>s |" 水平分割窗口
noremap ,v <C-W>v |" 垂直分割窗口
noremap ,h <C-W>h |" 将光标移到左边窗口
noremap ,j <C-W>j |" 将光标移到下边窗口
noremap ,k <C-W>k |" 将光标移到上边窗口
noremap ,l <C-W>l |" 将光标移到右边窗口
noremap ,w <C-W>w |" 将光标移到下一个窗口
noremap <F5> <C-W>w|" 将光标移到下一个窗口
noremap ,H <C-W>H |" 将当前窗口移到左边
noremap ,J <C-W>J |" 将当前窗口移到上边
noremap ,K <C-W>K |" 将当前窗口移到下边
noremap ,L <C-W>L |" 将当前窗口移到右边
noremap ,= <C-W>= |" 使所有分窗口一样高
noremap ,+ <C-W>+ |" 增加当前窗口的高度
noremap ,- <C-W>- |" 减少当前窗口的高度
noremap ,> <C-W>> |" 增加当前窗口的宽度
noremap ,< <C-W>< |" 减少当前窗口的宽度
noremap ,T <C-W>T |" 将所有分窗口转换标签
" 可视模式下缩进/反缩进可视区域(选择区域)
vnoremap < <gv
vnoremap > >gv
" 将Y映射为从光标当前位置复制到行尾,
" 以与D、C等大写字母的行为统一起来;
" 并且将复制内容回显到命令行中。
" 其中,echom[sg] {expr1}:回显表达式的结果,将其作为一个
" 真正的消息,并把该消息保存在message-history里;和echo类似,
" 但不可显示的字符只回显而不会被解释;@0,在命令行模式和
" Ex模式中,@表示寄存器,不同于普通模式中以"表示寄存器
noremap Y y$ :echom "Copied Text: " . @0<CR>3h
nnoremap yy yy :echom "Copied Text: " . @0<CR>3h
vnoremap y y :echom "Copied Text: " . @0<CR>h
" 映射缓冲区管理插件bufferhint(查看、切换缓冲区)的快捷键
" 按\键可调出“缓冲区列表”窗口。再按一下,可以关闭;
" 缓冲区列表最左侧的一个或两个字母(hint key)与缓冲区关联,
" 按下字母,就能切换到对应的缓冲区(类似于Vimperator/Vimium/VimFx);
" 按|键可切回上一个缓冲区。当频繁地在某两个文件之间来回切换时,这很有用;
" 当光标在缓冲区列表里时,按q可关闭窗口,k和j可以上下移动;
" 另外,箭头键、<c-f>、<c-b>、<home>、<end>、gg、G也可移动光标;
" 查找只需像往常一样按下/,输入关键字,按n到下一个,按N到上一个,
" 当找到需要的缓冲区之后,回车就能打开;若想关闭光标下的缓冲区,按dd;
" 若想关闭视区内任一缓冲区,输入d及其对应的hint key,例如da,再回车;
" 当缓冲区列表首次打开时,按路径排序(左侧字母为黄色);按下空格键,
" 可把排序方式切换到Latest Recently Used(左侧字母变成绿色)。
noremap \ :call bufferhint#Popup()<CR>
" “|”必须转义,否则将被识别成语句分隔符,而导致出现“Unknown function:
" bufferhint#LoadPrevious”的错误,这是因为vimrc启动过程中bufferhint.vim
" 文件还未加载,所以找不到该函数而出错。
noremap \| :call bufferhint#LoadPrevious()<CR>
" 打开配置文件
map <F6> :edit $MYVIMRC<CR>
" 重载配置文件
map <F9> :source $MYVIMRC<CR>
" Move a line of text using ALT+[jk] or Comamnd+[jk] on mac
" 上下移动行(整行移动)
" mz,设置标记z;`z,精确移动到标记z所在的行与列;
" :m,移动整行(:[range]m[ove] {address},把[range]指定的行移动到{address}
" 给出的行之下);+/-,行号加1/减1;:m+,移动当前行到下一行的下面
" (相当于与下一行交换位置),:m-,移动当前行到上一行的下面(相当于
" 没有移动),m-2,移动当前行到上两行的下面(相当于与上一行交换位置)
nmap <M-j> mz:m+<CR>`z
nmap <M-k> mz:m-2<CR>`z
" '<,光标移动到上次可视区域首行行首,'>,光标移动到上次可视区域末行行首;
" 若上次可视区域非跨多行(2行或以上),而是单行或行内部分字符,'<和'>效果等同;
" `<,光标移动到上次可视区域的首字符,`>,光标移动到上次可视区域的末字符;
" 相较于'<和'>,`<和`>移动更为精确;o,可视模式下表示移动光标到可视区域的
" 另一侧(光标在可视区域内的光标最初所在的位置与最后所在的位置之间移动)
vmap <M-j> :m'>+<CR>`<my`>mzgv`yo`z
vmap <M-k> :m'<-2<CR>`>my`<mzgv`yo`z
"if has("mac") || has("macunix")
" nmap <D-j> <M-j>
" nmap <D-k> <M-k>
" vmap <D-j> <M-j>
" vmap <D-k> <M-k>
"endif
"" 按<Tab>缩进,按<S-Tab>反缩进
"noremap <Tab> >>
"noremap <S-Tab> <<
" }
" Disable highlight
map <LEADER>h :noh<CR>
" 普通模式下插入换行符
map <LEADER><CR> i<CR><ESC>
" 保存文件并退出
map <LEADER>w :wq<CR>
" 保存文件,不退出
map <LEADER>s :update<CR>
" 文件没有修改则直接退出
map <LEADER>q :q<CR>
" 文件没有修改则全部退出
map <LEADER>x :qa<CR>
" 普通模式下插入一个空行
nmap <LEADER>o o<ESC>
nmap <LEADER>O O<ESC>
" 撤销上一次命令行set操作
map <LEADER>u :call UndoSetCommand()<CR>
" 重复上一次命令行操作
map <LEADER>r :@:<CR>
" 普通模式下插入单个字符
nmap <LEADER>i i <ESC>r
nmap <LEADER>a a <ESC>r
" 进入可视模式块选操作(列选操作)子模式
nnoremap <LEADER>v <C-V>
" 可视模式v/V子模式下,仍可切换到块选子模式
vnoremap <LEADER>v <C-V>
" n、v、o模式下粘贴"0复制专用寄存器中的内容
noremap <LEADER>p "0p
noremap <LEADER>P "0P
" 缓冲区切换
map <LEADER>bp :bprevious<CR>
map <LEADER>bn :bnext<CR>
" Useful mappings for managing tabs
map <LEADER>tc :tabnew<CR> |" tab create
map <LEADER>ts :tab split<CR>
map <LEADER>to :tabonly<CR>
map <LEADER>tc :tabclose<CR>
map <LEADER>tf :tabfirst<CR>
map <LEADER>tl :tablast<CR>
map <LEADER>tm :tabmove
map <LEADER>tp :tabprevious<CR>
map <LEADER>tn :tabnext<CR>
" Let 'tt' toggle between this and the last accessed tab
let g:lasttab=1
nmap <LEADER>tt :execute "tabnext ".g:lasttab<CR>
au TabLeave * let g:lasttab=tabpagenr()
" 列出所有标签页
map <LEADER>ta :tabs<CR>
" Opens a new tab with the current buffer's path
" Super useful when editing files in the same directory
map <LEADER>te :tabedit <c-r>=expand("%:p:h")<cr>/
" Switch CWD to the directory of the open buffer
map <LEADER>cd :cd %:p:h<cr>:pwd<cr>
" 在临时将当前窗口放大到一个新标签以及关闭该新标签返回原窗口之间切换
map <LEADER>z :call ZoomWindowTemporarily()<CR>
" toggle case ignore(切换忽略大小写选项)
nmap <LEADER>C :set ignorecase! ignorecase?<CR>
" 映射Vundle命令(Vundle源于Bundle,为避免与其他映射冲突,使用b开头)
map <LEADER>bl :PluginList<CR>
map <LEADER>bi :PluginInstall<CR>
map <LEADER>bs :PluginSearch
map <LEADER>bc :PluginClean<CR>
" 启动NERDTree
map <LEADER>n :NERDTree<CR>
" easymotion变量及快捷键映射
map <LEADER><LEADER>h <Plug>(easymotion-linebackward)
map <LEADER><LEADER>l <Plug>(easymotion-lineforward)
map <LEADER><LEADER>. <Plug>(easymotion-repeat)
" 下列快捷键为easymotion的默认映射,无需重复设置
" <LEADER><LEADER>w:跳转到当前光标后的某个单词
" <LEADER><LEADER>b:跳转到当前光标前的某个单词
" <LEADER><LEADER>s:双向跳转到所输入的单个字母
" <LEADER><LEADER>j:跳转到光标下面的某行
" <LEADER><LEADER>k:跳转到光标上面的某行
let g:EasyMotion_smartcase=1
" keep cursor colum when JK motion
let g:EasyMotion_startofline=0
" Specify the behavior when switching between buffers
" try和endtry:改变try和endtry之间命令的错误处理,包括所有
" 执行的内容、source里的命令、函数调用、自动命令的激活等。
" cat[ch] /{pattern}/:匹配{pattern}的例外抛出时,如果它没有被前一个
" catch捕获,则执行本语句之后的命令,直到遇到和本catch处于同一try块的
" 下一个catch、finally或者endtry为止。否则,这些命令被跳过。
" 若没有提供{pattern},所有的错误都会被捕获。
try
" 控制缓冲区切换的行为;
" useopen,跳到第一个打开的包含指定缓冲区的窗口(如果有的话);
" usetab,类似于useopen,但也考虑其它标签页里的窗口;
" split,在载入用于在quickfix命令里显示错误的缓冲区之前分割当前窗口;
" newtab,类似于split,但打开新标签页,若和split同时存在,本值优先。
set switchbuf=useopen,usetab,newtab
" 默认值为1,即多于一个标签页才显示标签栏
"set showtabline=2
catch
endtry
" Return to last edit position when opening files (You want this!)
autocmd BufReadPost *
\ if line("'\"") > 0 && line("'\"") <= line("$") |
\ exe "normal! g`\"" |
\ endif
" Remember info about open buffers on close
" viminfo中的%参数:保存和恢复缓冲区列表;Vim启动时若有文件名参数,
" 缓冲区列表不予恢复,若没有文件名参数,缓冲区列表从viminfo文件里恢复;
" 没有文件名的和帮助文件的缓冲区不会写入viminfo文件;若后跟数值,
" 该数值指定保存的缓冲区的最大个数,若没跟数值,则保存所有的缓冲区。
" se[t] {option}^={value}:把{value}乘到数值选项里,或者附加到字符串
" 选项之前。如果选项是逗号分隔的列表,除非原来的值为空,会加上一个逗号。
set viminfo^=%
" 绝对行号、相对行号、无行号切换
" com[mand][!] [{attr}...] {cmd} {rep}:定义一个用户命令。命令的名字是
" {cmd},而替换的文本是{rep}。该命令的属性(参考手册)是{attr}。如果该
" 命令已存在,报错,除非指定!,这种情况下命令被重定义。
command! Tln call s:ToggleLineNumber()
nnoremap <F2> :Tln<CR>
" 切换滚动模式:文本逐行滚动(光标不动)、光标逐行移动
command! Tsm call ToggleScrollMode()
nnoremap <F3> :call ToggleScrollMode()<CR>
"Toggle Menu and Toolbar 切换有无菜单栏、工具栏和滚动条
set guioptions-=m |" m,菜单栏
set guioptions-=T |" T,工具栏
set guioptions-=r |" r,右边滚动条
set guioptions-=L |" L,垂直分割窗口时左边滚动条
" =~#,匹配大小写,即使已设置了ignorecase
" <Bar>,即Ex命令分隔符|;\为续行符(长行接续符)
map <F4> :if &guioptions=~# 'T' <Bar>
\set guioptions-=T <Bar>
\set guioptions-=m <bar>
\set guioptions-=r <bar>
\set guioptions-=L <bar>
\else <Bar>
\set guioptions+=T <Bar>
\set guioptions+=m <Bar>
\set guioptions+=r <bar>
\set guioptions+=L <bar>
\endif<CR>
" 一键切换窗口最大化、还原窗口大小
map <F11> :call ToggleWindowSize()<CR>
" %默认匹配()、[]、{},增加匹配<>
set matchpairs+=<:>
" 普通模式下当前缓冲区文本修改、退出插入模式、离开缓冲区、失去焦点时,自动保存文件
"autocmd TextChanged,InsertLeave * update
autocmd InsertLeave * update
autocmd BufLeave,FocusLost * wall
" VimEnter事件(做完所有启动任务,包括载入.vimrc文件、执行"-c cmd"参数、
" 创建所有窗口并在其中载入所有缓冲区)之后,最大化窗口。
" simalt命令告诉Vim(winaltkeys不要设置为yes)虚拟一个Windows风格的Alt按键行为,
" 这样可以用它来映射Alt组合键(或者任何其它键)来产生标准的Windows操作,以便于
" 在Windows中即使禁用Alt-{key}访问菜单的标准方法(winaltkeys设置为no),
" 也能通过simalt来模拟访问菜单;其中,~在simalt命令中代表空格<Space>。
autocmd VimEnter * simalt ~x
let s:window_max_status=1
"" 自动保存配置(自动保存、读取、执行session会话文件)
"cd $vim/vim74 "进入保存session会话文件的目录
"" sesstionoptions:改变mksession命令的效果。这是逗号分隔的单词列表,
"" 每个单词允许保存和恢复某种设置:curdir,当前目录;sesdir,将session
"" 会话文件所在的目录切换成当前目录
""set sessionoptions-=resize
""set sessionoptions+=sesdir
"set sessionoptions+=winpos,globals
"" mks[ession][!] [file]:写入一个Vim脚本,该脚本能够恢复当前的编辑会话;
"" 如果包含[!],已有的文件会被覆盖。若不提供[file],默认保存为"session.vim"。
"" 注意:若提供[file],不能加.vim扩展名后缀,否则出错(vim会自动加)
"autocmd VimLeave * mksession!
"autocmd VimEnter * :call s:ReadSession()
" 下面为郑晖先生的状态保存设置【有修改】
" Save state {
" do not store global and local values in a session
set sessionoptions-=options
"set sessionoptions-=curdir
"set sessionoptions+=sesdir
" do not store empty windows(avoid nerdtree problem)
set sessionoptions-=blank
if has('gui_running') " auto change session in heavy GUI
autocmd VimEnter * nested :call s:loadSession()
autocmd VimLeave * :call s:updateSession()
endif
" save viminfo
exe 'set viminfo+=n' . escape($VimStateSavedFiles, ' \') . '/_viminfo'
" save view records
exe 'set viewdir='. escape($VimStateSavedFiles, ' ') . '/view'
autocmd BufWinLeave * silent! mkview
autocmd BufWinEnter * silent! loadview
" }
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Files backups and undo
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Turn backup off, since most stuff is in SVN, git et.c anyway...
"set nobackup
"set nowb
"set noswapfile
" Persistent undo 文件关闭后再打开仍可撤销、恢复上次的编辑操作
"set undodir=~/.vim/undodir
set undofile
" maximum number of changes that can be undone
"set undolevels=1000 " 此为默认设置,所以注销
" maximum number lines to save for undo on a buffer reload
"set undoreload=10000 " 此为默认设置,所以注销
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Text, tab and indent related
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Use spaces instead of tabs
" 插入模式中插入<Tab>时使用合适数量的空格,要插入实际的制表用CTRL-V<Tab>
set expandtab
" Be smart when using tabs ;)
" 行首的<Tab>根据shiftwidth插入空白,tabstop或softtabstop用在别的地方,
" <BS>删除行首shiftwidth那么多的空白;该选项若关闭,<Tab>总是根据tabstop
" 或softtabstop决定插入空白的数目,shiftwidth只用于文本左移或右移。
" 插入空白的具体方式 (制表还是空格) 取决于expandtab选项。
set smarttab
" 1 tab == 4 spaces
set shiftwidth=4
set tabstop=4
" Linebreak on 500 characters
set lbr
" Auto indent
set ai
" Smart indent
set si
" Wrap lines
"set wrap " 此为默认设置,所以注销
""""""""""""""""""""""""""""""
" 输入法设置
""""""""""""""""""""""""""""""
" 普通模式下自动禁用中文,但可接受中文标点
set noimdisable
" 设置输入法的激活键
set imactivatekey=C-space
""""""""""""""""""""""""""""""
" Visual mode related
""""""""""""""""""""""""""""""
" Visual mode pressing * or # searches for the current selection
" Super useful! From an idea by Michael Naumann
" 可视模式下搜索选中的内容(选中内容搜索)
"noremap * :call VisualSelectionArthurChiao('SearchForward', '')<CR>
"noremap # :call VisualSelectionArthurChiao('SearchBackward', '')<CR>
" <C-R>,命令行模式下插入寄存器中的内容;<C-R>/,插入搜索模式寄存器的内容
"vnoremap * :<C-U>call VisualSelectionAmix('', '')<CR>/<C-R>=@/<CR><CR>
"vnoremap # :<C-U>call VisualSelectionAmix('', '')<CR>?<C-R>=@/<CR><CR>
"vnoremap * :<C-U>call VisualSelectionAmix('', '')<CR>/<C-R>/<CR>
"vnoremap # :<C-U>call VisualSelectionAmix('', '')<CR>?<C-R>/<CR>
vnoremap <LEADER>f :call VisualSelectionAmix('', '')<CR>/<C-R>/<CR>
"vnoremap <LEADER>b :call VisualSelectionAmix('', '')<CR>?<C-R>/<CR>
" y,复制可视区域(选择区域、选择文本);/,进入搜索命令行模式;
" <C-R>0,粘贴"0复制专用寄存器中刚刚复制的内容;<CR>,回车执行搜索
" 注意:必须使用vnoremap,而不能使用vmap,否则无法达到目的
" 另外,本方法在遇到斜杠/这样的特殊字符时,无法达到目的,
" 即使使用<C-R><C-R>也不行
vnoremap f y/<C-R>0<CR>
""""""""""""""""""""""""""""""
" Status line
""""""""""""""""""""""""""""""
" Always show the status line, even for one window
set laststatus=2
" Show line number, column number, and relative position
" within a file in the status line
"set ruler
" Format the status line
"set statusline=\%{HasPaste()}%F%m%r%h\ %w\ \CWD:\ %r%{getcwd()}%h\ \L%l\/\C%c
" 状态栏设置:%<,行过长,则开头截短;CFD,当前文件目录,%F,显示完整路径;
" %m,修改标志位;%r,只读标志位;%h,帮助标志位;%w,预览窗口标志位;
" FMT,文件格式,%{&fileformat},%{}表示计算表达式,&表示取得选项变量的值;
" TYPE,文件类型,%Y,文件类型;%b,光标所在字符的10进制码点值,.9,最大显示9位;
" %B,光标所在字符的16进制码点值;CWD,当前工作目录;%=,左对齐与右对齐的分界点;
" %c,列号;%V,虚拟列号,表示为负数;%p,当前行在文件位置的百分比;
" %P,窗口在文件位置的百分比;%%,显示%号本身;%L,文件缓冲区里的总行数。
"set statusline=%<[CFP=%F]%m%r%h%w\ [FMT=%{&fileformat}]\ [TYPE=%Y]\ [%.9b\ 0x%.9B]\ [CWD=%{getcwd()}]\ %=[%l,%c%V\ %p%%\ %P\ %LLs]
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 配置airline(代替statusline,powerline的纯vim实现,无需Python支持)
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 设置vim-airline的主题为luna
let g:airline_theme="luna"
" 安装airline专用字体后,必须设置此项
let g:airline_powerline_fonts=1
" 打开tabline功能,方便查看Buffer和切换,这个功能比较不错,
" 在1个Tab下可用多个buffer,省去安装minibufexpl插件了
let g:airline#extensions#tabline#enabled=1
let g:airline#extensions#tabline#buffer_nr_show=1
" 启用airline中集成的CtrlP
let g:airline#extensions#ctrlp#enabled=1
" 关闭状态显示空白符号计数
let g:airline#extensions#whitespace#enabled=0
let g:airline#extensions#whitespace#symbol='!'
" Windows系统还需要在上面设置下增加如下代码
" 设置consolas字体(注意:下面的字体设置除gui_win32之外,其他仅为演示之用)
" 若在多个不同的系统平台上使用同一个vimrc,可这样设置不同类型的GUI专用选项:
if has("gui_running")
if has("gui_gtk2")
set guifont=Luxi\ Mono\ 12
elseif has("x11")
" Also for GTK 1
set guifont=*-lucidatypewriter-medium-r-normal-*-*-180-*-*-m-*-*
elseif has("gui_win32")
" h11的意思是字号设置为11px【px(pixel像素)是一个虚拟长度单位,
" 是计算机系统的数字化图像长度单位,如果px要换算成物理长度,
" 需要指定精度DPI(Dots Per Inch每英寸像素数),在扫描打印时
" 一般都有DPI可选。Windows系统默认96dpi,Apple系统默认72dpi】
set guifont=Consolas\ for\ Powerline\ FixedD:h11
endif
endif
" 设置状态栏符号显示,下面编码用双引号
let g:Powerline_symbols="fancy"
let g:airline_symbols={}
let g:airline_left_sep="\u2b80"
let g:airline_left_alt_sep="\u2b81"
let g:airline_right_sep="\u2b82"
let g:airline_right_alt_sep="\u2b83"
let g:airline_symbols.branch="\u2b60"
let g:airline_symbols.readonly="\u2b64"
let g:airline_symbols.linenr="\u2b61"
" 设置顶部tabline栏符号显示
let g:airline#extensions#tabline#left_sep="\u2b80"
let g:airline#extensions#tabline#left_alt_sep="\u2b81"
let g:airline_section_b='%<%m%r%h%w TYPE=%Y %.9b/0x%.9B CWD=%{getcwd()}'
"let g:airline_section_y='%l,%c%V %p%% %P %LLs'
let g:airline#extensions#tabline#buffer_idx_mode=1
" 按<LEADER>+数字键,选择Tab标签
nmap <M-1> <Plug>AirlineSelectTab1
nmap <M-2> <Plug>AirlineSelectTab2
nmap <M-3> <Plug>AirlineSelectTab3
nmap <M-4> <Plug>AirlineSelectTab4
nmap <M-5> <Plug>AirlineSelectTab5
nmap <M-6> <Plug>AirlineSelectTab6
nmap <M-7> <Plug>AirlineSelectTab7
nmap <M-8> <Plug>AirlineSelectTab8
nmap <M-9> <Plug>AirlineSelectTab9
nmap <M-[> <Plug>AirlineSelectPrevTab
nmap <M-]> <Plug>AirlineSelectNextTab
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 配置airline结束
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"***************************************************************
""""""""""""""""""""""""""""""
" Helper functions
""""""""""""""""""""""""""""""
" 撤销刚刚执行的set设置命令
" fu[nction][!] {name}([arguments]) [range] [abort] [dict]:
" 定义{name}命名的新函数。名字必须由字母数字和 ’_’ 字
" 符组成,而且必须以大写字母或者"s:"开头。
" 若有同名函数且没有使用[!],给出错误信息;若给出[!],已有的函数
" 被悄然替代,但该函数正在执行期间除外。此时,这是一个错误。
" 如果给出[range]参数,则该函数自己能理解并处理行范围。该范围通过
" a:firstline和a:lastline定义。如果没有[range],:{range}call
" 会在该范围的每一行分别执行该函数,每次光标都定位在处理行的行首。
" 见|function-range-example|。
function! UndoSetCommand()
if (@:=~? '^set\s') || (@:=~? '^se\s')
exe @:.'!'
endif
endfunction
""""""""""""""""""""""""""""""
" Returns true if paste mode is enabled
function! HasPaste()
if &paste
return 'PASTE MODE '
endif
return ''
endfunction
""""""""""""""""""""""""""""""
function! CmdLine(str)
" menu,创建菜单;emenu,执行菜单(相当于单击菜单);unmenu,删除菜单
execute "menu Foo.Bar :" . a:str
emenu Foo.Bar
unmenu Foo
endfunction
" 可视模式下按选择文本(选中的内容)执行查找搜索
function! VisualSelectionAmix(direction, extra_filter) range
" 预存无名寄存器的内容
let l:saved_reg=@"
" :exe[cute] {expr1},计算{expr1},返回的字符串作为Ex命令执行(类似于JS的
" eval()函数)
" :norm[al][!] {commands},在命令行模式上执行普通模式命令,!为不使用映射
" vgvy,进入可视模式,重选上一次的选择区域(选区),并复制该选区
execute "normal! vgvy"
" escape({string}, {chars}),将{string}中的{chars}字符用反斜杠转义
" 注意:VimScript中双引号字符串与单引号字符串的区别:
" 双引号字符串用于特殊的“转义序列”(如\n用于换行符、\u263A用于Unicode笑脸标志、
" \<ESC>用于转义字符;而单引号字符串则将包括在其中的所有内容视为文字字符,比如
" \n仅被视作\和n两个字面文字字符,而不视为换行符,但也要例外————两个连续的单引号,
" 它们被单纯地当作单引号,换言之,单引号字符串里面作为字面文字字符的单引号
" 必须在其前面加多一个单引号,以对其进行转义,否则会被视作单引号字符串的界定符。
let l:pattern=escape(@", ' \/.*$^~[]')
" substitute({expr}, {pat}, {sub}, {flags}):{expr},要被替换操作的原文本;
" {pat},匹配模式(比如正则表达式);{sub},用以替换符合匹配模式的文本的文本
" (子串);{flags},标志位,缺省为空"",则仅用{sub}替换第一个匹配,若设为g,
" 则替换所有{pat}匹配。该函数返回经匹配替换后的新文本。
" 下面这一句是将上次v模式选中的、经过escape()函数对特殊字符转义处理后的
" 文本的行尾的换行符删除(若行末有换行符,则以空字符""替换,实际就是删除)
let l:pattern=substitute(l:pattern, "\n$", "", "")
if a:direction=='gv'
call CmdLine("Ag \"" . l:pattern . "\" " )
elseif a:direction=='replace'
call CmdLine("%s" . '/'. l:pattern . '/')
endif
let @/=l:pattern
let @"=l:saved_reg
endfunction
function! VisualSelectionArthurChiao(direction, extra_filter) range
let l:saved_reg=@"
execute "normal! vgvy"
let l:pattern=escape(@", ' \/.*$^~[]')
let l:pattern=substitute(l:pattern, "\n$", "", "")
if a:direction=='SearchBackward'
execute "normal ?" . l:pattern . "^M"
elseif a:direction=='gv'
call CmdLine("Ack \"" . l:pattern . "\" " )
elseif a:direction=='replace'
call CmdLine("%s" . '/'. l:pattern . '/')
elseif a:direction=='SearchForward'
execute "normal /" . l:pattern . "^M"
endif
let @/=l:pattern
let @"=l:saved_reg
endfunction
""""""""""""""""""""""""""""""
" 切换绝对行号、相对行号、无行号
function! s:ToggleLineNumber()
" cpo,vi兼容性选项;这里的&表示获得选项变量的值
let l:save_cpo=&cpo
" se[t] {option}&vim:复位选项为Vim的缺省值
set cpo&vim
" number status
" 1 -> nonumber
" 4 -> relative number
" 2 -> number
"
if !exists('b:number_status')
"You may has multi-windows, so it should only working on local buffer
if &l:relativenumber==1
let b:number_status=4
elseif &l:number==1
let b:number_status=2
else
let b:number_status=1
endif
endif
"
if b:number_status==1
"set local number to make sure relative number like this (vim 7.4)
"
" 2
" 1
" 16 <- show current line number
" 1
" 2
"
setlocal number
setlocal relativenumber
let b:number_status=4
elseif b:number_status==4
setlocal norelativenumber
setlocal number
let b:number_status=2
elseif b:number_status==2
setlocal norelativenumber
setlocal nonumber
let b:number_status=1