vim的強大功能如何擷取

來源:互聯網
上載者:User
 

我不是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

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.