vim與gvim技巧大全

 

轉自:http://blog.163.com/lgh_2002/blog/static/44017526200941343548691/php

第二部分:vim tips的翻譯
不少東東都對於深刻認識vim有很大幫助:)
來源:
http://www.rayninfo.co.uk/vimtips.html
原做者:d.j.rayner (zzapper)
翻譯:hmisty (
lqy99@mails.tsinghua.edu.cn
)
2003-3-23
# 最佳vim技巧
----------------------------------------
# 信息來源
----------------------------------------
www.vim.org
         : 官方站點
comp.editors        : 新聞組
http://www.newriders.com/books/opl/ebooks/0735710015.html
: Vim書籍
http://vimdoc.sourceforge.net/cgi-bin/vim2html2.pl
: 關於vim的可查詢文檔
http://vimdoc.sourceforge.net/vimfaq.html
          : VIM FAQ
----------------------------------------
# 基礎
----------------------------------------
* # g* g#           : 尋找光標處的狹義單詞() (前向/後向)
%                   : 括號配對尋找 {}[]()
matchit.vim         : 使得 % 可以配對標記            : 插入模式下的單詞自動完成
          : 行自動完成(超級有用)
/         : 把狹義單詞  寫到 搜索命令 行
/         : 把廣義單詞  寫到 搜索命令 行
:set ignorecase     : 搜索時忽略大小寫
:syntax on          : 在 Perl,HTML,PHP 等中進行語法着色
:h regexp      : 按下 control-D 鍵便可獲得包含有 regexp 的幫助主題的列表
                    : (使用TAB能夠實現幫助的自動補齊)
----------------------------------------
# 使更新 _vimrc 更容易
:nmap ,s :source $VIM/_vimrc # 譯釋:nmap 是綁定一個在normal模式下的快捷鍵
:nmap ,v :e $VIM/_vimrc
# 譯釋:在normal模式下,前後按下 ,s 兩個鍵執行_vimrc,而 ,v 則是編輯_vimrc
----------------------------------------
# visual 模式 (例子是:輕鬆添加其餘的 HTML Tags)
:vmap sb "zdiz  :在visual模式下選中的文字先後分別加上和
# 譯釋:vmap 是綁定一個在visual模式下的快捷鍵
# 譯釋:原理:在visual模式下,# 譯釋:原理:在visual模式下,"zd 把一個選中的區域命名爲z 而後刪除,
# i 進入插入模式,輸入,z 撤銷剛纔的刪除,而後再寫入,
# 最後返回normal模式
# 譯釋:"z 命令建立一個選中的區域爲register,並把它命名爲z
# 譯釋:更使人開心的有:在visual模式下選中幾行,而後輸入 2> ,
#       則選中的行會所有縮進兩個tab
#       555,偶一開始仍是用 :xx,xx s/^/\t\t/,好傻啊!
:vmap st "zdiz ?>  :在visual模式下選中的文字先後分別加上
----------------------------------------
# 文件瀏覽
:Ex                             : 開啓目錄瀏覽器,注意首字母E是大寫的
:Sex                            : 在一個分割的窗口中開啓目錄瀏覽器
:ls                             : 顯示當前buffer的狀況
:cd ..                          : 進入父目錄
:args                           : 顯示目前打開的文件
:lcd %:p:h                      : 更改到當前文件所在的目錄
# 譯釋:lcd是牢牢改變當前窗口的工做路徑,% 是表明當前文件的文件名,
# 加上 :p擴展成全名(就是帶了路徑),加上 :h析取出路徑
:autocmd BufEnter * lcd %:p:h   : 自動更改到當前文件所在的目錄
# 譯釋:autocmd指定一個自動命令,BufEnter指定一個事件,* 指定事件的對象,
# lcd %:p:h 指定一個動做
# hehe,好像和寫記敘文差很少
----------------------------------------
# 緩衝區(buffer)瀏覽器 (第三方的一個最流行的腳本)
# 須要下載 bufexplorer.vim ,
http://www.vim.org/script.php?script_id=42
上就有
\be                             : 在緩衝區瀏覽器中打開緩衝區列表
\bs                             : 以分割窗口的形式打開緩衝區瀏覽器
----------------------------------------
# 大小寫轉換
guu                             : 行小寫
gUU                             : 行大寫
g~~                             : 行翻轉(固然指大小寫啦)
# 譯釋: g 是大小寫轉換命令(greate),u/U/~是三種轉換形式(小寫/大寫/翻轉),
# 最後一個重複則表示該轉換是對於一行而言的
guw                             : 字大寫(狹義字) 譯註:建議對比iw
gUw                             : 字小寫(狹義字)
g~w                             : 字翻轉(狹義字)
# 譯釋:最後一個w 表示該轉換是對於一個字而言的,因爲是在normal模式下,
# 因此這個w 表示一個狹義字
vEU                             : 字大寫(廣義字)
vE~                             : 字翻轉(廣義字)
# 譯釋:vE 這個指令組合會進入visual模式,而後選擇一個廣義字
ggguG                           : 把整個文章所有小寫(ft!bt!)
gf                              : 取當前光標處的廣義字做爲文件名,而後試圖打開它!
# 譯釋:爲何是廣義字呢?由於這樣能夠方便的取到路徑啊,像/var/www/html/index.htm
ga                              : 顯示光標處字符的ascii,hex,oct,...暈菜的一堆轉換
ggVGg?                          : 用rot13編碼整個文件(暈!)
# 譯釋:gg到文件首行首字符,V進入Visual-Line模式,G到文件末行首字符,
#       這樣就選中了整篇文章,而後g?就是用rot13編碼整個文件啦
#
# 【關於rot13——誰讓英文是偶數個字母啊】
# ROT13 是一種簡單的編碼,它把字母分紅先後兩組,每組13個,編碼和解碼
# 的算法相同,僅僅交換字母的這兩個部分,即:[a..m] --> [n..z] 和 [n..z]
# --> [a..m] 。 ROT13 用簡易的手段使得信件不能直接被識別和閱
# 讀,也不會被搜索匹配程序用一般的方法直接找到。常常用於 USENET 中發表一
# 些***性或使人不快的言論或有簡單保密須要的文章。
# 因爲 ROT13 是自逆算法,因此,解碼和編碼是同一個過程。
,                     : 增長,減小 光標處的狹義字所表示的數字
                                :(,僅僅是分割了這兩個命令,不是命令的一部分)
                                : Win32的用戶可能須要從新定義一下Ctrl-A,呵呵
