我不是Linux/UNIX的狂热爱好者,虽然我崇尚GNU的精神。
我以前的开发都是在Windows平台使用VC编写C/C++程序,
也使用Editplus写ASP/HTML等,偶尔使用SourceInsight尝试去浏览一些
大的项目源码。
在网络常常看到关于编辑器的争论,也就经常听到这样的话:
"Vi和Emacs是世界上上最强的两个编辑器"。
我在自己的PC上曾经安装过RedHat,但是通常不久之后,我都把
它们给删除了。的确类似我这样不是很有目的的钻研Linux的人,
很快就觉得Linux使用不方便,Vi更实在是看不出来有什么好用。
经常就听到有人讲Vi是如何如何的强大,什么的都能干。
还往往举一些例子,诸如可以正则表达式搜索等。
不过在我平时的工作,真的是很少看到谁在编程写代码时需要这么专业的编辑
技巧。有时候在安装好Linux时,我仅仅就是希望vi能象Editplus一样
好好的工作就可以了,我都不敢奢望它象VC一样方便。
可是在常见的Linux/UNIX入门书上,无一例外都或先将一下Vi的使用,
而且通常都会介绍Insert Mode和Command Mode的区分,讲h,j,k,l
进行Move,讲:q, :wq, :q!退出,讲i,o,a插入,讲<escape>,
将dd, yy, p等Copy & Paste。(当然,这些是最基本的,你不得不会:-))
可是仅仅这些,我想大多数人真的很难觉得这是什么最强的编辑器。
感觉还不如Notepad,真是不明白啊 :-(。
我这样的初学Linux者,常常在网上或者bbs上看到的vi技巧
总是这些不实用的命令,就象关于替换%s/foo/bar/gc等等都会成为
技巧介绍的文章,的确好迷惑的,因为这些对于Windows下的编辑器都是很基本的。
为什么那么多的人说Vi/Vim是最好的编辑器啊?我想总是有原因的。
虽然出来讲的人常常就是一句话,Vi是最好的。用vim+gcc+gdb,
想干什么干什么,呵呵。我不是狂热的Vim推崇者,
我只是希望我在Linux/Unix下编程的时候能有一个好的工具。
当我偶然的访问了一下vim.sourceforge.net,下载了几个Top rated的
vim script和看完了Top rated的Tips,我的看法大有改变。
在花了一整天的时间学习和熟练这些Tip和Script后,我感到Vim还的确是
一个不错的工具了。
我先说说当我转到Vi进行编程时,我最希望有的一些功能,
这些功能可能很小,但是如果相当Editplus或VC没有时,我就觉得很不爽了。
当然也许是受Windows毒害太久了吧,呵呵。
1. 怎样才能比较方便的同时编辑多个文件,例如多个文件间切换,
Copy Paste内容等。
2. 我要在编辑文本中查找一个词,几乎书上教的都是使用"/word",
可是如果这个词就在光标下,我却要一个字符一个字符输入这个词,
不是很郁闷吗?例如:/i_want_to_search_this_long_word.
3. 我的工作主要是C/C++编程,真是希望能想VC一样,在左边能看到
项目的文件列表,和Class,Function,Struct的列表,并且选择了
就能跳到相应的位置。
4. 也是和编程相关的,在VC里面,Build了Browse Info后,F12就
可以很方便的在class ,variable, constant等的definition,
implementation or reference间跳转,这非常方便非常有用。
5. 在VC里面,在一个.C/.cpp文件中,对于include的文件,例如
   #include "foo.h",你在foo处,<ctrl>+<shift>+g就可以跳到
   这个头文件去,真是方便啊。难道vim不提供吗?
6. 要是能在Vi中象Explorer一样查看文件列表,并可以选择就好了。
还有更多的问题,我就不必逐一列举了,因为我这篇文章不是要当
百科书,而是给那些用过vi后来放弃了(:-),当然不是转去Emacs那种),
和初学Linux/vi,但看了书本但觉得Vi很不好用的人看的。
OK,上面6个问题的解决之道。
1. vim.sourceforge.net 下载排名No. 3的bufexplorer.vim
2. vim.sf.net中Tips的No. 1的 "Super Star", 呵呵,当光标在这个
词上的时候,按*号就可以,和在Editplus中按Ctrl+F3一样方便。
另一个技巧是写了开始查找的/后,<ctrl+r><ctrl+w>就可以把光标下的
词复制到command buffer处,非常有用的Tip。
3. a)想要看到Class,Struct等列表,你需要No. 1的taglist.vim,
有了它,Vim现在看着顺眼多了。b)希望有项目文件列表:你需要
No.7的Project.vim, 有了它们俩,VC的左侧窗口基本都模拟出来了。:-)
4. 有taglist.vim的帮助,你已经会觉得方便了许多,taglist需要ctags
   才能实现,ctags的作用就是为C代码中Symbol建立tags,tags是什么?
   你通过Vim的Help(:help)就明白了,挺象超链接的。可是ctags的功能
   还不够强,因为这个工作cscope确实比它做的更好,也更强。如果你有兴趣
