VIM常用操作, 插件和vimrc文件
先上图:
我的自定义配色方案:
系统的evening配色方案:
1.常用操作
VIM作为文本编辑器,其强大之处,在我看来,首先就是快速的编辑能力,其次才是丰富的扩展插件。
所以掌握vim的快速编辑的方法是非常重要的,这里列举一些必须熟记的跟效率有关的操作.
<基本编辑操作>
上下左右移动:对应为上(K),下(J),左(H), 右(L);这个是基本要求,千万不要用方向键,用方向键的朋友伤不起~。
gg:跳到文档开头
G:跳到文档末尾
w:跳到下一个单词开头; 4w:跳到往后的第四个单词的开头,依次类推.
e:跳到下一个单词结尾
b:跳到上一个单词开头;4b:跳到往前的第四个单词的开头,依次类推.
0:跳到行的开头
^:跳到行的开头的第一个字符处
$:跳到行的末尾
<快速编辑操作>
=:快速调整当前行的缩进 gg=G:全文档快速缩进调整
Ctrl+p(Ctrl+n):快速补全命令,这个在写代码时非常有用,在编辑模式中, 输入几个字符后再输入此命令则 开始向上(下)搜 索开头与其匹配的单词并补齐, 不断输入此命令则循环查找. 此命令 会在所有在这个 vim 程序中打开的文件中进行匹配.
Ctrl+x+l:自动补全一行的内容,只在当前文档查找匹配的行,多个选项时通过快速补全命令选择.
Ctrl+x+f:自动补全目录.如我输入 c:\p,然后按Ctrl+x+f, 则得到 C:\Program Files\
abbr:缩写设置,如:abbr cmain int main(int argc, char** argv),则下次只要输入cmain后再输入其他非字母符号, 它就会自动扩展为int int main(int argc, char** argv)
qa:录制宏, 宏这个不多解释,就是为了重复执行一系列操作准备的,好一点的编辑器都可以录制宏.
q:结束录制
@a: 执行一次宏, 100@a:重复执行100次
<查找相关>
查找默认是区分大小写的,要不区分大小写的话,先:set ignorecase
f:在当前行查找字符,如fx查找x, ';'查找下一个, ','查找上一个.
/xxx: 向下查找xxx,xxx允许正则表达式
?xxx:向上查找xxx,xxx允许正则表达式
n:查找下一个
N查找上一个
*:查找并高亮当前光标下的单词.
g*:查找并高亮包含当前单词的字符串. 如"helloworld world", 光标在空格后的world上按g*, 则"helloworld"也会高亮
%:查找与光标所在处括号相匹配的反括号, 包括 () [] {}
<替换相关>
替换是vim的强项, 因为可以用正规表达式来匹配字符串.
替换表达式的一些字符含义:
%:全文档搜索
g:全部替换
c:替换前确认
以下提供几个例子.
:s/aa/bb/g :将光标所在行出现的所有包含 aa 的字符串中的 aa 替换为 bb, g表示全部匹配点都替换,没有g则只替换第一个匹配的
:s/\<aa\>/bb/g :将光标aaxy所在行出现的所有 aa 替换为 bb, 仅替换 aa 这个单词,类似于aaxy之类的不会被替换
:%s/aa/bb/g :将文档中出现的所有包含 aa 的字符串中的 aa 替换为 bb
:12,23s/aa/bb/g :将从12行到23行中出现的所有包含 aa 的字符串中的 aa 替换为 bb
:12,23s/^/#/ :将从12行到23行的行首加入 # 字符
:%s= *$== :将所有行尾多余的空格删除
:g/^\s*$/d :将所有不包含字符(空格也不包含)的空行删除.
<复制粘贴>
y 表示拷贝, d 表示删除, p 表示粘贴. 其中拷贝与删除是与光标移动命令
YY:复制整行
dd:删除整行
ddp:交换当前行和下一行
ggyG:表示复制整篇文档
ggdG:表示删除整篇文档
yw:表示拷贝从当前光标到光标所在单词结尾的内容.
dw:表示删除从当前光标到光标所在单词结尾的内容.
y0:表示拷贝从当前光标到光标所在行首的内容.
d0:表示删除从当前光标到光标所在行首的内容.
y$:表示拷贝从当前光标到光标所在行尾的内容.
d$:表示删除从当前光标到光标所在行尾的内容.
yfa:表示拷贝从当前光标到光标后面的第一个a字符之间的内容.
dfa:表示删除从当前光标到光标后面的第一个a字符之间的内容.
2.常用插件
<ctags>
这个其实不算插件,是一个独立的程序,需要安装这个程序放在系统Path所包含的目录中。
安装很简单,直接下载ctags.exe即可(Windows下),最简单就直接将ctags放在system32目录下。
为了操作方便,在vimrc中设置一些快捷键就可以了:
"-------------------------------------------cags------------------------------>>
map <F8> :!ctags -R --fields=+lS <CR> "生成tag文件,喜欢的时候就按一下F8"
"映射跳转快捷键,跳转到光标下单词的定义处,g]会列出跳转列表,如果需要自动跳转到第一个记录,则用map fj <C-]>"
map fj g]
"跳回之前的位置"
map ff <C-T>
<taglist>
这个插件用来查看当前文件定义的变量、函数等信息, 挺有用的,被用得很泛滥.
安装很简单,下载taglist.vim放入vim的plugin目录就可以了
在vimrc中简单设置一些选项:(更多设置自己输入:help taglist.txt查看哦,记得之前要将taglist.txt放入vim的doc目录哦)
"-------------------------------------------taglist-------------------------->>
"快捷键"
noremap <F11> :TlistToggle<CR>
"以下是一些taglist设置"
"设定windows系统中ctags程序的位置"
if MySys() == "windows"
"指定ctags程序的位置"
let Tlist_Ctags_Cmd = 'ctags'
elseif MySys() == "linux"
let Tlist_Ctags_Cmd = '/usr/bin/ctags'
endif
"不同时显示多个文件的tag,只显示当前文件的"
let Tlist_Show_One_File = 1
"如果taglist窗口是最后一个窗口,则退出vim"
let Tlist_Exit_OnlyWindow = 1
"在右侧窗口中显示taglist窗口"
let Tlist_Use_Right_Window = 1
"设置按照名称排序,这样或许找函数名会容易些"
Tlist_Sort_Type="name"
"vim启动时自动打开taglist窗口"
"Tlist_Auto_Open=1
"打开taglist时焦点自动转到taglist窗口"
"Tlist_GainFocus_On_ToggleOpen=1
"让taglist始终解释文件中的tag,不管taglist窗口有没有打开"
"Tlist_Process_File_Always=1
<NERD_tree.vim>
目录树, 同时还可以对文件进行vim的打开操作等.
安装跟上面的一样,下载NERD_tree.vim放入vim的plugin目录.
在vimrc中设置一下:
"-------------------------------------------NERD_tree.vim--------------------->>
"设置快捷键"
nmap <F2> :NERDTreeToggle<cr>
"禁用所有与NERD_tree有关的命令"
"let loaded_nerd_tree=1
"不显示指定的类型的文件"
"let NERDTreeIgnore=['/.vim$', '/~$']
"不显示隐藏文件(好像只在linux环境中有效)"
let NERDTreeShowHidden=0
"排序"
let NERDTreeSortOrder=['//$','/.cpp$','/.c$', '/.h$', '/.py$', '/.lua$', '*']
"不分大小写排序"
let NERDTreeCaseSensitiveSort=0
"设置窗口尺寸"
let NERDTreeWinSize=30
"是否显示行号"
"let NERDTreeShowLineNumbers=1
"是否显示书签"
"let NERDTreeShowBookmarks=1
"打开文件后, 关闭NERDTrre窗口"
"let NERDTreeQuitOnOpen=1
"高亮NERDTrre窗口的当前行"
let NERDTreeHighlightCursorline=1
<bufExplorer.vim>
用来切换vim当前打开的文件的.
安装如上,下载bufExplorer.vim放到vim的plugin目录下.
在vimrc中设置一下:
"-----------------------------------------bufExplorer.vim--------->>"
noremap zz :BufExplorer<CR>
安装了以上几个插件后,vim已经像模像样了,用起来也很方便了.<F2>打开目录浏览, <F11>打开taglist, <F5>生成tag,fj跳转,ff跳转返回 zz打开缓冲文件窗口
vimrc文件
vimrc文件配置得好的话,操作起来更方便快捷, 这个不多说了,附上我的vimrc文件:
-------------------------------------------基本设定------------------------->>
set fileencodings=ucs-bom,utf-8,cp936 "自动识别的文件编码
set nocompatible "不兼容vi
set magic
set ru "标尺信息
set ai "自动缩进
set sw=4 "自动缩进宽度
set ts=4
set dy=lastline "显示最多行,不用@@
set backspace=indent,eol,start
colo evening
sy on
set go= "无菜单、工具栏
set nobackup
set hlsearch
set incsearch
set hls
set showmatch
set autochdir "需要自动改变vim的当前目录为打开的文件所在目录则设置此项
set showcmd
set smartindent
set tags=tags; "设置tag文件的搜索路径
set tags+=/usr/include/tags;
filetype plugin on "支持插件
set cursorline "当前行有下划线
set virtualedit=onemore
"set number "需要显示行号则设置该项
"set path=.,/usr/include,include "vimgrep时额外的搜索路径
"highlight Comment ctermfg=gray "设置注释的颜色
"highlight Macro ctermfg=blue "设置宏定义的颜色
"hi Folded ctermfg=red ctermbg=darkblue
"hi FoldColumn guibg=green guifg=grey20 ctermfg=4 ctermbg=7
"-------------------------------------------快捷键设置----------------------->>
noremap <C-S> :update<CR>
noremap <F5> :w<CR> :!Python %<CR>
" 文件查找
noremap <F3> :vimgrep /<C-R>=expand("<cword>")<CR>/j *.txt *.cpp *.h *.py *.java *.lua<CR> \| :copen<CR>
noremap <F7> :vimgrep /<C-R>=expand("<cword>")<CR>/j **/*.txt **/*.cpp **/*.h **/*.py **/*.java **/*.lua<CR> \| :copen<CR>
noremap <C-F7> :vimgrep /<C-R>=expand("<C-R>+")<CR>/j **/*.txt **/*.cpp **/*.h **/*.py **/*.java **/*.lua<CR> \| :copen<CR>
" tabedit
nmap te :tabedit
nmap tn :tabnew<CR>
noremap <TAB> :tabn<cr>
"-------------------------------------------函数定义------------------------->>
fun! ToggleFold()
if foldlevel('.') == 0
normal! l
else
if foldclosed('.') < 0
. foldclose!
else
. foldopen!
endif
endif
" Clear status line
echo
endfun
"空格键折叠/展开折叠
noremap <space> :call ToggleFold()<CR>
function FoldBrace()
if getline(v:lnum+1)[0] == '{'
return 1
endif
if getline(v:lnum) =~ '{'
return 1
endif
if getline(v:lnum)[0] =~ '}'
return '<1'
endif
return -1
endfunction
if has("autocmd")
filetype plugin indent on
augroup vimrcEx
au!
autocmd FileType text setlocal textwidth=78
autocmd BufReadPost *
\ if line("'\"") > 0 && line("'\"") <= line("$") |
\ exe "normal g`\"" |
\ endif
au BufReadPost *.h,*.hh,*.c,*.ec,*.cpp,*.hpp,*.ecpp,*.pc set foldexpr=FoldBrace()
au BufReadPost *.h,*.hh,*.c,*.ec,*.cpp,*.hpp,*.ecpp,*.pc set foldmethod=expr
au BufReadPost *.h,*.hh,*.c,*.ec,*.cpp,*.hpp,*.ecpp,*.pc set foldenable
au BufWinLeave *.ztx mkview
au BufWinEnter *.ztx silent loadview
au BufNewFile,BufRead *.txt setf txt
augroup END
endif
""弹出窗口,让用户输入要查询的字串
"在include 和 source目录中查找,你可以根据情况进行修改
function s:Searchwordzx()
let findstring = inputdialog("Search string: ",expand("<cword>"))
if findstring != ""
execute "vimgrep " findstring "*"
endif
endfunction
""========================================
""从sdir.txt中读入目录,并在这些目录下查找指定字串,
"”sdir.txt要和源程序放在同一个目录下。
function s:Searchwordglzx()
let searchstring = expand("<cword>")
let searchdir = ''
for line in readfile("sdir.txt",'',6)
let searchdir .= fnameescape(line).'*.[csh] '
endfor
if searchstring != ""
execute "vimgrep " searchstring searchdir
endif
endfunction
"=====================================================================插件=============================================================
"-------------------------------------------ctags---------------------------->>
noremap <F8> :!ctags -R --fields=+lS <CR>
nmap fj g]
nmap ff <C-T>
"-------------------------------------------taglist.vim---------------------->>
noremap <F11> :TlistToggle<CR>
let Tlist_Show_One_File = 1
let Tlist_Exit_OnlyWindow = 1
let Tlist_Use_Right_Window = 1
"-------------------------------------------NERD_tree.vim-------------------->>
"设置快捷键"
noremap <F2> :NERDTreeToggle<cr>
"禁用所有与NERD_tree有关的命令"
"let loaded_nerd_tree=1
"不显示指定的类型的文件"
"let NERDTreeIgnore=['/.vim$', '/~$']
"不显示隐藏文件(好像只在linux环境中有效)"
let NERDTreeShowHidden=0
"排序"
let NERDTreeSortOrder=['//$','/.cpp$','/.c$', '/.h$', '/.py$', '/.lua$', '*']
"不分大小写排序"
let NERDTreeCaseSensitiveSort=0
"设置窗口尺寸"
"let NERDTreeWinSize=30
"是否显示行号"
"let NERDTreeShowLineNumbers=1
"是否显示书签"
"let NERDTreeShowBookmarks=1
"打开文件后, 关闭NERDTrre窗口"
"let NERDTreeQuitOnOpen=1
"高亮NERDTrre窗口的当前行"
let NERDTreeHighlightCursorline=1
"-------------------------------------------BufExplorer.vim------------------>>
noremap zz :BufExplorer<CR>
我的自定义配色方案文件(效果见第一张图):
self.vim(将该文件放在vim的colors目录下,然后在vim中输入命令:colo self 即可切换到该配色方案,也可以在vimrc中指定)
" Vim color file
" Maintainer: Bram Moolenaar <[email protected]>
" Last Change: 2006 Apr 14
" This color scheme uses a dark grey background.
" First remove all existing highlighting.
set background=dark
hi clear
if exists("syntax_on")
syntax reset
endif
let colors_name = "self"
hi Normal ctermbg=Black ctermfg=grey guifg=#c0c0c0 guibg=Black gui=none
" Groups used in the 'highlight' and 'guicursor' options default value.
hi ErrorMsg term=standout ctermbg=DarkRed ctermfg=White guibg=Red guifg=White
hi IncSearch term=reverse cterm=reverse gui=reverse
hi ModeMsg term=bold cterm=bold gui=bold
hi StatusLine term=reverse,bold cterm=reverse,bold gui=none guifg=black guibg=#606060
hi StatusLineNC term=reverse cterm=reverse gui=none guifg=black guibg=#606060
hi VertSplit term=reverse cterm=reverse guifg=#606060 guibg=#606060 gui=none
hi Visual term=reverse ctermbg=black guibg=#353535
hi VisualNOS term=underline,bold cterm=underline,bold gui=underline,bold
hi DiffText term=reverse cterm=bold ctermbg=Red gui=bold guibg=Red
hi Cursor guibg=#dddddd guifg=Black
hi lCursor guibg=Cyan guifg=Black
hi Directory term=bold ctermfg=LightCyan guifg=lightgreen gui=underline
hi LineNr term=underline ctermfg=cyan guifg=#388080
hi MoreMsg term=bold ctermfg=LightGreen gui=bold guifg=SeaGreen
hi NonText term=bold ctermfg=LightBlue guifg=LightBlue guibg=black
hi Question term=standout ctermfg=LightGreen gui=bold guifg=Green
hi Search term=reverse ctermbg=Yellow ctermfg=Black guibg=lightYellow guifg=Black
hi SpecialKey term=bold ctermfg=LightBlue guifg=Cyan
hi Title term=bold ctermfg=LightMagenta gui=bold guifg=Magenta
hi WarningMsg term=standout ctermfg=LightRed guifg=Red
hi WildMenu term=standout ctermbg=Yellow ctermfg=Black guibg=Yellow guifg=Black
hi Folded term=standout ctermbg=LightGrey ctermfg=DarkBlue guibg=DarkGrey guifg=DarkBlue
hi FoldColumn term=standout ctermbg=LightGrey ctermfg=DarkBlue guibg=Grey guifg=DarkBlue
hi DiffAdd term=bold ctermbg=DarkBlue guibg=DarkBlue
hi DiffChange term=bold ctermbg=DarkMagenta guibg=DarkMagenta
hi DiffDelete term=bold ctermfg=Blue ctermbg=DarkCyan gui=bold guifg=Blue guibg=DarkCyan
hi CursorColumn term=reverse ctermbg=Black guibg=grey40
hi CursorLine term=underline cterm=underline guibg=#202020
"语法关键字
hi statement guifg=#005cff ctermfg=blue ctermbg=black gui=none
hi preproc guifg=#005cff ctermfg=blue
"类型关键字
hi type guifg=#005cff ctermfg=blue ctermbg=black gui=none
"注释
hi comment guifg=green ctermfg=green ctermbg=black gui=none
"常量
hi Constant term=underline ctermfg=Magenta guifg=#ff8000 gui=none
"数字
hi Number term=underline ctermfg=Magenta guifg=Magenta gui=none
"标识符,如lua中的function end if
hi identifier guifg=#005cff ctermfg=red gui=none
"标签
hi label guifg=yellow ctermfg=yellow
hi operator guifg=orange ctermfg=lightRed ctermbg=darkBlue
hi TabLine guifg=black gui=none
hi TabLineSel gui=none
hi TabLineFill guibg=darkgrey gui=none
hi MatchParen ctermbg=blue guibg=lightblue guifg=black
hi Pmenu guibg=#101010 guifg=#909090 gui=none
" Groups for syntax highlighting
hi Special term=bold ctermfg=LightRed guifg=Orange guibg=grey5
hi Ignore ctermfg=DarkGrey guifg=grey20
" vim: sw=2