# 譯註:good guy, 使人不得不想到perl的數字串
=5*5                       : 插入25 (這是一個迷你計算器耶!)
----------------------------------------
# 好玩的東東
:h 42            : 也能夠訪問
http://www.google.com/search?q=42
                 : 第一個結果就是 News. Douglas Adams 1952 - 2001.
                 : Floor 42 extends its deepest sympathies to
                 : the family, friends, and fans of Douglas Adams.
:h holy-grail
:h!
----------------------------------------
# 標記和移動
'.               : 跳到最後修改的那一行 (超級有用)(ft,怎麼又是這個評價)
`.               : 不只跳到最後修改的那一行,還要定位到修改點
            : 依次沿着你的跳轉記錄向回跳 (從最近的一次開始)
            : 依次沿着你的跳轉記錄向前跳
:ju(mps)         : 列出你跳轉的足跡
:help jump-motions
:history         : 列出歷史命令記錄
:his c           : 命令行命令歷史
:his s           : 搜索命令歷史
q/               : 搜索命令歷史的窗口
q:               : 命令行命令歷史的窗口
:           : 歷史命令記錄的窗口
----------------------------------------
# 縮寫和鍵盤映射(原文中文件舉例都用了c:/aaa/x,偶全給他改爲/path/file了,哼唧)
:map      :'a,'bw! /path/file
# 譯釋:map是映射一個normal模式下的鍵
# 這裏是把F7鍵映射成把標記a到標記b中間的內容另存爲一個文件/path/file
# 標記(mark)的方法:把光標移動到須要標記的地方,輸入m,而後輸入標記名,例如a
# 引用標記的方法:'a ,即:單引號加標記名
:map      :r /path/file # 譯釋:把F8鍵映射成在當前位置插入文件/path/file的內容
:map     :.w! /path/file2
# 譯釋:.(點號)表示當前行
# 因此F11就是把當前行存爲/path/file2
# 最後的表示一個回車
:map     :r /path/file2
:ab php          : 列出php表示的縮寫
# 譯釋:定義一個縮寫使用::iab hm hmisty
# 一個有趣的現象是,它列出的會是php和它的前子串開頭的縮寫
# 例如,有這麼幾個縮寫:
# h => hmisty1 , hm => hmisty2 , hmi => hmisty3, m => hmisty4
# 那麼使用 :ab hm會顯示這麼幾個縮寫:hm 和 h
# 而不是你想象中的 hm 和 hmi
:map ,           : 列出以逗號開始的鍵盤映射
# 譯釋:通常而言,咱們稱這些逗號開始的組合鍵爲「逗號命令」
# 不過hmisty更喜歡用;構成「分號命令」
# 並且不是用map,而是用imap
# 由於偶懶麼,懶得按,因此直接在insert模式下就執行命令了
# 爲何用分號呢?由於我最經常使用它寫程序啊
# perl/C/C++/object pascal/java,都是用分號結束一個語句
# 咱們通常不多在分號後面連續寫其餘字符
# 因此用「分號+其餘鍵」就不多會在輸入的時候形成衝突
# 在鍵盤映射中經常使用的表示
             : 回車
            : Esc
         : 轉義符號 \
            : 管道符號 |
----------------------------------------
# 列出寄存器(Registers)
:reg             : 顯示全部當前的registers
"1p              : "表示引用register,1表示一個名字叫作1的register,
                 : p就是粘貼(paste)命令
# 譯釋:"也用來定義register
# 先輸入 ",表示定義register
# 而後輸入名字,如0~9,a~z
# 而後執行刪除或複製命令,如dd或y,
#         或者是visual模式下的d(刪除選中的部分)或y(複製選中的部分)
# 則被刪除或複製的部分就被存入了這個命名的register
#
# 觀察:一個特殊的register, "" ,裏面存儲了一個匿名的刪除/複製
# 在你執行dd或y的時候,被做用的部分被存到了""中
# 這些和perl是多麼像啊
----------------------------------------
# Useful trick
"
[email=ayy@a]ayy@a[/email]
           : 把當前行做爲一個Vim命令來執行
# 譯釋:"ayy 是定義當前行到register a,而後@a是執行register a中存儲的指令
# yy: 複製一行
# 10yy: 複製今後向下的10行
yy@"             : 用上面所提到的那個匿名register
----------------------------------------
# 從其餘程序獲取輸出 (須要外部程序)
:r!ls.exe        : 讀取ls的輸出到當前位置
!!date           : 讀取date的輸出 (可是會替換當前行的內容)
# 譯釋:其實你輸入了!!後,vim就自動轉換到 :.! 等待你繼續輸入
# 使用外部程序sort進行排序(sort是Unix標準命令,ls,date也是)
:%!sort -u       : 使用sort程序排序整個文件(用結果重寫文件)
# 譯釋:%表示整個文件的全部行
# !sort表示執行外部命令sort
# -u是sort的參數,man sort看看,這個參數的意義是合併相同的行
# u就是unique,若是兩行內容相同,則結果中只保留一行的說
:'a,'b!sort -u   : 對mark a 到mark b中間的內容進行排序
!1} sort -u      : 排序當前段落 (只能在normal模式下使用!!)
# 譯釋:!表示使用filter,1}表示filter的對象是從當前行開始向後數一段
# 段落指到空行處結束,不包括空行
# 其實你一旦輸入 !1},vim就自動計算當前段落應該到那一行(eg.+5),而後生成
# :.,.+5! 等待以後輸入sort -u,回車,完成操做
# .表示當前行,.+5固然就是當前行向後數5行
----------------------------------------
# 多文檔操做 (基礎)
# 譯註:用 :ls! 能夠顯示出當前全部的buffer
:bn              : 跳轉到下一個buffer
:bp              : 跳轉到上一個buffer
:wn              : 存盤當前文件並跳轉到下一個(又是「超級……」,ft!)
:wp              : 存盤當前文件並跳轉到上一個
:bd              : 把這個文件從buffer列表中作掉
:bun             : 卸掉buffer (關閉這個buffer的窗口可是不把它從列表中作掉)
:badd file.c     : 把文件file.c添加到buffer列表
:b 3             : 跳到第3個buffer
:b main          : 跳到一個名字中包含main的buffer,例如main.c               : (ultra,這個怎麼翻譯?:()
:sav php.html    : 把當前文件存爲php.html並打開php.html
:sav! % :ls:e # : 在normal模式下按F5鍵,則會顯示全部含有一個
                 : 可編輯文件的buffer,而後提示你輸入buffer的序號,
                 : 輸入後回車,則編輯這個buffer
# 譯註:這是一個鍵盤綁定
:set hidden      : 容許不保存buffer而切換buffer (w/o=without)
----------------------------------------
# 在分割窗口中快速切換
:map  j_
# 譯註:原文此處有誤,前面應該加上冒號
# 這是一個鍵盤綁定,把Ctrl-J定義成切換到下一個窗口並最大化
:map  k_
----------------------------------------
# 命令錄製 (最佳技巧,ft)
qq  #錄製到q
.. #輸入一系列複雜的指令
q   #再次按q中止錄製
@q  #執行q中存儲的指令
@@  #重複執行
# 編輯register/錄製
"ap #把register a中的內容貼到當前位置
.. #如今你能夠修改它了
"add#刪除之,從新存入register a
@a  #執行register a中的指令
----------------------------------------
# _vimrc基礎
:set incsearch                        : 實時匹配你輸入的內容
:set wildignore=*.o,*.obj,*.bak,*.exe : tab鍵的自動完成如今會忽略這些
:set shiftwidth=4                     : 如今自動縮進將是4個字符
# 譯註:一個tab位一般是8個字符
# 因此,咱們還要設定 :set tabstop=4,這樣,全部的縮進都是4字符了
# emacs默認就是4字符縮進吧?
:set vb t_vb=".                        : 沉默方式(不要叫beep!)
----------------------------------------
# 加載windows iexplorer來瀏覽(我想這隻有在windows下用gvim才能用到)
:nmap ,f :update:silent !start c:\progra~1\intern~1\iexplore.exe
[url=file://%:p/]file://%:p[/url]
# 譯釋:nmap是作一個normal模式下的鍵盤綁定
# 這裏綁定了一個逗號命令 ,f
# :update是寫這個文件,與:w不一樣,它只有當文件被修改了的時候才寫
# :silent別讓彈出窗口報告執行結果
# !...後面就是執行windows命令了。呵呵,去問bill gates什麼意思吧。
# 不過偶用gvim 6.1試過了,好用!
:nmap ,i :update: !start c:\progra~1\intern~1\iexplore.exe
----------------------------------------
# 用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
# 譯註:原文丟失了開頭的冒號
# cmap是命令(command)模式綁定
gvim
ftp://209.51.134.122/public_html/index.html
# 這一句就是開始編輯一個ftp遠端的文件,ft
----------------------------------------
# 附加到一個register (就是用大寫的register名字啦!)
"a5yy #複製5行到a中
10j   #下移10行
"A5yy #再添加5行到a中
----------------------------------------
[I     : 顯示光標處的狹義字能夠匹配的行(高級指令)
# 譯註:# 能夠全文查找與光標處的狹義字相匹配的字,
# 這在查找函數原型和實現,或者變量使用的時候頗有用
----------------------------------------
# 常規縮進
:'a,'b>>
# 譯釋:把mark a到mark b之間的內容進行兩次縮進
# 在visual模式下縮進 (無限可重複)
:vnoremap  >gv
# 同裏,內縮
----------------------------------------
# 查找(譯註:建議先學習正則表達式)
# 譯註:查找命令不用進入:命令模式,直接按/就能夠了
# 若是沒有修飾,能夠不要右邊的/
# 和smth bbs差很少啦,呵呵
/joe/e                      : 光標停留在匹配單詞最後一個字母處
/joe/e+1                    : 光標停留在匹配單詞最後一個字母的下一個字母處
/joe/s                      : 光標停留在匹配單詞第一個字母處
/^joe.*fred.*bill/          : ft,標準正則表達式
/^[A-J]\+/                  : 找一個以A~J中一個字母重複兩次或以上開頭的行
/forum\(\_.\)*pent          : 多行匹配
/fred\_s*joe/i              : 中間能夠有任何空白,包括換行符\n
# 譯註:這個和perl不太同樣的哦
/fred\|joe                  : 匹配FRED或JOE
/\/i                 : 匹配fred,fred必須是一個獨立的單詞,而不是子串
# 譯註:這和perl也不太同樣,perl是用\b作單詞定界符的
/\               : 匹配4個數字
\                  : 也是匹配4個數字
# 在visual模式下查找
:vmap g/ y/"       : 匹配選中的高亮文字
# 譯釋:vmap是在visual模式下的鍵盤映射
# 映射了g/這個命令組合
# y 把選中的高亮文字寫入匿名register "
# / 打開搜索模式
#  準備粘貼register
# " 粘貼了""中的內容
#  回車,執行
:vmap  g/    y/=escape(@", '\\/.*$^~[]') : with spec chars
# 譯釋:@#$&^*@#%&*#$@!
# 跨行匹配,\_ 表示容許匹配換行符,或者說,容許匹配新行
# 譯註:當心,和perl不同
/                   : 匹配多行註釋
/fred\_s*joe/i                    : 彷佛上面有了,ft
/bugs\(\_.\)*bunny                : 中間能夠有無數東西
:h \_                             : 看看關於 \_ 的幫助
# 查找當前光標位置所在子例程/函數(subroutine/function)的聲明
:nmap gx yiw/^\(sub\function\)\s\+"
# 譯釋:nmap 作一個normal模式下的鍵盤綁定
# y 進入複製狀態,後面須要一個motion
# 接着就用 iw 指出了這個motion,是inner word
# inner word也是狹義字,可是和 w 不一樣
# w 是從光標位置開始向後看
# 而inner word老是把光標移到第一個字母,從而總能獲得一個完整的狹義字
# 試一試 gUw 和 gUiw 就知道區別了,呵呵。
# 在多個文檔中搜索
:bufdo /searchstr
:argdo /searchstr
----------------------------------------
# 替換
# 譯註:替換命令須要先進入:命令模式
:%s/fred/joe/igc            : 一個常見的替換命令,修飾符igc和perl中同樣意思
:%s/\r//g                   : 刪除DOS方式的回車^M
:%s=  *$==                  : 刪除行尾空白
:'a,'bg/fred/s/dick/joe/igc : 很是有用!(ft,又來了!)
# 譯釋:'a,'b指定一個範圍:mark a ~ mark b
# g//用一個正則表達式指出了進行操做的行必須能夠被fred匹配
# 看後面,g//是一個全局顯示命令
# s/dick/joe/igc則對於這些知足條件的行進行替換
# 列複製
# 譯註:@#%&^#*^%#$!
:%s= [^ ]\+$=&&=            : 複製最後一列
:%s= \f\+$=&&=              : 同樣的功能
:%s= \S\+$=&&               : ft,仍是同樣 # 反向引用,或稱記憶
:s/\(.*\):\(.*\)/\2 :  \1/  : 顛倒用:分割的兩個字段
:%s/^\(.*\)\n\1/\1$/        : 刪除重複行 # 非貪婪匹配,\{-}
:%s/^.\{-}pdf/new.pdf/      : 只是刪除第一個pdf # 跨越可能的多行
:%s///        : 又是刪除多行註釋(咦?爲何要說「又」呢?)
:help /\{-}                 : 看看關於 非貪婪數量符 的幫助
:s/fred/a/g            : 替換fred成register a中的內容,呵呵 # 寫在一行裏的複雜命令
:%s/\f\+\.gif\>/\r&\r/g | v/\.gif$/d | %s/gif/jpg/
# 譯註:就是用 | 管道啦
# 或者
:%s/suck\|buck/loopy/gc     : 或者(或者須要\,ft!,|不是或者)
# ft, \不就是轉義了麼!這個和perl真是不一樣了!
# 調用VIM函數
:s/__date__/\=strftime("%c")/ : 插入時間串
# 處理列,替換全部在第三列中的str1
:%s:\(\(\w\+\s\+\)\{2}\)str1:\1str2:
# 交換第一列和最後一列 (共4列)
:%s:\(\w\+\)\(.*\s\+\)\(\w\+\)$:\3\2\1:
# filter all form elements into paste register
# 把全部的form元素(就是html裏面的form啦)放到register裏?
# ft, 頭疼,不解釋了
:redir @*|sil exec 'g##p'|redir END
:nmap ,z :redir @*sil exec
[email=%27g@%3C%5C%28input%5C%3CBar%3Eselect%5C%3CBar%3Etextarea%5C%3CBar%3E/%5C=fo]'g@select\textarea\/\=fo[/email]
# 上面這一行不能徹底顯示,最好Copy Article下去看
----------------------------------------
# 全局(global)顯示命令,就是用 :g+正則表達式
# 譯釋: :g/{pattern}/{cmd} 就是全局找到匹配的行
# 而後對這些行執行命令{cmd}
:g/\/                : 顯示全部可以爲單詞fred所匹配的行
:g//z#.5           : 顯示內容,還有行號,呵呵
:g//z#.5|echo "=========="  : 漂亮的顯示,ft!
# 全局命令 (其餘)
:g/^\s*$/d                  : 刪除全部空行
:g!/^dd/d                   : 刪除不含字串'dd'的行
:v/^dd/d                    : 同上 # 譯釋:v == g!,就是不匹配!
:g/fred/,/joe/d             : not line based (very powerfull)
:v/./.,/./-1join            : 壓縮空行
:g/^$/,/./-j                : 壓縮空行
:g/" : 增長在BOL(beginning of line)處的數字
# 譯註:.,$ 指明命令從當前行執行到最後一行
# 若是沒有 .,$ 限定範圍,那麼g//就會對整個文件進行操做
# exe 是執行後面的命令組合
:.,$g/^\d/exe "norm \"  : Win32下必須重定義Ctrl-A
# 保存全局命令的結果 (注意必須使用添加模式)
:g/fred/y A                 : 添加全部爲fred所匹配的行到register a
:'a,'b g/^Error/ . w >> errors.txt
# 複製每一行,而後在複製出來的每一行兩側加上一個 print '複製出來的內容'
:g/./yank|put|-1s/'/"/g|s/.*/Print '&'/
----------------------------------------
# 全局命令和替換命令聯姻 (強大的編輯能力)
:'a,'bg/fred/s/joe/susan/gic : 可使用反向引用來匹配
:g/fred/,/joe/s/fred/joe/gic :  non-line based (ultra)
----------------------------------------
# 先找fred,而後找joe,而後
[email=#$%5E$%%5E#$%%5E@%%5E%&%]#$^$%^#$%^@%^%&%[/email]
^*!
:/fred/;/joe/-2,/sid/+3s/sally/alley/gIC
----------------------------------------
# 重定向到register * 和 粘貼register *
:redir @*                    : 重定向命令的輸出結果(最下方命令行上的結果)                          : 到register * (ft,* 表明0~1,a~z,..)
:redir END                   : 結束重定向
# 處理粘貼
"*yy                         : 上面講過了,就是複製到register *中
"*p                          : 而後貼出來
----------------------------------------
:redir >> out.txt            : 重定向到一個文件
----------------------------------------
# 從新格式化文本
gq
gqap  (a是motion p是段落(visual模式))
ggVGgq  從新格式化整個文章
----------------------------------------
# 對多個文檔實施命令
:argdo %s/foo/bar/           : 對全部:args列表中的文檔執行命令
:bufdo %s/foo/bar/
:windo %s/foo/bar/
:argdo exe '%!sort'|w!       : 使用外部命令
----------------------------------------
# 命令行的一些好玩的東東
gvim -h                    : 啓動的時候啓動幫助(Win32)
vi -h 或 vim -h            : 這個是unix下用
ls | gvim -                : 編輯一個數據流!
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
# 自動編輯文件 (編輯命令序列Ex commands已經包含在convert.vim中了)
vim -s "convert.vim" file.c
# 不要加載.vimrc和任何plugins (啓動一個乾淨的VIM)
gvim -u NONE -U NONE -N
----------------------------------------
# GVIM 不一樣的地方
gvim -d file1 file2        : vimdiff (比較不一樣)
dp                         : 把光標處的不一樣放到另外一個文件
do                         : 在光標處從另外一個文件取得不一樣
----------------------------------------
# Vim陷阱
# 在vim的正則表達式中, + 和 | 都必須加轉義符 \
# 當心,這和perl不同!
/fred\+/      : 匹配fred或freddy可是不匹配free
----------------------------------------
# \v ,或叫作very magic (一般都是這麼叫)能夠取消轉義符
/codes\(\n\|\s\)*where  : 普通的正則表達式
/\vcodes(\n|\s)*where   : very magic,| 不用加 \ 了!
----------------------------------------
# 把東西送到命令行/搜索行 (SUPER:偶再也不翻譯這種嘆詞了)
              : 送一個狹義詞
              : 送一個廣義詞
-                  : 送一個小型刪除寄存器register
[0-9a-z]           : 送一個命名寄存器register
%                  : 送文件名過去 (#也行)
----------------------------------------
# 操做寄存器
:let @a=@_              : 清除register a
:let @*=@a              : 寄存器賦值
:map    "qyy:let @q=@q."zzz"
# 譯註:猜猜這個無聊的綁定是什麼意思?
----------------------------------------
# 關於幫助的幫助
:h quickref             : 翻到VIM Quick Reference頁(有用!)
:h tips                 : Vim本身的tips
:h visual     : 獲得一個關於visual關鍵字的幫助列表                     : 而後用tab鍵去選擇
:h ctrl            : 顯示全部關於Ctrl的幫助
:h :r                   : :ex冒號命令
:h CTRL-R               : 普通模式命令
:h \r                   : \r在正則表達式中是什麼意思呢?
:h i_CTRL-R             : insert模式下的Ctrl-R
:h c_CTRL-R             : 命令行(command-line)模式下的Ctrl-R
:h v_CTRL-V             : visual模式下的Ctrl-V
:h tutor                : VIM 指南
gvim -h                 : 關於 VIM 命令的幫助
vi/vim -h
T                  : Control Shift T go backwards in help
                        : 偶不清楚有什麼用:(
----------------------------------------
# 選項設置在哪裏?
:scriptnames            : 列出全部加載的 plugins, _vimrcs
:verbose set history    : 顯示history的值並指出設置文件的位置
----------------------------------------
# 製做你本身的VIM幫助
:helptags /vim/vim61/doc  : 重建 /doc 中全部的 *.txt 幫助文件
:help add-local-help
----------------------------------------
# 用外部程序來運行程序 (例如 perl :)
map      :w:!perl -c %
# 譯釋::w寫文件
# :!perl -c %用perl來運行當前文件
# 當前文件必須有文件名!
----------------------------------------
# 插入DOS換行符
:%s/nubian/&/g          :  Ctrl-V是一種轉義,它說要解釋
:%s/nubian/&/g          :  對於Win32應該這樣
:%s/nubian/^M&/g                  :  你看到的^M是一個字符
:%s/nubian/\r&/g                  :  更好的形式
----------------------------------------
# 把最後一個命令貼到當前位置
i:
# 把最後一個搜索指令貼到當前位置
i/
# 譯釋:i是進入insert模式,
# Ctrl-r是開啓插入模式下register的引用
# :和/分別引用了兩個register的內容
----------------------------------------
# 更多的完成功能
                        :插入當前目錄下的一個文件名到當前位置
# 在insert模式下使用
# 而後用 Ctrl-P/Ctrl-N 翻頁
----------------------------------------
# 替換一個visual區域
# 選擇一個區域,而後輸入 :s/Emacs/Vim/ 等等,vim會自動進入:模式
:'s/Emacs/Vim/g               : 前面的'是vim自動添加的
----------------------------------------
# 在文件中插入行號(不是顯示行號,是插入!)
:g/^/exec "s/^/".strpart(line(".")."    ", 0, 4)
----------------------------------------
# 用VIM的方式來編號行
:set number                       :顯示行號
:set nonu                         :取消顯示
:%s/^/\=strpart(line('.')."        ",0,&ts)
#從任意行開始編號(須要perl,嘿嘿)
:'a,'b!perl -pne 'BEGIN{$a=223} substr($_,2,0)=$a++'
#彷佛有點小問題,你試試看:)
qqmnYP`n^Aq                       : 記錄到q 而後用 @q 重複
#彷佛不能工做,你試試看:)
# 遞增已存在數字到文件末
:.,$g/^\d/exe "normal! \"
# 高級遞增,看:
http://vim.sourceforge.net/tip_view.php?tip_id=150
----------------------------------------
# 高級遞增 ("真的頗有用",ft)
" 把下面幾句放到 _vimrc #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是清楚命令行縮寫啊?怎麼回事?
cab viminc :let I=223 \| 'a,'bs/$/\=INC(5)/
----------------------------------------
# 加密(當心使用,不要忘了密碼)
:X                                : 而後vim會提示你輸入密碼
:h :X
----------------------------------------
# modeline (make a file readonly etc) must be in first/last 5 lines
# 不會用,不翻了
// vim:noai:ts=2:sw=4:readonly:
:h modeline
----------------------------------------
# Creating your own GUI Toolbar entry
# 對於text模式下的vim沒用,不翻了
amenu  Modeline.Insert\ a\ VIM\ modeline ggOvim:ff=unix ts=4 ss=4v
----------------------------------------
# 一個保存當前光標下的狹義字到一個文件的函數
function! SaveWord()  "這裏用!是強制覆蓋之前的定義
   normal yiw
   exe ':!echo