使用cscope,那你就应当看看cscope.sf.net,同时有很多的Vim版本是
没有内嵌cscope的支持的。你可以用在Vim中用:version查看。如果没有,
祝贺你,你有机会自己亲手把Vim编译一次了。呵呵,注意./configure
的时候--enable-cscope。有了cscope,用Vim看项目代码的确如虎添翼!
5. gf  --就这么简单,呵呵。如果你还是找不到头文件,怎么办?
请:help path.正确设置头文件所在的path很重要。
6. Try :Ex and :Sex :e . and :e /usr/src,你就都明白了。
其它的
7. 一定要去vim.sf.net 上把Top10的script都放到自己的Vim中试试,
一定要把No.2的Tip保存下来,随时查看。
8. 我在xterm中使用vim,但发现长时间编程用gvim也很好,你可以
把desert.vim下载下来,色彩不错哦,还保护视力。gvim=vim -g
P.S.
就到这里吧,写这篇文章是因为我花了一整天的时间来学习Vim,
以及安装测试使用这些Scripts,总算觉得使用Vim比较入门和顺手了。
其实接触和使用Vi也很长时间了,但是从来没有去过vim.sf.net,所以
一直觉得Vi很不好用,现在看法改变了,希望这篇文章能帮助那些
希望学好Vim的朋友入门。:-)
如果你正在学习Emacs,那你一定要去www.emacswiki.org看看那些Tip,
下载其中的script。不过我已经觉得Vim足够好了。因为我喜欢Vi方式的
用j来移动光标,而不是Emacs那样的Ctrl+n, 需要两只手,呵呵。

引用自 http://www.smth.edu.cn/bbsgcon.php?board=LinuxApp&file=N/G.1061286675.00&num=1280


vim配置实例

CODE

set nocompatible
source $VIMRUNTIME/vimrc_example.vim
source $VIMRUNTIME/mswin.vim
behave mswin

set guifont=FixedsysTTF:h14   "如果没有这个字体那就不要加
set tabstop=8
set softtabstop=4
set shiftwidth=4
colorscheme blue               "在gvim下可以看到有多少coloscheme

set sw=4      " shiftwidth
set et        " expandtab
set wm=8      " wrapmargin
set bs=2      " backspace
set ru        " ruler
set ic        " ignorecase      "忽略大小写 但是输入中有大写的话不忽略
set is        " incsearch
set scs       " smartcase: override the 'ic' when searching
"     if search pattern contains uppercase char
set vb t_vb=  " set visual bell and disable screen flash
set backup    " enable backup and define the backup file
set backupext=.bak
set hlsearch  " hlsearch
" allow backspacing over everything in
" the insert mode
set backspace=indent,eol,start
set dir=e:/tmp/vimswap/vim1,e:/tmp/vimswap/vim2,e:/tmp/vimswap/vim3,e:/tmp/vimswap/vim4
" 设置swap文件的目录上面
set backupdir=e:/tmp/vimswap/vim1,e:/tmp/vimswap/vim2,e:/tmp/vimswap/vim3,e:/tmp/vimswap/vim4
"设置备份文件的目录上面 我不喜欢看到每个目录下都有备份 因为一般备份用不到


