天天看點

VIM查找操作

" 搜尋

/joe/e : 設定光标到比對"joe"的末尾

/joe/e+1 : 設定光标到比對"joe"的末尾再後移一位

/joe/s-2 : 設定光标到比對"joe“的開頭再前移兩位

/^joe.*fred.*bill/ : 比對以'j'開頭且"joe"到"fred"到"bill"之間至少有一個字元

/^[A-J]\+/ : 搜尋'A'到’J‘重複兩次以上的開頭行

/begin\_.*end : 多行比對

/fred\_s*joe/i : 可以是任何空白字元包括\n,\t等等

/fred\|joe : 搜尋fred或者joe

/.*fred\&.*joe : 搜尋同時包括fred跟joe的行

/\<fred\>/i : 搜尋獨立的單詞fred

/\<\d\d\d\d\> : 搜尋獨立的4位數字

/\D\d\d\d\d\D : 搜尋6位字元串中間4位數字前後兩位不能為數字

/\<\d\{4}\> : 同/\<\d\d\d\d\>

" 查找空行

/^\n\{3} : 比對三連續的空行

" 使用正規表達式組查找

/\(fred\).*\(joe\).*\2.*\1

" 正規表達式重複

/^\([^,]*,\)\{8}

" visual searching

:vmap // y/<C-R>"<CR> : visually模式下的鍵盤映射,把//映射成比對目前選中的文本

:vmap <silent> // y/<C-R>=escape(@", '\\/.*$^~[]')<CR><CR> : 包括空白字元

" \zs 和 \ze 比對原 :h /\zs

/<\zs[^>]*\ze> : 比對尖括号中的内容

" 零寬度比對 :h /\@=

/<\@<=[^>]*>\@= : search for tag contents, ignoring chevrons

/<\@<=\_[^>]*>\@= : search for tags across possible multiple lines

" 多行查找 \_ 的意思是包括換行符

/<!--\_p\{-}--> : 比對<!--開始到-->結尾的所有内容

/fred\_s*joe/i : 比對fred開始到joe,之間一定得是空白字元

/bugs\(\_.\)*bunny : 比對所有bugs到bunny的字元串

:h \_ : help

" 查找函數聲明,nmap為normal模式下的鍵盤映射

:nmap gx yiw/^\(sub\<bar>function\)\s\+<C-R>"<CR>

" 查找多個檔案

:bufdo /searchstr/ : 在多個檔案緩沖區裡執行查找

" 更好的多檔案查找定位方法

:bufdo %s/searchstr/&/gic : 在多個檔案緩沖區裡查找,按下n停止

" 怎樣不使用 / 來查找網址

? http://www.vim.org/  : 向後查找

" 查找指定字元以外的字元串

/\c\v([^aeiou]&\a){4} : 查找4個輔音字母

----------------------------------------

#替換

:%s/fred/joe/igc : 普通替換指令

:%s/\r//g : 删除 DOS 的換行符 ^M

" 你的文本檔案是否亂七八糟的排成一行?使用如下指令

:%s/\r/\r/g : 轉換 DOS 回車符 ^M 為真正的回車符

:%s= *$== : 删除行尾空白

:%s= \+$== : 同上

:%s#\s*\r\?$## : 删除尾部空白和dos換行符

:%s#\s*\r*$## : 同上

" 删除空行

:%s/^\n\{3}// : 删除連續3個空行

:%s/^\n\+/\r/ : 壓縮空行,多個替換為一個

%s#<[^>]\+>##g : 删除html的tag部分

" IF YOU ONLY WANT TO KNOW ONE THING

:'a,'bg/fred/s/dick/joe/igc : 非常有用

# 譯釋:''a,''b指定一個範圍:mark a ~ mark b

# g//用一個正規表達式指出了進行操作的行必須可以被fred比對

# 看後面,g//是一個全局顯示指令

# s/dick/joe/igc則對于這些滿足條件的行進行替換

" 複制列

:%s= [^ ]\+$=&&= : 複制最後一列

:%s= \f\+$=&&= : 一樣

:%s= \S\+$=&& : 暈,還一樣!

" 記憶(反向引用)

:s/\(.*\):\(.*\)/\2 : \1/ : 将兩個字段颠倒

:%s/^\(.*\)\n\1$/\1/ : 删除重複行

" 非貪婪比對 \{-}

:%s/^.\{-}pdf/new.pdf/ : 删除第一個pdf

" use of optional atom \?

:%s#\<[zy]\?tbl_[a-z_]\+\>#\L&#gc : lowercase with optional leading characters

" 跨越盡量多的行

:%s/<!--\_.\{-}-->// : 删除多行注釋

:help /\{-} : 檢視非貪婪比對的更多幫助

" 使用寄存器替換

:s/fred/<c-r>a/g : 将fred替換為寄存器a裡的内容

:s/fred/<c-r>asome_text<c-r>s/g

:s/fred/\[email protected]/g : better alternative as register not displayed

" 在一行裡寫多種指令

:%s/\f\+\.gif\>/\r&\r/g | v/\.gif$/d | %s/gif/jpg/

