今天给vim来了个大换血,效果还不错。好吧,不多废话,具体内容待会儿写在那半成品的博客里。
一、
- 就是觉得不少语言里都推荐在“=”及“==”两侧加上空格以增强可读性,这个该如何实现自动呢?
其实倒不是完全实现不了,只是感觉实现的时候光标跳动有点冲,希望大大们给个更好的建议。
二、
- 下一个就是完全的手误。最近老是按“:”的时候<Shift>松的有些迟顿(难倒是冬天到了,手抖?)。希望大大们给个方法,让vim能够“:wq”、“:Wq”、“:WQ”及“:q!”、“:Q!”通吃
解决方案:
一、(1)全自动方案<语法太多,难免有不合适的地方>
代码: 全选
autocmd FileType * call g:compileByFileType()
func! g:compileByFileType()
if &filetype=="c"
if (filereadable("Makefile")||filereadable("makefile"))
else
set makeprg=gcc\ %\ -Wall\ -std=c99\ -lm\ -g\ -o\ %<
endif
inoremap / <c-r>=EqualSign('/')<CR>
inoremap = <c-r>=EqualSign('=')<CR>
inoremap < <c-r>=EqualSign('<')<CR>
inoremap - <c-r>=EqualSign('-')<CR>
inoremap > <c-r>=EqualSign('>')<CR>
inoremap + <c-r>=EqualSign('+')<CR>
elseif &filetype == "html"
inoremap ; ;<space>
elseif &filetype=="vim"
inoremap < <><left>
endif
endfunction
"设置= + - 前后自动空格
function! EqualSign(char)
if a:char =~ '=' && getline('.') =~ ".*("
return a:char
endif
let ex1 = getline('.')[col('.') - 3]
let ex2 = getline('.')[col('.') - 2]
if ex1 =~ "[-=+><>\/\*]"
if ex2 !~ "[\<TAB>\<space>]"
return "\<ESC>i".a:char."1\<SPACE>"
elseif ex1 =~ a:char && a:char =~ "[-+]"
return "\<ESC>xxxa".a:char.a:char
else
return "\<ESC>xa".a:char."2\<SPACE>"
endif
else
if ex2 !~ "[\<TAB>\<space>]"
return "\<SPACE>".a:char."\<SPACE>\<ESC>a"
else
return a:char."\<SPACE>\<ESC>a"
endif
endif
endf
符号右边按下<SPACE>则符号左右两边一起加空格,
暂未解决三个及以上符号连在一起的情况,人分析都吃力让代码来做压力较大
新版本,可增加了订制性、可扩展性
代码: 全选
1 """空格自动化
2 let g:space1 = ['+', '-', '*', '/', '%', '^', '<', '>', '=']
3 let g:space2 = [":=", "==", "!=", "<<", ">>", ">=", "<=", "+=", "-=", "/*=" ,"/=", "^=", "&&", "||"]
4 ""let g:space2 = [":=", "==", "!=", "=/~", "!/~", "<<", ">>", ">=", "<=", "+=", "-=", "/*=" ,"/=", "^=", "&&", "||"]
5 """空格自动化
6 inoremap <space> <c-r>=SmartSpace()<CR>
7 function! SmartSpace()
8 ""取上一行光标附近词a:char
9 for key in g:space2
10 echo key
11 endfor
12 let a:char = ''
13 let a:prechar=' '
14 let a:lastchar=''
15 for key in range(-8, 6)
16 let a:char = a:char.getline(line('.')-1)[col('.') + key]
17 endfor
18 ""判断a:char是否含有单个符号
19 for key in g:space1
20 if -1 != match(a:char, '\t'.key.' ')
21 let a:prechar = ' '
22 let a:lastchar = ' '
23 elseif -1 != match(a:char, ' '.key.' ')
24 let a:prechar = ' '
25 let a:lastchar = ''
26 endif
27 endfor
28 ""判断a:char是否含有两个连续符号
29 for key in g:space2
30 if -1 != match(a:char, ' '.key.' ') && 0 != match(a:char, ' '.key.' ')
31 let a:prechar = ' '
32 let a:lastchar = ' '
33 elseif -1 != match(a:char, ' '.key)
34 let a:prechar = ' '
35 let a:lastchar = ' '
36 endif
37 endfor
38 ""当前行两个连续符号
39 let a:char = getline('.')[col('.')-3].getline('.')[col('.')-2]
40 for key in g:space2
41 if a:char == key
42 if "[ \t]" !~ getline('.')[col('.')-4]
43 return "\<left>\<left>".a:prechar."\<right>\<right> "
44 else
45 return " "
46 endif
47 endif
48 endfor
49 ""当前行一个符号
50 let a:char = getline('.')[col('.')-2]
51 for key in g:space1
52 if a:char == key
53 if "[ \t]" !~ getline('.')[col('.')-3]
54 return "\<left>".a:prechar."\<right> ".a:lastchar
55 elseif ' ' =~ getline('.')[col('.')-3]
56 return " "
57 endif
58 endif
59 endfor
60 return " "
61 endfunction
代码: 全选
:inoremap <space> <c-r>=AutoSpace()<CR>
:cnoremap <space> <c-r>=AutoSpace()<CR>
function! AutoSpace()
if getline('.')[col('.') - 2] !~ "[-=+<~>\/\*|&]"
return "\<space>"
else
if getline('.')[col('.') - 3] == "\<space>"
return "\<space>"
elseif getline('.')[col('.') - 3] !~ "[-=+<>\/\*!|&]"
return "\<left>\<space>\<right>\<space>"
else
if getline('.')[col('.') - 4] == "\<space>"
return "\<space>"
else
return "\<left>\<left>\<space>\<right>\<right>\<space>"
endif
endif
endif
endfunction
二、在.vimrc中添加
代码: 全选
"预防手误的杀招
nnoremap : :
cnoremap Q! q!
command Wq wq
command Q q
command WQ wq