set diffexpr=MyDiff()
function MyDiff()
   let opt = ''
   if &diffopt =~ 'icase' | let opt = opt . '-i ' | endif
   if &diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif
   silent execute '!d:/tools/Vim/vim62/diff -a ' . opt . '"' . v:fname_in . '" "' . v:fname_new . '" > "' . v:fname_out . '"'
endfunction

"下面是设置自动folder的 而且是根据写C代码设置的 如果你不喜欢使用folder那么可以省略掉
au BufReadPost *.c,*.cpp    syn region myFold start="{" end="}" transparent fold
au BufReadPost *.c,*.cpp    syn sync fromstart
au BufReadPost *.c,*.cpp    set foldmethod=syntax
set foldlevel=0




更全点的配置文件
CODE

" ----------------------------------------------------------------
" $Id: .vimrc.html,v 1.3 2003/06/16 23:29:15 thouveni Exp $
"
"
" Download <URL:http://touv.ouvaton.org/documents/MyDotFiles/.vimrc>
"
" ----------------------------------------------------------------

" -----------------------------------------------------------
" {{{ 1. General setup
" -----------------------------------------------------------

" enable backspace to delete anyting (includes /n) in insert mode
set backspace=2

" il parait que c'est mieux de ne pas 阾re compatible
set nocompatible

" ??? fait un bip lors d'une erreur
set errorbells

" Active les plugins et les indeantaions par type de fichier
filetype plugin indent on

" Quand on tape un ), vim montre furtivement le ( correspondant.
set showmatch

" On ne coupe pas les lignes si elles sont grandes
set nowrap

" ??? now real wrap during insert (enable/override this when using as mail-editor)
"set tw=0

" ??? use full featured format-options. see "help fo-table for help
if v:version >= 600
       set formatoptions=tcrqn2
else
       " vim 5 doesn't know r/n
       set formatoptions=tcq2
endif

" define what are comments
set com& " reset to default
set com^=sr:*/ -,mb:*/ / ,el:*/ com^=sr:/// -,mb:/// / ,el:///

" Ajoute une marge ?gauche pour afficher les +/- des replis
set foldcolumn=2

" }}}


" -----------------------------------------------------------
" {{{ 2 Indentation
" -----------------------------------------------------------

" On garde d'une ligne ?l'autre l'indentation d'un paragraphe
set autoindent

" ???
set expandtab

" Nombre d'espace pour une tabulation
set shiftwidth=4

" if non-zero, number of spaces to insert for a <tab>
set softtabstop=4

" number of spaces the tab stands for
set tabstop=4