:%s/a/but/gie|:update|:next : 當使用 @: 來重複

" 或運算

:%s/suck\|buck/loopy/gc : 替換suck或者buck(這裡|不是管道)

" 調用vim函數

:s/__date__/\=strftime("%c")/ : 将__date__替換成目前日期,使用strftime函數

" 處理列,替換所有在第三列中的str1

:%s:\(\(\w\+\s\+\)\{2}\)str1:\1str2:

" 交換第一列跟第四列

:%s:\(\w\+\)\(.*\s\+\)\(\w\+\)$:\3\2\1:

" 過濾form中的内容放在寄存器裡

:redir @*|sil exec 'g#<\(input\|select\|textarea\|/\=form\)\>#p'|redir END

:nmap ,z :redir @*<Bar>sil exec '[email protected]<\(input\<Bar>select\<Bar>textarea\<Bar>

/\=form\)\>@p'<Bar>redir END<CR>

" 兩位以上的數字減三(帶進位。這個指令挺有趣)

:%s/\d\+/\=(submatch(0)-3)/

" 包含loc或者functions的行中的數字加6

:g/loc\|function/s/\d/\=submatch(0)+6/

" 比上面更好的方法

:%s#txtdev\zs\d#\=submatch(0)+1#g

:h /\zs 檢視幫助

" 字首為gg的數字加6

:%s/\(gg\)\@<=\d\+/\=submatch(0)+6/

:h zero-width 檢視幫助

" 替換一個特定字元串為數字

:let i=10 | 'a,'bg/Abc/s/yy/\=i/ |let i=i+1 # 将yy轉換成10,11,12等等

" 比上面的更精确

:let i=10 | 'a,'bg/Abc/s/xx\zsyy\ze/\=i/ |let i=i+1 # 将xxyy 轉換成 xx11,xx12,

xx13

" find replacement text, put in memory, then use \zs to simplify substitute

:%s/"\([^.]\+\).*\zsxx/\1/

" Pull word under cursor into LHS of a substitute

:nmap <leader>z :%s#\<<c-r>=expand("<cword>")<cr>\>#

" Pull Visually Highlighted text into LHS of a substitute

:vmap <leader>z :<C-U>%s/\<<c-r>*\>/

----------------------------------------

" all following performing similar task, substitute within substitution

" Multiple single character substitution in a portion of line only

:%s,\(all/.*\)\@<=/,_,g : replace all / with _ AFTER "all/"

" Same thing

:s#all/\zs.*#\=substitute(submatch(0), '/', '_', 'g')#

" Substitute by splitting line, then re-joining

:s#all/#&^M#|s#/#_#g|-j!

" Substitute inside substitute

:%s/.*/\='cp '.submatch(0).' all/'.substitute(submatch(0),'/','_','g')/

----------------------------------------

" 全局顯示指令

:g/gladiolli/# : 查找并顯示比對的行号

:g/fred.*joe.*dick/ : 顯示所有含有 fred,joe & dick的行

:g/\<fred\>/ : 顯示單一單詞fred

:g/^\s*$/d : 删除所有空行

:g!/^dd/d : 删除不含字元串''dd''的行

:v/^dd/d : 同上

:g/fred/,/joe/d : 删除所有的從fred到joe

:g/-------/.-10,.d : 以-------為标記删除之前的10行

:g/{/ ,/}/- s/\n\+/\r/g : 删除 {...}之間的空行

:v/\S/d : Delete empty lines (both types)

:v/./,/./-j : 壓縮空行

:g/^$/,/./-j : 同上

:g/<input\|<form/p : 或運算

:g/^/put_ : 雙倍行寬 (pu = put)

:g/^/m0 : 颠倒檔案 (m = move)

:'a,'bg/^/m'b : 颠倒選中的 a 到 b

:g/^/t. : 重複行

:g/fred/t$ : 拷貝行從fred到結尾

:g/stage/t'a : 拷貝行從stage 到 marker a(a為标記的位置)

:g/\(^I[^^I]*\)\{80}/d : 删除最少包含80個tab的行

" perform a substitute on every other line

:g/^/ if line('.')%2|s/^/zz /

" match all lines containing "somestr" between markers a & b

" copy after line containing "otherstr"

:'a,'bg/somestr/co/otherstr/ : co(py) or mo(ve)

" as above but also do a substitution

:'a,'bg/str1/s/str1/&&&/|mo/str2/

:%norm jdd : 隔行删除

" 增加數字 (鍵入 <c-a>)

:.,$g/^\d/exe "norm! \<c-a>": 增加從目前行首到結尾的數字

:'a,'bg/\d\+/norm! ^A : 增加數字

" 儲存全局指令的結果 (注意必須使用添加模式) 你需要使用 qaq 清空寄存器a.

"save results to a register/paste buffer 存儲結果到 寄存器/粘貼 到 a

:g/fred/y A : 添加配備行到寄存器到 a

:g/fred/y A | :let @*[email protected] : 放入複制緩沖區

:let @a=''|g/Barratt/y A |:let @*[email protected]

