[经验总结]我的VIM配置文件
http://blog.youkuaiyun.com/ThinkHY/archive/2008/12/31/3663195.aspx
"************************************************************************
"* filename: .vimrc
"* brief: Happy VIMMING!
"* creator: thinkhy
"* date: 2008年 09月 10日 星期三 22:23:30 CST
"* modify: 2010年 01月 02日 星期六 20:00:59 CST
"************************************************************************
set
fileencodings
=ucs-bom
,
utf-8
,
chinese
set
fileencoding
=utf-8
set
gfn
=FreeMono/ 14
set
awa
" 自动保存
set
ai
" 自动缩进
set
expandtab
set
shiftwidth
=4
set
tabstop
=4
filetype
plugin
on
syntax
enable
" 语法高亮
set
ai
" Auto indent
set
si
" Smart indent
set
cindent
" C缩进
set
cino
=g0
" public private friend 顶格写
set
nocompatible
" 不与VI兼容
set
ruler
" 显示光标位置
set
nobackup
" ~文件烦人
set
ve
=all
" 逍遥游
"set iskeyword=@,48-57,192-255 "把默认keyword中的_去掉 还是用默认的吧
"不然Ctags不好使
set
acd
" autochangedir
set
statusline
=[%{strftime('%y-%m-%d/ %a')}][%{&ff}][%Y]%k[%{(&fenc==/"/")?&enc
:
&fenc}%{(&bomb?/"
,
BOM/"
:
/"/")}]%=[Line
:
%l/%L
,
Column
:
%c%V]/ %P
" ===========================================================================================
" Key map
" <C-q> 粘贴系统剪贴板的内容
nmap
<
C-q
>
"+p
imap
<
C-q
>
<
ESC
>
"+p
" Enter 代替 ESC
inoremap
<
CR
>
<
ESC
>
" F2 保存文件
nmap
<
F2
>
:w
<
CR
>
imap
<
F2
>
<
ESC
>
:w
<
CR
>
" F3 切换窗口
nmap
<
F3
>
<
C-w
>
w
imap
<
F3
>
<
ESC
><
C-w
>
w
" F4 关闭窗口
nmap
<
F4
>
<
C-w
>
c
imap
<
F4
>
<
ESC
><
C-w
>
c
" F5 Make
nmap
<
F5
>
:copen
<
CR
>
:make!
<
CR
>
imap
<
F5
>
<
ESC
>
:copen
<
CR
>
:make!
<
CR
>
" F7 调整格式 用得太少 改作ptag
"nmap <F7> :%!indent -kr<CR>
"imap <F7> <ESC>:%!indent -kr<CR>
nmap
<
F7
>
<
C-w
>
}
<
CR
>
imap
<
F7
>
<
ESC
><
C-w
>
}
<
CR
>
" F8 打开taglist
nmap
<
F8
>
:TlistToggle
<
CR
>
imap
<
F8
>
<
ESC
>
:TlistToggle
<
CR
>
" F9 编译链接C/C++文件
nmap
<
F9
>
:!g++ % -o %<
<
CR
>
imap
<
F9
>
<
ESC
>
:!g++ % -o %<
<
CR
>
" F11 打开Winmanager
nmap
<
F11
>
:WManager
<
CR
>
imap
<
F11
>
<
ESC
>
:WManager
<
CR
>
" F12 建立Tag文件
nmap
<
F12
>
:!ctags -R --c-kinds=+p --fields=+S
<
CR
>
imap
<
F12
>
<
ESC
>
:!ctags -R --c-kinds=+p --fields=+S
<
CR
>
" <space> 空格
nmap
<
space
>
o
<
Esc
>
" 调整窗口大小
map
<
Up
>
<
Esc
>
:winc+
<
CR
>
map
<
Down
>
<
Esc
>
:winc-
<
CR
>
map
<
Left
>
<
Esc
>
:winc>
<
CR
>
map
<
Right
>
<
Esc
>
:winc<
<
CR
>
nmap
F :BufExplorer
<
CR
>
" 水木中收的技巧
" 设置多文件搜索快捷键,搜索完毕后不自动跳转
" 这个在GVIM与GUI的局快捷键冲突,在终端中与终端窗口的快捷键冲突
"nmap <M-f> *:vimgrep //<<c-r><c-w>/>/j **/*.[ch] **/*.txt **/*.cpp<cr>
" 顺序或倒序遍历quickfix中列出的item
nnoremap
<
F9
>
:cp
<
cr
>
inoremap
<
F9
>
<
c-o
>
:cp
<
cr
>
nnoremap
<
F10
>
:cn
<
cr
>
inoremap
<
F10
>
<
c-o
>
:cn
<
cr
>
"
" For C/C++ file
" Proposed by winmanager plugin
map
<
c-w
><
c-f
>
:FirstExplorerWindow
<
cr
>
map
<
c-w
><
c-b
>
:BottomExplorerWindow
<
cr
>
map
<
c-w
><
c-t
>
:WMToggle
<
cr
>
"=========================================================================================
"技巧
"
" 水木中介绍解决输入法切换的问题
autocmd
InsertEnter
*
set
noimdisable
autocmd
InsertLeave
*
set
imdisable
au
BufRead
,
BufNew
/home/thinkhy/work/apue.2e/*
set
tags
+=/home/thinkhy/work/apue.2e/tags
au
BufRead
,
BufNew
/home/thinkhy/work/wine/*
set
tags
+=/home/thinkhy/work/wine/wine-1.1.35/tags
au
BufRead
,
BufNew
Makefile
set
noexpandtab
au
BufRead
,
BufNew
makefile
set
noexpandtab
" 这个技巧看上去很好,但和我的习惯不符,还是^O和Tab搭配着好用。
" smth VIM版flw 介绍的 Tab用法
" if version >= 700
" nmap <silent> <TAB> <C-W>w:set cursorline<CR>:200sl m<CR>:set nocursorline<CR>
" nmap <silent> <S-TAB> <C-W>p:set cursorline<CR>:200sl m<CR>:set nocursorline<CR>
" else
" nmap <silent> <TAB> <C-W>w
" nmap <silent> <S-TAB> <C-W>p
" endif
"autocmd CmdWinEnter * inoremap <buffer> <Esc> <C-o>:exit<CR><Esc> /| /
"set noimdisable|set insertmode
"autocmd CmdWinLeave * set imdisable | set noinsertmode
"cnoremap <C-space> <C-f>
"imap <Tab> <Space><Space><Space><Space><Space><Space><Space><Space
"===========================================================
" For xml file
"===========================================================
"so ~/vimfiles/plugin/xml.vi
autocmd
FileType
xml,xsd,xsl :
set
tabstop
=
4
expandtab
let
g:ChineseIMESpaceToggle
=
1
"let g:ChineseIMEMappingCtrl6=1
setlocal
pumheight
=1
setlocal
completeopt
=menu
,
preview
,
longest
"nmap <F12> :w&&%!xmllint % --format<CR
"imap <F12> <ESC>:%!xmllint % --format<CR
" for C++ tags [09/11/30 thinkhy]
map
<
C-F12
>
:!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .
<
CR
>
">=================================================
">=================================================
" [ Added by thinkhy 2010年 01月 02日 星期六 19:54:24 CST]
" 水木VIM版 15322贴
"发信人: flw (梨花小蓓蕾), 信区: VIM
"标 题: 分享几个我自认为比较得意的自定义快捷键
"发信站: 水木社区 (Mon Dec 28 10:34:46 2009), 站内
" 换标签页
nmap
<
C-N
>
:tabnext
<
CR
>
nmap
<
C-P
>
:tabprev
<
CR
>
" 换窗口
nmap
<
silent
>
<
TAB
>
<
c-w
>
w:set cursorline
<
CR
>
:100sl m
<
CR
>
:set nocursorline
<
CR
>
nmap
<
silent
>
<
S-TAB
>
<
c-w
>
p:set cursorline
<
CR
>
:100sl m
<
CR
>
:set nocursorline
<
CR
>
function
! HelpHelper
(
where
)
" 先拿下光标下的文字
let
l:word
=
expand
(
"<cWORD>"
)
" 再取出疑似函数名/模块名的部分和疑似方法的部分
" /([_a-zA-Z0-9:]/+/)/(->/([_a-zA-Z0-9]/+/)/)/?
let
l:lists
=
matchlist
(
l:word,
"
//
([_a-zA-Z0-9:]
//
+
//
)
//
(->
//
([_a-zA-Z0-9]
//
+
//
)
//
)
//
?"
)
let
l:name
=
l:lists[
1
]
let
l:method
=
l:lists[
3
]
let
l:progList
=
[]
if
&ft
==
"perl"
if
match
(
l:name,
"::"
)
!=
-
1
" 函数里是不可能有 :: 的,不用想了,一定是模块
let
l:progList
+=
[ [
"perldoc -u "
,
"pod"
] ]
elseif
strlen
(
l:method
)
" 有方法的,一定是模块了
let
l:progList
+=
[ [
"perldoc -u "
,
"pod"
] ]
elseif
match
(
l:name,
"[A-Z]"
)
!=
-
1
" 有大写字母,那一定是模块了,Perl buildin 函数的名称全都是小写字母的
let
l:progList
+=
[ [
"perldoc -u "
,
"pod"
] ]
else
" 剩下的,有可能是函数,也有可能是模块,
" 但是考虑到这样的模块较少,因此先优先查函数
let
l:progList
+=
[ [
"perldoc -u -f "
,
"pod"
], [
"perldoc -u "
,
"pod"
] ]
endif
endif
if
&ft
==
"python"
let
l:progList
+=
[ [
"python
-c /"import sys; a = sys.argv[-1]; b = a.find('.') > -1 and 1 or 0;
m = b == 1 and '.'.join(a.split('.')[:-1]) or a; exec( 'import
'+m+';help('+a+')' )/" "
,
"man"
] ]
endif
if
&ft
==
"erlang"
if
match
(
l:name,
":"
)
!=
-
1
" erlang 的模块方法
let
l:lists
=
matchlist
(
l:name,
"
//
([_a-zA-Z0-9:]
//
+
//
):
//
([_a-zA-Z0-9]
//
+
//
)"
)
let
l:name
=
l:lists[
1
]
let
l:method
=
l:lists[
2
]
endif
let
l:progList
+=
[ [
"PAGER=/"col -b/" erl -man "
,
"man"
] ]
endif
let
l:progList
+=
[ [
"PAGER=/"col -b/" man 3 "
,
"man"
] ]
let
l:progList
+=
[ [
"PAGER=/"col -b/" man 2 "
,
"man"
] ]
let
l:progList
+=
[ [
"PAGER=/"col -b/" man "
,
"man"
] ]
let
l:found
=
0
" 下面调用外部命令,取帮助信息
" [Added by thinkhy 10/01/02]
if
&ft
==
"vim"
echomsg
"I
am
vim
"
try
execute
" h "
.
l:word
catch
/foo/
endtry
execute
"wincmd p"
return
endif
" [End thinkhy]
for
l:prog
in
l:progList
let
l:progName
=
l:prog[
0
]
let
l:fileType
=
l:prog[
1
]
let
l:cmd
=
l:progName
.
l:name
let
l:lines
=
system
(
l:cmd
)
if
!v:shell_error
if
a:where
==?
"inNewTab"
tabe
elseif
a:where
==?
"Vertical"
rightbelow
new
else
above
new
endif
set
buftype
= nofile
set
ts
= 8
execute
"set ft="
.
l:fileType
call
append
(
0
,
split
(
l:lines,
"/n"
)
)
normal
gg
if
strlen
(
l:method
)
" 跳转到方法
if
l:fileType
==
"pod"
" regex: /(=item/d*/s/+/)/@<= />
call
search
(
"
//
(=item
//
d*
//
s
//
+
//
)
//
@<="
.
l:method
.
"
//
>"
)
elseif
l:fileType
==
"man"
" regex: /(^/s/+/)/@<=l:method/>
call
search
(
"
//
(^
//
s
//
+
//
)
//
@<="
.
l:method
.
"
//
>"
)
endif
endif
let
l:found
=
1
break
endif
endfor
if
!l:found
echohl
ErrorMsg
|
echomsg
"^_^ 没有帮助信息。"
|
echohl
None
endif
endfunction
" vim 内打开 man/perldoc/erl -man/python help
autocmd
FileType
c,perl,erlang,python,vim
nmap
<
silent
>
K :call HelpHelper( "" )
<
CR
>
autocmd
FileType
c,perl,erlang,python,vim
nmap
<
silent
>
gK :call HelpHelper( "InNewTab" )
<
CR
>
">==========================================================================
"发信人: Dieken (风催草低 - 明月何尝不照人), 信区: VIM
"标 题: Re: 分享几个我自认为比较得意的自定义快捷键
"发信站: 水木社区 (Mon Dec 28 12:00:38 2009), 站内
" 我也来:
" Press v in quickfix window to preview
" 虽然没看懂zz:的意思,好使
au
FileType
qf :
nnoremap
<
buffer
>
v <Enter>zz:wincmd p<Enter>
" for gf command to open java source file at import clause
au
FileType
java :
set
suffixesadd
+=.
java
"
" nnoremap <c-m> :redir @a<CR>:g//<CR>:redir END<CR>:new<CR>:put! a<CR><CR>
" 将搜索结果放在copen窗口
" ----------------------------------------------------------------------------
" * :lop[en] [height] 打开一个窗口显示当前窗口的位置列表。只有当前窗口有位置
" * 列表的情况才能用。你可以同时打开多于一个的位置列表窗
" * 口。除此以外,和
":copen"
相同。
" ----------------------------------------------------------------------------
nnoremap
<
c-m
>
:g//laddexpr expand("%") . ":" . line(".") . ":" . getline(".")
<
CR
>
:lopen
<
CR
><
CR
>