" some nice options for cindenting  by FOLKE
set cinoptions={.5s,+.5s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s

" a <tab> in an indent insets 'shiftwidth' spaces (not tabstop)
"set smarttab

" smartindenting (clever autoindenting)
" set si


" }}}


" -----------------------------------------------------------
" {{{ 3. Searching, Substituting
" -----------------------------------------------------------

" On ignore la casse des caract鑢es dans les recherches de cha頽es.
set ignorecase

" No ignorecase if Uppercase chars in search
set scs

" change the way backslashes are used in search patterns
set magic

" begin search at top when EOF reached
set wrapscan

" jump to matches during entering the pattern
set sm

" highlight all matches...
set hls

" ...and also during entering the pattern
set incsearch

" !!! use 'g'-flag when substituting (subst. all matches in that line, not only first)
" to turn off, use g (why is there no -g ?)
" set gdefault

" !!! turn off the fucking :s///gc toggling
"set noedcompatible

" }}}


" -----------------------------------------------------------
" {{{ 4. Highlighting, Colors, Fonts
" -----------------------------------------------------------

" Active la coloration syntaxique quand c'est possible
if &t_Co > 2 || has("gui_running")
       syntax on
endif

" Fond noir
set bg=dark

if has("gui_running")

       "Nombre de colonnes ?afficher
       set co=98

       "Nombre de lignes ?afficher
       set lines=41

       " Choix d'une police
       if has("win32")
               set guifont=Fixedsys:h9:cANSI
               "set guifont=Courier:h10:cANSI
       else
               set gfn=-adobe-courier-medium-r-normal-*-*-140-*-*-m-*-iso8859-15
       endif

       " Choix d'un theme de coloration
       "colorscheme pablo
       colorscheme darkblue
endif

" ??? how many lines to sync backwards
syn sync minlines=10000 maxlines=10000

" ??? how many lines to search backward after a jump to check syntax
let c_minlines = 200

" ??? aldo highlight some things in comments
let c_comment_strings = 1

" ??? SQL-Highlighting in PHP-Strings (1=yes 0=no)
" let php_sql_query = 1
" let php_minlines=300
" let php_htmlInStrings=1

" }}}


" -----------------------------------------------------------
" {{{ 4. Statusline, Menu
" -----------------------------------------------------------

" use tab for auto-expansion in menus
set wc=<TAB>

" show a list of all matches when tabbing a command
set wmnu

" how command line completion works
set wildmode=list:longest,list:full

" ignore some files for filename completion
set wildignore=*.o,*.r,*.so,*.sl,*.tar,*.tgz

" some filetypes got lower priority
set su=.h,.bak,~,.o,.info,.swp,.obj

" remember last 2000 typed commands
set hi=2000

" show cursor position below each window
set ruler

" shows the current status (insert, visual, ...) in statusline
set showmode

" use shortest messages
set shm=a

" show always statusline of last window
set laststatus=2

" }}}


" -----------------------------------------------------------
" {{{ 5. window handling
" -----------------------------------------------------------

" focus follows mouse
set mousef

" minimal number of lines used for the current window
set wh=1

" minimal number of lines used for any window
set wmh=0

" make all windows the same size when adding/removing windows
set noequalalways

"a new window is put below the current one
set splitbelow

" }}}


" -----------------------------------------------------------
" {{{ 6. file, backup, path
" -----------------------------------------------------------

" Le swap est mis ?jour apr閟 50 caract鑢es saisies
set uc=50

" R閜ertoire de sauvegarde automaitique
set backupdir=~/.backup

" On active la sauvagarde
set backup


if has("unix")
       if v:version >= 600
               set     path=.,/usr/include,/usr/X11R6/include,/usr/local/include
       else
               set     path=.,/usr/include,/usr/X11R6/include/,/usr/local/include
       endif
endif

" change to directory of current file automatically
autocmd BufEnter * lcd %:p:h

" }}}


" -----------------------------------------------------------
" {{{ 7. UNIX Specials
" -----------------------------------------------------------

if has("unix")
       set clipboard=autoselect
       set shell=/bin/bash
endif

" }}}


" -----------------------------------------------------------
" {{{ 8. Mapping
" -----------------------------------------------------------

" Supprime tout les blancs en debut de ligne
nmap _S :%s/^/s/+//<CR>

" Converts file format to/from unix
command Unixformat :set ff=unix
command Dosformat :set ff=dos

" On fait tourner les tampons ...
nnoremap <C-N> :bn!<CR>
nnoremap <C-P> :bp!<CR>

" Annuler aka Undo (window$'s style)
noremap <C-Z> u
inoremap <C-Z> <C-O>u

" Refaire aka Redo (window$'s style)
noremap <C-Y> <C-R>
inoremap <C-Y> <C-O><C-R>

" Tout s閘閏tionner (window$'s style)
noremap <C-A> gggH<C-O>G
inoremap <C-A> <C-O>gg<C-O>gH<C-O>G
cnoremap <C-A> <C-C>gggH<C-O>G

" Indentation automatique (Emacs's style)
vnoremap <C-F>   =$
vnoremap <tab>   =
nnoremap <tab>   =$
nnoremap <C-tab> mzvip=`z

" Fermer fichier (tampon) (window$'s style)
map <C-F4> :bd<cr>
imap <C-F4> <C-O>:bd<cr>
cmap <c-F4> <c-c>:bd<cr>

" Sauvegarder fichier (touv's style)
noremap <c-x><c-s> w<cr>
inoremap <c-x><c-s> <C-O>:w<cr>

" Ouvrir un fichier (Emacs's style)
"noremap <c-x><c-f> :e!
"inoremap <c-x><c-f> <c-O>:e!

" have <F1> prompt for a help topic, rather than displaying the introduction
" page, and have it do this from any mode:
nnoremap <F1> :help<Space>
vmap <F1> <C-C><F1>
omap <F1> <C-C><F1>
map! <F1> <C-C><F1>

" Force la fermeture d'un tampon
map <F4> :bd!<cr>
imap <F4> <C-O>:bd!<cr>
cmap <F4> <c-c>:bd!<cr>

" Fermer un tag (cf. closetag.vim)
inoremap <F5> <C-R>=GetCloseTag()<CR>
map <F5> a<C-_><ESC>

" Supprime tout les blancs en fin de ligne
map <F6> :%s//s/+$//<CR>

" Mets en commentaire
map <F7> <Leader>c
imap <F7> <esc><F7>

" active/d閟active la navigation par tags
nnoremap <silent> <F8> :Tlist<CR>


if has("gui_running")
   " alt jumps to menu
   set winaltkeys=menu

   " clipboard to autoselect
   set guioptions+=a

   " Shift-Fleche pour selectionner un bloc
   map <S-Up> vk
   vmap <S-Up> k
   map <S-Down> vj
   vmap <S-Down> j
   map <S-Right> v
   vmap <S-Right> l
   map <S-Left> v
   vmap <S-Left> h

   if has("win32") || has("win16")
       " ...
   else
       " Couper aka Cut (generic's style)
       vmap <S-Del> "*x

       " Copier aka Copy (generic's style)
       vmap <C-Insert> "*y
       "vmap <Return> "*y"   "Return realise la copie du bloc selectionner
       "vmap <S-Return> "*y" "Shift Return aussi

       " Coller aka Insert (generic's style)
       function! NormalPaste()
           if @* != ""
               normal "*gP
           endif
       endfunction
       function! SelectPaste()
           if @* != ""
               if col(".") < col("'<")
                   normal "*gp
               else
                   normal "*gP
               endif
           endif
       endfunction

       "map <S-Insert>                          :call NormalPaste()<CR>
       "imap <S-Insert>                         x<Esc>:call NormalPaste()<CR>s
       "cmap <S-Insert> <C-R>*
       "vmap <S-Insert>                         "-x:call SelectPaste()<CR>
   endif
endif

" }}}


" -----------------------------------------------------------
" {{{ 9. Divers
" -----------------------------------------------------------

" use css when converting syntax to html (2html.vim)
let html_use_css = 1

" and a nice command for makeing html-code
command Code2html :source $VIMRUNTIME/syntax/2html.vim|

" }}}


" -----------------------------------------------------------
" {{{ 11. Templates
" -----------------------------------------------------------
if has("autocmd")
   au BufNewFile *.xsl 0r~/.vim/templates/xsl.xsl
   au BufNewFile *.xml 0r~/.vim/templates/xml.xml
   au BufNewFile *.html 0r~/.vim/templates/html.html
   au BufNewFile *.c 0r~/.vim/templates/c.c
   au BufNewFile *.php 0r~/.vim/templates/php.php
endif

"}}}


" -----------------------------------------------------------
" {{{ 12. Sp閏ificit?pour chaque type de fichier
" -----------------------------------------------------------
autocmd FileType text setlocal textwidth=78
autocmd FileType text set nocindent
autocmd FileType html set formatoptions+=tl
autocmd FileType css set smartindent
autocmd FileType html,css set noexpandtab tabstop=2
autocmd FileType c,cpp,slang set cindent
autocmd FileType html,xml,xsl source ~/.vim/scripts/closetag.vim

"}}}


" vim:fdm=marker

应用自http://bbs.loveunix.net/viewthread.php?tid=3155



http://larc.ee.nthu.edu.tw/~cthuang/vim/vim-living.html#Vertical_Splitting
 
Logo

更多推荐