:'a,'b g/^Error/ . w >> errors.txt

" 複制每一行,然後在複制出來的每一行兩側加上一個 print '複制出來的内容'

:g/./yank|put|-1s/'/"/g|s/.*/Print '&'/

" 用檔案中的内容替換字元串,-d 表示删除“标記”

:g/^MARK$/r tmp.ex | -d

" display prettily

:g/<pattern>/z#.5 : display with context

:g/<pattern>/z#.5|echo "==========" : display beautifully

" Combining g// with normal mode commands

:g/|/norm 2f|r* : replace 2nd | with a star

"send output of previous global command to a new window

:nmap <F3> :redir @a<CR>:g//<CR>:redir END<CR>:new<CR>:put! a<CR><CR>

----------------------------------------

" 全局指令和替換指令聯姻 (強大的編輯能力)

:'a,'bg/fred/s/joe/susan/gic : 可以使用反向引用來比對

:g/fred/,/joe/s/fred/joe/gic : non-line based (ultra)

----------------------------------------

" 先找fred,然後找joe

:/fred/;/joe/-2,/sid/+3s/sally/alley/gIC

----------------------------------------

" create a new file for each line of file eg 1.txt,2.txt,3,txt etc

:g/^/exe ".w ".line(".").".txt"

----------------------------------------

" Absolutely essential

----------------------------------------

* # g* g# : 查找目前光标下的單詞(單個單詞) (<cword>) (向前/向後)

% : 比對括号 {}[]()

. : 重複上次操作

@: : 重複上次的指令

matchit.vim : 适%能比對 <script> <?php等标記

<C-N><C-P> : 插入模式下自動完成填詞

<C-X><C-L> : 行自動完成(超級有用)

/<C-R><C-W> : 把單個<cword>單詞放入搜尋或者指令行

/<C-R><C-A> : 把字元串中有的單詞<CWORD>放入搜尋或者指令行

:set ignorecase : 忽略大小寫

:syntax on : 打開文法高亮 Perl,HTML,PHP 等等

:h regexp<C-D> : 按ctrl+d得到包含regexp的清單

(按tab自動不齊)

----------------------------------------

" 簡單編輯更新 _vimrc檔案

:nmap ,s :source $VIM/_vimrc :普通模式下的鍵盤映射 ,s映射成加載使用者目錄下的

_vimrc檔案

:nmap ,v :e $VIM/_vimrc :,v映射成打開_vimrc檔案

----------------------------------------

#VISUAL 模式 (友善增加 HTML 标簽)

:vmap sb "zdi<C-R>z<ESC> : 在 VISUALLY模式下将選中的文本前後分别加上

:vmap st "zdi<?= <C-R>z ?><ESC> : 加上 <?= ?>

----------------------------------------

" 浏覽

:Exp(lore) : 浏覽檔案

:Sex(plore) : 分割視窗浏覽檔案

:ls : 顯示緩沖區

:cd .. : 設定目前目錄位置

:args : 檢視目前打開的所有檔案

:lcd %:p:h : 改變路徑到目前編輯的檔案

:autocmd BufEnter * lcd %:p:h : 放入.vimrc自動完成上面的指令

----------------------------------------

" 緩沖區浏覽(一直排名前10的vim腳本)

" 需要 bufexplorer.vim  http://www.vim.org/script.php?script_id=42

\be : 緩沖浏覽器中檢視緩沖清單

\bs : 同上,但是分割視窗

----------------------------------------

" 轉換大小寫

guu : 将正行的字母轉換成小寫

gUU : 将正行的字母轉換成大寫

Vu : 轉換選中的行(小寫)

VU : 轉換選中的行(大寫)

g~~ : 反向轉換

vEU : 轉換詞大寫

vE~ : 反向轉換詞

ggguG : 将目前編輯檔案内容全部轉換成小寫

" Visually 模式下選擇所有的字母及數字 (放入 .vimrc檔案中)

vmap ,c :s/\<\(.\)\(\k*\)\>/\u\1\L\2/g<CR>

" 大寫所有句子的第一個字母

:%s/[.!?]\_s\+\a/\U&\E/g

----------------------------------------

gf : 打開目前光标下或後的檔案

:nnoremap gF :view <cfile><cr> : 打開目前光标下或後的檔案, 如果不存在則建立

ga : 顯示目前光标下單個字的ascii,十進制,十六進制……

ggVGg? : 将整個檔案用rot13編碼……(誰看得懂啊~~hoho)

ggg?G : 同上 (針對大檔案)

:8 | normal VGg? : 将第八行用rot13編碼

:normal 10GVGg? : 同上

<C-A>,<C-X> : 增加,減少目前光标下的數字

win32 使用者需要重定義 CNTRL-A

<C-R>=5*5 : 插入25 (小型電腦)

----------------------------------------

" 幾個彩蛋……

:h 42 : also  http://www.google.com/search?q=42

:h holy-grail

:h!

----------------------------------------

" 标記 & 移動

'. : 跳回最後編輯的行 (超有用)