[email=%27.@0.%27]'.@0.'[/email]
>> 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                            : 幫助
ie'                          : 輸入 é
i233                         : 輸入 é (Unix)
i233                         : 輸入 é (Win32)
ga                                : 查看字符的hex值
----------------------------------------
# 文件名自動完成 (例如 main_c.c)
:e main_                     : tab 鍵完成
gf                                : 打開光標處廣義字命名的文件 (normal模式)
main_                   : 文件名自動完成(insert模式)
----------------------------------------
# Vim複雜使用
# 交換兩個單詞
:%s/\/\=strpart("offon", 3 * ("off" == submatch(0)), 3)/g
----------------------------------------
# 把text文件轉換成html文件(oh,ft)
:runtime! syntax/2html.vim        : 轉換 txt 成 html
:h 2html                          : 看看幫助
----------------------------------------
# VIM 有一個內部自帶的 grep 命令
:grep some_keyword *.c            : 獲得一個包含some_keyword的c文件名列表
:cn                               : 去下一個出現的位置
----------------------------------------
# 強制無後綴文件的語法着色方式 .pl
:set syntax=perl # 取消語法着色
:set syntax off # 改變色彩主題 (在~vim/vim??/colors中的任何文件)
:colorscheme blue ----------------------------------------
:set noma (non modifiable)        : 防止修改
:set ro (Read Only)               : 只讀保護
----------------------------------------
# Sessions (打開一系列文件)
gvim file1.c file2.c lib/lib.h lib/lib2.h :在"session"中加載一系列文件
:mksession                        : 生成一個Session文件 (默認是Session.vim)
:q
gvim -S Session.vim               : 從新讀取一個session,也就讀取了全部文件,ft
----------------------------------------
# 標記(tags) (跳轉到subroutines/functions)
taglist.vim                       : 最流行的插件
:Tlist                            : 顯示Tags (functions的列表)
                             : 跳轉到光標處的function
                                  : 這個鍵 Ctrl-] 和vim幫助中是同樣的
