" 搜索
/joe/e : 設(shè)置光標(biāo)到匹配"joe"的末尾
/joe/e+1 : 設(shè)置光標(biāo)到匹配"joe"的末尾再后移一位
/joe/s-2 : 設(shè)置光標(biāo)到匹配"joe“的開(kāi)頭再前移兩位
/^joe.*fred.*bill/ : 匹配以'j'開(kāi)頭且"joe"到"fred"到"bill"之間至少有一個(gè)字符
/^[A-J]\+/ : 搜索'A'到’J‘重復(fù)兩次以上的開(kāi)頭行
/begin\_.*end : 多行匹配
/fred\_s*joe/i : 可以是任何空白字符包括\n,\t等等
/fred\|joe : 搜索fred或者joe
/.*fred\&.*joe : 搜索同時(shí)包括fred跟joe的行
/\<fred\>/i : 搜索獨(dú)立的單詞fred
/\<\d\d\d\d\> : 搜索獨(dú)立的4位數(shù)字
/\D\d\d\d\d\D : 搜索6位字符串中間4位數(shù)字前后兩位不能為數(shù)字
/\<\d\{4}\> : 同/\<\d\d\d\d\>
" 查找空行
/^\n\{3} : 匹配三連續(xù)的空行
" 使用正則表達(dá)式組查找
/\(fred\).*\(joe\).*\2.*\1
" 正則表達(dá)式重復(fù)
/^\([^,]*,\)\{8}
" visual searching
:vmap // y/<C-R>"<CR> : visually模式下的鍵盤(pán)映射,把//映射成匹配當(dāng)前選中的文本
:vmap <silent> // y/<C-R>=escape(@", '\\/.*$^~[]')<CR><CR> : 包括空白字符
" \zs 和 \ze 匹配原 :h /\zs
/<\zs[^>]*\ze> : 匹配尖括號(hào)中的內(nèi)容
" 零寬度匹配 :h /\@=
/<\@<=[^>]*>\@= : search for tag contents, ignoring chevrons
/<\@<=\_[^>]*>\@= : search for tags across possible multiple lines
" 多行查找 \_ 的意思是包括換行符
/<!--\_p\{-}--> : 匹配<!--開(kāi)始到-->結(jié)尾的所有內(nèi)容
/fred\_s*joe/i : 匹配fred開(kāi)始到j(luò)oe,之間一定得是空白字符
/bugs\(\_.\)*bunny : 匹配所有bugs到bunny的字符串
:h \_ : help
" 查找函數(shù)聲明,nmap為normal模式下的鍵盤(pán)映射
:nmap gx yiw/^\(sub\<bar>function\)\s\+<C-R>"<CR>
" 查找多個(gè)文件
:bufdo /searchstr/ : 在多個(gè)文件緩沖區(qū)里執(zhí)行查找
" 更好的多文件查找定位方法
:bufdo %s/searchstr/&/gic : 在多個(gè)文件緩沖區(qū)里查找,按下n停止
" 怎樣不使用 / 來(lái)查找網(wǎng)址
?http://www.vim.org/ : 向后查找
" 查找指定字符以外的字符串
/\c\v([^aeiou]&\a){4} : 查找4個(gè)輔音字母
----------------------------------------
#替換
:%s/fred/joe/igc : 普通替換命令
:%s/\r//g : 刪除 DOS 的換行符 ^M
" 你的文本文件是否亂七八糟的排成一行?使用如下命令
:%s/\r/\r/g : 轉(zhuǎn)換 DOS 回車符 ^M 為真正的回車符
:%s= *$== : 刪除行尾空白
:%s= \+$== : 同上
:%s#\s*\r\?$## : 刪除尾部空白和dos換行符
:%s#\s*\r*$## : 同上
" 刪除空行
:%s/^\n\{3}// : 刪除連續(xù)3個(gè)空行
:%s/^\n\+/\r/ : 壓縮空行,多個(gè)替換為一個(gè)
%s#<[^>]\+>##g : 刪除html的tag部分
" IF YOU ONLY WANT TO KNOW ONE THING
:'a,'bg/fred/s/dick/joe/igc : 非常有用
# 譯釋:''a,''b指定一個(gè)范圍:mark a ~ mark b
# g//用一個(gè)正則表達(dá)式指出了進(jìn)行操作的行必須可以被fred匹配
# 看后面,g//是一個(gè)全局顯示命令
# s/dick/joe/igc則對(duì)于這些滿足條件的行進(jìn)行替換
" 復(fù)制列
:%s= [^ ]\+$=&&= : 復(fù)制最后一列
:%s= \f\+$=&&= : 一樣
:%s= \S\+$=&& : 暈,還一樣!
" 記憶(反向引用)
:s/\(.*\):\(.*\)/\2 : \1/ : 將兩個(gè)字段顛倒
:%s/^\(.*\)\n\1$/\1/ : 刪除重復(fù)行
" 非貪婪匹配 \{-}
:%s/^.\{-}pdf/new.pdf/ : 刪除第一個(gè)pdf
" use of optional atom \?
:%s#\<[zy]\?tbl_[a-z_]\+\>#\Lgc : lowercase with optional leading characters
" 跨越盡量多的行
:%s/<!--\_.\{-}-->// : 刪除多行注釋
:help /\{-} : 查看非貪婪匹配的更多幫助
" 使用寄存器替換
:s/fred/<c-r>a/g : 將fred替換為寄存器a里的內(nèi)容
:s/fred/<c-r>asome_text<c-r>s/g
:s/fred/\=@a/g : better alternative as register not displayed
" 在一行里寫(xiě)多種命令
:%s/\f\+\.gif\>/\r&\r/g | v/\.gif$/d | %s/gif/jpg/
:%s/a/but/gie|:update|:next : 當(dāng)使用 @: 來(lái)重復(fù)
" 或運(yùn)算
:%s/suck\|buck/loopy/gc : 替換suck或者buck(這里|不是管道)
" 調(diào)用vim函數(shù)
:s/__date__/\=strftime("%c")/ : 將__date__替換成當(dāng)前日期,使用strftime函數(shù)
" 處理列,替換所有在第三列中的str1
:%s:\(\(\w\+\s\+\)\{2}\)str1:\1str2:
" 交換第一列跟第四列
:%s:\(\w\+\)\(.*\s\+\)\(\w\+\)$:\3\2\1:
" 過(guò)濾form中的內(nèi)容放在寄存器里
:redir @*|sil exec 'g#<\(input\|select\|textarea\|/\=form\)\>#p'|redir END
:nmap ,z :redir @*<Bar>sil exec 'g@<\(input\<Bar>select\<Bar>textarea\<Bar>
/\=form\)\>@p'<Bar>redir END<CR>
" 兩位以上的數(shù)字減三(帶進(jìn)位。這個(gè)命令挺有趣)
:%s/\d\+/\=(submatch(0)-3)/
" 包含loc或者functions的行中的數(shù)字加6
:g/loc\|function/s/\d/\=submatch(0)+6/
" 比上面更好的方法
:%s#txtdev\zs\d#\=submatch(0)+1#g
:h /\zs 查看幫助
" 前綴為gg的數(shù)字加6
:%s/\(gg\)\@<=\d\+/\=submatch(0)+6/
:h zero-width 查看幫助
" 替換一個(gè)特定字符串為數(shù)字
:let i=10 | 'a,'bg/Abc/s/yy/\=i/ |let i=i+1 # 將yy轉(zhuǎn)換成10,11,12等等
" 比上面的更精確
:let i=10 | 'a,'bg/Abc/s/xx\zsyy\ze/\=i/ |let i=i+1 # 將xxyy 轉(zhuǎn)換成 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/# : 查找并顯示匹配的行號(hào)
: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到j(luò)oe
:g/-------/.-10,.d : 以-------為標(biāo)記刪除之前的10行
:g/{/ ,/}/- s/\n\+/\r/g : 刪除 {...}之間的空行
:v/\S/d : Delete empty lines (both types)
:v/./,/./-j : 壓縮空行
:g/^$/,/./-j : 同上
:g/<input\|<form/p : 或運(yùn)算
:g/^/put_ : 雙倍行寬 (pu = put)
:g/^/m0 : 顛倒文件 (m = move)
:'a,'bg/^/m'b : 顛倒選中的 a 到 b
:g/^/t. : 重復(fù)行
:g/fred/t$ : 拷貝行從fred到結(jié)尾
:g/stage/t'a : 拷貝行從stage 到 marker a(a為標(biāo)記的位置)
:g/\(^I[^^I]*\)\{80}/d : 刪除最少包含80個(gè)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 : 隔行刪除
" 增加數(shù)字 (鍵入 <c-a>)
:.,$g/^\d/exe "norm! \<c-a>": 增加從當(dāng)前行首到結(jié)尾的數(shù)字
:'a,'bg/\d\+/norm! ^A : 增加數(shù)字
" 保存全局命令的結(jié)果 (注意必須使用添加模式) 你需要使用 qaq 清空寄存器a.
"save results to a register/paste buffer 存儲(chǔ)結(jié)果到 寄存器/粘貼 到 a
:g/fred/y A : 添加配備行到寄存器到 a
:g/fred/y A | :let @*=@a : 放入復(fù)制緩沖區(qū)
:let @a=''|g/Barratt/y A |:let @*=@a
:'a,'b g/^Error/ . w >> errors.txt
" 復(fù)制每一行,然后在復(fù)制出來(lái)的每一行兩側(cè)加上一個(gè) print '復(fù)制出來(lái)的內(nèi)容'
:g/./yank|put|-1s/'/"/g|s/.*/Print '&'/
" 用文件中的內(nèi)容替換字符串,-d 表示刪除“標(biāo)記”
: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>
----------------------------------------
" 全局命令和替換命令聯(lián)姻 (強(qiáng)大的編輯能力)
:'a,'bg/fred/s/joe/susan/gic : 可以使用反向引用來(lái)匹配
: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# : 查找當(dāng)前光標(biāo)下的單詞(單個(gè)單詞) (<cword>) (向前/向后)
% : 匹配括號(hào) {}[]()
. : 重復(fù)上次操作
@: : 重復(fù)上次的命令
matchit.vim : 適%能匹配 <script> <?php等標(biāo)記
<C-N><C-P> : 插入模式下自動(dòng)完成填詞
<C-X><C-L> : 行自動(dòng)完成(超級(jí)有用)
/<C-R><C-W> : 把單個(gè)<cword>單詞放入搜索或者命令行
/<C-R><C-A> : 把字符串中有的單詞<CWORD>放入搜索或者命令行
:set ignorecase : 忽略大小寫(xiě)
:syntax on : 打開(kāi)語(yǔ)法高亮 Perl,HTML,PHP 等等
:h regexp<C-D> : 按ctrl+d得到包含regexp的列表
(按tab自動(dòng)不齊)
----------------------------------------
" 簡(jiǎn)單編輯更新 _vimrc文件
:nmap ,s :source $VIM/_vimrc :普通模式下的鍵盤(pán)映射 ,s映射成加載用戶目錄下的
_vimrc文件
:nmap ,v :e $VIM/_vimrc :,v映射成打開(kāi)_vimrc文件
----------------------------------------
#VISUAL 模式 (方便增加 HTML 標(biāo)簽)
:vmap sb "zdi<C-R>z<ESC> : 在 VISUALLY模式下將選中的文本前后分別加上
:vmap st "zdi<?= <C-R>z ?><ESC> : 加上 <?= ?>
----------------------------------------
" 瀏覽
:Exp(lore) : 瀏覽文件
:Sex(plore) : 分割窗口瀏覽文件
:ls : 顯示緩沖區(qū)
:cd .. : 設(shè)置當(dāng)前目錄位置
:args : 查看當(dāng)前打開(kāi)的所有文件
:lcd %:p:h : 改變路徑到當(dāng)前編輯的文件
:autocmd BufEnter * lcd %:p:h : 放入.vimrc自動(dòng)完成上面的命令
----------------------------------------
" 緩沖區(qū)瀏覽(一直排名前10的vim腳本)
" 需要 bufexplorer.vim http://www.vim.org/script.php?script_id=42
\be : 緩沖瀏覽器中查看緩沖列表
\bs : 同上,但是分割窗口
----------------------------------------
" 轉(zhuǎn)換大小寫(xiě)
guu : 將正行的字母轉(zhuǎn)換成小寫(xiě)
gUU : 將正行的字母轉(zhuǎn)換成大寫(xiě)
Vu : 轉(zhuǎn)換選中的行(小寫(xiě))
VU : 轉(zhuǎn)換選中的行(大寫(xiě))
g~~ : 反向轉(zhuǎn)換
vEU : 轉(zhuǎn)換詞大寫(xiě)
vE~ : 反向轉(zhuǎn)換詞
ggguG : 將當(dāng)前編輯文件內(nèi)容全部轉(zhuǎn)換成小寫(xiě)
" Visually 模式下選擇所有的字母及數(shù)字 (放入 .vimrc文件中)
vmap ,c :s/\<\(.\)\(\k*\)\>/\u\1\L\2/g<CR>
" 大寫(xiě)所有句子的第一個(gè)字母
:%s/[.!?]\_s\+\a/\U&\E/g
----------------------------------------
gf : 打開(kāi)當(dāng)前光標(biāo)下或后的文件
:nnoremap gF :view <cfile><cr> : 打開(kāi)當(dāng)前光標(biāo)下或后的文件, 如果不存在則創(chuàng)建
ga : 顯示當(dāng)前光標(biāo)下單個(gè)字的ascii,十進(jìn)制,十六進(jìn)制……
ggVGg? : 將整個(gè)文件用rot13編碼……(誰(shuí)看得懂啊~~hoho)
ggg?G : 同上 (針對(duì)大文件)
:8 | normal VGg? : 將第八行用rot13編碼
:normal 10GVGg? : 同上
<C-A>,<C-X> : 增加,減少當(dāng)前光標(biāo)下的數(shù)字
win32 用戶需要重定義 CNTRL-A
<C-R>=5*5 : 插入25 (小型計(jì)算器)
----------------------------------------
" 幾個(gè)彩蛋……
:h 42 : also http://www.google.com/search?q=42
:h holy-grail
:h!
----------------------------------------
" 標(biāo)記 & 移動(dòng)
'. : 跳回最后編輯的行 (超有用)
`. : 同上,但是定位編輯點(diǎn)
g; : 跳轉(zhuǎn)到比較舊的編輯位置(如果有的話) (vim6.3后的新功能)
g, : 這個(gè)是較心的位置 (同上)
:changes :打出改變表
:h changelist : 查看“改變表跳轉(zhuǎn)”的幫助
<C-O> : 依次沿著你的跳轉(zhuǎn)記錄向回跳 (從最近的一次開(kāi)始)
<C-I> : 依次沿著你的跳轉(zhuǎn)記錄向前跳
:ju(mps) : 列出跳轉(zhuǎn)軌跡
:help jump-motions
:history : 列出歷史記錄
:his c : 命令行歷史
:his s : 搜索歷史
q/ : 搜索命令歷史的窗口
q: : 命令行命令歷史的窗口
:<C-F> : 歷史窗口
----------------------------------------
" 縮寫(xiě) & 映射
: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開(kāi)頭的縮寫(xiě)
:map , : 列出所有的映射(以逗號(hào)開(kāi)始的)
" 允許映射 F10 (win32)
set wak=no : :h winaltkeys
" 映射中常使用的表示
<CR> : 回車
<ESC> : Esc
<LEADER> : 右斜杠
<BAR> : 管道符號(hào)
<BACKSPACE> : 退格鍵
<SILENT> : 不回顯
#顯示自定義的 RGB 顏色顯示當(dāng)前光標(biāo)下的字符串 例如 #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
" 簡(jiǎn)單的 PHP 調(diào)試將所有顯示的變量放入寄存器a
iab phpdb exit("<hr>Debug <C-R>a ");
----------------------------------------
" 使用寄存器來(lái)映射 (放入 .vimrc文件自動(dòng)加載)
:let @m=":'a,'bs/"
:let @s=":%!sort -u"
----------------------------------------
" 列出寄存器
:reg : 顯示當(dāng)前所有的寄存器
:reg a : 顯示寄存器a中的內(nèi)容
"1p.... : 引用一個(gè)叫1的寄存器
:let @y='yy@"' : pre-loading registers (put in .vimrc)
qqq : 清空寄存器 "q"
----------------------------------------
" 一些有用的決竅
"ayy@a : 把當(dāng)前行作為命令執(zhí)行
yy@" : 上面的匿名寄存器
u@. : 只執(zhí)行鍵入的命令
----------------------------------------
" 從其它命令處獲得輸入(需要外部命令)
:r!ls.exe : 從ls 獲得輸入插入到當(dāng)前位置
!!date : 從date獲得輸入(刪除當(dāng)前行)
" 使用外部sort排序
:%!sort -u : 用sort排序整個(gè)文件(結(jié)果覆蓋整個(gè)文件)
:'a,'b!sort -u : 從mark a到mark b之間的內(nèi)容進(jìn)行排序
!1} sort -u : 排序一個(gè)段落
:g/^$/;,/^$/-1!sort : Sort each block (note the crucial ;)
----------------------------------------
" 多文件管理 (基本的)
:bn : 跳轉(zhuǎn)到下一個(gè)buffer
:bp : 跳轉(zhuǎn)到前一個(gè)buffer
:wn : 保存當(dāng)前buffer并跳轉(zhuǎn)到下一個(gè)buffer (超有用)
:wp : 保存當(dāng)前buffer并跳轉(zhuǎn)到前一個(gè)buffer
:bd : 把當(dāng)前文件從buffer移出 (超有用)
:bun : 卸載當(dāng)前buffer (關(guān)閉這個(gè)窗口但是不移出)
:badd file.c : 添加file.c到buffer列表
:b 3 : 前往第三個(gè) buffer
:b main : 前往含有main的buffer中 比如說(shuō) main.c
:sav php.html : 把當(dāng)前文件存為php.html并打開(kāi)
:sav! %<.bak : 換一個(gè)后綴名保存 (舊方法)
:sav! %:r.cfm : 同上
:sav %:s/fred/joe/ : 替換文件名
:sav %:s/fred/joe/:r.bak2 : 替換文件和后綴
:!mv % %:r.bak : 重命名當(dāng)前文件
:e! : 打開(kāi)未修改之前的文件
:w c:/aaa/% : 存儲(chǔ)文件到指定位置
:e # : 編輯標(biāo)記為#的文件在buffer中
:rew : 返回到第一個(gè)可編輯的文件
:brew : 回到第一個(gè)buffer
:sp fred.txt : 分割窗口打開(kāi)fred.txt
:sball,:sb : 把所有的 buffers分割顯示在一個(gè)窗口中 (超有用)
:scrollbind : in each split window
:map <F5> :ls<CR>:e # : 按F5顯示所有buffer, 并顯示行號(hào)
:set hidden : 允許不保存當(dāng)前buffer而進(jìn)行切換
----------------------------------------
" 在分割窗口中快速切換
map <C-J> <C-W>j<C-W>_
map <C-K> <C-W>k<C-W>_
----------------------------------------
" 錄制命令 (最好的技巧)
qq # 錄制命令放入 q寄存器
輸入一些命令
q # 錄制結(jié)束
@q :執(zhí)行放入寄存器q中的內(nèi)容
@@ :重復(fù)
5@@ :重復(fù)5次
" 編輯一個(gè) 寄存器/錄制
"qp :顯示寄存器q中的內(nèi)容(普通模式下)
<ctrl-R>q :顯示寄存器q中的內(nèi)容 (插入模式下)
" 你現(xiàn)在可以看到記錄內(nèi)容,隨便編輯
"qdd :刪除,重新存入q
@q :執(zhí)行 錄制/寄存器 q
" 在可視塊中運(yùn)行記錄
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 : 進(jìn)入可視化模式
V : 進(jìn)入可視化行選擇模式
<C-V> : 進(jìn)入可視化塊選擇模式
gv : 重新選擇
o : 選擇的區(qū)域頭尾移動(dòng)
"*y : 復(fù)制選擇區(qū)域到paste buffer
V% : 選擇一個(gè)匹配段
V}J : 合并一個(gè)段落
V}gJ : 合并一個(gè)段落,并保留空格
----------------------------------------
" 刪除選中的10行的前兩個(gè)字符(不過(guò)這里應(yīng)該假設(shè)是緊湊的排版格式,不能包含空格、
tab等字符的,可是經(jīng)實(shí)驗(yàn)應(yīng)該是錢3個(gè)字符才對(duì)啊??)
0<c-v>10j2ld
----------------------------------------
" 如何用可視塊拷貝幾列
" 可視塊(并非通常的 v 命令)
<C-V>,然后通過(guò)移動(dòng)命令選擇列 (win32 <C-Q>)
然后執(zhí)行 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 基本設(shè)置
:set incsearch : 輸入搜索命令時(shí),立即顯示目前輸入的模式對(duì)應(yīng)的匹配。匹配的字符串
被高亮。
:set wildignore=*.o,*.obj,*.bak,*.exe : tab補(bǔ)全時(shí)忽略這些忽略這些
:set shiftwidth=3 : 設(shè)置自動(dòng)縮進(jìn)為3個(gè)字符
:set vb t_vb=". : 安靜模式,關(guān)閉響鈴跟閃爍
:set browsedir=buffer : 設(shè)置文件瀏覽使用的目錄
“注:
”last 使用文件瀏覽器最近訪問(wèn)相同的目錄。
“buffer 使用相關(guān)緩沖區(qū)的目錄。
”current 使用當(dāng)前目錄。
“{path} 使用指定目錄。
----------------------------------------
" 啟動(dòng)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里打開(kāi)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
----------------------------------------
" 向寄存器中添加內(nèi)容 (使用相應(yīng)寄存器名稱的大寫(xiě))
" 復(fù)制5行放入a寄存器,然后向下跳轉(zhuǎn)10行再?gòu)?fù)制5行
"a5yy
10j
"A5yy
----------------------------------------
[I : 顯示當(dāng)前行中字符的所有匹配(超級(jí)有用)
----------------------------------------
" 常規(guī)縮進(jìn)
:'a,'b>> :將mark a到mark b之間的內(nèi)容進(jìn)行兩次縮進(jìn)
" 虛擬模式下縮進(jìn) (可重復(fù))
:vnoremap < <gv
”這是一個(gè)虛擬模式下的鍵盤(pán)映射 < 映射為<gv
"< 意為向內(nèi)縮進(jìn),gv 上面已有解釋,為重復(fù)上次選區(qū)
“<gv 也就是先向內(nèi)縮進(jìn)然后再選擇剛才的選區(qū)
“這樣就可以只按 < 實(shí)現(xiàn)重復(fù)縮進(jìn)了
:vnoremap > >gv :向內(nèi)縮進(jìn),原理同上
" 塊縮進(jìn)
>i{
>a{
" also
>% and <%
”自己試試看吧,涉及到用 { 的語(yǔ)言很有用,比如c,c++等
----------------------------------------
" 重定向 & 粘貼到寄存器 * (*為寄存器名稱)
:redir @* : 重定向命令到paste緩沖區(qū)
:redir END : 結(jié)束
:redir >> out.txt : 重定向到文件
" 操作粘貼緩沖區(qū)
"*yy : 復(fù)制到寄存器
"*p : 從寄存器中粘貼一行
" 復(fù)制到粘貼緩沖區(qū) (擴(kuò)展模式)
:'a,'by* : 復(fù)制一個(gè)范圍到粘貼寄存器
:%y* : 復(fù)制一個(gè)括號(hào)匹配到粘貼緩沖區(qū)
:.y* : 復(fù)制當(dāng)前行到粘貼緩沖區(qū)
" 從剪貼板上過(guò)濾非可打印字符
" 當(dāng)從一些 GUI 程序粘貼時(shí)會(huì)有用處
:nmap <leader>p :let @* = substitute(@*,'[^[:print:]]','','g')<cr>"*p
----------------------------------------
" 重新格式化文本
gq} : 合并一個(gè)段落
gqap : 當(dāng)前段落
ggVGgq : 全部段落
Vgq : 當(dāng)前行
" 在70列的時(shí)候換行
:s/.\{,69\};\s*\|.\{,69\}\s\+/&\r/g
----------------------------------------
" 命令使用于多個(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 " : 從管道出過(guò)濾內(nèi)容
gvim -o file1 file2 : 分割窗口顯示兩個(gè)文件
" 打開(kāi)文件后執(zhí)行一條命令
gvim.exe -c "/main" joe.c : 打開(kāi) joe.c & 跳轉(zhuǎn)到 "main"
" 在打開(kāi)一個(gè)文件時(shí)執(zhí)行多條命令
vim -c "%s/ABC/DEF/ge | update" file1.c
" 在一組文件上執(zhí)行多條命令
vim -c "argdo %s/ABC/DEF/ge | update" *.c
" 從一系列文件中刪除一塊區(qū)域
vim -c "argdo /begin/+1,/end/-1g/^/d | update" *.c
" 自動(dòng)編輯文件 (編輯命令序列Ex commands已經(jīng)包含在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中的內(nèi)容送往默認(rèn)的打印機(jī)
gvim -c 's/^/\=@*/|hardcopy!|q!'
" gvim 里的 grep (win32 or *nix)
:grep somestring *.php : 創(chuàng)建匹配的文件列表
" 使用 :cn(向后后) :cp(向前) 操縱列表
:h grep :查看幫助
----------------------------------------
" GVIM 的差異比較
gvim -d file1 file2 : vimdiff (比較不差異)
dp : 把光標(biāo)處的不同放到另一個(gè)文件
do : 在光標(biāo)處從另一個(gè)文件取得不同
----------------------------------------
" Vim traps
在正則表達(dá)式中 + | ( { 都要加上轉(zhuǎn)義符(反斜杠)
/fred\+/ : 匹配 fred/freddy 但不匹配 free
/\(fred\)\{2,3}/ : note what you have to break
----------------------------------------
" \v ,或叫做very magic (通常都是這么叫)可以取消轉(zhuǎn)義符
/codes\(\n\|\s\)*where : 普通的正則表達(dá)式
/\vcodes(\n|\s)*where : very magic
----------------------------------------
" 把對(duì)象送到命令行或者搜索行
<C-R><C-W> : 執(zhí)行當(dāng)前光標(biāo)下的單個(gè)單詞
<C-R><C-A> : 執(zhí)行當(dāng)前光標(biāo)下盡可能多的單詞
<C-R>- : 送至一個(gè)小型寄存器(同樣使用于插入模式)
<C-R>[0-9a-z] : 送至一個(gè)命名寄存器 (括弧同上)
<C-R>% : 送至文件名(#也行) (同上)
<C-R>=somevar : 送至一個(gè)變量 (例如 :let sray="ray[0-9]")
----------------------------------------
" 控制寄存器
:let @a=@_ : 清除寄存器 a
:let @a="" : 同上 a
:let @*=@a : 拷貝寄存器 a 到 paste buffer
:let @*=@: : 拷貝最后執(zhí)行的命令到 paste buffer
:let @*=@/ : 拷貝最后執(zhí)行的查找命令到paste buffer
:let @*=@% : 拷貝當(dāng)前文件到 paste buffer
map <f11> "qyy:let @q=@q."zzz"
----------------------------------------
" 幫助的幫助? (使用 TAB)
:h quickref : VIM 快速參考頁(yè)
:h tips : Vim'自己的技巧幫助
:h visual<C-D><tab> : 虛擬模式的幫助列表
: 然后使用tab選擇它們
:h ctrl<C-D> : 所有關(guān)于ctrl鍵的幫助列表
:helpg uganda : 過(guò)濾幫助文件 使用 :cn, :cp 查找下一個(gè)及后一個(gè)
:h :r : 關(guān)于 :ex 的命令幫助
:h CTRL-R : 普通模式相關(guān)
:h /\r : \r是什么的意思
:h \\zs : 使用雙反斜線查找關(guān)于 \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 命令行幫助
----------------------------------------
" 選項(xiàng)設(shè)置在那里
:scriptnames : 列出所有已經(jīng)加載的 plugins, _vimrcs文件
:verbose set history? :顯示 history的值并顯示在那里定義的
:function : 列出所有函數(shù)
:func SearchCompl : 顯示指定函數(shù)的細(xì)節(jié)
----------------------------------------
" 制作你自己的VIM 幫助
:helptags /vim/vim64/doc : 重新編譯所有 *.txt 的幫助文件在這個(gè)目錄里
:help add-local-help :如何添加本地幫助
----------------------------------------
" 用外部程序運(yùn)行文件 (例如 php)
map <f9> :w<CR>:!c:/php/php.exe %<CR>
map <f2> :w<CR>:!perl -c %<CR>
----------------------------------------
" 在另一個(gè)buffer中,捕捉當(dāng)前腳本的輸出
:new | r!perl # : 新建一個(gè)buffer,從另一個(gè)buffer中讀入結(jié)果
:new! x.out | r!perl # : 同上,并指定一個(gè)新文件名
: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) 對(duì)于Win32應(yīng)該這樣
:%s/$/\^M&/g : 你看到的^M是一個(gè)字符
----------------------------------------
" 自動(dòng)刪除行尾 Dos回車符和空格
autocmd BufRead * silent! %s/[\r \t]\+$//
autocmd BufEnter *.php :%s/[ \t\r]\+$//e
----------------------------------------
" 對(duì)指定文件或文件類型執(zhí)行某個(gè)動(dòng)作
autocmd VimEnter c:/intranet/note011.txt normal! ggVGg?
autocmd FileType *.pl exec('set fileformats=unix')
----------------------------------------
" 把最后一個(gè)命令貼到當(dāng)前位置
i<c-r>:
" 把最后一個(gè)搜索指令貼到當(dāng)前位置
i<c-r>/
----------------------------------------
" 更多的完成功能
<C-X><C-F> :插入當(dāng)前目錄下的一個(gè)文件名到當(dāng)前位置
# 在insert模式下使用
# 然后用 Ctrl-P/Ctrl-N 翻頁(yè)
----------------------------------------
" 替換一個(gè)visual區(qū)域
" 選擇一個(gè)區(qū)域,然后輸入 :s/Emacs/Vim/ 等等,vim會(huì)自動(dòng)進(jìn)入:模式
:'<,'>s/Emacs/Vim/g : 前面的' '<.'> 是vim自動(dòng)添加的
gv : 重新選擇前一個(gè)可視區(qū)域 (ULTRA)
----------------------------------------
" 在文件中插入行號(hào)
:g/^/exec "s/^/".strpart(line(".")." ", 0, 4)
:%s/^/\=strpart(line(".")." ", 0, 5)
:%s/^/\=line('.'). ' '
----------------------------------------
#用VIM的方式來(lái)編號(hào)行
:set number : 顯示行號(hào)
:map <F12> :set number!<CR> : Show linenumbers flip-flop
:%s/^/\=strpart(line('.')." ",0,&ts)
#從任意行開(kāi)始編號(hào)(需要perl)
:'a,'b!perl -pne 'BEGIN{$a=223} substr($_,2,0)=$a++'
#產(chǎn)生數(shù)字列表
#Type in number on line say 223 in an empty file
qqmnYP`n^Aq : in recording q repeat with @q
" 遞增已存在數(shù)字到文件末
:.,$g/^\d/exe "normal! \<c-a>"
" 高級(jí)遞增,參見(jiàn):
http://vim.sourceforge.net/tip_view.php?tip_id=150
----------------------------------------
" 高級(jí)遞增 (真的很有用)
" 把下面幾句放到 _vimrc
let g:I=0
function! INC(increment)
let g:I =g:I + a:increment
return g:I
endfunction
" 例如從mark a 到mark b 遞增,從223開(kāi)始,步長(zhǎng)為5
:let I=223
:'a,'bs/^/\=INC(5)/
" create a map for INC
cab viminc :let I=223 \| 'a,'bs/$/\=INC(5)/
----------------------------------------
" 生成從 23-64 的數(shù)字列表
o23<ESC>qqYp<C-A>q40@q
----------------------------------------
" 在當(dāng)前插入模式下編輯/移動(dòng) (真得很有用)
<C-U> : 刪除全部
<C-W> : 刪除最后一個(gè)單詞
<HOME><END> : 移動(dòng)到行首/行尾
<C-LEFTARROW><C-RIGHTARROW> : 向前/后移動(dòng)一個(gè)單詞
<C-X><C-E>,<C-X><C-Y> : scroll while staying put in insert
----------------------------------------
#加密(小心使用,不要忘了密碼)
:X : vim會(huì)提示你輸入密碼
:h :X
----------------------------------------
" 模式行 (使文件只讀等),必須在前/后 5行內(nèi)
// vim:noai:ts=2:sw=4:readonly:
" vim:ft=html: : 使用 HTML 語(yǔ)法高亮
:h modeline
----------------------------------------
" 建立你自己的菜單項(xiàng)
amenu Modeline.Insert\ a\ VIM\ modeline <Esc><Esc>ggOvim:ff=unix ts=4 ss=4<CR>
vim60:fdm=marker<esc>gg
----------------------------------------
" 一個(gè)保存當(dāng)前光標(biāo)下的狹義字到一個(gè)文件的函數(shù)
function! SaveWord()
normal yiw
exe ':!echo '.@0.' >> word.txt'
endfunction
map ,p :call SaveWord()
----------------------------------------
" 刪除重復(fù)行的函數(shù)
function! Del()
if getline(".") == getline(line(".") - 1)
norm dd
endif
endfunction
:g/^/ call Del() #使用該函數(shù)的一個(gè)例子
----------------------------------------
" 雙字節(jié)編碼 (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
----------------------------------------
" 文件名自動(dòng)完成 (例如 main_c.c)
:e main_<tab> : tab 鍵完成
gf : 打開(kāi)光標(biāo)處廣義字命名的文件 (normal模式)
main_<C-X><C-F> : 文件名自動(dòng)完成(insert模式)
----------------------------------------
" Vim復(fù)雜使用
" 交換兩個(gè)單詞
:%s/\<\(on\|off\)\>/\=strpart("offon", 3 * ("off" == submatch(0)), 3)/g
" 交換兩個(gè)單詞
:vnoremap <C-X> <Esc>`.``gvP``P
----------------------------------------
" 把text文件轉(zhuǎn)換成html文件(oh,ft)
:runtime! syntax/2html.vim : 轉(zhuǎn)換 txt 成 html
:h 2html
----------------------------------------
" VIM 有一個(gè)內(nèi)部自帶的 grep 命令
:grep some_keyword *.c : 得到一個(gè)包含some_keyword的c文件名列表
:cn : 去下一個(gè)出現(xiàn)的位置
----------------------------------------
" 強(qiáng)制無(wú)擴(kuò)展名的文件的語(yǔ)法著色方式
:set syntax=perl
" 取消語(yǔ)法著色 (很有用)
:set syntax off
" 改變色彩主題 (在~vim/vim??/colors中的任何文件)
:colorscheme blue
" 通過(guò)使用模式行強(qiáng)迫使用 HTML 語(yǔ)法高亮
# vim:ft=html:
" 強(qiáng)制自動(dòng)語(yǔ)法加亮(非標(biāo)準(zhǔn)的文件擴(kuò)展)
au BufRead,BufNewFile */Content.IE?/* setfiletype html
----------------------------------------
:set noma (non modifiable) : 防止修改
:set ro (Read Only) : 只讀保護(hù)
----------------------------------------
" 對(duì)話 (打開(kāi)一堆文件)
gvim file1.c file2.c lib/lib.h lib/lib2.h : 在"對(duì)話"中加載這些文件
:mksession : 生成一個(gè)Session文件 (默認(rèn)是Session.vim)
:q
gvim -S Session.vim : 重新加載所有文件
----------------------------------------
#標(biāo)記(tags) (跳轉(zhuǎn)到子程序/函數(shù))
taglist.vim : 很流行的插件
:Tlist : 顯示標(biāo)記 (函數(shù)列表)
<C-]> : 跳轉(zhuǎn)到光標(biāo)處的函數(shù)
----------------------------------------
" columnise a csv file for display only as may crop wide columns
:let width = 20
:let fill=' ' | while strlen(fill) < width | let fill=fill.fill | endwhile
:%s/\([^;]*\);\=/\=strpart(submatch(1).fill, 0, width)/ge
:%s/\s\+$//ge
" Highlight a particular csv column (put in .vimrc)
function! CSVH(x)
execute 'match Keyword /^\([^,]*,\)\{'.a:x.'}\zs[^,]*/'
execute 'normal ^'.a:x.'f,'
endfunction
command! -nargs=1 Csv :call CSVH(<args>)
" call with
:Csv 5 : highlight fifth column
----------------------------------------
" 折疊:隱藏某些片斷,使查看更容易
zf} : 使用動(dòng)作命令折疊一個(gè)段落
v}zf : 使用可視模式折疊一個(gè)段落
zf'a : 折疊到一個(gè)標(biāo)記上
zo : 打開(kāi)折疊
zc : 重新關(guān)閉折疊
----------------------------------------
" 顯示"不可見(jiàn)字符"
:set list
:h listchars
----------------------------------------
" 如何在不進(jìn)入插入模式的情況下粘貼"普通模式的命令"
:norm qqy$jq
----------------------------------------
" 處理文件名
:h filename-modifiers : 幫助
:w % : 寫(xiě)入當(dāng)前文件
:w %:r.cfm : 改變文件擴(kuò)展名為 .cfm
:!echo %:p : 顯示完整路徑和文件名
:!echo %:p:h : 只顯示完整路徑
:!echo %:t : 只顯示文件名
:reg % : 顯示文件名
<C-R>% : 插入文件名 (插入模式)
"%p : 插入文件名 (普通模式)
/<C-R>% : 在文本中查找文件名
----------------------------------------
" 刪除,但不破壞 buffer 內(nèi)容
"_d : 你一直想要的東西
"_dw : 例如:刪除一個(gè)單詞 (使用黑洞???)
----------------------------------------
" 送完整的路徑名到剪貼板,用于郵件附件等
nnoremap <F2> :let @*=expand("%:p")<cr> :unix
nnoremap <F2> :let @*=substitute(expand("%:p"), "/", "\\", "g")<cr> :win32
----------------------------------------
" 不用離開(kāi) Vim 就能修改文件名的簡(jiǎn)單 shell 腳本
$ vim
:r! ls *.c
:%s/\(.*\).c/mv & \1.bla
:w !sh
:q!
----------------------------------------
" 在一個(gè)文本里計(jì)算單詞數(shù)
g<C-G>
----------------------------------------
" 你自己設(shè)置高亮顯示的例子
:syn match DoubleSpace " "
:hi def DoubleSpace guibg=#e0e0e0
----------------------------------------
" reproduce previous line word by word
imap ] @@@<ESC>hhkyWjl?@@@<CR>P/@@@<CR>3s
nmap ] i@@@<ESC>hhkyWjl?@@@<CR>P/@@@<CR>3s
" 根據(jù)文件類型映射快捷鍵
: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?"
# 譯釋:呵呵,誰(shuí)來(lái)解釋一下吧!
# 其實(shí)不過(guò)是在啟動(dòng)vim的時(shí)候執(zhí)行了一個(gè)命令
# 先寫(xiě)入了 Just Another Vim Hacker 的rot13編碼
# 然后再解碼
/joe/e : 設(shè)置光標(biāo)到匹配"joe"的末尾
/joe/e+1 : 設(shè)置光標(biāo)到匹配"joe"的末尾再后移一位
/joe/s-2 : 設(shè)置光標(biāo)到匹配"joe“的開(kāi)頭再前移兩位
/^joe.*fred.*bill/ : 匹配以'j'開(kāi)頭且"joe"到"fred"到"bill"之間至少有一個(gè)字符
/^[A-J]\+/ : 搜索'A'到’J‘重復(fù)兩次以上的開(kāi)頭行
/begin\_.*end : 多行匹配
/fred\_s*joe/i : 可以是任何空白字符包括\n,\t等等
/fred\|joe : 搜索fred或者joe
/.*fred\&.*joe : 搜索同時(shí)包括fred跟joe的行
/\<fred\>/i : 搜索獨(dú)立的單詞fred
/\<\d\d\d\d\> : 搜索獨(dú)立的4位數(shù)字
/\D\d\d\d\d\D : 搜索6位字符串中間4位數(shù)字前后兩位不能為數(shù)字
/\<\d\{4}\> : 同/\<\d\d\d\d\>
" 查找空行
/^\n\{3} : 匹配三連續(xù)的空行
" 使用正則表達(dá)式組查找
/\(fred\).*\(joe\).*\2.*\1
" 正則表達(dá)式重復(fù)
/^\([^,]*,\)\{8}
" visual searching
:vmap // y/<C-R>"<CR> : visually模式下的鍵盤(pán)映射,把//映射成匹配當(dāng)前選中的文本
:vmap <silent> // y/<C-R>=escape(@", '\\/.*$^~[]')<CR><CR> : 包括空白字符
" \zs 和 \ze 匹配原 :h /\zs
/<\zs[^>]*\ze> : 匹配尖括號(hào)中的內(nèi)容
" 零寬度匹配 :h /\@=
/<\@<=[^>]*>\@= : search for tag contents, ignoring chevrons
/<\@<=\_[^>]*>\@= : search for tags across possible multiple lines
" 多行查找 \_ 的意思是包括換行符
/<!--\_p\{-}--> : 匹配<!--開(kāi)始到-->結(jié)尾的所有內(nèi)容
/fred\_s*joe/i : 匹配fred開(kāi)始到j(luò)oe,之間一定得是空白字符
/bugs\(\_.\)*bunny : 匹配所有bugs到bunny的字符串
:h \_ : help
" 查找函數(shù)聲明,nmap為normal模式下的鍵盤(pán)映射
:nmap gx yiw/^\(sub\<bar>function\)\s\+<C-R>"<CR>
" 查找多個(gè)文件
:bufdo /searchstr/ : 在多個(gè)文件緩沖區(qū)里執(zhí)行查找
" 更好的多文件查找定位方法
:bufdo %s/searchstr/&/gic : 在多個(gè)文件緩沖區(qū)里查找,按下n停止
" 怎樣不使用 / 來(lái)查找網(wǎng)址
?http://www.vim.org/ : 向后查找
" 查找指定字符以外的字符串
/\c\v([^aeiou]&\a){4} : 查找4個(gè)輔音字母
----------------------------------------
#替換
:%s/fred/joe/igc : 普通替換命令
:%s/\r//g : 刪除 DOS 的換行符 ^M
" 你的文本文件是否亂七八糟的排成一行?使用如下命令
:%s/\r/\r/g : 轉(zhuǎn)換 DOS 回車符 ^M 為真正的回車符
:%s= *$== : 刪除行尾空白
:%s= \+$== : 同上
:%s#\s*\r\?$## : 刪除尾部空白和dos換行符
:%s#\s*\r*$## : 同上
" 刪除空行
:%s/^\n\{3}// : 刪除連續(xù)3個(gè)空行
:%s/^\n\+/\r/ : 壓縮空行,多個(gè)替換為一個(gè)
%s#<[^>]\+>##g : 刪除html的tag部分
" IF YOU ONLY WANT TO KNOW ONE THING
:'a,'bg/fred/s/dick/joe/igc : 非常有用
# 譯釋:''a,''b指定一個(gè)范圍:mark a ~ mark b
# g//用一個(gè)正則表達(dá)式指出了進(jìn)行操作的行必須可以被fred匹配
# 看后面,g//是一個(gè)全局顯示命令
# s/dick/joe/igc則對(duì)于這些滿足條件的行進(jìn)行替換
" 復(fù)制列
:%s= [^ ]\+$=&&= : 復(fù)制最后一列
:%s= \f\+$=&&= : 一樣
:%s= \S\+$=&& : 暈,還一樣!
" 記憶(反向引用)
:s/\(.*\):\(.*\)/\2 : \1/ : 將兩個(gè)字段顛倒
:%s/^\(.*\)\n\1$/\1/ : 刪除重復(fù)行
" 非貪婪匹配 \{-}
:%s/^.\{-}pdf/new.pdf/ : 刪除第一個(gè)pdf
" use of optional atom \?
:%s#\<[zy]\?tbl_[a-z_]\+\>#\Lgc : lowercase with optional leading characters
" 跨越盡量多的行
:%s/<!--\_.\{-}-->// : 刪除多行注釋
:help /\{-} : 查看非貪婪匹配的更多幫助
" 使用寄存器替換
:s/fred/<c-r>a/g : 將fred替換為寄存器a里的內(nèi)容
:s/fred/<c-r>asome_text<c-r>s/g
:s/fred/\=@a/g : better alternative as register not displayed
" 在一行里寫(xiě)多種命令
:%s/\f\+\.gif\>/\r&\r/g | v/\.gif$/d | %s/gif/jpg/
:%s/a/but/gie|:update|:next : 當(dāng)使用 @: 來(lái)重復(fù)
" 或運(yùn)算
:%s/suck\|buck/loopy/gc : 替換suck或者buck(這里|不是管道)
" 調(diào)用vim函數(shù)
:s/__date__/\=strftime("%c")/ : 將__date__替換成當(dāng)前日期,使用strftime函數(shù)
" 處理列,替換所有在第三列中的str1
:%s:\(\(\w\+\s\+\)\{2}\)str1:\1str2:
" 交換第一列跟第四列
:%s:\(\w\+\)\(.*\s\+\)\(\w\+\)$:\3\2\1:
" 過(guò)濾form中的內(nèi)容放在寄存器里
:redir @*|sil exec 'g#<\(input\|select\|textarea\|/\=form\)\>#p'|redir END
:nmap ,z :redir @*<Bar>sil exec 'g@<\(input\<Bar>select\<Bar>textarea\<Bar>
/\=form\)\>@p'<Bar>redir END<CR>
" 兩位以上的數(shù)字減三(帶進(jìn)位。這個(gè)命令挺有趣)
:%s/\d\+/\=(submatch(0)-3)/
" 包含loc或者functions的行中的數(shù)字加6
:g/loc\|function/s/\d/\=submatch(0)+6/
" 比上面更好的方法
:%s#txtdev\zs\d#\=submatch(0)+1#g
:h /\zs 查看幫助
" 前綴為gg的數(shù)字加6
:%s/\(gg\)\@<=\d\+/\=submatch(0)+6/
:h zero-width 查看幫助
" 替換一個(gè)特定字符串為數(shù)字
:let i=10 | 'a,'bg/Abc/s/yy/\=i/ |let i=i+1 # 將yy轉(zhuǎn)換成10,11,12等等
" 比上面的更精確
:let i=10 | 'a,'bg/Abc/s/xx\zsyy\ze/\=i/ |let i=i+1 # 將xxyy 轉(zhuǎn)換成 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/# : 查找并顯示匹配的行號(hào)
: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到j(luò)oe
:g/-------/.-10,.d : 以-------為標(biāo)記刪除之前的10行
:g/{/ ,/}/- s/\n\+/\r/g : 刪除 {...}之間的空行
:v/\S/d : Delete empty lines (both types)
:v/./,/./-j : 壓縮空行
:g/^$/,/./-j : 同上
:g/<input\|<form/p : 或運(yùn)算
:g/^/put_ : 雙倍行寬 (pu = put)
:g/^/m0 : 顛倒文件 (m = move)
:'a,'bg/^/m'b : 顛倒選中的 a 到 b
:g/^/t. : 重復(fù)行
:g/fred/t$ : 拷貝行從fred到結(jié)尾
:g/stage/t'a : 拷貝行從stage 到 marker a(a為標(biāo)記的位置)
:g/\(^I[^^I]*\)\{80}/d : 刪除最少包含80個(gè)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 : 隔行刪除
" 增加數(shù)字 (鍵入 <c-a>)
:.,$g/^\d/exe "norm! \<c-a>": 增加從當(dāng)前行首到結(jié)尾的數(shù)字
:'a,'bg/\d\+/norm! ^A : 增加數(shù)字
" 保存全局命令的結(jié)果 (注意必須使用添加模式) 你需要使用 qaq 清空寄存器a.
"save results to a register/paste buffer 存儲(chǔ)結(jié)果到 寄存器/粘貼 到 a
:g/fred/y A : 添加配備行到寄存器到 a
:g/fred/y A | :let @*=@a : 放入復(fù)制緩沖區(qū)
:let @a=''|g/Barratt/y A |:let @*=@a
:'a,'b g/^Error/ . w >> errors.txt
" 復(fù)制每一行,然后在復(fù)制出來(lái)的每一行兩側(cè)加上一個(gè) print '復(fù)制出來(lái)的內(nèi)容'
:g/./yank|put|-1s/'/"/g|s/.*/Print '&'/
" 用文件中的內(nèi)容替換字符串,-d 表示刪除“標(biāo)記”
: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>
----------------------------------------
" 全局命令和替換命令聯(lián)姻 (強(qiáng)大的編輯能力)
:'a,'bg/fred/s/joe/susan/gic : 可以使用反向引用來(lái)匹配
: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# : 查找當(dāng)前光標(biāo)下的單詞(單個(gè)單詞) (<cword>) (向前/向后)
% : 匹配括號(hào) {}[]()
. : 重復(fù)上次操作
@: : 重復(fù)上次的命令
matchit.vim : 適%能匹配 <script> <?php等標(biāo)記
<C-N><C-P> : 插入模式下自動(dòng)完成填詞
<C-X><C-L> : 行自動(dòng)完成(超級(jí)有用)
/<C-R><C-W> : 把單個(gè)<cword>單詞放入搜索或者命令行
/<C-R><C-A> : 把字符串中有的單詞<CWORD>放入搜索或者命令行
:set ignorecase : 忽略大小寫(xiě)
:syntax on : 打開(kāi)語(yǔ)法高亮 Perl,HTML,PHP 等等
:h regexp<C-D> : 按ctrl+d得到包含regexp的列表
(按tab自動(dòng)不齊)
----------------------------------------
" 簡(jiǎn)單編輯更新 _vimrc文件
:nmap ,s :source $VIM/_vimrc :普通模式下的鍵盤(pán)映射 ,s映射成加載用戶目錄下的
_vimrc文件
:nmap ,v :e $VIM/_vimrc :,v映射成打開(kāi)_vimrc文件
----------------------------------------
#VISUAL 模式 (方便增加 HTML 標(biāo)簽)
:vmap sb "zdi<C-R>z<ESC> : 在 VISUALLY模式下將選中的文本前后分別加上
:vmap st "zdi<?= <C-R>z ?><ESC> : 加上 <?= ?>
----------------------------------------
" 瀏覽
:Exp(lore) : 瀏覽文件
:Sex(plore) : 分割窗口瀏覽文件
:ls : 顯示緩沖區(qū)
:cd .. : 設(shè)置當(dāng)前目錄位置
:args : 查看當(dāng)前打開(kāi)的所有文件
:lcd %:p:h : 改變路徑到當(dāng)前編輯的文件
:autocmd BufEnter * lcd %:p:h : 放入.vimrc自動(dòng)完成上面的命令
----------------------------------------
" 緩沖區(qū)瀏覽(一直排名前10的vim腳本)
" 需要 bufexplorer.vim http://www.vim.org/script.php?script_id=42
\be : 緩沖瀏覽器中查看緩沖列表
\bs : 同上,但是分割窗口
----------------------------------------
" 轉(zhuǎn)換大小寫(xiě)
guu : 將正行的字母轉(zhuǎn)換成小寫(xiě)
gUU : 將正行的字母轉(zhuǎn)換成大寫(xiě)
Vu : 轉(zhuǎn)換選中的行(小寫(xiě))
VU : 轉(zhuǎn)換選中的行(大寫(xiě))
g~~ : 反向轉(zhuǎn)換
vEU : 轉(zhuǎn)換詞大寫(xiě)
vE~ : 反向轉(zhuǎn)換詞
ggguG : 將當(dāng)前編輯文件內(nèi)容全部轉(zhuǎn)換成小寫(xiě)
" Visually 模式下選擇所有的字母及數(shù)字 (放入 .vimrc文件中)
vmap ,c :s/\<\(.\)\(\k*\)\>/\u\1\L\2/g<CR>
" 大寫(xiě)所有句子的第一個(gè)字母
:%s/[.!?]\_s\+\a/\U&\E/g
----------------------------------------
gf : 打開(kāi)當(dāng)前光標(biāo)下或后的文件
:nnoremap gF :view <cfile><cr> : 打開(kāi)當(dāng)前光標(biāo)下或后的文件, 如果不存在則創(chuàng)建
ga : 顯示當(dāng)前光標(biāo)下單個(gè)字的ascii,十進(jìn)制,十六進(jìn)制……
ggVGg? : 將整個(gè)文件用rot13編碼……(誰(shuí)看得懂啊~~hoho)
ggg?G : 同上 (針對(duì)大文件)
:8 | normal VGg? : 將第八行用rot13編碼
:normal 10GVGg? : 同上
<C-A>,<C-X> : 增加,減少當(dāng)前光標(biāo)下的數(shù)字
win32 用戶需要重定義 CNTRL-A
<C-R>=5*5 : 插入25 (小型計(jì)算器)
----------------------------------------
" 幾個(gè)彩蛋……
:h 42 : also http://www.google.com/search?q=42
:h holy-grail
:h!
----------------------------------------
" 標(biāo)記 & 移動(dòng)
'. : 跳回最后編輯的行 (超有用)
`. : 同上,但是定位編輯點(diǎn)
g; : 跳轉(zhuǎn)到比較舊的編輯位置(如果有的話) (vim6.3后的新功能)
g, : 這個(gè)是較心的位置 (同上)
:changes :打出改變表
:h changelist : 查看“改變表跳轉(zhuǎn)”的幫助
<C-O> : 依次沿著你的跳轉(zhuǎn)記錄向回跳 (從最近的一次開(kāi)始)
<C-I> : 依次沿著你的跳轉(zhuǎn)記錄向前跳
:ju(mps) : 列出跳轉(zhuǎn)軌跡
:help jump-motions
:history : 列出歷史記錄
:his c : 命令行歷史
:his s : 搜索歷史
q/ : 搜索命令歷史的窗口
q: : 命令行命令歷史的窗口
:<C-F> : 歷史窗口
----------------------------------------
" 縮寫(xiě) & 映射
: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開(kāi)頭的縮寫(xiě)
:map , : 列出所有的映射(以逗號(hào)開(kāi)始的)
" 允許映射 F10 (win32)
set wak=no : :h winaltkeys
" 映射中常使用的表示
<CR> : 回車
<ESC> : Esc
<LEADER> : 右斜杠
<BAR> : 管道符號(hào)
<BACKSPACE> : 退格鍵
<SILENT> : 不回顯
#顯示自定義的 RGB 顏色顯示當(dāng)前光標(biāo)下的字符串 例如 #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
" 簡(jiǎn)單的 PHP 調(diào)試將所有顯示的變量放入寄存器a
iab phpdb exit("<hr>Debug <C-R>a ");
----------------------------------------
" 使用寄存器來(lái)映射 (放入 .vimrc文件自動(dòng)加載)
:let @m=":'a,'bs/"
:let @s=":%!sort -u"
----------------------------------------
" 列出寄存器
:reg : 顯示當(dāng)前所有的寄存器
:reg a : 顯示寄存器a中的內(nèi)容
"1p.... : 引用一個(gè)叫1的寄存器
:let @y='yy@"' : pre-loading registers (put in .vimrc)
qqq : 清空寄存器 "q"
----------------------------------------
" 一些有用的決竅
"ayy@a : 把當(dāng)前行作為命令執(zhí)行
yy@" : 上面的匿名寄存器
u@. : 只執(zhí)行鍵入的命令
----------------------------------------
" 從其它命令處獲得輸入(需要外部命令)
:r!ls.exe : 從ls 獲得輸入插入到當(dāng)前位置
!!date : 從date獲得輸入(刪除當(dāng)前行)
" 使用外部sort排序
:%!sort -u : 用sort排序整個(gè)文件(結(jié)果覆蓋整個(gè)文件)
:'a,'b!sort -u : 從mark a到mark b之間的內(nèi)容進(jìn)行排序
!1} sort -u : 排序一個(gè)段落
:g/^$/;,/^$/-1!sort : Sort each block (note the crucial ;)
----------------------------------------
" 多文件管理 (基本的)
:bn : 跳轉(zhuǎn)到下一個(gè)buffer
:bp : 跳轉(zhuǎn)到前一個(gè)buffer
:wn : 保存當(dāng)前buffer并跳轉(zhuǎn)到下一個(gè)buffer (超有用)
:wp : 保存當(dāng)前buffer并跳轉(zhuǎn)到前一個(gè)buffer
:bd : 把當(dāng)前文件從buffer移出 (超有用)
:bun : 卸載當(dāng)前buffer (關(guān)閉這個(gè)窗口但是不移出)
:badd file.c : 添加file.c到buffer列表
:b 3 : 前往第三個(gè) buffer
:b main : 前往含有main的buffer中 比如說(shuō) main.c
:sav php.html : 把當(dāng)前文件存為php.html并打開(kāi)
:sav! %<.bak : 換一個(gè)后綴名保存 (舊方法)
:sav! %:r.cfm : 同上
:sav %:s/fred/joe/ : 替換文件名
:sav %:s/fred/joe/:r.bak2 : 替換文件和后綴
:!mv % %:r.bak : 重命名當(dāng)前文件
:e! : 打開(kāi)未修改之前的文件
:w c:/aaa/% : 存儲(chǔ)文件到指定位置
:e # : 編輯標(biāo)記為#的文件在buffer中
:rew : 返回到第一個(gè)可編輯的文件
:brew : 回到第一個(gè)buffer
:sp fred.txt : 分割窗口打開(kāi)fred.txt
:sball,:sb : 把所有的 buffers分割顯示在一個(gè)窗口中 (超有用)
:scrollbind : in each split window
:map <F5> :ls<CR>:e # : 按F5顯示所有buffer, 并顯示行號(hào)
:set hidden : 允許不保存當(dāng)前buffer而進(jìn)行切換
----------------------------------------
" 在分割窗口中快速切換
map <C-J> <C-W>j<C-W>_
map <C-K> <C-W>k<C-W>_
----------------------------------------
" 錄制命令 (最好的技巧)
qq # 錄制命令放入 q寄存器
輸入一些命令
q # 錄制結(jié)束
@q :執(zhí)行放入寄存器q中的內(nèi)容
@@ :重復(fù)
5@@ :重復(fù)5次
" 編輯一個(gè) 寄存器/錄制
"qp :顯示寄存器q中的內(nèi)容(普通模式下)
<ctrl-R>q :顯示寄存器q中的內(nèi)容 (插入模式下)
" 你現(xiàn)在可以看到記錄內(nèi)容,隨便編輯
"qdd :刪除,重新存入q
@q :執(zhí)行 錄制/寄存器 q
" 在可視塊中運(yùn)行記錄
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 : 進(jìn)入可視化模式
V : 進(jìn)入可視化行選擇模式
<C-V> : 進(jìn)入可視化塊選擇模式
gv : 重新選擇
o : 選擇的區(qū)域頭尾移動(dòng)
"*y : 復(fù)制選擇區(qū)域到paste buffer
V% : 選擇一個(gè)匹配段
V}J : 合并一個(gè)段落
V}gJ : 合并一個(gè)段落,并保留空格
----------------------------------------
" 刪除選中的10行的前兩個(gè)字符(不過(guò)這里應(yīng)該假設(shè)是緊湊的排版格式,不能包含空格、
tab等字符的,可是經(jīng)實(shí)驗(yàn)應(yīng)該是錢3個(gè)字符才對(duì)啊??)
0<c-v>10j2ld
----------------------------------------
" 如何用可視塊拷貝幾列
" 可視塊(并非通常的 v 命令)
<C-V>,然后通過(guò)移動(dòng)命令選擇列 (win32 <C-Q>)
然后執(zhí)行 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 基本設(shè)置
:set incsearch : 輸入搜索命令時(shí),立即顯示目前輸入的模式對(duì)應(yīng)的匹配。匹配的字符串
被高亮。
:set wildignore=*.o,*.obj,*.bak,*.exe : tab補(bǔ)全時(shí)忽略這些忽略這些
:set shiftwidth=3 : 設(shè)置自動(dòng)縮進(jìn)為3個(gè)字符
:set vb t_vb=". : 安靜模式,關(guān)閉響鈴跟閃爍
:set browsedir=buffer : 設(shè)置文件瀏覽使用的目錄
“注:
”last 使用文件瀏覽器最近訪問(wèn)相同的目錄。
“buffer 使用相關(guān)緩沖區(qū)的目錄。
”current 使用當(dāng)前目錄。
“{path} 使用指定目錄。
----------------------------------------
" 啟動(dòng)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里打開(kāi)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
----------------------------------------
" 向寄存器中添加內(nèi)容 (使用相應(yīng)寄存器名稱的大寫(xiě))
" 復(fù)制5行放入a寄存器,然后向下跳轉(zhuǎn)10行再?gòu)?fù)制5行
"a5yy
10j
"A5yy
----------------------------------------
[I : 顯示當(dāng)前行中字符的所有匹配(超級(jí)有用)
----------------------------------------
" 常規(guī)縮進(jìn)
:'a,'b>> :將mark a到mark b之間的內(nèi)容進(jìn)行兩次縮進(jìn)
" 虛擬模式下縮進(jìn) (可重復(fù))
:vnoremap < <gv
”這是一個(gè)虛擬模式下的鍵盤(pán)映射 < 映射為<gv
"< 意為向內(nèi)縮進(jìn),gv 上面已有解釋,為重復(fù)上次選區(qū)
“<gv 也就是先向內(nèi)縮進(jìn)然后再選擇剛才的選區(qū)
“這樣就可以只按 < 實(shí)現(xiàn)重復(fù)縮進(jìn)了
:vnoremap > >gv :向內(nèi)縮進(jìn),原理同上
" 塊縮進(jìn)
>i{
>a{
" also
>% and <%
”自己試試看吧,涉及到用 { 的語(yǔ)言很有用,比如c,c++等
----------------------------------------
" 重定向 & 粘貼到寄存器 * (*為寄存器名稱)
:redir @* : 重定向命令到paste緩沖區(qū)
:redir END : 結(jié)束
:redir >> out.txt : 重定向到文件
" 操作粘貼緩沖區(qū)
"*yy : 復(fù)制到寄存器
"*p : 從寄存器中粘貼一行
" 復(fù)制到粘貼緩沖區(qū) (擴(kuò)展模式)
:'a,'by* : 復(fù)制一個(gè)范圍到粘貼寄存器
:%y* : 復(fù)制一個(gè)括號(hào)匹配到粘貼緩沖區(qū)
:.y* : 復(fù)制當(dāng)前行到粘貼緩沖區(qū)
" 從剪貼板上過(guò)濾非可打印字符
" 當(dāng)從一些 GUI 程序粘貼時(shí)會(huì)有用處
:nmap <leader>p :let @* = substitute(@*,'[^[:print:]]','','g')<cr>"*p
----------------------------------------
" 重新格式化文本
gq} : 合并一個(gè)段落
gqap : 當(dāng)前段落
ggVGgq : 全部段落
Vgq : 當(dāng)前行
" 在70列的時(shí)候換行
:s/.\{,69\};\s*\|.\{,69\}\s\+/&\r/g
----------------------------------------
" 命令使用于多個(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 " : 從管道出過(guò)濾內(nèi)容
gvim -o file1 file2 : 分割窗口顯示兩個(gè)文件
" 打開(kāi)文件后執(zhí)行一條命令
gvim.exe -c "/main" joe.c : 打開(kāi) joe.c & 跳轉(zhuǎn)到 "main"
" 在打開(kāi)一個(gè)文件時(shí)執(zhí)行多條命令
vim -c "%s/ABC/DEF/ge | update" file1.c
" 在一組文件上執(zhí)行多條命令
vim -c "argdo %s/ABC/DEF/ge | update" *.c
" 從一系列文件中刪除一塊區(qū)域
vim -c "argdo /begin/+1,/end/-1g/^/d | update" *.c
" 自動(dòng)編輯文件 (編輯命令序列Ex commands已經(jīng)包含在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中的內(nèi)容送往默認(rèn)的打印機(jī)
gvim -c 's/^/\=@*/|hardcopy!|q!'
" gvim 里的 grep (win32 or *nix)
:grep somestring *.php : 創(chuàng)建匹配的文件列表
" 使用 :cn(向后后) :cp(向前) 操縱列表
:h grep :查看幫助
----------------------------------------
" GVIM 的差異比較
gvim -d file1 file2 : vimdiff (比較不差異)
dp : 把光標(biāo)處的不同放到另一個(gè)文件
do : 在光標(biāo)處從另一個(gè)文件取得不同
----------------------------------------
" Vim traps
在正則表達(dá)式中 + | ( { 都要加上轉(zhuǎn)義符(反斜杠)
/fred\+/ : 匹配 fred/freddy 但不匹配 free
/\(fred\)\{2,3}/ : note what you have to break
----------------------------------------
" \v ,或叫做very magic (通常都是這么叫)可以取消轉(zhuǎn)義符
/codes\(\n\|\s\)*where : 普通的正則表達(dá)式
/\vcodes(\n|\s)*where : very magic
----------------------------------------
" 把對(duì)象送到命令行或者搜索行
<C-R><C-W> : 執(zhí)行當(dāng)前光標(biāo)下的單個(gè)單詞
<C-R><C-A> : 執(zhí)行當(dāng)前光標(biāo)下盡可能多的單詞
<C-R>- : 送至一個(gè)小型寄存器(同樣使用于插入模式)
<C-R>[0-9a-z] : 送至一個(gè)命名寄存器 (括弧同上)
<C-R>% : 送至文件名(#也行) (同上)
<C-R>=somevar : 送至一個(gè)變量 (例如 :let sray="ray[0-9]")
----------------------------------------
" 控制寄存器
:let @a=@_ : 清除寄存器 a
:let @a="" : 同上 a
:let @*=@a : 拷貝寄存器 a 到 paste buffer
:let @*=@: : 拷貝最后執(zhí)行的命令到 paste buffer
:let @*=@/ : 拷貝最后執(zhí)行的查找命令到paste buffer
:let @*=@% : 拷貝當(dāng)前文件到 paste buffer
map <f11> "qyy:let @q=@q."zzz"
----------------------------------------
" 幫助的幫助? (使用 TAB)
:h quickref : VIM 快速參考頁(yè)
:h tips : Vim'自己的技巧幫助
:h visual<C-D><tab> : 虛擬模式的幫助列表
: 然后使用tab選擇它們
:h ctrl<C-D> : 所有關(guān)于ctrl鍵的幫助列表
:helpg uganda : 過(guò)濾幫助文件 使用 :cn, :cp 查找下一個(gè)及后一個(gè)
:h :r : 關(guān)于 :ex 的命令幫助
:h CTRL-R : 普通模式相關(guān)
:h /\r : \r是什么的意思
:h \\zs : 使用雙反斜線查找關(guān)于 \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 命令行幫助
----------------------------------------
" 選項(xiàng)設(shè)置在那里
:scriptnames : 列出所有已經(jīng)加載的 plugins, _vimrcs文件
:verbose set history? :顯示 history的值并顯示在那里定義的
:function : 列出所有函數(shù)
:func SearchCompl : 顯示指定函數(shù)的細(xì)節(jié)
----------------------------------------
" 制作你自己的VIM 幫助
:helptags /vim/vim64/doc : 重新編譯所有 *.txt 的幫助文件在這個(gè)目錄里
:help add-local-help :如何添加本地幫助
----------------------------------------
" 用外部程序運(yùn)行文件 (例如 php)
map <f9> :w<CR>:!c:/php/php.exe %<CR>
map <f2> :w<CR>:!perl -c %<CR>
----------------------------------------
" 在另一個(gè)buffer中,捕捉當(dāng)前腳本的輸出
:new | r!perl # : 新建一個(gè)buffer,從另一個(gè)buffer中讀入結(jié)果
:new! x.out | r!perl # : 同上,并指定一個(gè)新文件名
: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) 對(duì)于Win32應(yīng)該這樣
:%s/$/\^M&/g : 你看到的^M是一個(gè)字符
----------------------------------------
" 自動(dòng)刪除行尾 Dos回車符和空格
autocmd BufRead * silent! %s/[\r \t]\+$//
autocmd BufEnter *.php :%s/[ \t\r]\+$//e
----------------------------------------
" 對(duì)指定文件或文件類型執(zhí)行某個(gè)動(dòng)作
autocmd VimEnter c:/intranet/note011.txt normal! ggVGg?
autocmd FileType *.pl exec('set fileformats=unix')
----------------------------------------
" 把最后一個(gè)命令貼到當(dāng)前位置
i<c-r>:
" 把最后一個(gè)搜索指令貼到當(dāng)前位置
i<c-r>/
----------------------------------------
" 更多的完成功能
<C-X><C-F> :插入當(dāng)前目錄下的一個(gè)文件名到當(dāng)前位置
# 在insert模式下使用
# 然后用 Ctrl-P/Ctrl-N 翻頁(yè)
----------------------------------------
" 替換一個(gè)visual區(qū)域
" 選擇一個(gè)區(qū)域,然后輸入 :s/Emacs/Vim/ 等等,vim會(huì)自動(dòng)進(jìn)入:模式
:'<,'>s/Emacs/Vim/g : 前面的' '<.'> 是vim自動(dòng)添加的
gv : 重新選擇前一個(gè)可視區(qū)域 (ULTRA)
----------------------------------------
" 在文件中插入行號(hào)
:g/^/exec "s/^/".strpart(line(".")." ", 0, 4)
:%s/^/\=strpart(line(".")." ", 0, 5)
:%s/^/\=line('.'). ' '
----------------------------------------
#用VIM的方式來(lái)編號(hào)行
:set number : 顯示行號(hào)
:map <F12> :set number!<CR> : Show linenumbers flip-flop
:%s/^/\=strpart(line('.')." ",0,&ts)
#從任意行開(kāi)始編號(hào)(需要perl)
:'a,'b!perl -pne 'BEGIN{$a=223} substr($_,2,0)=$a++'
#產(chǎn)生數(shù)字列表
#Type in number on line say 223 in an empty file
qqmnYP`n^Aq : in recording q repeat with @q
" 遞增已存在數(shù)字到文件末
:.,$g/^\d/exe "normal! \<c-a>"
" 高級(jí)遞增,參見(jiàn):
http://vim.sourceforge.net/tip_view.php?tip_id=150
----------------------------------------
" 高級(jí)遞增 (真的很有用)
" 把下面幾句放到 _vimrc
let g:I=0
function! INC(increment)
let g:I =g:I + a:increment
return g:I
endfunction
" 例如從mark a 到mark b 遞增,從223開(kāi)始,步長(zhǎng)為5
:let I=223
:'a,'bs/^/\=INC(5)/
" create a map for INC
cab viminc :let I=223 \| 'a,'bs/$/\=INC(5)/
----------------------------------------
" 生成從 23-64 的數(shù)字列表
o23<ESC>qqYp<C-A>q40@q
----------------------------------------
" 在當(dāng)前插入模式下編輯/移動(dòng) (真得很有用)
<C-U> : 刪除全部
<C-W> : 刪除最后一個(gè)單詞
<HOME><END> : 移動(dòng)到行首/行尾
<C-LEFTARROW><C-RIGHTARROW> : 向前/后移動(dòng)一個(gè)單詞
<C-X><C-E>,<C-X><C-Y> : scroll while staying put in insert
----------------------------------------
#加密(小心使用,不要忘了密碼)
:X : vim會(huì)提示你輸入密碼
:h :X
----------------------------------------
" 模式行 (使文件只讀等),必須在前/后 5行內(nèi)
// vim:noai:ts=2:sw=4:readonly:
" vim:ft=html: : 使用 HTML 語(yǔ)法高亮
:h modeline
----------------------------------------
" 建立你自己的菜單項(xiàng)
amenu Modeline.Insert\ a\ VIM\ modeline <Esc><Esc>ggOvim:ff=unix ts=4 ss=4<CR>
vim60:fdm=marker<esc>gg
----------------------------------------
" 一個(gè)保存當(dāng)前光標(biāo)下的狹義字到一個(gè)文件的函數(shù)
function! SaveWord()
normal yiw
exe ':!echo '.@0.' >> word.txt'
endfunction
map ,p :call SaveWord()
----------------------------------------
" 刪除重復(fù)行的函數(shù)
function! Del()
if getline(".") == getline(line(".") - 1)
norm dd
endif
endfunction
:g/^/ call Del() #使用該函數(shù)的一個(gè)例子
----------------------------------------
" 雙字節(jié)編碼 (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
----------------------------------------
" 文件名自動(dòng)完成 (例如 main_c.c)
:e main_<tab> : tab 鍵完成
gf : 打開(kāi)光標(biāo)處廣義字命名的文件 (normal模式)
main_<C-X><C-F> : 文件名自動(dòng)完成(insert模式)
----------------------------------------
" Vim復(fù)雜使用
" 交換兩個(gè)單詞
:%s/\<\(on\|off\)\>/\=strpart("offon", 3 * ("off" == submatch(0)), 3)/g
" 交換兩個(gè)單詞
:vnoremap <C-X> <Esc>`.``gvP``P
----------------------------------------
" 把text文件轉(zhuǎn)換成html文件(oh,ft)
:runtime! syntax/2html.vim : 轉(zhuǎn)換 txt 成 html
:h 2html
----------------------------------------
" VIM 有一個(gè)內(nèi)部自帶的 grep 命令
:grep some_keyword *.c : 得到一個(gè)包含some_keyword的c文件名列表
:cn : 去下一個(gè)出現(xiàn)的位置
----------------------------------------
" 強(qiáng)制無(wú)擴(kuò)展名的文件的語(yǔ)法著色方式
:set syntax=perl
" 取消語(yǔ)法著色 (很有用)
:set syntax off
" 改變色彩主題 (在~vim/vim??/colors中的任何文件)
:colorscheme blue
" 通過(guò)使用模式行強(qiáng)迫使用 HTML 語(yǔ)法高亮
# vim:ft=html:
" 強(qiáng)制自動(dòng)語(yǔ)法加亮(非標(biāo)準(zhǔn)的文件擴(kuò)展)
au BufRead,BufNewFile */Content.IE?/* setfiletype html
----------------------------------------
:set noma (non modifiable) : 防止修改
:set ro (Read Only) : 只讀保護(hù)
----------------------------------------
" 對(duì)話 (打開(kāi)一堆文件)
gvim file1.c file2.c lib/lib.h lib/lib2.h : 在"對(duì)話"中加載這些文件
:mksession : 生成一個(gè)Session文件 (默認(rèn)是Session.vim)
:q
gvim -S Session.vim : 重新加載所有文件
----------------------------------------
#標(biāo)記(tags) (跳轉(zhuǎn)到子程序/函數(shù))
taglist.vim : 很流行的插件
:Tlist : 顯示標(biāo)記 (函數(shù)列表)
<C-]> : 跳轉(zhuǎn)到光標(biāo)處的函數(shù)
----------------------------------------
" columnise a csv file for display only as may crop wide columns
:let width = 20
:let fill=' ' | while strlen(fill) < width | let fill=fill.fill | endwhile
:%s/\([^;]*\);\=/\=strpart(submatch(1).fill, 0, width)/ge
:%s/\s\+$//ge
" Highlight a particular csv column (put in .vimrc)
function! CSVH(x)
execute 'match Keyword /^\([^,]*,\)\{'.a:x.'}\zs[^,]*/'
execute 'normal ^'.a:x.'f,'
endfunction
command! -nargs=1 Csv :call CSVH(<args>)
" call with
:Csv 5 : highlight fifth column
----------------------------------------
" 折疊:隱藏某些片斷,使查看更容易
zf} : 使用動(dòng)作命令折疊一個(gè)段落
v}zf : 使用可視模式折疊一個(gè)段落
zf'a : 折疊到一個(gè)標(biāo)記上
zo : 打開(kāi)折疊
zc : 重新關(guān)閉折疊
----------------------------------------
" 顯示"不可見(jiàn)字符"
:set list
:h listchars
----------------------------------------
" 如何在不進(jìn)入插入模式的情況下粘貼"普通模式的命令"
:norm qqy$jq
----------------------------------------
" 處理文件名
:h filename-modifiers : 幫助
:w % : 寫(xiě)入當(dāng)前文件
:w %:r.cfm : 改變文件擴(kuò)展名為 .cfm
:!echo %:p : 顯示完整路徑和文件名
:!echo %:p:h : 只顯示完整路徑
:!echo %:t : 只顯示文件名
:reg % : 顯示文件名
<C-R>% : 插入文件名 (插入模式)
"%p : 插入文件名 (普通模式)
/<C-R>% : 在文本中查找文件名
----------------------------------------
" 刪除,但不破壞 buffer 內(nèi)容
"_d : 你一直想要的東西
"_dw : 例如:刪除一個(gè)單詞 (使用黑洞???)
----------------------------------------
" 送完整的路徑名到剪貼板,用于郵件附件等
nnoremap <F2> :let @*=expand("%:p")<cr> :unix
nnoremap <F2> :let @*=substitute(expand("%:p"), "/", "\\", "g")<cr> :win32
----------------------------------------
" 不用離開(kāi) Vim 就能修改文件名的簡(jiǎn)單 shell 腳本
$ vim
:r! ls *.c
:%s/\(.*\).c/mv & \1.bla
:w !sh
:q!
----------------------------------------
" 在一個(gè)文本里計(jì)算單詞數(shù)
g<C-G>
----------------------------------------
" 你自己設(shè)置高亮顯示的例子
:syn match DoubleSpace " "
:hi def DoubleSpace guibg=#e0e0e0
----------------------------------------
" reproduce previous line word by word
imap ] @@@<ESC>hhkyWjl?@@@<CR>P/@@@<CR>3s
nmap ] i@@@<ESC>hhkyWjl?@@@<CR>P/@@@<CR>3s
" 根據(jù)文件類型映射快捷鍵
: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?"
# 譯釋:呵呵,誰(shuí)來(lái)解釋一下吧!
# 其實(shí)不過(guò)是在啟動(dòng)vim的時(shí)候執(zhí)行了一個(gè)命令
# 先寫(xiě)入了 Just Another Vim Hacker 的rot13編碼
# 然后再解碼