`. : 同上,但是定位編輯點

g; : 跳轉到比較舊的編輯位置(如果有的話) (vim6.3後的新功能)

g, : 這個是較心的位置 (同上)

:changes :打出改變表

:h changelist : 檢視“改變表跳轉”的幫助

<C-O> : 依次沿着你的跳轉記錄向回跳 (從最近的一次開始)

<C-I> : 依次沿着你的跳轉記錄向前跳

:ju(mps) : 列出跳轉軌迹

:help jump-motions

:history : 列出曆史記錄

:his c : 指令行曆史

:his s : 搜尋曆史

q/ : 搜尋指令曆史的視窗

q: : 指令行指令曆史的視窗

:<C-F> : 曆史視窗

----------------------------------------

" 縮寫 & 映射

:map <f7> :'a,'bw! c:/aaa/x

:map <f8> :r c:/aaa/x

:map <f11> :.w! c:/aaa/xr<CR>

:map <f12> :r c:/aaa/xr<CR>

:ab php : 檢視以php開頭的縮寫

:map , : 列出所有的映射(以逗号開始的)

" 允許映射 F10 (win32)

set wak=no : :h winaltkeys

" 映射中常使用的表示

<CR> : 回車

<ESC> : Esc

<LEADER> : 右斜杠

<BAR> : 管道符号

<BACKSPACE> : 倒退鍵

<SILENT> : 不回顯

#顯示自定義的 RGB 顔色顯示目前光标下的字元串 例如 #445588

:nmap <leader>c :hi Normal guibg=#<c-r>=expand("<cword>")<cr><cr>

map <f2> /price only\\|versus/ :in a map need to backslash the \

----------------------------------------

" Simple PHP debugging display all variables yanked into register a

" 簡單的 PHP 調試将所有顯示的變量放入寄存器a

iab phpdb exit("<hr>Debug <C-R>a ");

----------------------------------------

" 使用寄存器來映射 (放入 .vimrc檔案自動加載)

:let @m=":'a,'bs/"

:let @s=":%!sort -u"

----------------------------------------

" 列出寄存器

:reg : 顯示目前所有的寄存器

:reg a : 顯示寄存器a中的内容

"1p.... : 引用一個叫1的寄存器

:let @y='[email protected]"' : pre-loading registers (put in .vimrc)

qqq : 清空寄存器 "q"

----------------------------------------

" 一些有用的決竅

"[email protected] : 把目前行作為指令執行

[email protected]" : 上面的匿名寄存器

[email protected] : 隻執行鍵入的指令

----------------------------------------

" 從其它指令處獲得輸入(需要外部指令)

:r!ls.exe : 從ls 獲得輸入插入到目前位置

!!date : 從date獲得輸入(删除目前行)

" 使用外部sort排序

:%!sort -u : 用sort排序整個檔案(結果覆寫整個檔案)

:'a,'b!sort -u : 從mark a到mark b之間的内容進行排序

!1} sort -u : 排序一個段落

:g/^$/;,/^$/-1!sort : Sort each block (note the crucial ;)

----------------------------------------

" 多檔案管理 (基本的)

:bn : 跳轉到下一個buffer

:bp : 跳轉到前一個buffer

:wn : 儲存目前buffer并跳轉到下一個buffer (超有用)

:wp : 儲存目前buffer并跳轉到前一個buffer

:bd : 把目前檔案從buffer移出 (超有用)

:bun : 解除安裝目前buffer (關閉這個視窗但是不移出)

:badd file.c : 添加file.c到buffer清單

:b 3 : 前往第三個 buffer

:b main : 前往含有main的buffer中 比如說 main.c

:sav php.html : 把目前檔案存為php.html并打開

:sav! %<.bak : 換一個字尾名儲存 (舊方法)

:sav! %:r.cfm : 同上

:sav %:s/fred/joe/ : 替換檔案名

:sav %:s/fred/joe/:r.bak2 : 替換檔案和字尾

:!mv % %:r.bak : 重命名目前檔案

:e! : 打開未修改之前的檔案

:w c:/aaa/% : 存儲檔案到指定位置

:e # : 編輯标記為#的檔案在buffer中

:rew : 傳回到第一個可編輯的檔案

:brew : 回到第一個buffer

:sp fred.txt : 分割視窗打開fred.txt

:sball,:sb : 把所有的 buffers分割顯示在一個視窗中 (超有用)

:scrollbind : in each split window

:map <F5> :ls<CR>:e # : 按F5顯示所有buffer, 并顯示行号

:set hidden : 允許不儲存目前buffer而進行切換

----------------------------------------

" 在分割視窗中快速切換

map <C-J> <C-W>j<C-W>_

map <C-K> <C-W>k<C-W>_

----------------------------------------

" 錄制指令 (最好的技巧)

qq # 錄制指令放入 q寄存器

輸入一些指令

q # 錄制結束

@q :執行放入寄存器q中的内容

@@ :重複

[email protected]@ :重複5次

" 編輯一個 寄存器/錄制

"qp :顯示寄存器q中的内容(普通模式下)

<ctrl-R>q :顯示寄存器q中的内容 (插入模式下)

" 你現在可以看到記錄内容,随便編輯

"qdd :删除,重新存入q

@q :執行 錄制/寄存器 q

" 在可視塊中運作記錄

1) 定義記錄/寄存器

qq:s/ to/ from/g^Mq

2) 定義可視塊

V}

3) 鍵入 : 将顯示下面資訊

:'<,'>

4)完成如下操作

:'<,'>norm @q

----------------------------------------

"combining a recording with a map (to end up in command mode)

nnoremap ] @q:w!<bar>bd

----------------------------------------

" 可視化模式提供一種靈活易用的方法選擇一塊文本供操作符使用

" 記出

v : 進入可視化模式

V : 進入可視化行選擇模式

<C-V> : 進入可視化塊選擇模式

gv : 重新選擇

o : 選擇的區域頭尾移動

"*y : 複制選擇區域到paste buffer

V% : 選擇一個比對段

V}J : 合并一個段落

V}gJ : 合并一個段落,并保留白格

----------------------------------------

" 删除選中的10行的前兩個字元(不過這裡應該假設是緊湊的排版格式,不能包含空格、

tab等字元的,可是經實驗應該是錢3個字元才對啊??)

0<c-v>10j2ld

----------------------------------------

" 如何用可視塊拷貝幾列

" 可視塊(并非通常的 v 指令)

<C-V>,然後通過移動指令選擇列 (win32 <C-Q>)

然後執行 c,d,y,r 等指令

----------------------------------------

" how to overwrite a visual-block of text with another such block

Pick the first block: ctrl-v move "ay

Pick the second block: ctrl-v move c ctrl-o "aP <esc>

----------------------------------------

" _vimrc 基本設定

:set incsearch : 輸入搜尋指令時,立即顯示目前輸入的模式對應的比對。比對的字元串

被高亮。

:set wildignore=*.o,*.obj,*.bak,*.exe : tab補全時忽略這些忽略這些

:set shiftwidth=3 : 設定自動縮進為3個字元

:set vb t_vb=". : 安靜模式,關閉響鈴跟閃爍

:set browsedir=buffer : 設定檔案浏覽使用的目錄

“注:

”last 使用檔案浏覽器最近通路相同的目錄。

“buffer 使用相關緩沖區的目錄。

”current 使用目前目錄。

“{path} 使用指定目錄。

----------------------------------------

" 啟動windows中的IE

:nmap ,f :update<CR>:silent !start c:\progra~1\intern~1\iexplore.exe

file://%:p<CR>

:nmap ,i :update<CR>: !start c:\progra~1\intern~1\iexplore.exe <cWORD><CR>

----------------------------------------

" 在vim裡打開ftp

cmap ,r :Nread  ftp://209.51.134.122/public_html/index.html

cmap ,w :Nwrite  ftp://209.51.134.122/public_html/index.html

gvim  ftp://www.somedomain.com/index.html  # 使用 netrw.vim

----------------------------------------

" 向寄存器中添加内容 (使用相應寄存器名稱的大寫)

" 複制5行放入a寄存器,然後向下跳轉10行再複制5行

"a5yy

10j

"A5yy

----------------------------------------

[I : 顯示目前行中字元的所有比對(超級有用)

----------------------------------------

" 正常縮進

:'a,'b>> :将mark a到mark b之間的内容進行兩次縮進

" 虛拟模式下縮進 (可重複)

:vnoremap < <gv

”這是一個虛拟模式下的鍵盤映射 < 映射為<gv

"< 意為向内縮進,gv 上面已有解釋,為重複上次選區

“<gv 也就是先向内縮進然後再選擇剛才的選區

“這樣就可以隻按 < 實作重複縮進了

:vnoremap > >gv :向内縮進,原理同上

" 塊縮進

>i{

>a{

" also

>% and <%

”自己試試看吧,涉及到用 { 的語言很有用,比如c,c++等

----------------------------------------

" 重定向 & 粘貼到寄存器 * (*為寄存器名稱)

:redir @* : 重定向指令到paste緩沖區

:redir END : 結束

:redir >> out.txt : 重定向到檔案

" 操作粘貼緩沖區

"*yy : 複制到寄存器

"*p : 從寄存器中粘貼一行

" 複制到粘貼緩沖區 (擴充模式)

:'a,'by* : 複制一個範圍到粘貼寄存器

:%y* : 複制一個括号比對到粘貼緩沖區

:.y* : 複制目前行到粘貼緩沖區

" 從剪貼闆上過濾非可列印字元

" 當從一些 GUI 程式粘貼時會有用處

:nmap <leader>p :let @* = substitute(@*,'[^[:print:]]','','g')<cr>"*p

----------------------------------------

" 重新格式化文本

gq} : 合并一個段落

gqap : 目前段落

ggVGgq : 全部段落

Vgq : 目前行

" 在70列的時候換行

:s/.\{,69\};\s*\|.\{,69\}\s\+/&\r/g

----------------------------------------

" 指令使用于多個檔案

:argdo %s/foo/bar/e : 在所有檔案上操做 :args

:bufdo %s/foo/bar/e

:windo %s/foo/bar/e

:argdo exe '%!sort'|w! : 包含外部指令

----------------------------------------

" 指令行技巧

gvim -h : 顯示幫助

ls | gvim - : 管道操作

cat xx | gvim - -c "v/^\d\d\|^[3-9]/d " : 從管道出過濾内容

gvim -o file1 file2 : 分割視窗顯示兩個檔案

" 打開檔案後執行一條指令

gvim.exe -c "/main" joe.c : 打開 joe.c & 跳轉到 "main"

" 在打開一個檔案時執行多條指令

vim -c "%s/ABC/DEF/ge | update" file1.c

" 在一組檔案上執行多條指令

vim -c "argdo %s/ABC/DEF/ge | update" *.c

" 從一系列檔案中删除一塊區域

vim -c "argdo /begin/+1,/end/-1g/^/d | update" *.c

" 自動編輯檔案 (編輯指令序列Ex commands已經包含在convert.vim中了)

vim -s "convert.vim" file.c

#不加載.vimrc跟任何plugin(幹淨清新的 VIM^_^)

gvim -u NONE -U NONE -N

" Access paste buffer contents (put in a script/batch file)

gvim -c 'normal ggdG"*p' c:/aaa/xp

" 将paste中的内容送往預設的列印機

gvim -c 's/^/\[email protected]*/|hardcopy!|q!'

" gvim 裡的 grep (win32 or *nix)

:grep somestring *.php : 建立比對的檔案清單

" 使用 :cn(向後後) :cp(向前) 操縱清單

:h grep :檢視幫助

----------------------------------------

" GVIM 的差異比較

gvim -d file1 file2 : vimdiff (比較不差異)

dp : 把光标處的不同放到另一個檔案

do : 在光标處從另一個檔案取得不同

----------------------------------------

" Vim traps

在正規表達式中 + | ( { 都要加上轉義符(反斜杠)

/fred\+/ : 比對 fred/freddy 但不比對 free

/\(fred\)\{2,3}/ : note what you have to break

----------------------------------------

" \v ,或叫做very magic (通常都是這麼叫)可以取消轉義符

/codes\(\n\|\s\)*where : 普通的正規表達式

/\vcodes(\n|\s)*where : very magic

----------------------------------------

" 把對象送到指令行或者搜尋行

<C-R><C-W> : 執行目前光标下的單個單詞

<C-R><C-A> : 執行目前光标下盡可能多的單詞

<C-R>- : 送至一個小型寄存器(同樣使用于插入模式)

<C-R>[0-9a-z] : 送至一個命名寄存器 (括弧同上)

<C-R>% : 送至檔案名(#也行) (同上)

<C-R>=somevar : 送至一個變量 (例如 :let sray="ray[0-9]")

----------------------------------------

" 控制寄存器

:let @[email protected]_ : 清除寄存器 a

:let @a="" : 同上 a

:let @*[email protected] : 拷貝寄存器 a 到 paste buffer

:let @*[email protected]: : 拷貝最後執行的指令到 paste buffer

:let @*[email protected]/ : 拷貝最後執行的查找指令到paste buffer

:let @*[email protected]% : 拷貝目前檔案到 paste buffer

map <f11> "qyy:let @[email protected]"zzz"

----------------------------------------

" 幫助的幫助? (使用 TAB)

:h quickref : VIM 快速參考頁

:h tips : Vim'自己的技巧幫助

:h visual<C-D><tab> : 虛拟模式的幫助清單

: 然後使用tab選擇它們

:h ctrl<C-D> : 所有關于ctrl鍵的幫助清單

:helpg uganda : 過濾幫助檔案 使用 :cn, :cp 查找下一個及後一個

:h :r : 關于 :ex 的指令幫助

:h CTRL-R : 普通模式相關

:h /\r : \r是什麼的意思

:h \\zs : 使用雙反斜線查找關于 \zs 的幫助

:h i_CTRL-R : 在插入模式中 <C-R>的解釋

:h c_CTRL-R : 在指令模式中 <C-R> 的解釋

:h v_CTRL-V : 虛拟模式

:h tutor : VIM 快速指南

<C-[>, <C-T> : Move back & Forth in HELP History

gvim -h : VIM 指令行幫助

----------------------------------------

" 選項設定在那裡

:scriptnames : 列出所有已經加載的 plugins, _vimrcs檔案

:verbose set history? :顯示 history的值并顯示在那裡定義的

:function : 列出所有函數

:func SearchCompl : 顯示指定函數的細節

----------------------------------------

" 制作你自己的VIM 幫助

:helptags /vim/vim64/doc : 重新編譯所有 *.txt 的幫助檔案在這個目錄裡

:help add-local-help :如何添加本地幫助

----------------------------------------

" 用外部程式運作檔案 (例如 php)

map <f9> :w<CR>:!c:/php/php.exe %<CR>

map <f2> :w<CR>:!perl -c %<CR>

----------------------------------------

" 在另一個buffer中,捕捉目前腳本的輸出

:new | r!perl # : 建立一個buffer,從另一個buffer中讀入結果

:new! x.out | r!perl # : 同上,并指定一個新檔案名

:new+read!ls

----------------------------------------

" create a new buffer, paste a register "q" into it, then sort new buffer

:new +put q|%!sort

----------------------------------------

" 插入DOS換行符

:%s/$/\<C-V><C-M>&/g : (that's what you type

:%s/$/\<C-Q><C-M>&/g : for Win32) 對于Win32應該這樣

:%s/$/\^M&/g : 你看到的^M是一個字元

----------------------------------------

" 自動删除行尾 Dos回車符和空格

autocmd BufRead * silent! %s/[\r \t]\+$//

autocmd BufEnter *.php :%s/[ \t\r]\+$//e

----------------------------------------

" 對指定檔案或檔案類型執行某個動作

autocmd VimEnter c:/intranet/note011.txt normal! ggVGg?

autocmd FileType *.pl exec('set fileformats=unix')

----------------------------------------

" 把最後一個指令貼到目前位置

i<c-r>:

" 把最後一個搜尋指令貼到目前位置

i<c-r>/

----------------------------------------

" 更多的完成功能

<C-X><C-F> :插入目前目錄下的一個檔案名到目前位置

# 在insert模式下使用

# 然後用 Ctrl-P/Ctrl-N 翻頁

----------------------------------------

" 替換一個visual區域

" 選擇一個區域,然後輸入 :s/Emacs/Vim/ 等等,vim會自動進入:模式

:'<,'>s/Emacs/Vim/g : 前面的' '<.'> 是vim自動添加的

gv : 重新選擇前一個可視區域 (ULTRA)

----------------------------------------

" 在檔案中插入行号

:g/^/exec "s/^/".strpart(line(".")." ", 0, 4)

:%s/^/\=strpart(line(".")." ", 0, 5)

:%s/^/\=line('.'). ' '

----------------------------------------

#用VIM的方式來編号行

:set number : 顯示行号

:map <F12> :set number!<CR> : Show linenumbers flip-flop

:%s/^/\=strpart(line('.')." ",0,&ts)

#從任意行開始編号(需要perl)

:'a,'b!perl -pne 'BEGIN{$a=223} substr($_,2,0)=$a++'

#産生數字清單

#Type in number on line say 223 in an empty file

qqmnYP`n^Aq : in recording q repeat with @q

