VimQVi Improved) 是一个类gvi 的文本编辑器Q在Vi的基上增加了很多新的Ҏ和功能。Vim以其强大的功能和可定制能?br />
Q成为Linux/Unix环境下开源的最重要的编辑器之一Q另一个是 EmacsQ,被众多开发者所喜爱。笔者此时所用的是最新的7.1版本
?br />
与大部分其它~辑器不同,q入 Vim 后,~省状态下键入的字Wƈ不会插入到所~辑的文件之中。Vim 的模式(modeQ可以简单地
理解?#8220;状?#8221;Q概念非帔R要。需要知道,Vim 有以下几个模式:
1Q?nbsp; 正常QnormalQ模式,~省的编辑模式;下面如果不加Ҏ说明Q提到的命o都直接在正常模式下输入;M其它模式中都
可以通过键盘上的 Esc 键回到正常模式?br />
2Q?nbsp; 命oQcommandQ模式,用于执行较长、较复杂的命令;在正常模式下输入“:”Q一般命令)?#8220;/”Q正向搜索)?#8220;?”
Q反向搜索)卛_q入该模式;命o模式下的命o要输入回车键QEnterQ才完成?br />
3Q?nbsp; 插入QinsertQ模式,输入文本时用;在正常模式下键入“i”QinsertQ或“a”QappendQ即可进入插入模式(也有?br />
外一些命令,?#8220;c”Q也可以q入插入模式Q但q些命o有其它的作用Q?br />
4Q?nbsp; 可视QvisualQ模式,用于选定文本块;可以在正常模式下输入“v”Q小写)来按字符选定Q输?#8220;V”Q大写)来按行?br />
定,或输?#8220;Ctrl-V”来按方块选定?br />
5Q?nbsp; 选择QselectQ模式,与普通的 Windows ~辑器较为接q的选择文本块的方式Q在以可视模式和选择模式之一选定文本块之
后,可以使用“Ctrl-G”切换到另一模式——该模式很少?Linux 上用,本文中就不再介绍了?
------------------------------------------
首先 vim ~/.vimrc 打开~辑文g
[转]
1、VI或VIM的配|文件的路径
发现/usr/share/vim/vimrc?etc/vim/vimrc指向是同一个文Ӟ即vimrcQؓvi和vim的配|文Ӟ修改q个文g卛_。这个\径在不同的LINUX版本中可能会不同?/p>
2、配|颜?/p>
配轩VI和VIM的颜色显C,使它能够高亮度显CZ些特别的单词Q这对编写程序很有用。后来打开文g发现里面其实已经有一行了Q只是用引号注释掉了Q只需
syntax on 所在行前面的引号去掉即可。或者另外独立添加一行:syntax on 也行Q另外编?etc/profile
增加一行alias vi="vim"p了?/p>
3、设|鼠?/p>
使用VI~辑文本Ӟ如果想修文g中改d标较q的位置Q这时候想用鼠标定位,可默认情况下Q鼠标是不可用的。如果你想用鼠标,只需另v一行,写上Qset mouse=a 卛_
4、设|自动羃q?/p>
默认情况下,VI和VIM都没有羃q的Q每换一行,光标均定位在格Q如果你惌动对齐,请将 set
autoindent所在行前面的引号去掉,或者另外添加一行:set
autoindent也可。这与配|颜色类伹{这L讄的结果是按回车后新行与上一行自动对齐?/p>
5、设|tab的羃q量
如果用python~写E序Q那么行~进量是一个极光要的概念Q同一个块的羃q量必须相同。你可能喜欢在行前加I格来表C羃q,但每ơ必L多次I格
键,如果你喜Ƣ用按TAB键来表示~进Q你可能觉得写的文本或程序不太好看,因ؓ默认情况下,VI和VIM的TAB~进量比较大Q至六Q七个字W)。设
|TAB键羃q量的方法:set shiftwidth=3 你也可以选一 个你自己喜欢的羃q量Q比?Q或4.
----------------------------------------------
首先从视觉方?
W一个要做的是羃q?/strong>,修改你的VIM配置文g_vimrc,在最后加?span style="color: rgb(0, 128, 0);">set cindent,q样p|了c风格的羃q?在这里羃q的大小?span style="color: rgb(51, 153, 102);">shiftwidth的倹{?/p>
W二个要做的是语法高?/strong>Q这个是必须的,在中_vimrc加入syntax enable?/p>
W三个要做的字体的设|?/strong>Q设|一个舒服的字体可以让你~程的时候舒服好多,用editplus的时候我q的ConsolasQ在vim中我q是用的q种字体Q在_vimrc中加?/p>
if has(”gui_running”)
set guifont=Consolas:h9
endif
表示q行界面vim的时候就用这U字体?/p>
W四Q设|配色方?/strong>Q可以到点击q儿下蝲Q然后放?span style="color: rgb(0, 128, 0);">$VIM"vimfiles"colorsq个目录下,然后在中加入如下配置
if has(”gui_running”)
set guifont=Consolas:h9
” set color schema
colorscheme colorscheme_name
endif
colorscheme_nameZ需要设|的配色Ҏ的名U?/span>
接下来是在运行程序中用到的:
W一Q用ctag
VIM中已l带了Ctagsq个E序。尽ctags也可以支持其它编辑器Q但是它正式支持的只?a class="st_tag internal_tag" rel="tag" title="Posts tagged with vim">VIM。Ctags可以帮助E序员很Ҏ地浏览源代码。用下面的命令可以在源代码的根目录下创徏“tags”文gQ?/p>
[/home/brimmer/src]$ ctags -R
“-R”表示递归创徏Q也包括源代码根目录下的所有子目录下的源程序?#8220;tags”文g中包括这些对象的列表Q?/p>
l ?define定义的宏
l 枚D型变量的?/p>
l 函数的定义、原型和声明
l 名字I间QnamespaceQ?/p>
l cd定义QtypedefsQ?/p>
l 变量Q包括定义和声明Q?/p>
l c(classQ、结构(structQ、枚丄型(enumQ和联合QunionQ?/p>
l cR结构和联合中成员变量或函数
VIM用这?#8220;tags”文g来定位上面这些做了标记的对象Q下面介l一下定位这些对象的ҎQ?/p>
1) 用命令行。在q行vim的时候加?#8220;-t”参数Q例如:
[/home/brimmer/src]$ vim -t foo_bar
q个命o打开定义“foo_bar”Q变量或函数或其它)的文Ӟq把光标定位到这一行?/p>
2) ?a class="st_tag internal_tag" rel="tag" title="Posts tagged with vim">vim~辑器内?#8220;:ta”命oQ例如:
:ta foo_bar
3) 最方便的方法是把光标移到变量名或函数名上,然后按下“Ctrl-]”。用“Ctrl-o”退回原来的地方?/p>
注意Q运?a class="st_tag internal_tag" rel="tag" title="Posts tagged with vim">vim的时候,必须?#8220;tags”文g所在的目录下运行。否则,q行vim的时候还要用“:set tags=”命o讑֮“tags”文g的\径,q样vim才能扑ֈ“tags”文g?/p>
你还可以选择使用taglistq个插gQ这个插件可以在右侧昄函数Q变量等的列?/p>
W二Q改正程序中的错?/strong>
?a class="st_tag internal_tag" rel="tag" title="Posts tagged with vim">VIM~辑器的环境下用“:make”Qmake工具的用已l在我昨天的文章?
提到的云风的几篇文章中详l介l到Q就可以~译E序Q当然其前提是在当前目录下有Makefile文g。运行完“:make”之后Q如果程序中有错误,?
会显C出来。这时候,光标会自动指向第一个出现错误的地方Q而且你还可以看到错误的提C。然后,你就可以Ҏ错误Q而不用手工找到出错的那一行。记住下?
几个有用的命令:
l “:cl”列出错误
l “:cn”让光标指向下一个错?/p>
l “:cp”让光标指向上一个错?/p>
l “:cnew”从头开?/p>
你甚臛_以让VIM识别出其它编译器而不是gcc的错误提C。这对一些开发嵌入式pȝ的程序员q很有用Q因Z们很可能用的不是gcc而是其它~译器。通过讄“errorformat”的|可以?a class="st_tag internal_tag" rel="tag" title="Posts tagged with vim">VIM识别出编译器的出错提C。因Z同的~译器的出错提示是不同的Q所以如果用的不是gccp重新讄?/p>
“errorformat”的值是一个字W串Q它的格式和C语言的scanf的字W串格式相识?/p>
gcc?#8220;errorformat”的gؓQ?f:%l:"%m。其?#8220;%f”表示文g名,“%l”表示行号Q?#8220;%m”表示出错信息?/p>
?#8220;:h errorformat”查看详细的帮助信息?/p>
?span style="color: rgb(0, 128, 0);">“:h quickfix”?#8220;:h make”?#8220;:h makeprg”?#8220;:h errorfile”查看其它的信息?/p>
W三Q用快捷键
下面的这些快捷键对程序员很有帮助Q?br />
在函CUd光标
[[ 转到上一个位于第一列的“{”
]] 转到下一个位于第一列的“{”
{ 转到上一个空?/p>
} 转到下一个空?/p>
gd 转到当前光标所指的局部变量的定义
* 转到当前光标所指的单词下一ơ出现的地方
# 转到当前光标所指的单词上一ơ出现的地方
括号的匹?/p>
% 用来q行括受中括号和大括号的匹配。这要看当前光标指向的是什么符号了?/p>
----------------------------------------------
一个ubuntu 下的vimrc配置例子:
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 一般设?br />
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 讑֮默认解码
set fenc=utf-8
set fencs=utf-8,usc-bom,euc-jp,gb18030,gbk,gb2312,cp936
"讑֮搜烦是的高亮昄
set hlsearch
" 不要使用vi的键盘模式,而是vim自己?br />
set nocompatible
" history文g中需要记录的行数
set history=100
" 在处理未保存或只L件的时候,弹出认
set confirm
" 与windows׃n剪脓?br />
set clipboard+=unnamed
" 侦测文gcd
filetype on
" 载入文gcd插g
filetype plugin on
" 为特定文件类型蝲入相关羃q文?br />
filetype indent on
" 保存全局变量
set viminfo+=!
" 带有如下W号的单词不要被换行分割
set iskeyword+=_,$,@,%,#,-
" 语法高亮
syntax on
" 高亮字符Q让其不?00列限?br />
:highlight OverLength ctermbg=red ctermfg=white guibg=red guifg=white
":match OverLength '"%101v.*'
" 状态行颜色
highlight StatusLine guifg=SlateBlue guibg=Yellow
highlight StatusLineNC guifg=Gray guibg=White
"高亮当前?br />
set cursorline
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 文g讄
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 不要备䆾文gQ根据自己需要取舍)
set nobackup
" 不要生成swap文gQ当buffer被丢弃的时候隐藏它
setlocal noswapfile
set bufhidden=hide
" 字符间插入的像素行数?br />
set linespace=0
" 增强模式中的命o行自动完成操?br />
set wildmenu
" 在状态行上显C光标所在位|的行号和列?br />
set ruler
set rulerformat=%20(%2*%<%f%=" %m%r" %3l" %c" %p%%%)
" 命o行(在状态行下)的高度,默认?Q这里是2
set cmdheight=2
" 使回格键QbackspaceQ正常处理indent, eol, start{?br />
set backspace=2
" 允许backspace和光标键跨越行边?br />
set whichwrap+=<,>,h,l
" 可以在buffer的Q何地方用鼠标(cMoffice中在工作区双击鼠标定位)
set mouse=a
set selection=exclusive
set selectmode=mouse,key
" 启动的时候不昄那个援助索马里儿童的提示
set shortmess=atI
" 通过使用: commands命oQ告诉我们文件的哪一行被改变q?br />
set report=0
" 不让vim发出讨厌的滴滴声
set noerrorbells
" 在被分割的窗口间昄I白Q便于阅?br />
set fillchars=vert:" ,stl:" ,stlnc:"
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 搜烦和匹?br />
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 高亮昄匚w的括?br />
set showmatch
" 匚w括号高亮的时_单位是十分之一U)
set matchtime=5
" 在搜索的时候不忽略大小?br />
set noignorecase
" 不要高亮被搜索的句子QphrasesQ?br />
"set nohlsearch
" 在搜索时Q输入的词句的逐字W高亮(cMfirefox的搜索)
set incsearch
" 输入:set list命o是应该显CZ啥?
set listchars=tab:"|" ,trail:.,extends:>,precedes:<,eol:$
" 光标Ud到buffer的顶部和底部时保?行距?br />
set scrolloff=3
" 不要闪烁
set novisualbell
" 我的状态行昄的内容(包括文gcd和解码)
set statusline=%F%m%r%h%w" [FORMAT=%{&ff}]" [TYPE=%Y]" [POS=%l,%v][%p%%]" %{strftime(""%d/%m/%y" -" %H:%M"")}
" L昄状态行
set laststatus=2
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 文本格式和排?br />
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 自动格式?br />
set formatoptions=tcrqn
" l承前一行的~进方式Q特别适用于多行注?br />
set autoindent
" 为CE序提供自动~进
set smartindent
" 使用C样式的羃q?br />
set cindent
" 制表Wؓ4
set tabstop=4
" l一~进?
set softtabstop=4
set shiftwidth=4
" 不要用空g替制表符
set noexpandtab
" 不要换行
"set nowrap
"讄每行80个字W自动换?br />
set textwidth=80
" 在行和段开始处使用制表W?br />
set smarttab
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" CTags的设?br />
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 按照名称排序
let Tlist_Sort_Type = "name"
" 在右侧显C窗?br />
let Tlist_Use_Right_Window = 1
" 压羃方式
let Tlist_Compart_Format = 1
" 如果只有一个bufferQkillH口也kill掉buffer
let Tlist_Exist_OnlyWindow = 1
" 不要关闭其他文g的tags
let Tlist_File_Fold_Auto_Close = 0
" 不要昄折叠?br />
let Tlist_Enable_Fold_Column = 1
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Autocommands
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 只在下列文gcd被侦到的时候显CP普通文本文件不昄
if has("autocmd")
autocmd FileType xml,html,c,cs,java,perl,shell,bash,cpp,python,vim,php,ruby set number
autocmd FileType xml,html vmap <C-o> <ESC>'<i<!--<ESC>o<ESC>'>o-->
autocmd FileType java,c,cpp,cs vmap <C-o> <ESC>'<o/*<ESC>'>o*/
autocmd FileType html,text,php,vim,c,java,xml,bash,shell,perl,python setlocal textwidth=80
autocmd Filetype html,xml,xsl source $VIMRUNTIME/plugin/closetag.vim
autocmd BufReadPost *
" if line("'""") > 0 && line("'""") <= line("$") |
" exe "normal g`""" |
" endif
endif " has("autocmd")
" C/C++的编译和q行
map <F5> :call CompileRunGcc()<CR>
func! CompileRunGcc()
exec "w"
exec "!make"
exec "! ./%<"
endfunc
" shell scriptq行
map <F6> :call CompileRunSH()<CR>
func! CompileRunSH()
exec "w"
exec "!chmod a+x %"
exec "!./%"
endfunc
" pythonq行
map <F7> :call CompileRunPyhton()<CR>
func! CompileRunPyhton()
exec "w"
exec "!chmod a+x %"
exec "!./%"
endfunc
" 能够漂亮地显C?NFO文g
set encoding=utf-8
function! SetFileEncodings(encodings)
let b:myfileencodingsbak=&fileencodings
let &fileencodings=a:encodings
endfunction
function! RestoreFileEncodings()
let &fileencodings=b:myfileencodingsbak
unlet b:myfileencodingsbak
endfunction
au BufReadPre *.nfo call SetFileEncodings('cp437')|set ambiwidth=single
au BufReadPost *.nfo call RestoreFileEncodings()
" 高亮昄普通txt文gQ需要txt.vim脚本Q?br />
au BufRead,BufNewFile * setfiletype txt
" 用空格键来开x?br />
set foldenable
set foldlevel=0
set foldmethod=indent
nnoremap <space> @=((foldclosed(line('.')) < 0) ? 'zc' : 'zo')<CR>
" minibufexpl插g的一般设|?br />
let g:miniBufExplMapWindowNavVim = 1
let g:miniBufExplMapWindowNavArrows = 1
let g:miniBufExplMapCTabSwitchBufs = 1
let g:miniBufExplModSelTarget = 1
----------------------
一个相兛_?br />
http://forum.ubuntu.org.cn/viewtopic.php?f=68&t=138212&st=0&sk=t&sd=a

]]>