我不是Linux/UNIX的狂熱愛好者,雖然我崇尚GNU的精神。
我以前的開發都是在Windows平台使用VC編寫C/C++程式,
也使用Editplus寫ASP/HTML等,偶爾使用SourceInsight嘗試去瀏覽一些
大的項目源碼。
在網路常常看到關於編輯器的爭論,也就經常聽到這樣的話:
"Vi和Emacs是世界上上最強的兩個編輯器"。
我在自己的PC上曾經安裝過RedHat,但是通常不久之後,我都把
它們給刪除了。的確類似我這樣不是很有目的的鑽研Linux的人,
很快就覺得Linux使用不方便,Vi更實在是看不出來有什麼好用。
經常就聽到有人講Vi是如何如何的強大,什麼的都能幹。
還往往舉一些例子,諸如可以Regex搜尋等。
不過在我平時的工作,真的是很少看到誰在編程寫代碼時需要這麼專業的編輯
技巧。有時候在安裝好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