" 遞增已存在數字到檔案末

:.,$g/^\d/exe "normal! \<c-a>"

" 進階遞增,參見:

http://vim.sourceforge.net/tip_view.php?tip_id=150

----------------------------------------

" 進階遞增 (真的很有用)

" 把下面幾句放到 _vimrc

let g:I=0

function! INC(increment)

let g:I =g:I + a:increment

return g:I

endfunction

" 例如從mark a 到mark b 遞增,從223開始,步長為5

:let I=223

:'a,'bs/^/\=INC(5)/

" create a map for INC

cab viminc :let I=223 \| 'a,'bs/$/\=INC(5)/

----------------------------------------

" 生成從 23-64 的數字清單

o23<ESC>qqYp<C-A>[email protected]

----------------------------------------

" 在目前插入模式下編輯/移動 (真得很有用)

<C-U> : 删除全部

<C-W> : 删除最後一個單詞

<HOME><END> : 移動到行首/行尾

<C-LEFTARROW><C-RIGHTARROW> : 向前/後移動一個單詞

<C-X><C-E>,<C-X><C-Y> : scroll while staying put in insert

----------------------------------------

#加密(小心使用,不要忘了密碼)

:X : vim會提示你輸入密碼

:h :X

----------------------------------------

" 模式行 (使檔案隻讀等),必須在前/後 5行内