----------------------------------------
# Just Another Vim Hacker JAVH
# Juat Another Perl Hacker JAPH,嘿嘿
vim -c ":%s/^/WhfgTNabgureRIvzSUnpxre/|:%s/[R-T]/ /Ig|:normal ggVGg?"
# 譯釋:呵呵,誰來解釋一下吧!
# 其實不過是在啓動vim的時候執行了一個命令
# 先寫入了 Just Another Vim Hacker 的rot13編碼
# 而後再解碼
----------------------------------------
終於翻完了,呵呵。好累啊!
__END__
--
hmisty, hey misty!
H misty
Haow Much I'm Special To You
vi 剪貼操做補充(一)
強烈建議你們先看看 doc/change.txt 裏關於寄存器部分的內容,
只是簡單說起一下,英文不太好的朋友請找 vim 的中文文檔。
我要介紹的超強武器是 ctrl-r,在 insert mode
和 command mode 都可使用,功能就是插入寄存器相關內容。
你們能夠試試先 copy 或 delete 一些文本,而後在
normal mode 或 command mode 輸入 ctrl-r ",看到了嗎,
你粘貼了寄存器"的內容。
寄存器的主要有如下幾種:
a. The unnamed register ""
"d", "c", "s", "x" 和 "y" 等涉及刪除或拷貝的命令
都會將內容存放於此(有例外)。
b. 10 numbered registers "0 to "9
0 爲最近拷貝的內容,1-9 爲最近刪除的內容。
指定 named register 時不會存放於此。
c. The small delete register "-
刪除很少於一行的內容會存在於此。
d. 26 named registers "a to "z or "A to "Z
小寫與大寫的區別是,小寫是覆蓋方式,大寫是添加方式。
e. four read-only registers ":, "., "% and "#
". 存放上次插入的文本
有什麼用?呵,例如,你輸入了一段文本,在另外一個地方也
要有相同的內容,你輸完後,通常要選擇並複製一下吧?
而用這個,直接移到須要插入的地方,i. 便可。
"% 是當前編輯文件全名
呵,vim 中,% 就是表明當前編輯文件名的變量,好記吧?
不過,通常直接用 % 就行,例如":!cat %",vim 會自動
擴展。
"# 是alternate file 名稱 (這個我不知道)
": 上次執行的命令
記起來比較容易,冒號就是命令行提示符嘛。這個有些什麼用呢?
在測試配置文件時十分有用,先在命令行輸入命令,調試好後,
在 insert mode 裏按Ctrl-R : 就可將該命令插到文件中。
f. the expression register "=
呵,表達式寄存器,能夠輸入一個表達式,並插入結果。
g. The selection and drop registers "*, "+ and "~
跟 gui 即 X/Windows 剪貼板有關的變量。
在 X 中,鼠標中鍵與系統剪貼板不同,至於區別,你們本身
試驗一下,這裏給個提示,在命令行下輸入 reg 能夠列出全部
寄存器的內容。
h. The black hole register "_
黑洞
i. Last search pattern register "/
上次搜索的內容。例如,我要搜索一個單詞 linuxforum,但我
比較懶,先輸入 /linux,發現出現不少個 linux,屢次按 n 無果,
難道要從新輸入 /linuxforum ? 不用,只須要 //forum 便可。
呵,聰明的你必定想到了,用命令行歷史也能夠調來,按 ctrl-p 或 ctrl-n
便可上下翻閱。這樣也能夠嘛,也比較快捷,但要查找 forumlinux 呢?
用 ctrl-r 的話只需 /forum/ 。
vim 使用技巧
做者: camry.wu
我是 vim 粉絲, 用了許久, 有一些本身的感覺, 又處處挖到一些別人的技巧. 感受對 vim
粉絲比較有用, 就把它記在這兒. 但願藉此文套出你們本身的巧活, 就正應了拋磚引玉的古
話了.
先稍爲介紹一下 vim. vi 是 unix/linux 下極爲廣泛的一種文本編輯器, 大部分機器上都
有. vi 有各類變種, 在不一樣的機器上經常使用不一樣的變種軟件. 其中 vim 比較好用也用得比較
普遍. vim 是 Vi IMproved 的縮寫, 表示更好的 vi. 我我的以爲它是很是好的編輯器(爲
了避免 Emacs 粉絲挑眼, 就不說最好了). 沒用過的也建議試試看, 固然 vim 對編寫文本
文件很方便好用, 好比編寫程序, html文檔等等, 卻不能用來編寫 word 文檔.
關於 vim 的安裝, 基本使用方法等網絡上能搜出許多, 就不在這裏羅嗦了, 要是對 vim 有
興趣, 那就看看這裏(中文文檔):
http://vcd.cosoft.org.cn/pwiki/index.php
本文就說些其中比較有用, 比較經常使用的命令, 若能熟練運用這些命令, 那麼會發現編輯文件
很舒服.
說明:
如下的例子中 xxx 表示在命令模式下輸入 xxx 並回車
如下的例子中 :xxx 表示在擴展模式下輸入 xxx 並回車
小括號中的命令表示相關命令.
在編輯模式或可視模式下輸入的命令會另外註明.
1. 查找
  /xxx(?xxx)      表示在整篇文檔中搜索匹配xxx的字符串, / 表示向下查找, ? 表示
                  向上查找.其中xxx能夠是正規表達式,關於正規式就很少說了.
                  通常來講是區分大小寫的, 要想不區分大小寫, 那得先輸入
                  :set ignorecase
                  查找到之後, 再輸入 n 查找下一個匹配處, 輸入 N 反方向查找.
  *(#)            當光標停留在某個單詞上時, 輸入這條命令表示查找與該單詞匹配的
                  下(上)一個單詞. 一樣, 再輸入 n 查找下一個匹配處, 輸入 N 反方
                  向查找.
  g*(g#)          此命令與上條命令類似, 只不過它不徹底匹配光標所在處的單詞, 而
                  是匹配包含該單詞的全部字符串.
  gd              本命令查找與光標所在單詞相匹配的單詞, 並將光標停留在文檔的非
                  註釋段中第一次出現這個單詞的地方.
  %               本命令查找與光標所在處相匹配的反括號, 包括 () [] {}
  f(F)x           本命令表示在光標所在行進行查找, 查找光標右(左)方第一個x字符.
                  找到後:
                  輸入 ; 表示繼續往下找
                  輸入 , 表示反方向查找
2. 快速移動光標
   在 vi 中, 移動光標和編輯是兩件事, 正由於區分開來, 因此能夠很方便的進行光標定
位和編輯. 所以能更快一點移動光標是頗有用的.
  w(e)            移動光標到下一個單詞.
  b               移動光標到上一個單詞.
  0               移動光標到本行最開頭.
  ^               移動光標到本行最開頭的字符處.
  $               移動光標到本行結尾處.
  H               移動光標到屏幕的首行.
  M               移動光標到屏幕的中間一行.
  L               移動光標到屏幕的尾行.
  gg              移動光標到文檔首行.
  G               移動光標到文檔尾行.
  c-f             (即 ctrl 鍵與 f 鍵一同按下) 本命令即 page down.
  c-b             (即 ctrl 鍵與 b 鍵一同按下, 後同) 本命令即 page up.
  ''              此命令至關有用, 它移動光標到上一個標記處, 好比用 gd, * 等查
                  找到某個單詞後, 再輸入此命令則回到上次停留的位置.
  '.              此命令至關好使, 它移動光標到上一次的修改行.
  `.              此命令至關強大, 它移動光標到上一次的修改點.
3. 拷貝, 刪除與粘貼
   在 vi 中 y 表示拷貝, d 表示刪除, p 表示粘貼. 其中拷貝與刪除是與光標移動命令
結合的, 看幾個例子就可以明白了.
  yw              表示拷貝從當前光標到光標所在單詞結尾的內容.
  dw              表示刪除從當前光標到光標所在單詞結尾的內容.
  y0              表示拷貝從當前光標到光標所在行首的內容.html

相關文章
相關標籤/搜索