// vim:noai:ts=2:sw=4:readonly:

" vim:ft=html: : 使用 HTML 文法高亮

:h modeline

----------------------------------------

" 建立你自己的菜單項

amenu Modeline.Insert\ a\ VIM\ modeline <Esc><Esc>ggOvim:ff=unix ts=4 ss=4<CR>

vim60:fdm=marker<esc>gg

----------------------------------------

" 一個儲存目前光标下的狹義字到一個檔案的函數

function! SaveWord()

normal yiw

exe ':!echo '[email protected]' >> word.txt'

endfunction

map ,p :call SaveWord()

----------------------------------------

" 删除重複行的函數

function! Del()

if getline(".") == getline(line(".") - 1)

norm dd

endif

endfunction

:g/^/ call Del() #使用該函數的一個例子

----------------------------------------

" 雙位元組編碼 (non alpha-numerics)

:digraphs : 顯示編碼表

:h dig : 幫助

i<C-K>e' : 輸入 é

i<C-V>233 : 輸入 é (Unix)

i<C-Q>233 : 輸入 é (Win32)

ga : 檢視字元的hex值

#删除非 ascii 字元

:%s/[<C-V>128-<C-V>255]//gi : where you have to type the Control-V

:%s/[?-?]//gi : Should see a black square & a dotted y

:%s/[<C-V>128-<C-V>255<C-V>01-<C-V>31]//gi : All pesky non-asciis

:exec "norm /[\x00-\x1f\x80-\xff]/" : same thing

#Pull a non-ascii character onto search bar

yl/<C-R>" :

/[^a-zA-Z0-9_[:space:][:punct:]] : search for all non-ascii

----------------------------------------

" 檔案名自動完成 (例如 main_c.c)

:e main_<tab> : tab 鍵完成

gf : 打開光标處廣義字命名的檔案 (normal模式)

main_<C-X><C-F> : 檔案名自動完成(insert模式)

----------------------------------------

" Vim複雜使用

" 交換兩個單詞

:%s/\<\(on\|off\)\>/\=strpart("offon", 3 * ("off" == submatch(0)), 3)/g

" 交換兩個單詞

:vnoremap <C-X> <Esc>`.``gvP``P

----------------------------------------

" 把text檔案轉換成html檔案(oh,ft)

:runtime! syntax/2html.vim : 轉換 txt 成 html

:h 2html

----------------------------------------

" VIM 有一個内部自帶的 grep 指令

:grep some_keyword *.c : 得到一個包含some_keyword的c檔案名清單

:cn : 去下一個出現的位置

----------------------------------------

" 強制無擴充名的檔案的文法着色方式

:set syntax=perl

" 取消文法着色 (很有用)

:set syntax off

" 改變色彩主題 (在~vim/vim??/colors中的任何檔案)

:colorscheme blue

" 通過使用模式行強迫使用 HTML 文法高亮

# vim:ft=html:

" 強制自動文法加亮(非标準的檔案擴充)

au BufRead,BufNewFile */Content.IE?'

execute 'normal ^'.a:x.'f,'

endfunction

command! -nargs=1 Csv :call CSVH(<args>)

" call with

:Csv 5 : highlight fifth column

----------------------------------------

" 折疊:隐藏某些片斷,使檢視更容易

zf} : 使用動作指令折疊一個段落

v}zf : 使用可視模式折疊一個段落

zf'a : 折疊到一個标記上

zo : 打開折疊

zc : 重新關閉折疊

----------------------------------------

" 顯示"不可見字元"

:set list

:h listchars

----------------------------------------

" 如何在不進入插入模式的情況下粘貼"普通模式的指令"

:norm qqy$jq

----------------------------------------

" 處理檔案名

:h filename-modifiers : 幫助

:w % : 寫入目前檔案

:w %:r.cfm : 改變檔案擴充名為 .cfm

:!echo %:p : 顯示完整路徑和檔案名

:!echo %:p:h : 隻顯示完整路徑

:!echo %:t : 隻顯示檔案名

:reg % : 顯示檔案名

<C-R>% : 插入檔案名 (插入模式)

"%p : 插入檔案名 (普通模式)

/<C-R>% : 在文本中查找檔案名

----------------------------------------

" 删除,但不破壞 buffer 内容

"_d : 你一直想要的東西

"_dw : 例如:删除一個單詞 (使用黑洞???)

----------------------------------------

" 送完整的路徑名到剪貼闆,用于郵件附件等

nnoremap <F2> :let @*=expand("%:p")<cr> :unix

nnoremap <F2> :let @*=substitute(expand("%:p"), "/", "\\", "g")<cr> :win32

----------------------------------------

" 不用離開 Vim 就能修改檔案名的簡單 shell 腳本

$ vim

:r! ls *.c

:%s/\(.*\).c/mv & \1.bla

:w !sh

:q!

----------------------------------------

" 在一個文本裡計算單詞數

g<C-G>

----------------------------------------

" 你自己設定高亮顯示的例子

:syn match DoubleSpace " "

:hi def DoubleSpace guibg=#e0e0e0

----------------------------------------

" reproduce previous line word by word

imap ] @@@<ESC>[email protected]@@<CR>P/@@@<CR>3s

nmap ] [email protected]@@<ESC>[email protected]@@<CR>P/@@@<CR>3s

" 根據檔案類型映射快捷鍵

:autocmd bufenter *.tex map <F1> :!latex %<CR>

:autocmd bufenter *.tex map <F2> :!xdvi -hush %<.dvi&<CR>

----------------------------------------

" 讀取 MS-Word 文檔,需要 antiword

:autocmd BufReadPre *.doc set ro

:autocmd BufReadPre *.doc set hlsearch!

:autocmd BufReadPost *.doc %!antiword "%"

----------------------------------------

" a folding method

vim: filetype=help foldmethod=marker foldmarker=<<<,>>>

A really big section closed with a tag <<<

--- remember folds can be nested ---

Closing tag >>>

----------------------------------------

" Just Another Vim Hacker JAVH

vim -c ":%s%s*%Cyrnfr)fcbafbe[Oenz(Zbbyranne%|:%s)[[()])-)Ig|norm Vg?"

# 譯釋:呵呵,誰來解釋一下吧!

# 其實不過是在啟動vim的時候執行了一個指令

# 先寫入了 Just Another Vim Hacker 的rot13編碼

# 然後再解碼