VIM技巧

轉載自:http://www.2maomao.com/blog/wp-content/uploads/vim_tips.txt
參考:http://www.iplaysoft.com/vim.html

最佳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#           : 尋找光標處的狹義單詞(<cword>) (前向/後向)
%                   : 括號配對尋找 {}[]()
matchit.vim         : 使得 % 能夠配對標記 <tr><td><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>      : 按下 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 \"zdi<b><C-R>z</b><ESC>  :在visual模式下選中的文字前後分別加上<b>和</b>
# 譯釋:vmap 是綁定一個在visual模式下的快捷鍵\r\n# 譯釋:原理:在visual模式下,# 譯釋:原理:在visual模式下,\"zd 把一個選中的區域命名爲z 然後刪除,
# i 進入插入模式,輸入<b>,<C-R>z 撤銷剛纔的刪除,然後再寫入</b>,
# 最後<ESC>返回normal模式\r\n# 譯釋:\"z 命令創建一個選中的區域爲register,並把它命名爲z\r\n# 譯釋:更令人開心的有:在visual模式下選中幾行,然後輸入 2> ,
#       則選中的行會全部縮進兩個tab
#       555,偶一開始還是用 :xx,xx s/^/\\t\\t/,好傻啊!\r\n:vmap st \"zdi<?= <C-R>z ?><ESC>  :在visual模式下選中的文字前後分別加上<?= 和 ?>
----------------------------------------
# 文件瀏覽
:Ex                             : 開啓目錄瀏覽器,注意首字母E是大寫的
:Sex                            : 在一個分割的窗口中開啓目錄瀏覽器
:ls                             : 顯示當前buffer的情況
:cd ..                          : 進入父目錄
:args                           : 顯示目前打開的文件
:lcd %:p:h                      : 更改到當前文件所在的目錄
# 譯釋:lcd是緊緊改變當前窗口的工作路徑,% 是代表當前文件的文件名,
# 加上 :p擴展成全名(就是帶了路徑),加上 :h析取出路徑\r\n: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/~是三種轉換形式(小寫/大寫/翻轉),
# 最後一個重複則表示該轉換是對於一行而言的\r\nguw                             : 字大寫(狹義字) 譯註:建議對比iw
gUw                             : 字小寫(狹義字)
g~w                             : 字翻轉(狹義字)
# 譯釋:最後一個w 表示該轉換是對於一個字而言的,由於是在normal模式下,
# 所以這個w 表示一個狹義字<cword>\r\nvEU                             : 字大寫(廣義字)
vE~                             : 字翻轉(廣義字)
# 譯釋:vE 這個指令組合會進入visual模式,然後選擇一個廣義字<CWORD>\r\nggguG                           : 把整個文章全部小寫(ft!bt!)
gf                              : 取當前光標處的廣義字作爲文件名,然後試圖打開它!
# 譯釋:爲什麼是廣義字呢?因爲這樣可以方便的取到路徑啊,像/var/www/html/index.htm\r\nga                              : 顯示光標處字符的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 是自逆算法,所以,解碼和編碼是同一個過程。\r\n<C-A>,<C-X>                     : 增加,減少 光標處的狹義字所表示的數字
                                :(,僅僅是分割了這兩個命令,不是命令的一部分)
                                : Win32的用戶可能需要重新定義一下Ctrl-A,呵呵
# 譯註:good guy, 令人不得不想到perl的數字串\r\n<C-R>=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,怎麼又是這個評價)
`.               : 不僅跳到最後修改的那一行,還要定位到修改點
<C-O>            : 依次沿着你的跳轉記錄向回跳 (從最近的一次開始)
<C-I>            : 依次沿着你的跳轉記錄向前跳
:ju(mps)         : 列出你跳轉的足跡
:help jump-motions
:history         : 列出歷史命令記錄
:his c           : 命令行命令歷史
:his s           : 搜索命令歷史
q/               : 搜索命令歷史的窗口
q:               : 命令行命令歷史的窗口
:<C-F>           : 歷史命令記錄的窗口
----------------------------------------
# 縮寫和鍵盤映射(原文中文件舉例都用了c:/aaa/x,偶全給他改成/path/file了,哼唧)
:map   <f7>   :\'a,\'bw! /path/file
# 譯釋:map是映射一個normal模式下的鍵
# 這裏是把F7鍵映射成把標記a到標記b中間的內容另存爲一個文件/path/file
# 標記(mark)的方法:把光標移動到需要標記的地方,輸入m,然後輸入標記名,例如a\r\n# 引用標記的方法:\'a ,即:單引號加標記名\r\n:map   <f8>   :r /path/file # 譯釋:把F8鍵映射成在當前位置插入文件/path/file的內容
:map   <f11>  :.w! /path/file2<CR>
# 譯釋:.(點號)表示當前行
# 所以F11就是把當前行存爲/path/file2
# 最後的<CR>表示一個回車
:map   <f12>  :r /path/file2<CR>
:ab php          : 列出php表示的縮寫
# 譯釋:定義一個縮寫使用::iab hm hmisty
# 一個有趣的現象是,它列出的會是php和它的前子串開頭的縮寫
# 例如,有這麼幾個縮寫:
# h => hmisty1 , hm => hmisty2 , hmi => hmisty3, m => hmisty4
# 那麼使用 :ab hm會顯示這麼幾個縮寫:hm 和 h
# 而不是你想象中的 hm 和 hmi\r\n:map ,           : 列出以逗號開始的鍵盤映射
# 譯釋:一般而言,我們稱這些逗號開始的組合鍵爲“逗號命令”
# 不過hmisty更喜歡用;構成“分號命令”
# 而且不是用map,而是用imap
# 因爲偶懶麼,懶得按<Esc>,所以直接在insert模式下就執行命令了
# 爲什麼用分號呢?因爲我最常用它寫程序啊
# perl/C/C++/object pascal/java,都是用分號結束一個語句
# 我們一般很少在分號後面連續寫其他字符
# 所以用“分號+其他鍵”就很少會在輸入的時候造成衝突\r\n# 在鍵盤映射中常用的表示
<CR>             : 回車
<ESC>            : Esc
<LEADER>         : 轉義符號 \\
<BAR>            : 管道符號 |
----------------------------------------
# 列出寄存器(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
\"ayy@a           : 把當前行作爲一個Vim命令來執行
# 譯釋:\"ayy 是定義當前行到register a,然後@a是執行register a中存儲的指令
# yy: 複製一行
# 10yy: 複製從此向下的10行\r\nyy@\"             : 用上面所提到的那個匿名register
----------------------------------------
# 從其他程序獲取輸出 (需要外部程序)
:r!ls.exe        : 讀取ls的輸出到當前位置
!!date           : 讀取date的輸出 (但是會替換當前行的內容)
# 譯釋:其實你輸入了!!後,vim就自動轉換到 :.! 等待你繼續輸入\r\n# 使用外部程序sort進行排序(sort是Unix標準命令,ls,date也是)
:%!sort -u       : 使用sort程序排序整個文件(用結果重寫文件)
# 譯釋:%表示整個文件的所有行
# !sort表示執行外部命令sort
# -u是sort的參數,man sort看看,這個參數的意義是合併相同的行
# u就是unique,如果兩行內容相同,則結果中只保留一行的說\r\n:\'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! %<.bak     : 換一個後綴保存
:e!              : 返回到修改之前的文件(修改之後沒有存盤)
:w /path/%       : 把文件存到一個地兒
:e #             : 編輯標記爲#的buffer(這個buffer必須含有一個可編輯的文件)
                 : 用ls命令就能看到哪一個buffer有#
                 : %a表示當前正在編輯的buffer
                 : u 表示不能編輯或者已經被做掉的buffer
:e #3            : 編輯編號爲3的buffer(這個buffer必須含有一個可編輯的文件)
:rew             : 回到第一個可編輯的文件
:brew            : 回到第一個buffer
:sp fred.txt     : 在一個水平分割的窗口中打開文件fred.txt # 譯註:vs fred.txt可以實現垂直分割
:sball           : 把當前所有含有可編輯文件的buffer顯示到一個分割窗口中              : (偶該考慮把super翻譯成 高級指令 了,ft)
:map   <F5> :ls<CR>:e # : 在normal模式下按F5鍵,則會顯示所有含有一個\r\n                 : 可編輯文件的buffer,然後提示你輸入buffer的序號,
                 : 輸入後回車,則編輯這個buffer
# 譯註:這是一個鍵盤綁定\r\n:set hidden      : 允許不保存buffer而切換buffer (w/o=without)
----------------------------------------
# 在分割窗口中快速切換
:map <C-J> <C-W>j<C-W>_
# 譯註:原文此處有誤,前面應該加上冒號
# 這是一個鍵盤綁定,把Ctrl-J定義成切換到下一個窗口並最大化
:map <C-K> <C-W>k<C-W>_
----------------------------------------
# 命令錄製 (最佳技巧,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<CR>:silent !start c:\\progra~1\\intern~1\\iexplore.exe file://%:p
# 譯釋:nmap是做一個normal模式下的鍵盤綁定
# 這裏綁定了一個逗號命令 ,f
# :update是寫這個文件,與:w不同,它只有當文件被修改了的時候才寫
# :silent別讓彈出窗口報告執行結果
# !...後面就是執行windows命令了。呵呵,去問bill gates什麼意思吧。
# 不過偶用gvim 6.1試過了,好用!\r\n: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
# 譯註:原文丟失了開頭的冒號
# cmap是命令(command)模式綁定\r\ngvim 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之間的內容進行兩次縮進\r\n# 在visual模式下縮進 (無限可重複)
:vnoremap < <gv
# 譯釋::vnoremap 重定義了visual模式下 < 符號的含義
# 把它定義成 <gv
# 即:先<向外縮進,然後gv重新選擇上一次選擇了的區域
# 這樣在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
/\\<fred\\>/i                 : 匹配fred,fred必須是一個獨立的單詞,而不是子串
# 譯註:這和perl也不太一樣,perl是用\\b做單詞定界符的
/\\<\\d\\d\\d\\d\\>               : 匹配4個數字
\\<\\d\\{4}\\>                  : 也是匹配4個數字
# 在visual模式下查找
:vmap g/ y/<C-R>\"<CR>       : 匹配選中的高亮文字
# 譯釋:vmap是在visual模式下的鍵盤映射
# 映射了g/這個命令組合
# y 把選中的高亮文字寫入匿名register \"
# / 打開搜索模式
# <C-R> 準備粘貼register
# \" 粘貼了\"\"中的內容
# <CR> 回車,執行\r\n:vmap <silent> g/    y/<C-R>=escape(@\", \'\\\\/.*$^~[]\')<CR><CR> : with spec chars
# 譯釋:@#$&^*@#%&*#$@!\r\n# 跨行匹配,\\_ 表示允許匹配換行符,或者說,允許匹配新行
# 譯註:小心,和perl不一樣
/<!--\\_p\\{-}-->                   : 匹配多行註釋
/fred\\_s*joe/i                    : 似乎上面有了,ft
/bugs\\(\\_.\\)*bunny                : 中間可以有無數東西
:h \\_                             : 看看關於 \\_ 的幫助\r\n# 查找當前光標位置所在子例程/函數(subroutine/function)的聲明
:nmap gx yiw/^\\(sub\\<bar>function\\)\\s\\+<C-R>\"<CR>
# 譯釋:nmap 做一個normal模式下的鍵盤綁定
# y 進入複製狀態,後面需要一個motion
# 接着就用 iw 指出了這個motion,是inner word
# inner word也是狹義字<cword>,但是和 w 不同
# w 是從光標位置開始向後看
# 而inner word總是把光標移到第一個字母,從而總能得到一個完整的狹義字
# 試一試 gUw 和 gUiw 就知道區別了,呵呵。\r\n# 在多個文檔中搜索
:bufdo /searchstr
:argdo /searchstr
----------------------------------------
# 替換
# 譯註:替換命令需要先進入:命令模式\r\n:%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則對於這些滿足條件的行進行替換\r\n# 列複製
# 譯註:@#%&^#*^%#$!
:%s= [^ ]\\+$=&&=            : 複製最後一列
:%s= \\f\\+$=&&=              : 一樣的功能
:%s= \\S\\+$=&&               : ft,還是一樣 # 反向引用,或稱記憶
:s/\\(.*\\):\\(.*\\)/\\2 :  \\1/  : 顛倒用:分割的兩個字段
:%s/^\\(.*\\)\\n\\1/\\1$/        : 刪除重複行 # 非貪婪匹配,\\{-}
:%s/^.\\{-}pdf/new.pdf/      : 只是刪除第一個pdf # 跨越可能的多行
:%s/<!--\\_.\\{-}-->//        : 又是刪除多行註釋(咦?爲什麼要說“又”呢?)
:help /\\{-}                 : 看看關於 非貪婪數量符 的幫助
:s/fred/<c-r>a/g            : 替換fred成register a中的內容,呵呵 # 寫在一行裏的複雜命令
:%s/\\f\\+\\.gif\\>/\\r&\\r/g | v/\\.gif$/d | %s/gif/jpg/
# 譯註:就是用 | 管道啦\r\n# 或者
:%s/suck\\|buck/loopy/gc     : 或者(或者需要\\,ft!,|不是或者)
# ft, \\不就是轉義了麼!這個和perl真是不同了!\r\n# 調用VIM函數
:s/__date__/\\=strftime(\"%c\")/ : 插入時間串\r\n# 處理列,替換所有在第三列中的str1
:%s:\\(\\(\\w\\+\\s\\+\\)\\{2}\\)str1:\\1str2:\r\n# 交換第一列和最後一列 (共4列)
:%s:\\(\\w\\+\\)\\(.*\\s\\+\\)\\(\\w\\+\\)$:\\3\\2\\1:\r\n# filter all form elements into paste register
# 把所有的form元素(就是html裏面的form啦)放到register裏?
# ft, 頭疼,不解釋了
:redir @*|sil exec \'g#<\\(input\\|select\\|textarea\\|/\\=form\\)\\>#p\'|redir END
:nmap ,z :redir @*<Bar>sil exec select\\textarea\\/\\=fo\">\'g@<\\(input\\<Bar>select\\<Bar>textarea\\<Bar>/\\=fo
# 上面這一行不能完全顯示,最好Copy Article下去看\r\n----------------------------------------
# 全局(global)顯示命令,就是用 :g+正則表達式
# 譯釋: :g/{pattern}/{cmd} 就是全局找到匹配的行
# 然後對這些行執行命令{cmd}
:g/\\<fred\\>/                : 顯示所有能夠爲單詞fred所匹配的行
:g/<pattern>/z#.5           : 顯示內容,還有行號,呵呵
:g/<pattern>/z#.5|echo \"==========\"  : 漂亮的顯示,ft!\r\n# 全局命令 (其他)
: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/<input\\|<form/p          : 或者 要用\\|
:g/^/pu _                   : 把文中空行擴增一倍 (pu = put)                         : 即:原來兩行間有一個空行,現在變成2個
:g/^/m0                     : 按行翻轉文章 (m = move)
:g/fred/t$                  : 拷貝行,從fred到文件末尾(EOF)
:%norm jdd                  : 隔行刪除
# 譯釋:% 指明是對所有行進行操作
# norm指出後面是normal模式的指令
# j是下移一行,dd是刪除行\r\n# incrementing numbers
:.,$g/^\\d/exe \"norm! \\<c-a>\" : 增加在BOL(beginning of line)處的數字
# 譯註:.,$ 指明命令從當前行執行到最後一行
# 如果沒有 .,$ 限定範圍,那麼g//就會對整個文件進行操作
# exe 是執行後面的命令組合\r\n:.,$g/^\\d/exe \"norm \\<c-p>\"  : Win32下必須重定義Ctrl-A\r\n# 保存全局命令的結果 (注意必須使用添加模式)
:g/fred/y A                 : 添加所有爲fred所匹配的行到register a
:\'a,\'b g/^Error/ . w >> errors.txt\r\n# 複製每一行,然後在複製出來的每一行兩側加上一個 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,然後#$^$%^#$%^@%^%&%^*!
:/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<CR>
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        : 以分割窗口打開兩個文件\r\n# 指出打開之後執行的命令
gvim.exe -c \"/main\" joe.c  : 打開joe.c,然後跳轉到\'main\'\r\n# 對一個文件執行多個命令
vim -c \"%s/ABC/DEF/ge | update\" file1.c\r\n# 對一組文件執行多個命令
vim -c \"argdo %s/ABC/DEF/ge | update\" *.c\r\n# 自動編輯文件 (編輯命令序列Ex commands已經包含在convert.vim中了)
vim -s \"convert.vim\" file.c\r\n# 不要加載.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,| 不用加 \\ 了!\r\n----------------------------------------
# 把東西送到命令行/搜索行 (SUPER:偶不再翻譯這種嘆詞了)
<C-R><C-W>              : 送一個狹義詞
<C-R><C-A>              : 送一個廣義詞
<C-R>-                  : 送一個小型刪除寄存器register
<C-R>[0-9a-z]           : 送一個命名寄存器register
<C-R>%                  : 送文件名過去 (#也行)
----------------------------------------
# 操作寄存器
:let @a=@_              : 清除register a
:let @*=@a              : 寄存器賦值
:map   <f11> \"qyy:let @q=@q.\"zzz\"
# 譯註:猜猜這個無聊的綁定是什麼意思?
----------------------------------------
# 關於幫助的幫助
:h quickref             : 翻到VIM Quick Reference頁(有用!)
:h tips                 : Vim自己的tips
:h visual<C-D><tab>     : 得到一個關於visual關鍵字的幫助列表                     : 然後用tab鍵去選擇
:h ctrl<C-D>            : 顯示所有關於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
<C-S>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   <f2>   :w<CR>:!perl -c %<CR>
# 譯釋::w<CR>寫文件
# :!perl -c %<CR>用perl來運行當前文件
# 當前文件必須有文件名!
----------------------------------------
# 插入DOS換行符
:%s/nubian/<C-V><C-M>&/g          :  Ctrl-V是一種轉義,它說要解釋<C-M>
:%s/nubian/<C-Q><C-M>&/g          :  對於Win32應該這樣
:%s/nubian/^M&/g                  :  你看到的^M是一個字符
:%s/nubian/\\r&/g                  :  更好的形式
----------------------------------------
# 把最後一個命令貼到當前位置
i<c-r>:
# 把最後一個搜索指令貼到當前位置
i<c-r>/
# 譯釋:i是進入insert模式,
# Ctrl-r是開啓插入模式下register的引用
# :和/分別引用了兩個register的內容
----------------------------------------
# 更多的完成功能
<C-X><C-F>                        :插入當前目錄下的一個文件名到當前位置
# 在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)\r\n#從任意行開始編號(需要perl,嘿嘿)
:\'a,\'b!perl -pne \'BEGIN{$a=223} substr($_,2,0)=$a++\'
#似乎有點小問題,你試試看:)\r\nqqmnYP`n^Aq                       : 記錄到q 然後用 @q 重複
#似乎不能工作,你試試看:)\r\n# 遞增已存在數字到文件末
:.,$g/^\\d/exe \"normal! \\<c-a>\"\r\n# 高級遞增,看:
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)/
----------------------------------------
# 加密(小心使用,不要忘了密碼)\r\n: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 <Esc><Esc>ggOvim:ff=unix ts=4 ss=4<CR>v
----------------------------------------
# 一個保存當前光標下的狹義字到一個文件的函數
function! SaveWord()  \"這裏用!是強制覆蓋以前的定義
   normal yiw
   exe \':!echo \'.@0.\' >> word.txt\'
endfunction
map ,p :call SaveWord() #使用該函數的一個例子
----------------------------------------
# 刪除重複行的函數
function! Del()
 if getline(\".\") == getline(line(\".\") - 1)
   norm dd
 endif
endfunction\r\n: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值
----------------------------------------
# 文件名自動完成 (例如 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
----------------------------------------
# 把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的列表)
<C-]>                             : 跳轉到光標處的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__\r\n--
hmisty, hey misty!
H misty
Haow Much I\'m Special To You
vi 剪貼操作補充(一)\r\n強烈建議大家先看看 doc/change.txt 裏關於寄存器部分的內容,
 只是簡單提及一下,英文不太好的朋友請找 vim 的中文文檔。
我要介紹的超強武器是 ctrl-r,在 insert mode
和 command mode 均可使用,功能就是插入寄存器相關內容。
大家可以試試先 copy 或 delete 一些文本,然後在
normal mode 或 command mode 輸入 ctrl-r \",看到了嗎,
你粘貼了寄存器\"的內容。\r\n寄存器的主要有以下幾種:
a. The unnamed register \"\"
 \"d\", \"c\", \"s\", \"x\" 和 \"y\" 等涉及刪除或拷貝的命令
 都會將內容存放於此(有例外)。\r\nb. 10 numbered registers \"0 to \"9
 0 爲最近拷貝的內容,1-9 爲最近刪除的內容。
 指定 named register 時不會存放於此。\r\nc. The small delete register \"-
 刪除不多於一行的內容會存在於此。\r\nd. 26 named registers \"a to \"z or \"A to \"Z
 小寫與大寫的區別是,小寫是覆蓋方式,大寫是添加方式。\r\ne. four read-only registers \":, \"., \"% and \"#
 \". 存放上次插入的文本
 有什麼用?呵,例如,你輸入了一段文本,在另一個地方也
 要有相同的內容,你輸完後,一般要選擇並複製一下吧?
 而用這個,直接移到需要插入的地方,i<ctrl-r>. 即可。
 \"% 是當前編輯文件全名
 呵,vim 中,% 就是代表當前編輯文件名的變量,好記吧?
 不過,一般直接用 % 就行,例如\":!cat %\",vim 會自動
 擴展。
 \"# 是alternate file 名稱 (這個我不知道)
 \": 上次執行的命令
 記起來比較容易,冒號就是命令行提示符嘛。這個有些什麼用呢?
 在測試配置文件時十分有用,先在命令行輸入命令,調試好後,
 在 insert mode 裏按Ctrl-R : 就可將該命令插到文件中。\r\nf. the expression register \"=
 呵,表達式寄存器,可以輸入一個表達式,並插入結果。\r\ng. The selection and drop registers \"*, \"+ and \"~
 跟 gui 即 X/Windows 剪貼板有關的變量。
 在 X 中,鼠標中鍵與系統剪貼板不一樣,至於區別,大家自己
 試驗一下,這裏給個提示,在命令行下輸入 reg 可以列出所有
 寄存器的內容。
h. The black hole register \"_
 黑洞\r\ni. Last search pattern register \"/
 上次搜索的內容。例如,我要搜索一個單詞 linuxforum,但我
 比較懶,先輸入 /linux,發現出現很多個 linux,多次按 n 無果,
 難道要重新輸入 /linuxforum ? 不用,只需要 /<ctrl-r>/forum 即可。
 呵,聰明的你一定想到了,用命令行歷史也可以調來,按 ctrl-p 或 ctrl-n
 即可上下翻閱。這樣也可以嘛,也比較快捷,但要查找 forumlinux 呢?
 用 ctrl-r 的話只需 /forum<ctrl-r>/ 。\r\nvim 使用技巧
作者: camry.wu\r\n我是 vim 粉絲, 用了許久, 有一些自己的感受, 又到處挖到一些別人的技巧. 感覺對 vim
粉絲比較有用, 就把它記在這兒. 希望藉此文套出大家自己的巧活, 就正應了拋磚引玉的古
話了.\r\n先稍爲介紹一下 vim. vi 是 unix/linux 下極爲普遍的一種文本編輯器, 大部分機器上都
有. vi 有各種變種, 在不同的機器上常用不同的變種軟件. 其中 vim 比較好用也用得比較
廣泛. vim 是 Vi IMproved 的縮寫, 表示更好的 vi. 我個人覺得它是非常好的編輯器(爲
了避免 Emacs 粉絲挑眼, 就不說最好了). 沒用過的也建議試試看, 當然 vim 對編寫文本
文件很方便好用, 比如編寫程序, html文檔等等, 卻不能用來編寫 word 文檔.\r\n關於 vim 的安裝, 基本使用方法等網絡上能搜出許多, 就不在這裏羅嗦了, 要是對 vim 有
興趣, 那就看看這裏(中文文檔): http://vcd.cosoft.org.cn/pwiki/index.php\r\n本文就說些其中比較有用, 比較常用的命令, 若能熟練運用這些命令, 那麼會發現編輯文件
很舒服.\r\n說明:
以下的例子中 xxx 表示在命令模式下輸入 xxx 並回車
以下的例子中 :xxx 表示在擴展模式下輸入 xxx 並回車
小括號中的命令表示相關命令.
在編輯模式或可視模式下輸入的命令會另外註明.\r\n1. 查找\r\n  /xxx(?xxx)      表示在整篇文檔中搜索匹配xxx的字符串, / 表示向下查找, ? 表示向上查找.其中xxx可以是正規表達式,關於正規式就不多說了.
一般來說是區分大小寫的, 要想不區分大小寫, 那得先輸入
:set ignorecase
查找到以後, 再輸入 n 查找下一個匹配處, 輸入 N 反方向查找.\r\n  *(#)            當光標停留在某個單詞上時, 輸入這條命令表示查找與該單詞匹配的
下(上)一個單詞. 同樣, 再輸入 n 查找下一個匹配處, 輸入 N 反方
向查找.\r\n  g*(g#)          此命令與上條命令相似, 只不過它不完全匹配光標所在處的單詞, 而
是匹配包含該單詞的所有字符串.\r\n  gd              本命令查找與光標所在單詞相匹配的單詞, 並將光標停留在文檔的非
註釋段中第一次出現這個單詞的地方.\r\n  %               本命令查找與光標所在處相匹配的反括號, 包括 () [] {}\r\n  f(F)x           本命令表示在光標所在行進行查找, 查找光標右(左)方第一個x字符.
找到後:
輸入 ; 表示繼續往下找
輸入 , 表示反方向查找\r\n2. 快速移動光標
在 vi 中, 移動光標和編輯是兩件事, 正因爲區分開來, 所以可以很方便的進行光標定
位和編輯. 因此能更快一點移動光標是很有用的.\r\n  w(e)            移動光標到下一個單詞.
  b               移動光標到上一個單詞.\r\n  0               移動光標到本行最開頭.
  ^               移動光標到本行最開頭的字符處.
  $               移動光標到本行結尾處.\r\n  H               移動光標到屏幕的首行.
  M               移動光標到屏幕的中間一行.
  L               移動光標到屏幕的尾行.
  gg              移動光標到文檔首行.
  G               移動光標到文檔尾行.
  c-f             (即 ctrl 鍵與 f 鍵一同按下) 本命令即 page down.
  c-b             (即 ctrl 鍵與 b 鍵一同按下, 後同) 本命令即 page up.\r\n  \'\'              此命令相當有用, 它移動光標到上一個標記處, 比如用 gd, * 等查
  找到某個單詞後, 再輸入此命令則回到上次停留的位置.\r\n  \'.              此命令相當好使, 它移動光標到上一次的修改行.\r\n  `.        此命令相當強大, 它移動光標到上一次的修改點.\r\n3. 拷貝, 刪除與粘貼
   在 vi 中 y 表示拷貝, d 表示刪除, p 表示粘貼. 其中拷貝與刪除是與光標移動命令
結合的, 看幾個例子就能夠明白了.\r\n  yw              表示拷貝從當前光標到光標所在單詞結尾的內容.
  dw              表示刪除從當前光標到光標所在單詞結尾的內容.
  y0              表示拷貝從當前光標到光標所在行首的內容.

  
  d0              表示刪除從當前光標到光標所在行首的內容.
  y$              表示拷貝從當前光標到光標所在行尾的內容.
  d$              表示刪除從當前光標到光標所在行尾的內容.
  yfa             表示拷貝從當前光標到光標後面的第一個a字符之間的內容.
  dfa             表示刪除從當前光標到光標後面的第一個a字符之間的內容.\r\n  特殊地:
  yy              表示拷貝光標所在行.
  dd              表示刪除光標所在行.
  D               表示刪除從當前光標到光標所在行尾的內容.\r\n  關於拷貝, 刪除和粘貼的複雜用法與寄存器有關, 可以自行查詢.\r\n4. 
  
  數字與命令
   在 vi 中數字與命令結合往往表示重複進行此命令, 若在擴展模式的開頭出現則表示行
號定位. 如:\r\n  5fx             表示查找光標後第 5 個 x 字符.\r\n  5w(e)           移動光標到下五個單詞.\r\n  5yy             表示拷貝光標以下 5 行.
  5dd             表示刪除光標以下 5 行.\r\n  y2fa            表示拷貝從當前光標到光標後面的第二個a字符之間的內容.\r\n  :12,24y         表示拷貝第12行到第24行之間的內容.
  :12,y           表示拷貝第12行到光標所在行之間的內容.
  :,24y           表示拷貝光標所在行到第24行之間的內容. 刪除類似.\r\n5. 快速輸入字符
   在 vi 中, 不要求你輸入每一個字符, 可以有很多種方法快速輸入一些字符.
   使用 linux/unix 的同學一定有一個經驗, 在命令行下輸入命令時敲入頭幾個字符再按
TAB 系統就會自動將剩下的字符補齊, 假如有多個匹配則會打印出來. 這就是著名的命令
補齊(其實windows中也有文件名補齊功能). vi 中有許多的字符串補齊命令, 非常方便.\r\n  c-p(c-n)        在編輯模式中, 輸入幾個字符後再輸入此命令則 vi 開始向上(下)搜
                  索開頭與其匹配的單詞並補齊, 不斷輸入此命令則循環查找. 此命令
                  會在所有在這個 vim 程序中打開的文件中進行匹配.\r\n  c-x-l           在編輯模式中, 此命令快速補齊整行內容, 但是僅在本窗口中出現的
                  文檔中進行匹配.\r\n  c-x-f           在編輯模式中, 這個命令表示補齊文件名. 如輸入:
                  /usr/local/tom 後再輸入此命令則它會自動匹配出:
                  /usr/local/tomcat/\r\n  abbr            即縮寫. 這是一個宏操作, 可以在編輯模式中用一個縮寫代替另一個
                  字符串. 比如編寫java文件的常常輸入 System.out.println, 這很
                  是麻煩, 所以應該用縮寫來減少敲字. 可以這麼做:
                  :abbr sprt System.out.println
                  以後在輸入sprt後再輸入其他非字母符號, 它就會自動擴展爲System.
                  out.println\r\n6. 替換
   替換是 vi 的強項, 因爲可以用正規表達式來匹配字符串.以下提供幾個例子.\r\n  :s/aa/bb/g      將光標所在行出現的所有包含 aa 的字符串中的 aa 替換爲 bb
  :s/\\<aa\\>/bb/g  將光標所在行出現的所有 aa 替換爲 bb, 僅替換 aa 這個單詞
  :%s/aa/bb/g     將文檔中出現的所有包含 aa 的字符串中的 aa 替換爲 bb
  :12,23s/aa/bb/g 將從12行到23行中出現的所有包含 aa 的字符串中的 aa 替換爲 bb
  :12,23s/^/#/    將從12行到23行的行首加入 # 字符
  :%s= *$==       將所有行尾多餘的空格刪除
  :g/^s*$/d       將所有不包含字符(空格也不包含)的空行刪除.\r\n7. 多文件編輯
   在一個 vim 程序中打開很多文件進行編輯是挺方便的.\r\n  :sp(:vsp) 文件名    vim 將分割出一個橫(縱)向窗口, 並在該窗口中打開新文件.
                      從 vim6.0 開始, 文件名可以是一個目錄的名稱, 這樣, vim 會
                      把該目錄打開並顯示文件列表, 在文件名上按回車則在本窗口打
                      開該文件, 若輸入 O 則在新窗口中打開該文件, 輸入 ? 可以看
                      到幫助信息.\r\n  :e 文件名           vim 將在原窗口中打開新的文件, 若舊文件編輯過, 會要求保存.\r\n  c-w-w               vim 分割了好幾個窗口怎麼辦? 輸入此命令可以將光標循環定位
                      到各個窗口之中.\r\n  :ls                 此命令查看本 vim 程序已經打開了多少個文件, 在屏幕的最下方
                      會顯示出如下數據:
                      1   %a      \"usevim.html\"         行 162
                      2   #       \"xxxxxx.html\"         行 0\r\n                      其中:
                      1               表示打開的文件序號, 這個序號很有用處.
                      %a              表示文件代號, % 表示當前編輯的文件,
                                      # 表示上次編輯的文件
                      \"usevim.html\"   表示文件名.
                      行 162          表示光標位置.\r\n  :b 序號(代號)       此命令將指定序號(代號)的文件在本窗口打開, 其中的序號(代號)
                      就是用 :ls 命令看到的.\r\n  :set diff           此命令用於比較兩個文件, 可以用
                      :vsp filename
                      命令打開另一個文件, 然後在每個文件窗口中輸入此命令,就能看
                      到效果了.\r\n8. 宏替換
   vi 不僅可以用 abbr 來替換文字, 也可以進行命令的宏定義. 有些命令輸起來很費勁,
因此我把它們定義到 <F1>-<F12> 上, 這樣就很方便了.這些配置可以預先寫到 ~/.vimrc
(windows 下爲 $VIM/_vimrc) 中, 寫進去的時候不用寫前面的冒號.\r\n  :nmap <F2> :nohls<cr>              取消被搜索字串的高亮
  :nmap <F9> <C-W>w                  命令模式下轉移光標到不同窗口
  :imap <F9> <ESC><F9>               輸入模式下運行<F9>
  :nmap <F12> :%s= *$==<cr>          刪除所有行尾多餘的空格.
  :imap <F12> <ESC><F12>             同上\r\n  :java 中: (注, 這裏爲什麼說 java 中, 因爲以下定義對其他文件格式不起作用, 下文
            會說到如何實現這一點)
  :nmap <F3> :comp javac<CR>:mak -d . %<CR>
       此命令用 javac 編譯 java 文件, 它會自動將光標定位到出錯點. 不過這需要定
       義一個 javac.vim 文件在 $VIM/compiler 下, 在 javac.vim 裏面只有兩行字:
          setlocal makeprg=javac
          setlocal errorformat=%A%f:%l:\\ %m,%-Z%p^,%-C%.%#\r\n  :nmap <F4> :comp ant<CR>:mak<CR>
       此命令用 ant 編譯 java 文件, 它會自動將光標定位到出錯點. 一般來說, 安裝
       vim 後已經有了compiler/ant.vim文件, 因此這個命令可以直接使用. 但是需要
       在當前目錄下有 build.xml 文件, 當然還必須安裝 ant 才行.\r\n  :nmap <F5> :cl<CR>                 此命令用於查看所有的編譯錯誤.
  :imap <F5> <ESC><F5>\r\n  :nmap <F6> :cc<CR>                 此命令用於查看當前的編譯錯誤.
  :imap <F6> <ESC><F6>\r\n  :nmap <F7> :cn<CR>                 此命令用於跳到下一個出錯位置.
  :imap <F7> <ESC><F7>\r\n  :nmap <F8> :cp<CR>                 此命令用於跳到上一個出錯位置.
  :imap <F8> <ESC><F8>\r\n  :nmap <F11> :JavaBrowser<cr>
       此命令用於在窗口左部分割出一個新窗口, 裏面的內容是 java 的資源樹, 包括
       本文件中出現的類, 類的成員變量及成員方法, 就好像 JCreator 表現的那樣.
       在這個窗口中輸入 ? 會看到幫助. 嘿嘿, 很好用, 不過需要 ctags 支持.
  :imap <F11> <ESC><F11>\r\n9. TAB
   TAB 就是製表符, 單獨拿出來做一節是因爲這個東西確實很有用.\r\n   <<                  輸入此命令則光標所在行向左移動一個 tab.
   >>                  輸入此命令則光標所在行向右移動一個 tab.
   5>>                 輸入此命令則光標後 5 行向右移動一個 tab.
   :12,24>             此命令將12行到14行的數據都向右移動一個 tab.
   :12,24>>            此命令將12行到14行的數據都向右移動兩個 tab.\r\n   那麼如何定義 tab 的大小呢? 有人願意使用 8 個空格位, 有人用4個, 有的用2個.
   有的人希望 tab 完全用空格代替, 也有的人希望 tab 就是 tab. 沒關係, vim 能
   幫助你.以下的設置一般也都先寫入配置文件中, 免得老敲.\r\n   :set shiftwidth=4   設置自動縮進 4 個空格, 當然要設自動縮進先.
   :set sts=4          即設置 softtabstop 爲 4. 輸入 tab 後就跳了 4 格.
   :set tabstop=4      實際的 tab 即爲 4 個空格, 而不是缺省的 8 個.
   :set expandtab      在輸入 tab 後, vim 用恰當的空格來填充這個 tab.\r\n10. autocmd
    這個命令十分的強大, 可以用這個命令實現對不同的文件格式應用不同的配置; 可以
在新建文件時自動添加上版權聲明等等. 這些命令一般定義在 ~/.vimrc 這樣的配置文件
裏面. 由於他很強大, 所以我不能給出很具體的說明, 只能舉幾個例子, 詳細的請看幫助.\r\n  :autocmd!               刪除所有之前的自動命令.
  autocmd FileType        java  source ~/.vim/files/java.vim
  autocmd FileType        java  source ~/.vim/files/jcommenter.vim
    以上兩條命令讓我在打開 java 文件時才應用後面提到的兩個配置文件.
  autocmd BufNewFile      *.java  0r ~/.vim/files/skeletons/java.skel
    以上這條命令讓我在新建 java 文件時自動加入 java.skel 文件的內容.
  autocmd BufNewFile      *.java  normal gnp
    以上這條命令讓我在新建 java 文件時自動運行 gnp 命令, 這個命令進行一些特殊化
    處理, 比如將新 java 文件中的 __date__ 替換成今天的日期什麼的.\r\n11. 常用腳本
    在 vim.sf.net 你可以發現很多腳本(script), 這些腳本常常有讓你意想不到的作用.
我常用的有:\r\n    jcommenter.vim        自動加入 javadoc 風格的註釋.
    JBrowser.vim          類資源瀏覽. C, C++ 等可以用 Tlist\r\n    還有許多有用的, 比如 checkstyle.vim 可以檢驗你的編程風格, jad.vim 可以直接
    反編譯 .class 文件等等.\r\n12. 常用配置
    在~/.vimrc 配置文件中你常常需要一些個性化配置. 比如上面寫的一些宏定義, 一些
autocmd 定義等等. 比如:\r\n    set suffixes=.bak,~,.o,.h,.info,.swp,.aux,.bbl,.blg,.dvi,.lof,.log,.lot,.ps,.toc
        這樣在vim中打開文件時, 按 tab 鍵補齊文件名時它會忽略上述文件.\r\n    set nu          顯示行號
    set ai          設置自動縮進
    map Y y$        讓 Y 和 D 一樣, 要不然 Y 的本意和 yy 一樣.\r\n13. 其他
    還有許多有意思的命令, 記錄在這裏免得忘記.\r\n    .                                               重複上次編輯命令.
    :g/^/exec \"s/^/\".strpart(line(\".\").\" \", 0, 4)   在行首插入行號
    :runtime! syntax/2html.vim                      轉換 txt 成 html, 會按照你的
                                                    顏色配置來轉\r\nVI高級命令集錦及VIM應用實例
作者:  轉自:http://linux-down.kmip.net/  本文已被閱讀:5 次
*****************************************************************************\r\n本文由正泰linux http://linux-down.kmip.net 蒐集,整理,如需轉載,請註明出處!
本站有大量的linux電子教程,軟件,技術文檔,歡迎大家訪問!站長阿泰qq:253222170\r\n******************************************************************************\r\nVI高級命令集錦及VIM應用實例\r\njavalee 寫到:\r\n1.交換兩個字符位置
xp
2.上下兩行調換
ddp
3.把文件內容反轉
:g/^/m0/ (未通過)
4.上下兩行合併
J
5.刪除所有行
dG
6.從當前位置刪除到行尾
d$
7.從當前位置複製到行尾
y$ 如果要粘貼到其他地方 p 就可以了\r\n由於vi 是建立在 EX 上的 所以 當鍵入 : 時就來到了 EX 命令狀態
8.
:ab string strings
例如 \":ab usa United States of America\" ,
當你在文見裏插入 usa 時
United States of America 就蹦出來了
9.
:map keys new_seq
定義你當前 鍵盤命令
10.
:set [all]
vi or ex 的編輯狀態
如 顯示每行 :set nu
11.
在命令狀態下,nyy表示拷貝從光標行起的下n行內容,p表示paste,可剛複製的內容粘貼在光標處的
下面。\r\n12.
單個字符替換用r,覆蓋多個字符用R,用多個字符替換一個字符用s,整行替換用S\r\n13.\r\n:%s/old_word/new_word/g
這個指令是於在整個文件中替換特定字符串\r\n14.光標控制\r\nk:上移 nk 上移n行
j:下移 nj 下移n行\r\n將光標移到第n行,按下 mk
將光標移到第m行,按下 \"ay\'k
即將第n到m的行存到a寄存器,以此類推,b,c........寄存器等\r\n這樣就可以將你常用的需要複用的內容粘貼到不同的寄存器中以備用\r\n想粘貼到某處,直接將光標移到某地,按下 \'ap 即可,以此類推,b,c........寄存器等\r\n在當前屏幕中
H 跳到第一行
M 跳到中間一行
L 跳到最後一行\r\n15.
表8-2 刪除命令
刪除命令操作
d l 刪除當前字符(與x命令功能相同)
d 0 刪除到某一行的開始位置
d ^ 刪除到某一行的第一個字符位置(不包括空格或TA B字符)
d w 刪除到某個單詞的結尾位置
d 3 w 刪除到第三個單詞的結尾位置
d b 刪除到某個單詞的開始位置
d W 刪除到某個以空格作爲分隔符的單詞的結尾位置
d B 刪除到某個以空格作爲分隔符的單詞的開始位置
d 7 B 刪除到前面7個以空格作爲分隔符的單詞的開始位置
d) 刪除到某個語句的結尾位置
d 4) 刪除到第四個語句的結尾位置
d( 刪除到某個語句的開始位置
d } 刪除到某個段落的結尾位置
d { 刪除到某個段落的開始位置
d 7 { 刪除到當前段落起始位置之前的第7個段落位置
d d 刪除當前行
d /t e x t 刪除從文本中出現\" t e x t\"中所指定字樣的位置,一直向前直到下一個該字樣所出現的
位置(但不包括該字樣)之間的內容
d fc 刪除從文本中出現字符\"c\"的位置,一直向前直到下一個該字符所出現的位置(包括
該字符)之間的內容
d tc 刪除當前行直到下一個字符\" c\"所出現位置之間的內容
D 刪除到某一行的結尾
d $ 刪除到某一行的結尾
5 d d 刪除從當前行所開始的5行內容
d L 刪除直到屏幕上最後一行的內容
d H 刪除直到屏幕上第一行的內容
d G 刪除直到工作緩存區結尾的內容
d 1 G 刪除直到工作緩存區開始的內容\r\n修改命令操作
c l 更改當前字符
c w 修改到某個單詞的結尾位置
c 3 w 修改到第三個單詞的結尾位置
c b 修改到某個單詞的開始位置
c W 修改到某個以空格作爲分隔符的單詞的結尾位置
c B 修改到某個以空格作爲分隔符的單詞的開始位置
c 7 B 修改到前面7個以空格作爲分隔符的單詞的開始位置
c 0 修改到某行的結尾位置
c) 修改到某個語句的結尾位置
c 4) 修改到第四個語句的結尾位置
c( 修改到某個語句的開始位置
c } 修改到某個段落的結尾位置
c { 修改到某個段落的開始位置
c 7 { 修改到當前段落起始位置之前的第7個段落位置
c tc 修改當前行直到下一個字符c所出現位置之間的內容
C 修改到某一行的結尾
c c 修改當前行
5 c c 修改從當前行所開始的5行內容\r\n.重複上一次修改!\r\n表8-4 替換命令
替換命令操作
G的開頭處
    \"         移至當前行上一次所在位置(在光標移動之後)――一個雙引號
    \'\'        移至當前行上第一次所在位置的行的開頭處(在光標移動之後)――兩個單引號\r\n19.
同時vi多個文件時,CTRL-SHIFT-6回到上一個文件,在本次vi的文件和上次vi的文件之間切換。
但是我發現一個BUG:在用CTRL-SHIFT-6切換到上一個文件後,用:args查看多文件vi狀態時,
屏幕底部仍然顯示目前vi的是剛纔的文件。
(在HP-UX,Solaris,AIX上通過)\r\n也可以使用:
:e#
進行切換\r\n20.
sco 下VI 要在文本前同樣的字符加用
%s/^/要加的內容/g 要在文本後同樣的字符加
%s/$/要加的內容/g\r\n21.
如何去掉文本中的 ^M 硬回車?不必用binary傳回去再ascii傳回來的方式,用shell或者unix語句實現。\r\ncat filename |tr -d \'\\015\' >newfile
不同的unix系統還存在一些其他不同的命令,如:doscp
sed 也可以實現這個功能.\r\ndos2unix filename filename2
反之
unix2dos filename filename2\r\n在vi 中用:$s/^M//g
^是crtl-V crtl-M\r\n22.如何在\"unix命令行\"下將一個文件的某字符串用另一個串換掉\r\nsed \'s/string1/string2/gp\' file1 > file2\r\n23.將/etc/hosts下所有的地址都ping 2次\r\n1 #/usr/bin/sh
2 #grad /etc/hosts and ping each address
3 cat /etc/hosts|grep -v \'^#\' | while read LINE
4 do
5 ADDR=`awk \'{print $1}\'`
6 for MACHINE in $ADDR
7 do
8 ping $MACHINE -n 2
9 done
10 done\r\n24\r\n到前一個函數[[ ,到下一個函數]] ,括號配對% ,交叉參考Ctrl_] (事先用ctags做索引),回來用e# ` 編輯一個函數:vi -t 函數名 ,編輯加密文本vi -X\r\n25
在插入模式下ctrl+p,自動補齊剩餘單詞,以賴規則:tags,以有的單詞等等\r\n*****************************************************************************\r\n本文由正泰linux http://linux-down.kmip.net 蒐集,整理,如需轉載,請註明出處!
本站有大量的linux電子教程,軟件,技術文檔,歡迎大家訪問!站長阿泰qq:253222170\r\n******************************************************************************\r\n當今世界,文本編輯器種類繁多,大有\"亂花漸欲迷人眼\"之勢。中國有句古語:手巧不如傢什妙,作爲IT業的專業人士,選擇一款優秀的編輯軟件至關重要。筆者認爲:LINUX下的VIM※以其強大的功能和無窮的魅力將使您終生受益。\r\n作者:閆石 ([email protected])
來自:http://www-900.ibm.com/developerWorks/cn/linux/l-tip-prompt/tip15/index.shtml\r\n由於被廣泛移植,無論是PC機的DOS和WINDOWS,還是RISC/6000的AIX,乃至於IBM的大型機S/390,都能見到VIM的身影。然而,對於初學者,VIM的用戶界面與使用方法非常不符合常規,甚至認爲它比較混亂,無所適從。事實上,VIM編輯器是專門爲經驗豐富的用戶設計的,它的界面和使用方法提供了更快的速度和更強的功能。對於熟知它的用戶,VIM的許多特性節省了時間和擊鍵次數,並可以完成一些其他編輯器無法完成的功能。\r\n學習的最好方法是實踐,唯有如此,才能真正掌握其中的精髓。文中列舉的實例,都是筆者在實際工作中遇到的,具有一定的代表性,請大家在閱讀的過程中仔細體會。\r\n好了,現在讓我們共同暢遊神奇的VIM的世界!\r\n例一、兩個常用的指令序列\r\nxp 左右交換光標處兩字符的位置。
ddp 上下交換光標處兩行的位置。\r\n例二、重複輸入同一字符\r\n有時,我們可能想多次輸入同一字符,VIM的插入功能可以很好的完成這項工作\r\n命令 80i=^ESC 一次可以輸入80個字符= ,當然,80a=^ESC 也可以完成上述功能。\r\n請注意:此處的^ESC表示鍵盤左上方上的ESC鍵。\r\n例三、將兩個文本數據文件按行逐條合併,並給出標尺\r\n數據文件1內容如下:
1-----
2-----
3-----\r\n數據文件2內容如下:
1=====
2=====
3=====\r\n要求的結果如下:
|--------1---------2---------3---------4---------5
1-----
1=====
|--------1---------2---------3---------4---------5
2-----
2=====
|--------1---------2---------3---------4---------5
3-----
3=====\r\n也許您會說,這還不簡單,無非是反覆拷貝、粘貼,任何一款文本編輯器都能完成上述功能。可是,如果這兩個文件都很大,每個文件都成千上萬行,恐怕簡單的拷貝、粘貼就難以勝任了。因此,我們所關心的,是找到一種行之有效的方法,把枯燥乏味的工作留給計算機,我們只需發佈指令。爲達到此目的,請按以下步驟執行:\r\n㈠、將兩文件合併,結果如下
1-----
2-----
3-----
1=====
2=====
3=====\r\n㈡、在兩文件頭尾相接的地方插入標誌行,用以區分兩個文件,本文采用的是一整行!字符
1-----
2-----
3-----
!!!!!!!!!!!!!!!!!!!!!!!!
1=====
2=====
3=====\r\n㈢、在標誌行的下方輸入標尺
1-----
2-----
3-----
!!!!!!!!!!!!!!!!!!!!!!!!
|--------1---------2---------3---------4---------5
1=====
2=====
3=====\r\n㈣、執行宏命令腳本merge_2r.vim,即在VIM編輯器中按如下鍵 :so merge_2r.vim 回車\r\n㈤、按下鍵盤上的=鍵,執行的結果如下
|--------1---------2---------3---------4---------5
1-----
1=====
|--------1---------2---------3---------4---------5
2-----
2=====
|--------1---------2---------3---------4---------5
3-----
3=====
|--------1---------2---------3---------4---------5
!!!!!!!!!!!!!!!!!!!!!!!!
|--------1---------2---------3---------4---------5\r\n㈥、將最後三行刪除,即可得到我們需要的結果
|--------1---------2---------3---------4---------5
1-----
1=====
|--------1---------2---------3---------4---------5
2-----
2=====
|--------1---------2---------3---------4---------5
3-----
3=====\r\n怎麼樣,簡單嗎?請大家自己實際嘗試一下。下面,我來詳細講解宏命令腳本merge_2r.vim 。\r\n該腳本內容如下:\r\n\"--------------------------------------------------------------------
\"Macro Function : Merge File1 And File2,Have Ruler in every record
\" Date : 2001/12/01
\" Author : Yan Shi
\"--------------------------------------------------------------------
\"1-----
\"2----- } Sample File1
\"3-----
\"!!!!!!!!!!!!!!!!!!!!!!!! Flag Row
\"|--------1---------2---------3---------4---------5 Ruler
\"1=====
\"2===== } Sample File2
\"3=====
\"--------------------------------------------------------------------
:1
:map = ma/!!!!!^M+:.co \'a-1^M/!!!!!^M2+:.m\'a^M+=\r\n前14行每行都以\"開始,表明該行是註釋行,實際並不執行,只是方便讀者閱讀,只有最後兩行纔是真正的代碼行。請注意:本例中的^M表示鍵盤上的回車鍵,並非^和M兩個字符。爲了講述清楚,我把命令行分解開,逐一說明。\r\n首先將第一行置爲當前行,然後執行map命令,將一大串VIM指令映像給字符=。這一大串VIM指令共分9步執行:\r\nma 將數據文件一的第一行標記爲a
1-----
2-----
3-----
!!!!!!!!!!!!!!!!!!!!!!!!
|--------1---------2---------3---------4---------5
1=====
2=====
3=====\r\n/!!!!!^M 找到標誌行,置爲當前行
1-----
2-----
3-----
!!!!!!!!!!!!!!!!!!!!!!!!
|--------1---------2---------3---------4---------5
1=====
2=====
3=====\r\n+ 光標下移一行,即把標尺行置爲當前行
1-----
2-----
3-----
!!!!!!!!!!!!!!!!!!!!!!!!
|--------1---------2---------3---------4---------5
1=====
2=====
3=====\r\n:.co \'a-1^M 把標尺行復制到標記行(數據文件一的第一行)的上方
|--------1---------2---------3---------4---------5
1-----
2-----
3-----
!!!!!!!!!!!!!!!!!!!!!!!!
|--------1---------2---------3---------4---------5
1=====
2=====
3=====\r\n/!!!!!^M 再次找到標誌行,置爲當前行
|--------1---------2---------3---------4---------5
1-----
2-----
3-----
!!!!!!!!!!!!!!!!!!!!!!!!
|--------1---------2---------3---------4---------5
1=====
2=====
3=====\r\n2+ 光標下移2行,即數據文件二的第一行置爲當前行
|--------1---------2---------3---------4---------5
1-----
2-----
3-----
!!!!!!!!!!!!!!!!!!!!!!!!
|--------1---------2---------3---------4---------5
1=====
2=====
3=====\r\n:.m\'a^M 把數據文件二的第一行移至標記行的下方
|--------1---------2---------3---------4---------5
1-----
1=====
2-----
3-----
!!!!!!!!!!!!!!!!!!!!!!!!
|--------1---------2---------3---------4---------5
2=====
3=====\r\n+ 光標下移一行,即數據文件一的第二行置爲當前行
|--------1---------2---------3---------4---------5
1-----
1=====
2-----
3-----
!!!!!!!!!!!!!!!!!!!!!!!!
|--------1---------2---------3---------4---------5
2=====
3=====\r\n= 這一步很關鍵,是典型的遞歸調用,重複完成以上步驟\r\n例四、在文件中置入行號\r\n工作中,我們有時希望把行號置入文件中,而VIM提供的功能 :set nu 只能顯示行號,不能編輯或將其置入文件當中,下面的宏命令腳本row_num.vim可以完成此項功能。\r\n\"------------------------------------------
\"Macro Function : Source File Add Row_Num
\" Date : 2001/12/01
\" Author : Yan Shi
\"------------------------------------------
:%s/^/^I/
:$
:let end=line(\".\")
:1
\"------------------------------------------
:let num=1
:while num<=end
:let line=getline(\".\")
:let temp=substitute(line,$,num,\"\")
:call setline(\".\",temp)
:+
:let num=num+1
:endwhile
\"------------------------------------------\r\n請注意:本例中的^I表示鍵盤上的TAB鍵,並非^和I兩個字符。下面,我針對該宏命令腳本逐一講解。\r\n:%s/^/^I/ 每一行的行首添加一個TAB字符
:$ 到文件的末行
:let end=line(\".\") 末行的行號 ==〉變量 END,函數line的功能是取得指定行的行號,此處參數\".\"表示當前行
:1 到文件的首行
\"------------------------------------------
:let num=1 1 ==〉計數器
:while num<=end
:let line=getline(\".\") 取當前行的內容 ==〉變量 LINE
:let line=substitute(line,$,num,\"\") 在變量 LINE 的前面置入行號
:call setline(\".\",line) 將變量 LINE 的內容寫回當前行
:+ 下移一行
:let num=num+1 計數器加一
:endwhile 循環執行,直到文件結束
\"------------------------------------------\r\n有關正則表達式的使用\r\nUNIX/LINUX下的很多工具之所以強大、靈活,關鍵是因爲有了正則文法和元字符,這也是VIM乃至UNIX/LINUX系統的精華所在。正因爲使用靈活,因此掌握起來比較吃力,如果不是真正理解,實際運用中會出現千奇百怪的錯誤。因此,有必要對這部分知識多花些氣力。下面結合具體實例講解。\r\n例五、有一文件,包含某外企的中國員工的資料,首先是姓名,然後是兩個空格,其次是15位身份證號碼。\r\nzhang.fei 430759701022003
diao.chan 651302801225012
guan.yu 342869680413001
xi.shi 120638780214006
liu.bei 210324650708001\r\n現在,有以下問題需要解決:\r\n按照外國人的習慣,應該是名在前,姓在後。因此,文件中的姓名字段需要修改。
姓與名的首字母應該大寫。
根據身份證號碼,還可以判斷出生年月日,將其作爲一個新字段添加。
根據身份證號碼,可以判斷出性別。若爲男性,添加male,若爲女性,添加female 。
將男女員工分開,男員工在前,女員工在後。
將各字段數據左對齊\r\n最終結果如下:\r\nFei.Zhang 430759701022003 1970/10/22 male
Yu.Guan 342869680413001 1968/04/13 male
Bei.Liu 210324650708001 1965/07/08 male
-----------------------------------------------
Chan.Diao 651302801225012 1980/12/25 female
Shi.Xi 120638780214006 1978/02/14 female\r\n爲了完成上述功能,只需執行腳本employee.vim ,使用方法爲 :so employee.vim 回車即可。\r\n腳本內容如下:\r\n:%s/ / /
:%s/\\(............\\)\\( *\\)/\\1/
:%s/\\([A-Za-z][A-Za-z]*\\)\\(\\.\\)\\([A-Za-z][A-Za-z]*\\)/\\u\\3\\2\\u\\1/
:%s/$/ xxxxxx/
:%s/\\([0-9]\\{6}\\)\\([0-9]\\{6}\\)\\([0-9]\\{3}\\) \\(xxxxxx\\)/\\1\\2\\3 \\2/
:%s/\\(..\\)\\(..\\)\\(..\\)$/19\\1\\/\\2\\/\\3
:%s/$/ xxxxxx/
:%s/\\([0-9]\\{14}[13579]\\)\\(.*\\)\\(xxxxxx\\)/\\1\\2male /
:%s/\\([0-9]\\{14}[02468]\\)\\(.*\\)\\(xxxxxx\\)/\\1\\2female/
:$
:s/.*/&^M-----------------------------------------------
:g/female/.m$\r\n在這個腳本中,使用了大量的正則表達式,這裏僅對涉及到的正則表達式做一簡要介紹。有關正則表達式的內容相當多,本文不可能佔用大量篇幅敘述,請大家諒解。\r\n% 地址範圍符號,代表文件中的所有行,作用等同於地址範圍 1,$
. 與任意單字符(換行符除外)匹配,例如 y.s 可以匹配 yas y.s 或 y s 等等。
* 與前一字符的0次或多次出現匹配,例如 y*s 可以匹配 yys yyyyys 或 s 等等。
$ 與行尾匹配。
& 代表模式匹配中出現的字符串,例如 s/abc/&def 是把當前行的abc替換成abcdef 。
[] 匹配[]中出現的字符,例如[abc]匹配字符 a,b 或 c ,[a-zA-Z]匹配所有的英文字符。
\\( \\) \\(和\\)之間出現的內容可以由\\num來替代。
\\1\\2\\3 替代\\(和\\)之間出現的內容。
\\u 將後續字符串的首字母大寫。
\\{num} 與前一字符的num次出現匹配。\r\n現在,我們對腳本逐條講解,希望能幫助大家理解正則文法。\r\n⑴:%s/ / /
將文件中每行出現的2個空格替換爲10個空格。\r\nzhang.fei 430759701022003
diao.chan 651302801225012
guan.yu 342869680413001
xi.shi 120638780214006
liu.bei 210324650708001\r\n⑵:%s/\\(............\\)\\( *\\)/\\1/
保留行首的12個字符,將其餘的空格刪除,這樣,前兩個字段就對齊了。\r\nzhang.fei 430759701022003
diao.chan 651302801225012
guan.yu 342869680413001
xi.shi 120638780214006
liu.bei 210324650708001\r\n⑶:%s/\\([A-Za-z][A-Za-z]*\\)\\(\\.\\)\\([A-Za-z][A-Za-z]*\\)/\\u\\3\\2\\u\\1/
將文件中每行出現的僱員姓名互換,並將首字母大寫。\r\nFei.Zhang 430759701022003
Chan.Diao 651302801225012
Yu.Guan 342869680413001
Shi.Xi 120638780214006
Bei.Liu 210324650708001\r\n⑷:%s/$/ xxxxxx/
在每一行的行尾添加2個空格和6個x\r\nFei.Zhang 430759701022003 xxxxxx
Chan.Diao 651302801225012 xxxxxx
Yu.Guan 342869680413001 xxxxxx
Shi.Xi 120638780214006 xxxxxx
Bei.Liu 210324650708001 xxxxxx\r\n⑸:%s/\\([0-9]\\{6}\\)\\([0-9]\\{6}\\)\\([0-9]\\{3}\\) \\(xxxxxx\\)/\\1\\2\\3 \\2/
將xxxxxx替換成出生年月日。\r\nFei.Zhang 430759701022003 701022
Chan.Diao 651302801225012 801225
Yu.Guan 342869680413001 680413
Shi.Xi 120638780214006 780214
Bei.Liu 210324650708001 650708\r\n⑹:%s/\\(..\\)\\(..\\)\\(..\\)$/19\\1\\/\\2\\/\\3
將年月日用/字符分隔,並在年前添加19。\r\nFei.Zhang 430759701022003 1970/10/22
Chan.Diao 651302801225012 1980/12/25
Yu.Guan 342869680413001 1968/04/13
Shi.Xi 120638780214006 1978/02/14
Bei.Liu 210324650708001 1965/07/08\r\n⑺:%s/$/ xxxxxx/
在每一行的行尾添加2個空格和6個x\r\nFei.Zhang 430759701022003 1970/10/22 xxxxxx
Chan.Diao 651302801225012 1980/12/25 xxxxxx
Yu.Guan 342869680413001 1968/04/13 xxxxxx
Shi.Xi 120638780214006 1978/02/14 xxxxxx
Bei.Liu 210324650708001 1965/07/08 xxxxxx\r\n⑻:%s/\\([0-9]\\{14}[13579]\\)\\(.*\\)\\(xxxxxx\\)/\\1\\2male /
身份證號碼末位是奇數的,將xxxxxx替換成male\r\nFei.Zhang 430759701022003 1970/10/22 male
Chan.Diao 651302801225012 1980/12/25 xxxxxx
Yu.Guan 342869680413001 1968/04/13 male
Shi.Xi 120638780214006 1978/02/14 xxxxxx
Bei.Liu 210324650708001 1965/07/08 male\r\n⑼:%s/\\([0-9]\\{14}[02468]\\)\\(.*\\)\\(xxxxxx\\)/\\1\\2female/
身份證號碼末位是偶數的,將xxxxxx替換成female\r\nFei.Zhang 430759701022003 1970/10/22 male
Chan.Diao 651302801225012 1980/12/25 female
Yu.Guan 342869680413001 1968/04/13 male
Shi.Xi 120638780214006 1978/02/14 female
Bei.Liu 210324650708001 1965/07/08 male\r\n⑽:$ 到文件的最後一行\r\n⑾:s/.*/&^M-----------------------------------------------
在文件的最末行插入一行 \"-\" 字符。\r\nFei.Zhang 430759701022003 1970/10/22 male
Chan.Diao 651302801225012 1980/12/25 female


:g/female/.m$
將所有的女員工記錄移至文件尾。
\r\n<P>Fei.Zhang 430759701022003 1970/10/22 male
Yu.Guan 342869680413001 1968/04/13 male
Bei.Liu 210324650708001 1965/07/08 male
-----------------------------------------------
Chan.Diao 651302801225012 1980/12/25 female
Shi.Xi 120638780214006 1978/02/14 female
\r\n<P>筆者目前正在爲某外資公司從事大型機(IBM S/390)的軟件開發,一切工作都在TSO環境中進行。爲了對編寫的程序進行測試,必須準備測試數據。有過大型機開發經驗的人會知道,通過TSO,輸入字符型數據還可以,如果要輸入16進制數據,操作起來很麻煩。因爲16進制數是縱向排列的,輸入時既不方便,又很容易錯位。怎麼解決呢?我嘗試了幾種辦法,實際證明,用VIM最方便。
\r\n<P>例六、下列數據 1234567890ABCDEF ,將其變成 13579ACE 24680BDF 的形式,這樣,數據就可以很方便的粘貼到TSO環境中了。
\r\n<P>下面給出宏命令腳本change_d.vim
\r\n<P>\"----------------------------------------------------
\"Macro Function : Convert Char Arrange Direction
\"
\" Sample : 40 50 60 ==&gt; 4 5 6
\" 0 0 0
\" Date : 2001/12/01
\" Author : Yan Shi
\"----------------------------------------------------
:s/.*/&amp;^M/
:1
:map = malx+$p-`al=
\r\n<P>說明如下:
\r\n<P>⑴ :s/.*/&amp;^M/ 在數據行下方添加一空行。
⑵ :1 回到文件的首行的首字符。
⑶ :map = malx+$p-`al= 將一大串VIM命令映像給字符=
\r\n<P>① ma 將首字符標記爲a
② l 光標右移一個字符
③ x 刪除光標處字符
④ + 移至下一行
⑤ $ 到行尾
⑥ p 將刪除的字符粘貼
⑦ - 回至上一行
⑧ `a 返回到標記字符處
⑨ l 光標右移一個字符
⑩ = 遞歸調用,重複以上步驟,直到將該行所有的數據處理完。
\r\n<P>上面的這幾個實例,展示了VIM強大的文本處理功能,但這遠不能覆蓋其全貌。VIM的命令很多,而且使用靈活,需要狠下一番氣力才能熟練掌握。筆者年齡尚小,經驗還很欠缺,希望本文能夠起到拋磚引玉的作用。由於時間的原因,上述實例僅在DOS和WINDOWS環境下測試,沒有在其他系統下進行進一步的測試,希望各位同行、前輩不吝賜教,謝謝!
\r\n<P>※ VIM 意爲 VI Improved ,與VI99%向下兼容。而且,VIM提供了許多VI不具備的功能,內置了諸多函數,因此,建議有經驗的VI用戶對VIM有所瞭解,您會發現,轉向VIM 是明智之舉。欲查詢有關VIM的資料,請參考 <A href=\"http://www.vim.org/\"><FONT color=#0000ff>http://www.vim.org</FONT></A>
\r\n<P>注:本文使用 VIM 6.0 版本
\r\n<P>作者簡介
閆石,工程師。您可以通過電子郵件:<A href=\"mailto:[email protected]\"><FONT color=#0000ff>[email protected]</FONT></A> 或者 <A href=\"mailto:[email protected]\"><FONT color=#0000ff>[email protected]</FONT></A> 和他聯繫。
\r\n<P>附錄A:一個用vi作表單的在線教程
<A href=\"http://www-900.ibm.com/developerWorks/cn/cnedu.nsf/linux-onlinecourse-bytitle/9F896668D7EB5CA948256A710030E157?OpenDocument\"><FONT color=#0000ff>http://www-900.ibm.com/developerWorks/cn/cnedu.nsf/linux-onlinecourse-bytitle/9F896668D7EB5CA948256A710030E157?OpenDocument</FONT></A>
\r\n<P>附錄B:vi 命令常見問題解答
<A href=\"http://www.linuxsir.com/bbs/showthread.php?s=&amp;threadid=23957\"><FONT color=#0000ff>http://www.linuxsir.com/bbs/showthread.php?s=&amp;threadid=23957</FONT></A>
附錄C:命令行下在線教程:
運行vimtutor即可學習!
\r\n<P>vi 命令常見問題解答
\r\n<P>作者:譯者Elale
\r\n<P>[vi-faq中文版]
\r\n<P>0.0 - 引言 -- 我怎樣用這個FAQ
\r\n<P>這個文檔分爲了幾個部分.首先,第0節和第1節介紹了什麼是vi;第2節則收錄了很多新
學者的問題,一些對vi沒有很多經驗的人也經常問這些問題.這裏麪包括諸如“命令模式
和插入模式之間的區別”,以及“我怎樣拷貝和粘貼”之類的問題.第3節是面向vi的中級
用戶的,它從問題“我如何查找和替換”開始,逐步深入,直到對vi裏面的宏(Macro)的
用法討論爲止.第3節還包括了一個vi的快速參考,有一個規範的vi命令列表.再下面,
是一個有關“:set”命令的列表,包含了所有能定vi環境的變量,這些變量也可以在
.exrc文件中定義.
\r\n<P>我們已經在一個運行SunOS和UCB版本vi的機器上驗證了快速參考.除了SunOS帶的vi外,
每個命令都可以在系統V和UCB版本vi運行,但是我個人並沒有驗證這一點.
\r\n<P>除非我們在文檔中指明,缺省我們假定你處在命令模式下.
\r\n<P>我們還嘗試保留儘可能多的術語,因爲在原始的vi文檔中使用了這些術語,儘管我可能
忘了它的本來含義.
\r\n<P>0.1 - 索引
\r\n<P>第一個文件:
\r\n<P>0.0 - 引言 -- 我怎樣用這個FAQ?
0.1 - 索引
0.2 - 我可以散發這個FAQ嗎?
0.3 - 你能爲這個FAQ做什麼?
\r\n<P>1.0 - 什麼是vi?
1.1 - 關於vi有什麼重大的交易? 爲什麼大家都用它? 更進一步說,爲什麼我要用它?
1.2 - 噢! 這聽起來不錯! 有沒有理由不用vi?
1.3 - vi能在多少不同的操作系統下面運行?
1.4 - 好吧, 你說服了我. 我決定開始使用vi. 我該從哪兒開始?
1.5 - vi有其他一些可用的變種嗎?
\r\n<P>2.0 - vi入門
2.1 - 有什麼遊戲幫助我們學習vi嗎?
2.2 - 命令模式和插入模式有什麼區別?
2.3 - 等等,我的鍵盤沒有&lt;Esc&gt;鍵,我該怎麼辦?
2.4 - 那些~s是什麼東西?
2.5 - 我無法習慣用 hjkl, 你有什麼建議嗎?
2.6 - 我如何才能不存盤就退出?
2.7 - 我怎樣插入一個文件?
2.8 - 我怎樣查找文本?
2.9 - 我怎樣搜索一個控制序列?
2.10 - 我怎樣重新格式化文本?
2.11 - 我怎樣複製文本?
2.12 - 啊! 我剛纔敲了一個dG,然後我的論文就沒有了! 我該怎麼辦?
 (或者,我剛纔犯了個錯誤,我該怎麼辦?)
2.13 - 我正在寫我的論文,被告知我必須將每一節都放在不同的文件,我該怎麼辦?
2.14 - 所有的:命令都是怎樣處理的?
\r\n<P>3.0 - 怎樣查找和替換?
3.1 - 我怎樣在vi中運行一個程序?
3.2 - 啊! 我正在寫我的論文, 系統崩潰了! 怎麼辦?
3.3 - 有沒有使vi對程序員更友好的竅門?
3.4 - 宏 -- 我怎樣寫宏?
3.5 - 我怎樣將一個功能鍵定義成一個宏?
3.6 - 有沒有辦法縮寫文本?
3.7 - 我怎樣在當前文檔中做拼寫檢查?
3.8 - 我手頭有一個硬拷貝的終端, 我還能用vi嗎?
3.9 - 好了,是不是處在開放模式下的原因呀?! 但是我現在沒有用硬拷貝終端,
 它還是在開放模式呀?
\r\n<P>第二個文件:
\r\n<P>4.0 - vi檔案的在線幫助在哪?
5.0 - 好玩的vi訣竅,無聊的宏
5.1 - 好玩的vi訣竅
5.2 - 好玩的宏
6.0 - 依字母順序的vi快速參考
6.1 - 命令模式的輸入選項(:命令)
6.2 - 設置選項(set)
7.0 - 建立 .exrc文件
7.1 - .exrc文件的樣本
8.0 - vi的漏洞
9.0 - 術語表
10.0 - 關於vi的參考書目
\r\n<P>0.2 - 我可以散發這個FAQ嗎?
\r\n<P>可以!只要你沒有對它做任何修改,或者用它來賺錢.
\r\n<P>0.3 - 你能爲這個FAQ做什麼?
首先, 把你發現的錯誤告訴我. 如果你有什麼建議我們也很歡迎. 你認爲還不清楚的
地方告訴我們,我們同樣歡迎. 還有, 使用vi! (Spread the word) 我很抱歉我無法將
所有對這FAQ有貢獻的人都列出來, 因爲許許多多的人都給過我建議和幫助,如果我將
他們都列出來的話,那麼恐怕這張貢獻者的清單將和這個文檔本身一樣長了.
\r\n<P>1.0 - 什麼是vi?
vi是個可視化的編輯器(vi就意味着可視化--VIsual). 那麼,什麼是可視化的編輯器呢?
(相對於非可視化的編輯器來說)?可視化的編輯器就是可以讓你在編輯文本的時候看到
它們.今天,這聽起來似乎非常普通,反之,非可視化的編輯器似乎很奇怪. 非可視化的
編輯器的例子可以舉出不少:如ed, sed和edlin(直到相當近的一段時間內,它是DOS自帶
的最後一個編輯器) 等.vi是威廉.僑伊寫的,作爲BSD UNIX的一部分. 後來AT&amp;T也開始
用vi, 於是標準UNIX也開始用vi了.
\r\n<P>1.1 - 關於vi有什麼重大的交易嗎? 爲什麼大家都用它? 更進一步說,爲什麼我要用?
vi是UNIX下面的缺省編輯器, 因此幾乎近來所有的UNIX都捆綁了vi(近來是指1984年左右).
這意味着無論何時你跨平臺使用某種UNIX,你都知道在你指尖下面有一個強力的編輯器.
爲什麼不是別的呢? vi是個強大的編輯器.同樣,一旦你瞭解了vi,你就能很快的編輯你的
文件,因爲它非常能節省你的敲鍵次數. 由於它在插入和命令兩種情況下使用不同的模式,
它比大多數的不基於這種模式的編輯器要快. 而且,vi非常小(我機器上面的版本只有
200K).還有,vi幾乎能做任何事,只要你知道如何使它做你想做的事.
\r\n<P>1.2 - 噢! 這聽起來不錯! 有沒有理由不用vi?
有. 有一個非常好的理: vi稍微有些難學, 如果你開始學的話,vi又慢又讓人痛苦,
當然,一旦你學會了, vi就快多了. 但是學習的過程很慢. 有人曾經問我, 如果vi是個
比較易學的編輯器, 它是否直觀(intuitive)呢? 我一般這樣回答:\"是的,我們有些人是
這樣認爲.但是大多數人認爲我們瘋了.\"
\r\n<P>1.3 - vi能在多少不同的操作系統下面運行?
UNIX. 就是它. 儘管如此,還是有很多vi的變種運行在不同的操作系統上. 我就在以下
一些操作系統上用過vi: UNIX, DOS, OS/2, MAC SYSTEM 7.(後面有一個有關細節的列表)
\r\n<P>1.4 - 好吧, 你說服了我. 我決定開始使用vi. 我該從哪兒開始?
好吧, 狡猾的傢伙. 關於vi有很多很好的書:大多數講UNIX的書至少有一章給了vi,而且
有不少是專門講vi的書.我沒有什麼偏愛. 所以你最好是問問你們那兒的vi高手們他們
是從哪兒學來的. 還有,到處試. 用vi打開一個不重要的文檔(你的論文不象是個學vi的
好實驗品),然後再到處. 我無法想象有人學習vi卻不花相當多的時間去到處試試. 記住:
如果你有些地方不明白了, 只要敲兩次&lt;Esc&gt;鍵,你就又回到命令模式下了. 我要提到的
一點是,我想在這裏提比較合適,就是如果要成爲系統管理員或者其他對UNIX配置
做什麼修改的話,最好是學學ed或者ex,因爲有些版本的UNIX沒有把vi放在根分區裏面,
這樣你就可能無計可施了. ed是個不錯的選擇.
\r\n<P>1.5 - vi有其他一些可用的變種嗎?
只能列出一部分:STvi (STevie), elvis, vile, vim, 和nvi, xvi.
elvis適用於:Amiga, DOS, OS/2, Unix, VMS, Atari.
STevie適用於: Atari ST, DOS, Unix, Mac System 7.
Mac System 7可以在很多info-mac的鏡象站點獲取,在/info-mac/text下.
(例如<A href=\"ftp://ftp.hawaii.edu/\"><FONT color=#0000ff>ftp.hawaii.edu</FONT></A>)
nvi是將和BSD 4.4捆綁在一起的vi.
vim適用於: Amiga, DOS, Mac System 7, Unix.
Amiga, DOS,和源碼可以在以下站點換取:ftp.fu-berlin.de /misc/editors/vim
Mac System 7可以在很多info-mac的鏡象站點獲取,在/info-mac/text下.
(例如<A href=\"ftp://ftp.hawaii.edu/\"><FONT color=#0000ff>ftp.hawaii.edu</FONT></A>)
vile適用於: DOS, OS/2, Unix, VMS.
xvi適用於: DOS, Unix.
vi的變種之間很有很多差異.很多都改進了vi,大多數都可以使用在這個文檔
種列出的命令,但是有一些不同的地方.更進一步的細節,你可以參考這些變
附帶的相應的文檔.
\r\n<P>2.0 - vi入門
對vi的初學者來說,有些基本的提示.第一,任何時候,手頭都要有一份命令摘要.
我們將在後面給出一個快速參考/命令摘要. 第二, 找一本vi方面的比較好的書.
這個文檔不是學vi的最佳途徑(最起碼現在還不是),我不敢保證這個文檔能教會一個
對vi一無所知的人, 而很多書已經做到了這一點. 但是,我們這裏還是給出了不少
提示. 對選擇書籍來說,有一個標準的原則:買之前一定要仔細閱讀. 要了解這本書
對你是否有意義.確信它能在你練習vi的時候有用. 和其他的書做個比較 -- 不管怎樣,
vi可能讓你感到非常莫名其妙, 而且你要確信這麼一點:是書讓你糊,而不是
你低估了學vi的難度.
還有, 找一些諸如\"學vi\"(vilearn),\"vi嚮導\"(vitutor)之類的軟件來幫助你掌握
vi的基本知識.
\r\n<P>2.1 - 有什麼遊戲幫助我們學習vi嗎?
這似乎很無聊, 但是事實上UNIX系統裏面有不少遊戲可以幫助你學習使用vi.這些幫助
主要是一些基本知識. 雖然我還不知道有哪個遊戲可以幫你學習vi的所有命令, 但我
確實知道有一些可以幫助你學習使用 hjkl來移動光標. NetHack,一個類Rogue的遊戲,
就對這非常有幫助. 而且它是一個很大的遊戲,能玩很長一段時間. 我沒有貶低其他遊戲
的意思,這些遊戲是: rogue, moria, omega, worm, snake.)
\r\n<P>2.2 - 命令模式和插入模式有什麼區別?
vi將命令模式和插入模式區分開來,這經常被認爲是vi的一個大問題,但往往這也被認爲是
vi的優勢所在. 理解其中的區別是掌握vi的關鍵.vi啓動時,開始處於命令模式;在這種模式
下,我們可以在文件中到處移動,改變文本的某個特定區域, 剪切, 複製和粘貼文本,還有更
多. 插入模式是指用戶可以真正插入文本.換句話說,命令模式是用來在文件中移動,而插入
模式是用來在文件中鍵入文本. 有些命令,例如: a, i, c, C, O, o和其他一些可以從命令
模式切換到插入模式. &lt;Esc&gt;鍵或者^C(CRTL+C)可以脫離插入模式而返回到命令模.
你要適應這種差別. 它使得vi區別於其他的編輯器. 它也使你能在你的手不離開標準
鍵盤做很多事情.
\r\n<P>2.3 - 等等,我的鍵盤沒有&lt;Esc&gt;鍵,我該怎麼辦?
試試敲 ^[(CTRL+[). 如果你的鍵盤有一個&lt;Meta&gt;鍵,再試試它.如果還不行,再試試^3.
\r\n<P>2.4 - 那些~s是什麼東西?
它們僅僅是用來讓你知道你的文檔末尾在哪兒.實際上它們並不在你的文檔裏面,所以
你用不着擔心它們.
\r\n<P>2.5 - 我無法習慣用 hjkl, 你有什麼建議嗎?
首先,如果你的終端設置正確而且你連接的也沒有問題的話,你可以使用箭頭鍵.但是,
如果你認爲你要經常使用vi,那麼最好是習慣使用 hjkl,因爲它們敲起來更. 而且,
有時候連接出問題了,使得ESC序列都可能丟失了.(這樣你可能就無法使用箭頭鍵了--譯註)
\r\n<P>2.6 - 我如何才能不存盤就退出?
:q!可以做到這一點. 如果vi看起來凍住了,確信你沒有錯敲了個 ^S. 敲^Q可以解開^S.
\r\n<P>2.7 - 我怎樣插入一個文件?
:r &lt;文件名&gt;
例如,要插入文件/etc/motd, 可以敲 :r /etc/motd.
這將把文件插入到光標處.如果你在r前面指定了一個數字,那麼這條命令將把文件插入
到那個位置.
\r\n<P>2.8 - 我怎樣查找文本?
/&lt;文本&gt;將向前查找, ?&lt;文本&gt;將向後查找. ??或者//將重複上次查找. 在UNIX下,這已經
是個可愛的標準用法了. 而且, 在vi中, n將查找文本下一次的出現位置. N重複上次查找,
不過逆轉了查找的方向. 在查找中可以使用規範.
\r\n<P>2.9 - 我怎樣搜索一個控制序列?
/^V^&lt;序列&gt;
^V會告訴vi照字面理解下一個字符,不要把它看作是一條命令.
\r\n<P>2.10 - 我怎樣重新格式化文本?
如果你的計算機有一個名叫fmt的程序, 你要做的僅僅是在命令模式下面敲!}fmt(記住,
不要在前面加. 這可以重新格式化你的文件,從光標所在的位置一直到當前段落的結尾.
如果你的機器裏面沒有fmt這個程序, 你就得去找個類似的軟件了(我記得在公共域裏面
有不少這樣的程序,但是我對此瞭解不多)
\r\n<P>2.11 - 我怎樣複製文本?
這有點複雜.把這節拿出來,多看幾遍;還有,一定要多做實驗.
\"&lt;字母&gt;yy可以把一行文本拷貝到寄存器中(這裏的寄存器是vi的術語,指可以存放剪切和
拷貝下來的東西的地方), &lt;字母&gt;裏面的字母必須是a到z之間的一個. \"&lt;字母&gt;dd可以把
一行剪切下來放到寄存器裏面. 你可以在yy或者dd前面用數字指明要拷貝或者剪切的
行數.如果&lt;字母&gt;中的字母是大寫的話,意味着把文本插入到寄存器中已有的文本之前.
\"&lt;字母&gt;p把文本插入到光標之後,\"&lt;字母&gt;P把文本插入到光標之前.如果寄存器中含有某
一行的開頭或結尾,這一行將會被放到另一合適的行. Y是yy的快捷方式. 還有, y$, yH,
yM,等等,都是可以用的.d命令也是一樣的.如果要快速的剪切和粘貼, 你就無須指定寄存器
了.如果這樣的話,你就不能往寄存器裏面添加文本了.而且只要有一個刪除命令的話,
寄存器中的東西就沒有了(包括x命令). 舉例來說,如果要移動上一段的話,你可以把光標
移到段落的開頭,敲\"a13dd,再把光標移到你想要放文本的地方,敲\"ap,就可以把那段文本
放到光標所在的行後面. 現在,大概你想要剪切和粘貼文本到不是行末尾的區域去.我們
來看如何做到這一點:我們可以使用 m&lt;字母&gt; 命令來標記一個區域,這個字母可以和
剪切/粘貼寄存器的字母相,因爲它們是保存在內存中的不同位置. 然後,
敲\"&lt;寄存器&gt;`&lt;字母&gt;[yy或者dd], 這裏的寄存器就是要保存文本的那個寄存器,&lt;字母&gt;
是用來標記的,yy和dd是你的操作.
\r\n<P>2.12 - 啊! 我剛纔敲了一個dG,然後我的論文就沒有了! 我該怎麼辦?
(或者,我剛纔犯了個錯誤,我該怎麼辦?)
u可以撤消你剛纔的操作.U可以撤消你對當前行的修改(當然,一行對於一篇論文來說當然
很不夠了). :e!可以不保存修改而重新把你的文件調進來. 還有,你刪除的文本都保存在從
0到9編號的寄存器裏.所以,\"&lt;n&gt;p就可以把上第n次的刪除文本粘貼出來.你可以按如下的
方法迅速地查看所有刪除的文. 先試一個,不對的話,敲u,再試下一個.(爲加速這個過程,
這時vi中的.命令和通常的用法不一樣了.它不是重複上次操作,而是試下一個寄存器,這樣
你要做的無非就是: \"1p u . u .,直到你撤消了你想撤消的刪除操作)
\r\n<P>2.13 - 我正在寫我的論文,被告知我必須將每一節都放在不同的文件裏,我該怎麼辦?
:[m],[n]w &lt;文件名&gt;可以將從第m行到第n行之間的文本保存到&lt;文件名&gt;所指定的文件中.
這種行序號方法幾乎在所有的:命令下都可以使用. 如果你用命令:[m],[n] w &gt;&gt;&lt;文件名&gt;,
這些文本將添加到文件的後面.
\r\n<P>2.14 - 所有的:命令都是怎樣處理的?
:後面的命令都是從ex編輯器裏面過來的. 這就給vi加入了很多靈活性,也使vi功能更強
大. 例如, 有很多的方法可以用來查找和替換,它們有很多的類似地方(事實上,它們在
某種意義上說都是一樣的)
\r\n<P>3.0 - 怎樣查找和替換?
有很多方. 最簡單的是:
:s/old/new/g, 但是,這僅對當前行起作用..., 所以,我們用
:%s/old/new/g, 更一般的,我們還可以用
:[範圍]s/old/new/[cg],這裏,[範圍]是任意的行範圍,包括行號,$(文件末尾),.(當前行),
%(當前文件),或者兩個行號之間加個破折號(或者可以這樣: .,+5,這表示下面5行).
[cgi]是c,g,i中間的一個或者什麼也沒有.c告訴vi每次替換的時候要給提示,g是說對
所有一行中出現的地方都做替換.i則是指在查找時不區分大小寫.如果最後一個斜槓(/)
後面沒有東西的話,那麼vi只替換在行中第一次匹配的地方. 我比較喜歡這樣做:
:g/foobar/s/bar/baz/g, 這個命令首先搜尋foobar,然後把它變成foobaz. 它沒有改變
jailbars, 而其他的一些命令可能會改變jailbars. 這是我的方法,但是可能比較難記.
當然,你還可以在查找的的時候使用正規式,以及在替換文本的時候使用其他一些命令.如果
你在正規式裏用\\(和\\)來剝離一個序列的話,你會發現你可以做很多好玩的事情. 例如:
:g/\\(foo\\)\\(bar\\)/s/\\2/\\1baz/g 將foobar替換成foobaz
還有一些特殊的序列:
&amp; 所有查找時匹配到的東西
\\[1-9] 1到9號用\\(和\\)括起來的東西
\\u 下一個字符將被變成大寫.
\\U 以後的字符都變成大寫,直到遇到\\e或\\E
\\l 下一個字符將被變成小.
\\L 以後的字符都變成大寫,直到遇到\\e或\\E
\\[Ee] 更改大小寫的選擇區域的終點
\r\n<P>3.1 - 我怎樣在vi中運行一個程序?
:!命令 可以在vi中運行程序. :sh會啓動一個交互式的外殼(SHELL).在這個外殼
裏面, 如果你願意,你還可以再次運行vi. 當你在編輯Makefiles和配置文件來編譯
某個程序的時候,這可能比較有用. 這比:e優越之處在於它無須保存文件,而且如果
你退出外殼的時候,vi還回到原來的地方.(當然,我還是建議你先保存一下文件)
\r\n<P>3.2 - 啊! 我正在寫我的論文, 系統崩潰了! 怎麼辦?
不要怕! 你會收到一封電子郵件,裏面就是你的論文.敲入vi -r &lt;文件名&gt;
(這個文件名就是系統崩潰時你正在編輯的文件)你就可以恢復出你的論文來.只敲
vi -r將把所有可能恢復的文件都列出來.
\r\n<P>3.3 - 有沒有使vi對程序員更友好的竅門?
:set ai可以讓vi自動對齊.
:set sw=#,#是移動的寬度(shiftwidth),或者說TAB鍵的寬度(tabwidth);你可以
用&lt;&lt;或者&gt;&gt;命令來左移或右移某一行. 還有, 你可以使用 &lt;%或&gt;%來將{,(或[等符號
括起來的文本都左移或右移;這時候,你必須把光標放在這些符號({,(或[)上面.
:set sm會在你敲},]或)顯示出對應匹配的{,[或(來.
:set lisp會對lisp編程有些幫助. ()被移到s表達式(s-expressions)外面,如果
原子(atoms)沒有停止則{}將被移走.
\r\n<P>3.4 - 宏 -- 我怎樣寫宏?
:map &lt;lhs&gt; &lt;rhs&gt;, 其中&lt;lhs&gt;最多10個字符,&lt;rhs&gt;最多100個字符. 以後,如果
你敲了&lt;lhs&gt;,vi就會用&lt;rhs&gt;來取代它.所有的宏都是在命令模式下開始的,但是可以
在你想在的模式下終止. 記住,在你想用的控制字符前面加上^V.
:unmap &lt;lhs&gt;將刪除這個宏. :map!&lt;lhs&gt; &lt;rhs&gt; 使得&lt;lhs&gt;將&lt;rhs&gt;插入到文檔
中去.
\r\n<P>3.5 - 我怎樣將一個功能鍵定義成一個宏?
如果&lt;lhs&gt;是#n,n是0-9之間的一個數,那麼這個宏就映射成某一個功能鍵了.(你
可以試一下F1-F10之間的鍵--譯者)
\r\n<P>3.6 - 有沒有辦法縮寫文本?
當然了. 這可是vi呀,它能做任何事情!
:ab email <A href=\"mailto:[email protected]\"><FONT color=#0000ff>[email protected]</FONT></A> 可以在你敲完email後,把那個沒有縮寫
的文本插入到文件中. :una email取消縮寫.
\r\n<P>3.7 - 我怎樣在當前文檔中做拼寫檢查?
這兒有一個宏可以做到這一點. 這些應該放在你的.exrc文件中(後面我們將對.exrc
進一步討論). 它是一個相當簡單的宏. 它僅僅是調用ispell來處理當前文件.當然,你
的系統裏面一定得有ispell這個程序. 使用它的時候,只需要敲個V鍵就行了(因爲vi並
沒有用V,所以V是一個比較合適的鍵)
\r\n<P>map V :w^M:!ispell % ^M:e!^M^M
第二個^M使你在拼寫檢查完之後無須敲回車就可以到vi中.
(譯註, 在我的系統裏,沒有ispell,只有spell,我用它替換了ispell,工作的不錯;還有,
^M不是兩個字符,而是一個字符,通過^V^M敲進去的;另外,我個人認爲第二個^M還是不要
的好,因爲直接回到vi後你就無法看到拼寫檢查的結果了)
\r\n<P>3.8 - 我手頭有一個硬拷貝的終端, 我還能用vi嗎?
好了,好了. 我並認爲有人會真的問這個問題.這個問題太偏了,我們大可不必理
它.(而且,它回答了一個非常普通的問題)
vi啓動的時候處於一種特殊的模式下面,叫做\"開放模式\"; 在這種狀態下,事情或多或少
的有些不同. 刪除的字符在你面前顯示成一\\\',vi會認爲你的終端窗口只有一行. ^r
可以把當前行重新輸出. z則把當前行周圍的窗口重畫一遍.
\r\n<P>3.9 - 好了,是不是處在開放模式下的原因呀?! 但是我現在沒有用硬拷貝終端,它還是在
開放模式呀?
這兒的問題就是vi沒有認出你用的終端的類型. 於是它假定你有的是個最爛的終端,
所以它決定依然處在開放模式下.這似乎沒什麼用處.因爲沒有多少人喜歡開放模式,但是
開放模式還是需要知道你的終端的一些最起碼的信息的. 現在,我們來看如何解決這個
問題.我們有可能把它分成幾種特殊的情形,但是,一般情況下, 這並沒有用處. 如果你
直到你的終端的類, 你可以在UNIX提示符下面設置終端類型(在CSH及其變種下面,使用
命令setenv TERM &lt;終端類型&gt;;在SH及其變種下面,使用命令TERM=&lt;終端類型&gt;;
export TERM) 最好你能把上面的命令寫在.profile文件或者.cshrc文件裏面,這樣你
一登錄它就自動地給你設置好了.(當然,你應該知道如何使用ed,或者你能在UNIX提示符
下面設置好終端類型以便能使用vi, 這樣你纔有可能去編輯這些文件).如果你確實不
知道你地終端類型,試一試vt100.現在大多數地終端或者終端仿真器都能仿真vt100.
如果這還不能生效的話,你只好去找個高手來幫你了.
\r\n<P>4.0 - vi檔案的在線幫助在哪兒?
有一個vi的FAQ,其中列出了vi檔案的所有在線文件. 同時它還列出了這些文檔
的鏡象站點. 最主要的一個地址是alf.uib.no,但是這些文檔在很多很多地地方
都保存着. vi-archive faq把它們都給列出來了.你在下載這些文件之前一定要
覈對一下這個FAQ.因爲很有可能有一個站點比去挪威的站點更近更快些.
一個鏡象站點是cs.uwp.edu/pub/vi, 另一個是monu6.cc.monash.edu.au/pub/Vi,
這些站點上有很多有關vi的文件,還有一些vi的變種版本;當然,UCB版本的vi是
肯定有的, 還有許多的宏.
\r\n<P>5.0 - 好玩的vi訣竅,好玩的宏
這一節主要講述一些無聊的訣竅和一些無聊的.事實上,任何vi的訣竅和宏我們
都歡迎,只要它們不是過分冗長. 如果有人向我建議而我也認爲確實值得加的話,
我會考慮加進去的.
\r\n<P>5.1 - 好玩的vi訣竅
xp 刪除光標下的字符,再把粘貼到後面去.換句話說,它交換了當前兩個字符
的位置. ddp 和xp類似,不過是交換兩行的位置.
uu 撤消和重複上次所做的修改.(這可以使你不改變什麼東西就可以到你上次所
做的修改處)
\r\n<P>5.2 - 好玩的宏
和垂直上方的字符交換位置
map * kxjphxkP
\r\n<P>折行
map g $80|F r
(譯註,我對這條宏表示疑問!)
\r\n<P>改變大多數單詞的大小寫
map v ywmno:s/./\\~/g
(譯註,這條好象也不大對!)
\r\n<P>在當前的單詞周圍加上`和\'
map *` i`\'
在當前的單詞周圍加上\'和\'
map *\' i\'\'
在當前的單詞周圍加上\"和\"
map *\" i\"\"
(這幾條也太無聊了吧--譯註)
在當前的單詞周圍加上``和``
map! `` `\'
(咦,好象又有問題?--譯註)
\r\n<P>從光標處把當前行分開,在下一行開頭加上一個&gt;號(例如,引用USENET).如果加上了單詞的折行
功能那麼最後一個單詞可能被折在第一行.
map g may0O`ay$:s/./ /g
(不對吧--譯註)
\r\n<P>插入一個字符
map g i$^[r
\r\n<P>6.0 - 依字母順序的vi快速參考
... 是指有些東西需要在命令之前或之後指明.這通常是說光標的移動鍵
(h,j,k,l,w,b等等)或者是指行號.
# (這裏#代表一個數字) 執行n次後面的命令...
: 進入ex模式
) 下一句
( 上一句
} 下一段
{ 上一段
]] 下一節
[[ 上一節
0 行的開頭
$ 行的末尾
^ 行的第一個非空白字符
+ 下一行的開頭
- 上一行的開
(空格) 下一個字符
(回車) 下一行
/ 向前搜索
? 向後搜索
% 查找當前小(中,大)括號的匹配字符
, 逆向重複上一個f,F,t或T操作
; 重複上一個f,F,t或T操作
. 重複上一個操作
` 轉到標記處
\' 轉到標記所在行的開頭
`` 查找前回到上一個做標記的地方
\'\' 查找前回到上一個做標記所在行的開頭
~ 切換字符的大小寫
\" 保存到寄存器中
!! 重複上一次SHELL命令
! 把後面的文本送給命令, 取代輸出(例如, !}fmt把當前的段落
送給命令fmt處理,然後用fmt返回的東西替換輸出.)
&gt;&gt; 右移當前段落一個移動寬度(shiftwidth)
&lt;&lt; 左移當前段落一個移動寬(shiftwidth)
&gt;% 從當前到匹配小(中,大)括號之間的文本右移
&lt;% 從當前到匹配小(中,大)括號之間的文本左移
(似乎漏了一個符號|, 移動到某一列----譯註)
a 在當前位置之後添加
A 在當前行的末尾添加
^a 沒有使用
b 上一個單詞的開頭
B 上一個單詞的開頭,忽略標點符號
^b 上移一屏
c 覆蓋...
C 覆蓋到行末尾
^c 終止插入模式,在命令模式沒有用
d 刪除...
D 刪除到行末尾
\r\n<P>^d 下移半屏,如果在插入模式下則移到上一個移動寬度(ShiftTab)處
e 單詞的末尾
E 單詞的末尾,忽略標點符號
^e 屏幕下卷一行
f 查找...
F 向後查找...
^f 下移一屏
g 未用
G ...跳至[缺省是到文件末尾]
^g 顯示狀態欄
h 左移
H 屏幕上的第一行
^h 在插入模式下是退格,命令模式下是左移
i 在當前的位置前面插入
I 在本行的第一個非空白字符前面插入
^i 插入模式下是製表鍵,命令模式下未用
j 下移
J 把下一行合併到本行
^j 命令模式下是下移,插入模式下是建一個新行
k 上移
K 未用
^k 未用
l 右移
L 屏幕中的最後一行
^l 重繪屏
m 把當前位置標記到寄存器中
M 屏幕的中間行
^m 回車
n 重複上次查找
N 逆向重複上次查找
^n 命令模式下是下移
o 在當前行的下面建一個新行
O 在當前行的上面建一個新行
^o 未用
p 在當前行的下面粘貼
(譯註--應爲在當前位置的後面粘貼)
P 在當前行的上面粘貼
(譯註--應爲在當前位置的前面粘貼)
^p 命令模式下是上移
q 未用
Q 退出並且啓動ex
^q 未用
r 覆蓋當前的字符
R 在插入模式下一直覆蓋字符
^r 在命令模式下面重繪屏幕
s 替換
S 替換整行
t 到...
T 向後到...
^t 移到下一個移動寬度(shifttab)處
u 撤消上一次操
U 撤消對本行的所有修改
^u 上移半屏
v 未用
V 未用
^v 未用
w 下一個單詞的開頭
W 下一個單詞的開頭,忽略標點符號
^w 命令模式下未用,在插入模式下是到上一個單詞的開頭處
x 刪除當前字符
X 刪除前一個字符
^x 未用
y 複製...
Y 複製整行
^y 屏幕上卷一行
z 重新配置當前行周圍的屏幕
ZZ 保存之後退出
^z 未用
(譯註--在命令模式下,^z執行了UNIX暫停操作)
6.1 - 命令模式的輸入選項(:命令)
(注: 這不是一個規範的列表,, 我只是列出了一些最重要的命令)
:r &lt;文件&gt; 把&lt;文件&gt;讀入到當前文檔
:r !&lt;命令&gt; 把&lt;命令&gt;的輸出插入到當前文本中
:nr &lt;文件&gt; 把&lt;文件&gt;插入到第n行
:!&lt;命令&gt; 運行&lt;命令&gt;,然後返回
:sh 轉到SHELL
:so &lt;文件&gt; 讀取&lt;文件&gt;,再執行文件裏面的命令
(譯註--文件中的命令應該都是一些ex命令)
 保存之後退出
:wq 保存之後退出
:l1,l2w &lt;文件&gt;把第l1和第l2行之間的文本寫到&lt;文件&gt;中去,如果沒有指定&lt;文件&gt;,
vi就假定是當前文件,如果沒有指定l1,l2,就假定是整個文件(就成了:w)
:w &gt;&gt; &lt;文&gt; 添加到&lt;文件&gt;末尾. 也可以使用行號
:w! 覆蓋當前文件
:q 退出
:q! 不存盤就退出
:e &lt;文件&gt; 不離開vi編輯&lt;文件&gt;
:e! 重新編輯當前文件,忽略所有的修改
:n 編輯下一個文件
:e +n &lt;文件&gt; 從第n行開始編輯&lt;文件&gt;,如果超過了末尾,就從末尾開始編輯
:e# 編輯替換文件(如果使用了命令:e&lt;文件&gt;,替換文件就指的是原始文件)
:args 顯示所有要編輯的文件
:rew 重新回到第一個編輯的文檔
:map m n 創建一個宏(使 m 做 n)
:map! m n 創建一個插入模式的宏(使 m 做 n)
:unmap m 刪除宏m
:unmap! m 刪除插入模式的宏m
:ab &lt;1&gt; &lt;2&gt; 縮寫,敲&lt;1&gt;的時候&lt;2&gt;取代
:unab &lt;1&gt; 取消縮寫&lt;1&gt;
:set &lt;選項&gt; 設置&lt;選項&gt;...
\r\n<P>6.2 - 設置選項(set) 顯示所有的制
magic magic 可以使用更多的正規表達式
mesg mesg 允許向終端發送消息
number (nu) nonumber 顯示行號
open open 允許開放和可視化
optimize (opt) optimize 優化吞吐量,打印時不發回車
paragraphs= (para=) IPLPPPQPPLIbp 設置{ &amp; }的分界符
prompt prompt 命令模式下的輸入給出:的提示符
readonly (ro) noro 除非用!號否則不準保存文件
redraw noredraw 當編輯的時候重繪屏幕
remap remap 允許宏指向其他的宏
report= 5 如果影響的行數&gt;這個數的話就報告
scroll 1/2 window 下卷屏幕時滾動屏幕的數目,
同樣這也z命令輸出的行數(z 輸出2倍滾屏的大小)
sections= SHNHH HU 定義節的末尾(當使用命令[[ 和 ]] 時)
shell= (sh=) /bin/sh 缺省的SHELL,如果設置了環境變量SHELL的話,就使用變量
shiftwidth= (sw=) 8 當使用移動(shift)命令時移動的字符數
showmatch (sm) nosm 顯示{, }, (, , [, 或者 ] 的匹配情況
showmode noshowmode 顯示你處在什麼模式下面
slowopen (slow) 插入之後不要立刻更新顯示
tabstop= (ts=) 8 設置製表停止位(tabstop)的長度
taglength= (tl=) 0 重要標記的字符個數(0表示所有的字符)
tags= tag, /usr/lib/tags 定義包含標記的文件路
term= 設置終端類型
terse noterse 顯示簡短的錯誤信息
timeout (to) timeout 一秒鐘後鍵盤映射超時
ttytype= 設置終端類型
warn warn 顯示\"No write since last change\"信息
window= (w=) 可視模式下窗口的行數
wrapmargin= (wm=) 0 右邊距,大於0的話最右邊的單詞將折行,留出n個空白位置
wrapscan (ws) ws 查找到文件尾後再重頭開始
writeany (wa) nowa 可以保存到任意一個文件去
\r\n<P>(譯註--這些選項在各種vi版本中都基本上大同小異,以SunOS帶的vi爲例,它沒有這裏列
出來的open選項, scroll的參數值也不同,還多出來一些選項,如flash,modelines,
novice,tagstack等等)
\r\n<P>7.0 - 建立 .exrc文件
所有命令輸入模式下的命令(即 :命令)都可以在.exrc文件中使用,在.exrc中的命令在


: empty register \"q\"
----------------------------------------
\" Useful tricks
\"<A href=\"mailto:ayy@a\"><FONT color=#0000ff>ayy@a</FONT></A>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : execute \"Vim command\" in a text file
yy@\"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : same thing using unnamed register
u@.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : execute command JUST typed in
----------------------------------------
\" Get output from other commands (requires external programs)
:r!ls.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : reads in output of ls
!!date&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : same thing (but replaces/filters current line)
\" Sorting with external sort
:%!sort -u&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : use an external program to filter content
:\'a,\'b!sort -u&nbsp;&nbsp; : use an external program to filter content
!1} sort -u&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : sorts paragraph (note normal mode!!)
----------------------------------------
\" Multiple Files Management (Essential)
:bn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : goto next buffer
:bp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : goto previous buffer
:wn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : save file and move to next (super)
:wp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : save file and move to previous
:bd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : remove file from buffer list (super)
:bun&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Buffer unload (remove window but not from list)
:badd file.c&nbsp;&nbsp;&nbsp;&nbsp; : file from buffer list
:b 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : go to buffer 3
:b main&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : go to buffer with main in name eg main.c (ultra)
:sav php.html&nbsp;&nbsp;&nbsp; : Save current file as php.html and \"move\" to php.html
:sav! %&lt;.bak&nbsp;&nbsp;&nbsp;&nbsp; : Save Current file to alternative extension (old way)
:sav! %:r.cfm&nbsp;&nbsp;&nbsp; : Save Current file to alternative extension
:sav %:s/fred/joe/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : do a substitute on file name
:sav %:s/fred/joe/:r.bak2&nbsp;&nbsp;&nbsp; : do a substitute on file name &amp; ext.
:!mv % %:r.bak&nbsp;&nbsp; : rename current file (DOS use Rename or DEL)
:e!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : return to unmodified file
:w c:/aaa/%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : save file elsewhere
:e #&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : edit alternative file (also cntrl-^)
:rew&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : return to beginning of edited files list (:args)
:brew&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : buffer rewind
:sp fred.txt&nbsp;&nbsp;&nbsp;&nbsp; : open fred.txt into a split
:sball,:sb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Split all buffers (super)
:scrollbind&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : in each split window
:map&nbsp;&nbsp; &lt;F5&gt; :ls&lt;CR&gt;:e # : Pressing F5 lists all buffer, just type number
:set hidden&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Allows to change buffer w/o saving current buffer
----------------------------------------
\" Quick jumping between splits
map &lt;C-J&gt; &lt;C-W&gt;j&lt;C-W&gt;_
map &lt;C-K&gt; &lt;C-W&gt;k&lt;C-W&gt;_
----------------------------------------
\" Recording (BEST TIP of ALL)
qq&nbsp; # record to q
your complex series of commands
q&nbsp;&nbsp; # end recording
@q to execute
@@ to Repeat
5@@ to Repeat 5 times
\" editing a register/recording
\"qp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :display contents of register q (normal mode)
&lt;ctrl-R&gt;q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :display contents of register q (insert mode)
\" you can now see recording contents, edit as required
\"qdd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :put changed contacts back into q
@q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :execute recording/register q
\" Operating a Recording on a Visual BLOCK
1) define recording/register
qq:s/ to/ from/g^Mq
2) Define Visual BLOCK
V}
3) hit : and the following appears
:\'&lt;,\'&gt;
4)Complete as follows
:\'&lt;,\'&gt;norm @q
----------------------------------------
\"combining a recording with a map (to end up in command mode)
nnoremap ] @q:w!&lt;bar&gt;bd
----------------------------------------
\" Visual is the newest and usually the most intuitive editing mode
\" Visual basics
v&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : enter visual mode
V&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : visual mode whole line
&lt;C-V&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : enter VISUAL BLOCK mode
gv&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : reselect last visual area (ultra)
o&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : navigate visual area
\"*y&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : yank visual area into paste buffer
V%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : visualise what you match
V}J&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Join Visual block (great)
V}gJ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Join Visual block w/o adding spaces
----------------------------------------
\" Delete first 2 characters of 10 successive lines
0&lt;c-v&gt;10j2ld
----------------------------------------
\" how to copy a set of columns using VISUAL BLOCK
\" visual block (AKA columnwise selection) (NOT BY ordinary v command)
&lt;C-V&gt; then select \"column(s)\" with motion commands (win32 &lt;C-Q&gt;)
then c,d,y,r etc
----------------------------------------
\" 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 &lt;esc&gt;
----------------------------------------
\" _vimrc essentials
:set incsearch : jumps to search word as you type (annoying but excellent)
:set wildignore=*.o,*.obj,*.bak,*.exe : tab complete now ignores these
:set shiftwidth=3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : for shift/tabbing
:set vb t_vb=\".&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : set silent (no beep)
:set browsedir=buffer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Maki GUI File Open use current directory
----------------------------------------
\" launching Win IE
:nmap ,f :update&lt;CR&gt;:silent !start c:\\progra~1\\intern~1\\iexplore.exe <A href=\"file://%:p<CR/\"><FONT color=#0000ff>file://%:p&lt;CR</FONT></A>&gt;
:nmap ,i :update&lt;CR&gt;: !start c:\\progra~1\\intern~1\\iexplore.exe &lt;cWORD&gt;&lt;CR&gt;
----------------------------------------
\" FTPing from VIM
cmap ,r&nbsp; :Nread <A href=\"ftp://209.51.134.122/public_html/index.html\"><FONT color=#0000ff>ftp://209.51.134.122/public_html/index.html</FONT></A>
cmap ,w&nbsp; :Nwrite <A href=\"ftp://209.51.134.122/public_html/index.html\"><FONT color=#0000ff>ftp://209.51.134.122/public_html/index.html</FONT></A>
gvim <A href=\"ftp://www.somedomain.com/index.html\"><FONT color=#0000ff>ftp://www.somedomain.com/index.html</FONT></A> # uses netrw.vim
----------------------------------------
\" appending to registers (use CAPITAL)
\" yank 5 lines into \"a\" then add a further 5
\"a5yy
10j
\"A5yy
----------------------------------------
[I&nbsp;&nbsp;&nbsp;&nbsp; : show lines matching word under cursor &lt;cword&gt; (super)
----------------------------------------
\" Conventional Shifting/Indenting
:\'a,\'b&gt;&gt;
\" visual shifting (builtin-repeat)
:vnoremap &lt; &lt;gv
:vnoremap &gt; &gt;gv
\" Block shifting (magic)
&gt;i{
&gt;a{
\" also
&gt;% and &lt;%
----------------------------------------
\" Redirection &amp; Paste register *
:redir @*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : redirect commands to paste buffer
:redir END&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : end redirect
:redir &gt;&gt; out.txt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : redirect to a file
\" Working with Paste buffer
\"*yy&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : yank to paste
\"*p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : insert from paste buffer
\" yank to paste buffer (ex mode)
:\'a,\'by*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Yank range into paste
:%y*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Yank whole buffer into paste
:.y*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Yank Current line to paster
\" filter non-printable characters from the paste buffer
\" useful when pasting from some gui application
:nmap &lt;leader&gt;p :let @* = substitute(@*,\'[^[:print:]]\',\'\',\'g\')&lt;cr&gt;\"*p
----------------------------------------
\" Re-Formatting text
gq}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Format a paragraph
gqap&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Format a paragraph
ggVGgq&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Reformat entire file
Vgq&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : current line
\" break lines at 70 chars, if possible after a ;
:s/.\\{,69\\};\\s*\\|.\\{,69\\}\\s\\+/&amp;\\r/g
----------------------------------------
\" Operate command over multiple files
:argdo %s/foo/bar/e&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : operate on all files in :args
:bufdo %s/foo/bar/e
:windo %s/foo/bar/e
:argdo exe \'%!sort\'|w!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : include an external command
----------------------------------------
\" Command line tricks
gvim -h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : help
ls | gvim -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : edit a stream!!
cat xx | gvim - -c \"v/^\\d\\d\\|^[3-9]/d \" : filter a stream
gvim -o file1 file2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : open into a split
\" execute one command after opening file
gvim.exe -c \"/main\" joe.c&nbsp; : Open joe.c &amp; jump to \"main\"
\" execute multiple command on a single file
vim -c \"%s/ABC/DEF/ge | update\" file1.c
\" execute multiple command on a group of files
vim -c \"argdo %s/ABC/DEF/ge | update\" *.c
\" remove blocks of text from a series of files
vim -c \"argdo /begin/+1,/end/-1g/^/d | update\" *.c
\" Automate editing of a file (Ex commands in convert.vim)
vim -s \"convert.vim\" file.c
#load VIM without .vimrc and plugins (clean 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
\" print paste contents to default printer
gvim -c \'s/^/\\=@*/|hardcopy!|q!\'
\" gvim\'s use of external grep (win32 or *nix)
:grep somestring *.php&nbsp;&nbsp;&nbsp;&nbsp; : creates a list of all matching files
\" use :cn(ext) :cp(rev) to navigate list
:h grep
----------------------------------------
\" GVIM Difference Function (Brilliant)
gvim -d file1 file2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : vimdiff (compare differences)
dp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : \"put\" difference under cursor to other file
do&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : \"get\" difference under cursor from other file
----------------------------------------
\" Vim traps
In regular expressions you must backslash + (match 1 or more)
In regular expressions you must backslash | (or)
In regular expressions you must backslash ( (group)
In regular expressions you must backslash { (count)
/fred\\+/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : matches fred/freddy but not free
/\\(fred\\)\\{2,3}/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : note what you have to break
----------------------------------------
\" \\v or very magic (usually) reduces backslashing
/codes\\(\\n\\|\\s\\)*where&nbsp; : normal regexp
/\\vcodes(\\n|\\s)*where&nbsp;&nbsp; : very magic
----------------------------------------
\" pulling objects onto command/search line (SUPER)
&lt;C-R&gt;&lt;C-W&gt; : pull word under the cursor into a command line or search
&lt;C-R&gt;&lt;C-A&gt; : pull WORD under the cursor into a command line or search
&lt;C-R&gt;-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : pull small register (also insert mode)
&lt;C-R&gt;[0-9a-z]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : pull named registers (also insert mode)
&lt;C-R&gt;%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : pull file name (also #) (also insert mode)
&lt;C-R&gt;=somevar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : pull contents of a variable (eg :let sray=\"ray[0-9]\")
----------------------------------------
\" manipulating registers
:let @a=@_&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : clear register a
:let @a=\"\"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : clear register a
:let @*=@a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : copy register a to paste buffer
map&nbsp;&nbsp; &lt;f11&gt; \"qyy:let @q=@q.\"zzz\"
----------------------------------------
\" help for help (USE TAB)
:h quickref&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : VIM Quick Reference Sheet (ultra)
:h tips&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Vim\'s own Tips Help
:h visual&lt;C-D&gt;&lt;tab&gt;&nbsp;&nbsp;&nbsp;&nbsp; : obtain&nbsp; list of all visual help topics
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Then use tab to step thru them
:h ctrl&lt;C-D&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : list help of all control keys
:helpg uganda&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : grep HELP Files use :cn, :cp to find next
:h :r&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : help for :ex command
:h CTRL-R&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : normal mode
:h /\\r&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : what\'s \\r in a regexp (matches a &lt;CR&gt;)
:h <A href=\"file://zs/\"><FONT color=#0000ff>\\\\zs</FONT></A>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : double up backslash to find \\zs in help
:h i_CTRL-R&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : help for say &lt;C-R&gt; in insert mode
:h c_CTRL-R&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : help for say &lt;C-R&gt; in command mode
:h v_CTRL-V&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : visual mode
:h tutor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : VIM Tutor
&lt;C-[&gt;, &lt;C-T&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Move back &amp; Forth in HELP History
gvim -h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : VIM Command Line Help
----------------------------------------
\" where was an option set
:scriptnames&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : list all plugins, _vimrcs loaded (super)
:verbose set history?&nbsp;&nbsp; : reveals value of history and where set
:function&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : list functions
:func SearchCompl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : List particular function
----------------------------------------
\" making your own VIM help
:helptags /vim/vim64/doc&nbsp; : rebuild all *.txt help files in /doc
:help add-local-help
----------------------------------------
\" running file thru an external program (eg php)
map&nbsp;&nbsp; &lt;f9&gt;&nbsp;&nbsp; :w&lt;CR&gt;:!c:/php/php.exe %&lt;CR&gt;
map&nbsp;&nbsp; &lt;f2&gt;&nbsp;&nbsp; :w&lt;CR&gt;:!perl -c %&lt;CR&gt;
----------------------------------------
\" capturing output of current script in a separate buffer
:new | r!perl #&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : opens new buffer,read other buffer
:new! x.out | r!perl #&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : same with named file
:new+read!ls
----------------------------------------
\" create a new buffer, paste a register \"q\" into it, then sort new buffer
:new +put q|%!sort
----------------------------------------
\" Inserting DOS Carriage Returns
:%s/$/\\&lt;C-V&gt;&lt;C-M&gt;&amp;/g&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :&nbsp; that\'s what you type
:%s/$/\\&lt;C-Q&gt;&lt;C-M&gt;&amp;/g&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :&nbsp; for Win32
:%s/$/\\^M&amp;/g&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :&nbsp; what you\'ll see where ^M is ONE character
----------------------------------------
\" automatically delete trailing Dos-returns,whitespace
autocmd BufRead * silent! %s/[\\r \\t]\\+$//
autocmd BufEnter *.php :%s/[ \\t\\r]\\+$//e
----------------------------------------
\" perform an action on a particular file or file type
autocmd VimEnter c:/intranet/note011.txt normal! ggVGg?
autocmd FileType *.pl exec(\'set fileformats=unix\')
----------------------------------------
\" Retrieving last command line command for copy &amp; pasting into text
i&lt;c-r&gt;:
\" Retrieving last Search Command for copy &amp; pasting into text
i&lt;c-r&gt;/
----------------------------------------
\" more completions
&lt;C-X&gt;&lt;C-F&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :insert name of a file in current directory
----------------------------------------
\" Substituting a Visual area
\" select visual area as usual (:h visual) then type :s/Emacs/Vim/ etc
:\'&lt;,\'&gt;s/Emacs/Vim/g&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : REMEMBER you dont type the \'&lt;.\'&gt;
gv&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Re-select the previous visual area (ULTRA)
----------------------------------------
\" inserting line number into file
:g/^/exec \"s/^/\".strpart(line(\".\").\"&nbsp;&nbsp;&nbsp; \", 0, 4)
:%s/^/\\=strpart(line(\".\").\"&nbsp;&nbsp;&nbsp;&nbsp; \", 0, 5)
:%s/^/\\=line(\'.\'). \' \'
----------------------------------------
#numbering lines VIM way
:set number&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : show line numbers
:map &lt;F12&gt; :set number!&lt;CR&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Show linenumbers flip-flop
:%s/^/\\=strpart(line(\'.\').\"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \",0,&amp;ts)
#numbering lines (need Perl on PC) starting from arbitrary number
:\'a,\'b!perl -pne \'BEGIN{$a=223} substr($_,2,0)=$a++\'
#Produce a list of numbers
#Type in number on line say 223 in an empty file
qqmnYP`n^Aq&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : in recording q repeat with @q
\" increment existing numbers to end of file (type &lt;c-a&gt; as 5 characters)
:.,$g/^\\d/exe \"normal! \\&lt;c-a&gt;\"
\" advanced incrementing
<A href=\"http://vim.sourceforge.net/tip_view.php?tip_id=150\"><FONT color=#0000ff>http://vim.sourceforge.net/tip_view.php?tip_id=150</FONT></A>
----------------------------------------
\" advanced incrementing (really useful)
\" put following in _vimrc
let g:I=0
function! INC(increment)
let g:I =g:I + a:increment
return g:I
endfunction
\" eg create list starting from 223 incrementing by 5 between markers a,b
:let I=223
:\'a,\'bs/^/\\=INC(5)/
\" create a map for INC
cab viminc :let I=223 \\| \'a,\'bs/$/\\=INC(5)/
----------------------------------------
\" generate a list of numbers&nbsp; 23-64
o23&lt;ESC&gt;qqYp&lt;C-A&gt;q40@q
----------------------------------------
\" editing/moving within current insert (Really useful)
&lt;C-U&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : delete all entered
&lt;C-W&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : delete last word
&lt;HOME&gt;&lt;END&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : beginning/end of line
&lt;C-LEFTARROW&gt;&lt;C-RIGHTARROW&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : jump one word backwards/forwards
&lt;C-X&gt;&lt;C-E&gt;,&lt;C-X&gt;&lt;C-Y&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : scroll while staying put in insert
----------------------------------------
#encryption (use with care: DON\'T FORGET your KEY)
:X&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : you will be prompted for a key
:h :X
----------------------------------------
\" modeline (make a file readonly etc) must be in first/last 5 lines
// vim:noai:ts=2:sw=4:readonly:
\" vim:ft=html:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : says use HTML Syntax highlighting
:h modeline
----------------------------------------
\" Creating your own GUI Toolbar entry
amenu&nbsp; Modeline.Insert\\ a\\ VIM\\ modeline &lt;Esc&gt;&lt;Esc&gt;ggOvim:ff=unix ts=4 ss=4&lt;CR&gt;vim60:fdm=marker&lt;esc&gt;gg
----------------------------------------
\" A function to save word under cursor to a file
function! SaveWord()
&nbsp;&nbsp; normal yiw
&nbsp;&nbsp; exe \':!echo <A href=\"mailto:\'.@0.\'\"><FONT color=#0000ff>\'.@0.\'</FONT></A> &gt;&gt; word.txt\'
endfunction
map ,p :call SaveWord()
----------------------------------------
\" function to delete duplicate lines
function! Del()
&nbsp;if getline(\".\") == getline(line(\".\") - 1)
&nbsp;&nbsp; norm dd
&nbsp;endif
endfunction
\r\n<P>:g/^/ call Del()
----------------------------------------
\" Digraphs (non alpha-numerics)
:digraphs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : display table
:h dig&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : help
i&lt;C-K&gt;e\'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : enters ?i&lt;C-V&gt;233&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : enters ?(Unix)
i&lt;C-Q&gt;233&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : enters ?(Win32)
ga&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : View hex value of any character
#Deleting non-ascii characters (some invisible)
:%s/[&lt;C-V&gt;128-&lt;C-V&gt;255]//gi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : where you have to type the Control-V
:%s/[€-]//gi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Should see a black square &amp; a dotted y
:%s/[&lt;C-V&gt;128-&lt;C-V&gt;255&lt;C-V&gt;01-&lt;C-V&gt;31]//gi : All pesky non-asciis
:exec \"norm /[\\x00-\\x1f\\x80-\\xff]/\"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : same thing
#Pull a non-ascii character onto search bar
yl/&lt;C-R&gt;\"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :
----------------------------------------
\" All file completions grouped (for example main_c.c)
:e main_&lt;tab&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : tab completes
gf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : open file under cursor&nbsp; (normal)
main_&lt;C-X&gt;&lt;C-F&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : include NAME of file in text (insert mode)
----------------------------------------
\" Complex Vim
\" swap two words
:%s/\\&lt;\\(on\\|off\\)\\&gt;/\\=strpart(\"offon\", 3 * (\"off\" == submatch(0)), 3)/g
\" swap two words
:vnoremap &lt;C-X&gt; &lt;Esc&gt;`.``gvP``P
----------------------------------------
\" Convert Text File to HTML
:runtime! syntax/2html.vim&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : convert txt to html
:h 2html
----------------------------------------
\" VIM has internal grep
:grep some_keyword *.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : get list of all c-files containing keyword
:cn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : go to next occurrence
----------------------------------------
\" Force Syntax coloring for a file that has no extension .pl
:set syntax=perl
\" Remove syntax coloring (useful for all sorts of reasons)
:set syntax off
\" change coloring scheme (any file in ~vim/vim??/colors)
:colorscheme blue
\" Force HTML Syntax highlighting by using a modeline
\" vim:ft=html:
----------------------------------------
:set noma (non modifiable)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Prevents modifications
:set ro (Read Only)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Protect a file from unintentional writes
----------------------------------------
\" Sessions (Open a set of files)
gvim file1.c file2.c lib/lib.h lib/lib2.h : load files for \"session\"
:mksession&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Make a Session file (default Session.vim)
:q
gvim -S Session.vim&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Reload all files
----------------------------------------
#tags (jumping to subroutines/functions)
taglist.vim&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : popular plugin
:Tlist&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : display Tags (list of functions)
&lt;C-]&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : jump to function under cursor
----------------------------------------
\" columnise a csv file for display only as may crop wide columns
:let width = 20
:let fill=\' \' | while strlen(fill) &lt; 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)
&nbsp;&nbsp;&nbsp; execute \'match Keyword /^\\([^,]*,\\)\\{\'.a:x.\'}\\zs[^,]*/\'
&nbsp;&nbsp;&nbsp; execute \'normal ^\'.a:x.\'f,\'
endfunction
command! -nargs=1 Csv :call CSVH(&lt;args&gt;)
\" call with
:Csv 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : highlight fifth column
----------------------------------------
\" folding : hide sections to allow easier comparisons
zf}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : fold paragraph using motion
v}zf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : fold paragraph using visual
zf\'a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : fold to mark
zo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : open fold
zc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : re-close fold
----------------------------------------
\" displaying \"invisible characters\"
:set list
:h listchars
----------------------------------------
\" How to paste \"normal commands\" w/o entering insert mode
:norm qqy$jq
----------------------------------------
\" manipulating file names
:h filename-modifiers&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : help
:w %&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : write to current file name
:w %:r.cfm&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : change file extention to .cfm
:!echo %:p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : full path &amp; file name
:!echo %:p:h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : full path only
:!echo %:t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : filename only
:reg %&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : display filename
&lt;C-R&gt;%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : insert filename (insert mode)
\"%p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : insert filename (normal mode)
/&lt;C-R&gt;%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Search for file name in text
----------------------------------------
\" delete without destroying default buffer contents
\"_d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : what you\'ve ALWAYS wanted
\"_dw&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : eg delete word (use blackhole)
----------------------------------------
\" pull full path name into paste buffer for attachment to email etc
nnoremap &lt;F2&gt; :let @*=expand(\"%:p\")&lt;cr&gt; :unix
nnoremap &lt;F2&gt; :let @*=substitute(expand(\"%:p\"), \"/\", \"\\\\\", \"g\")&lt;cr&gt; :win32
----------------------------------------
\" Simple Shell script to rename files w/o leaving vim
$ vim
:r! ls *.c
:%s/\\(.*\\).c/mv &amp; \\1.bla
:w !sh
:q!
----------------------------------------
\" count words in a text file
g&lt;C-G&gt;
----------------------------------------
\" example of setting your own highlighting
:syn match DoubleSpace \"&nbsp; \"
:hi def DoubleSpace guibg=#e0e0e0
----------------------------------------
\" reproduce previous line word by word
imap ]&nbsp; @@@&lt;ESC&gt;hhkyWjl?@@@&lt;CR&gt;P/@@@&lt;CR&gt;3s
nmap ] <A href=\"mailto:i@@@<ESC>hhkyWjl?@@@<CR>P/@@@<CR>3s\"><FONT color=#0000ff>i@@@&lt;ESC&gt;hhkyWjl?@@@&lt;CR&gt;P/@@@&lt;CR&gt;3s</FONT></A>
\" Programming keys depending on file type
:autocmd bufenter *.tex map &lt;F1&gt; :!latex %&lt;CR&gt;
:autocmd bufenter *.tex map &lt;F2&gt; :!xdvi -hush %&lt;.dvi&amp;&lt;CR&gt;
----------------------------------------
\" reading Ms-Word documents, requires antiword
:autocmd BufReadPre *.doc set ro
:autocmd BufReadPre *.doc set hlsearch!
:autocmd BufReadPost *.doc %!antiword \"%\"
----------------------------------------
\" a folding method
vim: filetype=help foldmethod=marker foldmarker=&lt;&lt;&lt;,&gt;&gt;&gt;
A really big section closed with a tag &lt;&lt;&lt; 
--- remember folds can be nested --- 
Closing tag &gt;&gt;&gt; 
----------------------------------------
\" Just Another Vim Hacker JAVH
vim -c \":%s%s*%Cyrnfr)fcbafbe[Oenz(Zbbyranne%|:%s)[[()])-)Ig|norm Vg?\"
----------------------------------------
__END__
----------------------------------------
If you liked these please return to <A href=\"http://www.vim.org/\"><FONT color=#0000ff>www.vim.org</FONT></A>
and vote for this tip (It does encourage me!!)
Tip 305
----------------------------------------
Please email any errors, tips etc to
<A href=\"mailto:[email protected]\"><FONT color=#0000ff>[email protected]</FONT></A>
----------------------------------------
updated version at <A href=\"http://www.rayninfo.co.uk/vimtips.html\"><FONT color=#0000ff>http://www.rayninfo.co.uk/vimtips.html</FONT></A>
----------------------------------------
\" Information Sources
----------------------------------------
<A href=\"http://www.vim.org/\"><FONT color=#0000ff>www.vim.org</FONT></A>
comp.editors \"VIM\" newsgroup
groups.yahoo.com/group/vim \"VIM\" specific newsgroup
VIM Webring
Vim Book
Searchable VIM Doc
VIM FAQ
VimTips PDF Version
----------------------------------------
\" : commands to neutralise &lt; for HTML display and publish
\" use yy@\" to execute following commands
:w!|sav! vimtips.html|:/^__BEGIN__/,/^__END__/s#&lt;#\\&lt;#g|:w!|/vimtips[f]tp/|:!vimtipsftp
----------------------------------------
&nbsp;
\r\n<P>&nbsp;
\r\n<P>&nbsp;
\r\n<P>created:&nbsp;&nbsp; March 23, 2002 3:15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; complexity:&nbsp;&nbsp; intermediate
author:&nbsp;&nbsp; Arun Easi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; as of Vim:&nbsp;&nbsp; 5.7
\r\n<P>:g is something very old and which is very powerful. I just wanted to illustrate the use of it
with some examples. Hope, it will be useful for someone.
\r\n<P>Brief explanation for \":g\"
-------------------------
Syntax is:
&nbsp;&nbsp;&nbsp; :[range]:g/&lt;pattern&gt;/[cmd]
You can think the working as, for the range (default whole file), execute
the colon command(ex) \"cmd\" for the lines matching &lt;pattern&gt;. Also, for all
lines that matched the pattern, \".\" is set to that particular line (for
certain commands if line is not specified \".\" (current line) is assumed).
\r\n<P>Some examples
-------------
Display context (5 lines) for all occurences of a pattern
&nbsp;&nbsp;&nbsp; :g/&lt;pattern&gt;/z#.5
&nbsp;&nbsp;&nbsp; :g/&lt;pattern&gt;/z#.5|echo \"==========\"
&nbsp;&nbsp;&nbsp; &lt;&lt; same as first, but with some beautification &gt;&gt;
Delete all lines matching a pattern
&nbsp;&nbsp;&nbsp; :g/&lt;pattern&gt;/d
Delete all blank lines (just an example for above)
&nbsp;&nbsp;&nbsp; :g/^\\s*$/d
Double space the file
&nbsp;&nbsp;&nbsp; :g/^/pu =\\\"\\n\\\"
&nbsp;&nbsp;&nbsp; :g/^/pu _
&nbsp;&nbsp;&nbsp; &lt;&lt; the above one also works &gt;&gt;
Copy all lines matching a pattern to end of file
&nbsp;&nbsp;&nbsp; :g/&lt;pattern&gt;/t$
Yank all lines matching a pattern to register \'a\'
&nbsp;&nbsp;&nbsp; 0\"ay0:g/&lt;pattern&gt;/y A
Increment the number items from current line to end-of-document by one
&nbsp;&nbsp;&nbsp; :.,$g/^\\d/exe \"normal! \\&lt;c-a&gt;\"
Comment (C) lines containing \"DEBUG\" statements
&nbsp;&nbsp;&nbsp; g/^\\s*DEBUG/exe \"norm! I/* \\&lt;Esc&gt;A */\\&lt;Esc&gt;\"
A Reverse lookup for records
(eg: An address book, with Name on start-of-line and fields after a space)
&nbsp;&nbsp;&nbsp; :g/&lt;patern&gt;?^\\w?p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \"if only name is interested
&nbsp;&nbsp;&nbsp; :g/&lt;patern&gt;/ka|?^\\w?p|\'ap&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \"if name and the lookup-line is interested
&nbsp;&nbsp;&nbsp; :g/&lt;patern&gt;/?^\\w?|+,/^[^ ]/-1p&nbsp; \"if entire record is interested
Reverse a file (just to show the power of \'g\')
&nbsp;&nbsp;&nbsp; :g/^/m0
\r\n<P>Foot note 1: use :v to negate the search pattern
Foot note 2: Some explanation of commonly used commands with :g
:2,8co15 =&gt; Copy lines 2 through 8 after line 15
:4,15t$&nbsp; =&gt; Copy linesa 4 through 15 towards end of document (t == co)
&nbsp;&nbsp;&nbsp; :-t$&nbsp; =&gt; Copy previous line to end of document
&nbsp;&nbsp;&nbsp;&nbsp; :m0&nbsp; =&gt; Move current line to the top of the document
:.,+3m$-1 =&gt; Move current line through cur-line+3 to the last but one line
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; of the document
Foot note 3: Commands used with :g are ex commands, so a help search should
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; be,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :help :&lt;help-topic&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eg. :help :k
\r\n<P>&nbsp; rate this tip&nbsp; Life Changing Helpful Unfulfilling
\r\n<P>&lt;&lt;Edit file under cursor after a horizontal split | Deleting nested reply threads in emails &gt;&gt;
\r\n<P>Additional Notes
&nbsp;<A href=\"mailto:[email protected]\"><FONT color=#0000ff>[email protected]</FONT></A>, March 28, 2002 7:10
Thanx Karma for extending my g// knowledge
\r\n<P>Here\'s a very useful g// for day to day use
\r\n<P>:\'a,\'bg/pattern/s/pattern2/string3/gi
\r\n<P>zzapper


Here\'s something very curious:\r\n:%s/foo/bar/gc
is of course a substitution effective for the entire file
with confirm on each occurrence of \"foo\"
with the option of quitting at any point.\r\nHowever, using something similar,\r\n:g/foo/s//bar/gc
using the global g to effect the entire file --
does NOT allow quitting at any point
(even with the use of <ESC>).\r\nIf there are hundreds of \"foo\" -- it\'s an important fine point...\r\nInvite further comments...
Arun Easi, April 23, 2002 23:33
g/foo/s//bar/gc => run the command s//bar/gc for each of the line
matching foo. It is like running multiple \"s//\" commands (Hence
you have to press q for each of the invocation). The
g in \"s///gc\" does not imply entire file, it just implies all occurence
on a line (or else, it would have substituted only the first)
[email protected], May 30, 2002 9:04
Here is one that deletes every other line (adjusting double spaced files):\r\n:g/.*/norm jdd\r\npagaltzis()gmx_de, August 6, 2002 15:12
This can be done much simpler:\r\n:%norm jdd
[email protected], February 10, 2003 4:49
Another cool g feature is to count the number of lines matching /regexp/\r\nlet x=0 | g/regexp/let x=x+1
echo x\r\nGreat, if you are editing data files.\r\nRegards
Mike
[email protected], March 27, 2003 2:14
Reverse all the lines in a file:\r\n:g/^/m0\r\nI have found that useful . . . honest!\r\nPK\r\[email protected], September 3, 2003 5:06
Can I do something like this using \":g\" (or anything else)\r\nI have a file which contains following kind of lines\r\nabc123=1,2,3
bcd123=100,200,300
abcb123=1,3,4\r\nI want to convert this to following\r\nabc123=1,abc,2,abc,3,abc
bcd123=100,bcd,200,bcd,300,bcd
abcb123=1,abcb,3,abcb,4,abcb\r\nBasically I want to replace each comma in a line with first few letters, which are coming before 123, of that line surrounded by 2 commas.
Anonymous, September 3, 2003 12:45
To answer  kkgahlot\'s question:\r\nglobal // execute \"s/\\\\([=,][^,]*\\\\)/\\\\1, \" . matchstr (getline (\".\"), \"^.\\\\{-}\\\\(123\\\\)\\\\@=\") . \"/g\"\r\nTo make the whole thing a little more transparent some explanations (from the inside out):\r\nWe want to execute on each line a command like\r\ns/\\([=,][^,]*\\)/\\1, abc/g\r\nfor each line, but abc gets changed on each line.\r\nThe function\r\nmatchstr (getline (\".\"), \"^.\\\\{-}\\\\(123\\\\)\\\\@=\")\r\nreturns the string that matches the pattern /^.\\{-}\\(123)\\@=/ on the current line. In the given examples this is the text preceding 123= at the beginning of the line. Depending on the actual requierements, a simpler expression like /^[a-z]*/ could work too.\r\nThe command\r\nexecute \"s/\\\\([=,][^,]*\\\\)/\\\\1, \" . matchstr (getline (\".\"), \"^.\\\\{-}\\\\(123\\\\)\\\\@=\") . \"/g\"\r\nassembles the desired substitute command for the current line by joining some static text with the return value of the matchstr function and then executes it.\r\nAs execute works only on the current line, the command\r\nglobal // execute ...\r\napplies it to all line. If only certain lines should be proecessed replace // with some other pattern.\r\[email protected], November 21, 2003 10:39
Reverting lines in a file can also be done via
:%!tac\r\ninstead of tac, you can also use sort, xxd, xxd -r, cut, your-own-filter
Anonymous, March 29, 2004 7:18
too bad :g does not have a /c parameter for confirmed execution of ex commands. Something like the /c used in :<range>s/<PAT>/<REPL>/c for replacing only confirmed pattern locations.\r\nor does it ??
[email protected], April 14, 2004 10:06
I just want to add that the :g command in vi/ed is the basis for the name for the Unix grep command, i.e. Global Regular Expression Print.  The \"Print\" part described the default behaviour of :g when no command was given.  Obviously this behaviour was more useful when using ed.
[email protected], August 16, 2004 23:55
Thank you for the tip
發信人: smartiger (天才虎), 信區: Linux
標  題: 解釋一下vi的一個高級用法
發信站: BBS 水木清華站 (Tue Jan 14 12:14:54 2003), 轉信\r\n:v/./$s/$/<ctrl-v><enter>./|\'\';/./-1j|$d
         Replaces multiple blank lines with just one blank line.\r\n請問如何解釋,特別是|和;\r\n--\r\n                  RedHat   8.0         Slackware  8.0
                  Mandrake 9.0         Debian     2.2r6
                  Xteam    4.0         RedFlag    3.0\r\n                            SmarTiger\r\n※ 來源:·BBS 水木清華站 smth.edu.cn·[FROM: 210.138.200.6]
發信人: sk8er (TRUE SK8ER), 信區: Linux
標  題: Re: 解釋一下vi的一個高級用法
發信站: BBS 水木清華站 (Tue Jan 14 16:32:33 2003), 轉信\r\n我試了一下,這個好像不像你所說的那樣工作。
:v/./$ 把整個文檔都選中了,然後用 s 替換……怎麼搞的……看不懂。\r\n還不如用\r\n:%s/\\(\\n\\s*\\)\\{2,}/\\r\\r/g\r\n來刪除多餘的空行。\r\n【 在 smartiger (天才虎) 的大作中提到: 】
:          Replaces multiple blank lines with just one blank line.
: 請問如何解釋,特別是|和;\r\n--
People will buy anything that\'s one to a customer.\r\n※ 修改:·sk8er 於 Jan 14 16:33:55 修改本文·[FROM:  166.111.140.66]
※ 來源:·BBS 水木清華站 smth.edu.cn·[FROM: 166.111.140.66]
發信人: yeshao (葉少·HP加滿了!), 信區: Linux
標  題: Re: 解釋一下vi的一個高級用法
發信站: BBS 水木清華站 (Tue Jan 14 16:34:07 2003), 轉信\r\n :g/^[[:blank:]]*$/d
【 在 sk8er (TRUE SK8ER) 的大作中提到: 】
: 我試了一下,這個好像不像你所說的那樣工作。
: 還不如用
: 來刪除多餘的空行。\r\n--\r\n痛苦和驕傲,這一生都要擁有\r\n※ 來源:·BBS 水木清華站 smth.edu.cn·[FROM: 202.112.55.84]
發信人: sk8er (TRUE SK8ER), 信區: Linux
標  題: Re: 解釋一下vi的一個高級用法
發信站: BBS 水木清華站 (Tue Jan 14 16:36:10 2003), 轉信\r\n你把空行全刪掉了
他還想爲多個留一個空行\r\n【 在 yeshao (葉少·HP加滿了!) 的大作中提到: 】
:  :g/^[[:blank:]]*$/d\r\n--
New York now leads the world\'s great cities in the number of people around
whom you shouldn\'t make a sudden move.
                -- David Letterman\r\n※ 來源:·BBS 水木清華站 smth.edu.cn·[FROM: 166.111.140.66]
發信人: scaner (沉默), 信區: Linux
標  題: Re: 解釋一下vi的一個高級用法
發信站: BBS 水木清華站 (Thu Jan 23 16:29:02 2003), 轉信\r\n:v/./$s/$/<ctrl-v><enter>./|\'\';/./-1j|$d\r\n|是兩個命令風格符號\r\n:v/./$s/$/<ctrl-v>enter./
\'\';/./-1j
$d
??
記得大概是這樣.
我也看不動.
自己看help把.
大概意思是吧
所有的空行,變成
<enter>.
變成
<blank line>
........ --> n line -> ndot
然後
d掉最後一行
v那個是區域選擇命令\r\n具體的我也不清楚了.\r\n【 在 smartiger (天才虎) 的大作中提到: 】
:          Replaces multiple blank lines with just one blank line.
: 請問如何解釋,特別是|和;\r\n--
沉默是痛苦的女兒\r\n※ 來源:·BBS 水木清華站 smth.edu.cn·[FROM: 166.111.168.15]
發信人: allanj (木瓜), 信區: Linux
標  題: Re: 解釋一下vi的一個高級用法
發信站: BBS 水木清華站 (Thu Jan 23 18:26:01 2003), 轉信\r\n好像在那裏見過\r\n你在最後一行加個 .  然後執行下面的命令
    :v/./ ; /./-1j
那個 . 就是爲了防止原來最後一行爲空,
不能再匹配 /./ 了\r\n大意:
	/./ 是非空行
	v 是 g! 的簡寫, 而 g! 就是取 g 的反\r\n    所以 v/./ 就是標記出所有空行\r\n    然後對標記出的每一行  操作
	; 連接 2 個行號
	/./-1 就是從標記那個行號開始找非空行,
			  然後 (行號 - 1)
	j 就是 連接 2 行
所以 () ; () j 就是把連續的幾個空行 join
(如果標記的行不存在, g 方式就繼續下一個存在的,
 所以連接也不會出問題)\r\n原來的:
v/./$s/$/^M./|\'\';/./-1j|$d
在 vim 下沒試成, 設了 compatible 也沒效果.
他是不是也想在最後加個 . 然後連接, 再去掉?\r\n大致這樣分
v/./
$s/$/^M./   |
\'\';/./-1j   |
$d\r\nv/./        對所有的空行執行後面 3 個命令
$s/$/^M./   對第 $ 行, 執行後面的替換
\'\';/./-1j   從 \'\' 行開始, 到第一個非空行, 執行 j 命令
$d          刪除第 $ 行\r\n【 在 smartiger (天才虎) 的大作中提到: 】
:          Replaces multiple blank lines with just one blank line.
: 請問如何解釋,特別是|和;
--
※ 修改:·allanj 於 Jan 23 18:26:56 修改本文·[FROM:  166.111.215.54]
※ 修改:·allanj 於 Jan 23 18:27:26 修改本文·[FROM:  166.111.215.54]
※ 來源:·BBS 水木清華站 smth.edu.cn·[FROM: 166.111.215.54]
發信人: sk8 (destroying Tsinghua), 信區: Linux
標  題: Re: 解釋一下vi的一個高級用法
發信站: BBS 水木清華站 (Thu Jan 23 19:50:40 2003), 轉信\r\n不就是合併空行嗎?何必搞得這麼複雜\r\n這不是解決這個問題的好辦法\r\n用
:%s/\\(\\n\\s*\\)\\{2,}/\\r\\r/g
不就行了\r\n【 在 allanj (木瓜) 的大作中提到: 】
: 好像在那裏見過
: 你在最後一行加個 .  然後執行下面的命令
:     :v/./ ; /./-1j
: 那個 . 就是爲了防止原來最後一行爲空,
:     不能再匹配 /./ 了
: 大意:
:         /./ 是非空行
:         v 是 g! 的簡寫, 而 g! 就是取 g 的反
:     所以 v/./ 就是標記出所有空行
:     然後對標記出的每一行  操作
:         ; 連接 2 個行號
: ...................
--
※ 修改:·sk8 於 Jan 23 19:56:07 修改本文·[FROM:  218.88.205.178]
※ 來源:·BBS 水木清華站 smth.edu.cn·[FROM: 218.88.205.178]
vim使用技巧(1)
本文參考了vim官方網站的文檔http://www.vim.org/tips/index.php。爲了查找方便起見,文中的技巧編號沿用原文檔中的編號。\r\n1. 使用 * 鍵可以向後搜索光標所在位置的單詞。反之,使用 # 鍵可以向前搜索光標所在位置的單詞。第一次使用 * 或者 # 進行搜索之後,則可以使用 N 或 Shift-N 繼續進行搜索。另外,如果設置了hlsearch選項(:set hlsearch)的話,那麼使用 * Shift-N 則可以標記當前的單詞爲高亮顯示。\r\n2. 經常會遇到這樣的情況,就是在命令行上輸入含有一個長長的路徑的命令 vi /home/username/linux/src/dir1/dir2/dir3/srcfile.c,編輯結束之後發現需要編輯同一目錄下的另一個文件,這時不得不在vi中重新輸入長長的路徑。而將下面的腳本放在vimrc文件(Unix下爲~/.vimrc,Windows下爲_vimrc)中即可快速輸入路徑:\r\n\"   Edit another file in the same directory as the current file
\"   uses expression to extract path from current file\'s path
\"  (thanks Douglas Potts)
if has(\"unix\")
map ,e :e [C-R]=expand(\"%:p:h\") . \"/\" [CR]
else
map ,e :e [C-R]=expand(\"%:p:h\") . \"\\\" [CR]
endif\r\n這樣編輯完第一個文件之後,在vi中輸入 ,e ,然後就可以利用Tab鍵進行自動補齊了。注意上面代碼中的[]符號,實際輸入的時候需要換成小於號和大於號(由於blog自身原因,小於號和大於號不能直接輸入)\r\n4. 單詞自動補齊:輸入一個單詞(例如函數、變量名等)的開頭幾個字母,然後按Ctrl-N或者Ctrl+P鍵,vim會在當前文檔中查找匹配的單詞並自動將輸入補齊。\r\n6. 使用 % 鍵可以查找匹配的括號。\r\n7. 使用 [{ 和 ]} 命令可以跳轉到光標所在程序塊的開頭和結尾。\r\n8. 如果當前光標處的單詞是一個局部變量,則使用 gd 來跳轉到該變量的定義處;如果當前光標處的單詞是全局變量,則使用 gD 來跳轉到該變量的定義處。\r\n9. [i 命令可以快速察看光標所在位置的變量的定義,[d 命令可以快速察看光標所在位置的宏的定義。\r\n10. 流行的文本編輯器通常都有前進和後退功能,可以在文件中曾經瀏覽過的位置之間來回移動。在 vim 中使用 Ctrl-O 執行後退,使用 Ctrl-I 執行前進。
相關幫助:  :help CTRL-O  :help CTRL-I   :help jump-motions\r\n12. 如果想在源程序中不使用TAB鍵並保證縮進爲四字符,那麼在 vimrc 中加入下列設置:\r\n        set tabstop=4
	set shiftwidth=4
	set expandtab\r\n13. 使用 set incsearch 之後可以在鍵入搜索關鍵字時即時顯示匹配的位置。\r\n14. 使用 set hlsearch 可以將匹配進行高亮顯示。進行一次搜索之後,執行 :nohlsearch 或 :noh 可以暫時關閉本次搜索結果的高亮顯示。而使用 :set nohlsearch 則可以永久關閉搜索高亮顯示。
可以將:noh命令映射到一個鍵上,例如:nmap <silent> <C-N> :silent noh<CR>,這樣就可以使用Ctrl-N來關閉高亮顯示。\r\nposted on 2004年10月05日 5:19 PM
1. 已經在編輯狀態(insert mode)了,如何快速執行 normal mode 的命令?
在編輯文本時,需要快速定位到某個位置,如下一個 d 的位置,難道要
<ESC>、fd、i 這般繁瑣嗎?
其實,使用 Ctrl-O 就可以臨時切換到 normal mode, 執行一個命令後自動返回 insert mode。
於是上述命令序列可以改爲:
Ctrl-O、fd 即可。
Ctrl-O 要按兩個鍵呢,很麻煩,於是來個 keymap
\" make ` functions <C-O> in insert mode
inoremap ` <C-O>
nnoremap ` i`<ESC>\r\n在 normal mode 下按 ` (左上角那個),會正常插入 `,
而在 insert mode 下則相當於按 Ctrl-O,
於是上述命令序列又可簡化爲
`fd 即可。
在 insert mode 想粘貼剪貼板內容時,可以輸入 `P,爽吧?
這樣就可以在 insert mode 下天馬行空,不用再按 <ESC>和a 切來切去了。\r\n2. vim 的剪貼板怎麼怪怪的?
用 y 命令拷貝的文本怎麼不能在 X/Windows 的其它應用中使用呢?
事實上,vim 有多個所謂寄存器來寄存剪切的內容。
平時是不是隻用 y <motion> 和 p 命令呢?
其實這時使用的是 unamed 寄存器(對應寄存器*,不知對否?),即沒有給定名稱的,
而給定名稱的,可以加前綴 \"r 使用。
例如,將當前行放到寄存器a中,輸入: \"aY
將另一行(先移到其它行)放到寄存器b中,輸入: \"bY
粘貼寄存器a,輸入:\"aP
粘貼寄存器b,輸入:\"bP\r\n好了,扯遠了,X/Windows 的剪貼板的內容是存在寄存器+中,不信,自己試試:\"+P
能不能將簡單的 y 和 p命令與系統剪貼板聯繫起來呢?
就這句,浪費了我許多口水:)
set clipboard+=unnamed \" set clipboard\r\n3. 我不要每次都輸入 this_object.set_...
呵,在 C 的結構或 C++ 的對象設置時,那個結構名或對象名總是重複 n 次要輸入,挺煩的:(
添加這兩句到配置文件中吧:
\" Ctrl-F to yank line upstairs
inoremap <silent> <C-F> <C-O>:exe \"norm! kly0jPD\"<CR>\r\n這是在編輯模式中使用的,怎麼個用法?舉個例子吧(括號內是我的註釋):\r\n(在編輯模式下,先輸入這句:)
 this_object.set_height(1.80);
(                    ^)
(                    |)
(用<tab>啊,空格啊移到箭頭所示處,即h處,然後按Ctrl-F)
(自動補全成:)
 this_object.set_
(於是你可以繼續輸入\"weight(100);\" 了)\r\n不知大家明白沒有,不明白的先試試:)\r\n4. 我想註釋一堆 C++ 代碼
當然,這有許多種我不知道的方法,我的通用方法爲,先在配置文件裏添加:
vnoremap . :normal .<CR>\r\n呵,一句就夠了,示例如下:\r\n假設你有如下幾行代碼需要註釋:
this_object.set_height(1.60);
this_object.set_weight(100);
this_object.run();\r\n你先移到第一行,輸入 I//<ESC> (<ESC>就是ESC鍵),將第一行註釋。
然後移到第二行,按 V 進行 line visual mode,按 j 或其它方向移動鍵選好要註釋的所有代碼行,
最後按: .
是不是很神奇?\r\n呵,說白了,這只是在 visual mode 裏使用 redo 的功能而已,有點跑題了。
當然,殊途是同歸的,只是路的長遠而已。
這是條通用的路,可以用在很多地方。
回到主題,誰有更直接的辦法註釋一堆 C++ 代碼?一堆 C 代碼呢(用/* */ 風格) ?\r\n5. vi 的自動完成有什麼新奇的東東?
不就是根據 buffer 的內容來自動完成嗎?
有些插件是可以動態地讀取頭文件或模塊來提供自動完成的,例如 python 的 pydict。(此列表待補全:)
我想介紹的是 vi 基於字典的自動完成:
1. 增加基於字典的自動完成
set complete+=k \"add dictionary complete
2. 設定字典文件,字典文件其實是個文件文件,每個單詞佔一行
(以下字典文件可能並不存在)
set dictionary=/usr/share/dict/words \"set dictionary
3. 呵,因此我是不用什麼英文字典來自動完成的,很少寫英文文章,使用字典後反應很慢。
我用基於字典完成的原因是,使用編輯語言的關鍵字自動完成,見:
\" complete from filetype syntax file
autocmd Syntax * execute \"setlocal dictionary=\".$VIMRUNTIME.\"/syntax/\".getbufvar(\"%\",\"current_syntax\").\".vim\"
對應的語言語法文件必須存在纔可使用,於是寫新的 C 文件時,可以直接 inc<Ctrl>-N, cont<Ctrl>-N\r\n(請大家不吝賜教,to be continued)
編輯者: zslevin (10/16/04 10:53)\r\nvi編輯技巧\r\n    遊標的移動
本節所述皆是在 common-mode(c-mode,在 vim 又名 normal-mode)下的移動,原始的 vi 只能在 c-mode 移動,在 insert-mode 只做文字的輸入,而不做遊標的移動。當然 vim 及 elvis 的方向鍵是不論在那一種 mode 皆可移動自如。\r\n基本的遊標移動\r\n    h 左,或 Backspace 或方向鍵
j 下,或 Enter 或 +(要 Shift 鍵),或方向鍵\r\nk 上,或 方向鍵或 -(不必 Shift 鍵)
l 右,或 Space 或方向鍵
Ctrl-f 即 PageDown 翻頁。
Crtl-b 即 PageUp 翻頁。\r\n使用 hjkl 鍵的移動是爲了使手不必離開打字區(鍵盤中央的部位),
以加快打字的速度,如果各位不習慣,那就使用方向鍵吧!\r\nBackspace 及 Space 的移動方式是到了行首或行尾時會折行,
但方向鍵或 hl 鍵的移動則在行首或行尾時您繼續按也不會折行。
轉折換行的功能是 vim 的擴充功能,elvis 無此功能。\r\njk 及使用方向鍵的上下移動遊標會盡量保持在同一欄位。
使用 Enter,+,- 的上下移動,遊標會移至上(下)一行的
第一個非空白字元處。\r\n好像有點複雜,各位就暫時使用方向鍵來移動就簡單明白了!
等您愛上了 vim 後再來講究吧。\r\n進階的遊標移動\r\n    0 是數目字 0 而不是英文字母 o。或是 Hmoe 鍵,移至行首,(含空白字元)。
^ 移至第一個非空白字元,注意,要 Shift 鍵。
$ 移至行尾,或 End 鍵。要 Shift 鍵。\r\n以上兩個按鍵是源自規則表示式(regular expression),
在 regexp 中 ^ 是匹配行首,$ 是匹配行尾。\r\nG 移至檔尾(最後一行的第一個非空白字元處)
gg □至檔首(第一行之第一個非空白字元處)\r\ngg 是 vim 的擴充功能,在 elvis 或原始 vi 中可用 1G 來
移至檔首(是數字 1 不是英文字 l)。\r\nG 之原意是 goto,指移至指定數目之行首,如不指定數目,
則預設是最後一行。\r\nw 移至次一個字(word)字首。當然是指英文單字。
W 同上,但會忽略一些標點符號。
e 移至前一個字字尾。
E 同上,但會忽略一些標點符號。
b 移至前一個字字首。
B 同上,但會忽略一些標點符號。
H 移至螢幕頂第一個非空白字元。
M 移至螢幕中間第一個非空白字元。
L 移至螢幕底第一個非空白字元。\r\n這和 PageDown,PageUp 不一樣,內文內容並未動,
只是遊標在動而已。\r\nn| 移至第 n 個字元(欄)處。注意,要用 Shift 鍵。n 是從頭起算的。
:n 移至第 n 行行首。或 nG。
特殊的移動\r\n    ) 移至下一個句子(sentence)首。
( 移至上一個句子(sentence)首。
} 移至下一個段落(paragraph)首。
{ 移至上一個段落(paragraph)首。\r\nsentence 是以 . ! ? 爲區格。paragraph 是以空白行爲區格。\r\n% 這是匹配 {},[],() 用的,例如您的遊標現在在 { 上只要按 %,就會跑到相匹配的 } 上。寫程式時滿好用的。
另還有一些 vim 的特殊按鍵,但這得留待最後纔來講述,否則各位恐怕會頭昏眼花了。\r\n    基本編輯指令
這個單元就開始進入主題了。下編輯指令都是在 commond-mode (c-mode),就是您一進入 vim 時的模式,只能下指令,不能鍵入文字。如果印象模糊,請瞄一下第一個單元的內容。這個單元說的是基本的指令,有些比較特殊的編輯指令,因爲太有個性了,所以會獨立成一個單元來說明。\r\n進入 i-mode 的指令\r\n    i 在遊標所在字元前開始輸入文字(insert)。
a 在遊標所在字元后開始輸入文字(append)。
o 在遊標所在行下開一新行來輸入文字(open)。
I 在行首開始輸入文字。
 此之行首指第一個非空白字元處,要從真正的第一個字元處開始輸人文字,
可使用 0i 或 gI(vim)。\r\nA 在行尾開始輸入文字。
 這個好用,您不必管遊標在此行的什麼地方,
只要按 A 就會在行尾等著您輸入文字。\r\nO 在遊標所在行上開一新行來輸入文字。
J 將下一行整行接至本行(Joint)。
 並無相對的 split 功能,可在 i-mode 下按 Enter 來達成\r\n,當然如果您熟 macro 的話,可自行定義。
 使用 J 時,預設會消去本行的 EOL,且上下行接縫間會留下一個空白字元,
這符合英文習慣,卻對中文會造成困擾,欲不留空白字元,
可使用 gJ(大寫 J)指令,但這是 vim 的擴充功能,elvis 不適用。\r\n請您隨便找一個檔案來試看看,光看文字說明太抽象了。\r\n刪除指令\r\n    x 刪除遊標所在處之字元。在 vim 及 elvis 亦可用 Del 鍵。
X 刪除遊標前之字元。不可使用 Spaceback 鍵。
 vim 可以正確使用以上兩個指令於中文,會刪去一箇中文字 elvis 則不行,
一箇中文字要刪兩次,即使用 xx。\r\n dd 刪除一整行(delete line)。
dw 刪除一個字(delete word)。不能適用於中文。
dG 刪至檔尾。
d1G 刪至檔首。或 dgg(只能用於 vim)。
D 刪至行尾,或 d$(含遊標所在處字元)。
d0 刪至行首,或 d^(不含遊標所在處字元)。
 請回憶一下 $ 及 ^ 所代表的意義,您就可以理解 d$ 及 d^ 的動作,
這就是 vi(m) 可愛之處。\r\n取代及還原\r\n    r 取代遊標所在處之字元。vi(m) 很有個性的,您在 c-mode 按了 r 她就會停在那裏等主人鍵入所要替代的字元,希望您這個當主人的,不要傻呼呼的也楞在那裏,趕快鍵入您的新字元吧!:-)
 vim 中可用於中文字,也就是可以替換一箇中文字,elvis 則不行。
當然您的 vim 是要設在 taiwan 的才行。怎麼樣!有沒有看過如此
有個性的取代方式?ㄚ!r 就是 replace 啦!\r\nR 取代字元至按 Esc 爲止。
cc 取代整行內容。或大寫 S 亦可。
cw 替換一個英文字(word),中文不適用。(change)
~ 遊標所在處之大小寫互換。當然不能用於中文。別忘了 Shift!
C 取代至行尾,即遊標所在處以後的字都會被替換。或 c$。
c0 取代至行首,或 c^。
s 替換一個字元爲您所輸入的字串。和 R 不同,R 是覆蓋式的取代,s 則是插入式的取代,您可親自實驗看看。ㄟ!是小寫的 s。
u 這個太重要了,就是 undo,傳統的 vi 僅支援一次 undo,vim 及 elvis 就不只了,vim 是沒有限制的。
U 在遊標沒離開本行之前,回覆所有編輯動作。
Crtl+r 這個也是很重要,就是 redo 鍵。
加上數目字
喔!騷到 vi(m) 的癢處了,這是 vi(m) 一個非常騷包的功能,只此一家別無分號(當然同源的 ed,sed 等不在此限)。就是您可以在大部份的指令前加上數目字,代表要處理幾次的意思。以下用實例來說明比較清楚。\r\n5dd 刪除遊標所在處(含)起算以下五行內容。妙吧!
3r 按了 3r 後,您鍵入一個英文字,則三個字元皆會被您所鍵入的英文取代。很抱歉,這不能用於中文。
5J 將五行合併成一行。
3x 刪除三個字元。抱歉,不能用於中文。
5i A 然後按 Ecs,插入五個 A。中文也可以!
2i system Esc 插入 systemsystem。中文也可以!
5G 遊標移至第五行,是從檔首開始起算。
5l 移至右第五個字元處,當然 j 是可以用方向鍵取代的。所有移動指令(參考第二單元)都可以加上數目字來控制,中文也通喔!elvis 當然是不能用於中文。
其它的指令和數目字結合,就留待各位去發掘吧!最重要的是請您親自操作看看,使用 vi(m) 常常要動動腦筋,會有更妙的操作方式。
簡單重排功能\r\n    >> 整行向右移一個 shiftwidth(預設是 8 個字元,可重設)。
<< 整行向左移一個 shiftwidth(預設是 8 個字元,可重設)。
 :set shiftwidth? 可得知目前的設定值。:set shiftwidth=4
可馬上重設爲 4 個字元。shiftwidth 可簡寫成 sw。ㄟ,別忘了 Shift 鍵!\r\n:ce(nter) 本行文字置中。注意是冒號命令!
:ri(ght) 本行文字靠右。
:le(ft) 本行文字靠左。
 所謂置中、靠左右,是參考 textwidth(tw) 的設定。
如果 tw 沒有設定,預設是 80,就是以 80 個字元爲總寬度爲標準來置放。
當然您也可以如 sw 一樣馬上重設。\r\ngqip 整段重排。中文會出槌!:-(
gqq 本行重排。
 重排的依據也是 textwidth。這裏的重排是指您鍵入文字時沒有按 Enter 鍵,
就一直在 keyin,這樣會形成一個很長的一行(雖然螢幕上會替您做假性折行),
重排後,則會在每一行最後加入 EOL。gq 重排功能是 vim 纔有的功能。\r\n    複製(yank)
yank 是什麼意思?有疑問的請查一下字典吧!就好像是中醫治療中的「拔罐」的意思啦(是不是叫「拔罐」?知道的朋友指正一下吧)!反正在 vi(m) 中,她就是複製 copy 的意思。這在 vi(m) 的思考邏輯裏,就是「拔」yank 起來,「放」put 上去。其實複製的指令就是 y 一個而已,爲什麼要獨立成一個單元來說明呢?因爲 vi(m) 複製、貼上的功能實在太獨特了,再配合前面介紹的數目字,及 vi(m) 內部的緩衝區來使用的話,您會發現,原來 vi(m) 肚子裏還暗藏著祕密武器。\r\n指令說明]]>


yy 複製遊標所在行整行。或大寫一個 Y。
2yy 或 y2y 複製兩行。ㄟ,請舉一反三好不好!:-)
y^ 複製至行首,或 y0。不含遊標所在處字元。
y$ 複製至行尾。含遊標所在處字元。
yw 複製一個 word。
y2w 複製兩個字。
yG 複製至檔尾。
y1G 複製至檔首。
p 小寫 p 代表貼至遊標後(下)。
P 大寫 P 代表貼至遊標前(上)。
 整行的複製,按 p 或 P 時是插入式的貼在下(上)一行。
非整行的複製則是貼在遊標所在處之後(前)。\r\n\"ayy 將本行文字複製到 a 緩衝區
 a 可爲 26 個英文字母中的一個,如果是小寫的話,原先的
內容會被清掉,如果是大寫的話是 append 的作用,會把內
容附加到原先內容之後。\r\n\" 是 Enter 鍵隔壁的那一個同上符號(ditto marks)。\r\n\"ap 將 a 緩衝區的內容貼上。
 緩衝區的術語在 vim 稱爲 registers,vim 擴充了相當多的
功能,有興趣深入的朋友請 :h registers。您用 d、c、s、
x、y 等指令改變或刪除的內容都是放在 registers 中的。
例如:您用 dd 刪除的一行,也是可以使用 p 來貼上的。只
要是在緩衝區的內容都可以使用 p 來貼上,不是一定要 y 起
來的內容才能用 p。因此您認爲 p 是 paste 也可以,認爲是
put 可能較正確。\r\n5\"ayy 複製五行內容至 a 緩衝區。
5\"Ayy 再複製五行附在 a 內容之後,現在 a 中有十行內容了!
 ㄟ!不要我一直用 a 您就認爲只有 a 可以用喔。26 個英文
字母都可以的,交叉運用下,您會發覺 vi(m) 肚量不小。\r\n問題來了!忘記誰是誰的時候怎麼辦? :reg(冒號命令)就
會列出所有 registers 的代號及內容。您現在就試著按看看
咦!怎麼還有數目字、特殊符號的緩衝區,原來您剛剛刪除
(複製)的內容就預設放在 \" 這個緩衝區,然後依序是
0,1,2,...9。也就是說您按 p 不加什麼的話,是取出 \" 緩
衝區的內容的。% 指的是目前編輯的檔案,# 指的是前一次
編輯的檔案。還有其它的呀!因爲沒什麼重要,就請
:h registers 吧!registers 有個 \"s\" 結尾,不要搞錯了,\r\n  而且 Tab 的補全鍵 vim 也支援的,也就是說您鍵入 :h regi
再按 Tab 鍵,vim 就會幫您補全,按了 Tab 後發現不是您要
的,那就繼續按,總會出現您要的。:-)\r\nTab 補全的功能,elvis 也有,但叫出 registers 列表的命令
則沒有,您得自行記憶在您的腦袋瓜子裏。而且 elvis 的補全
能力並沒 vim 強。\r\n天大的指令
. 這是什麼?ㄚ,是英文句點啦!沒錯,就是英文句點。什麼意思?重複前次的編輯動作。這個指令太高明瞭,只要是編輯動作(移動遊標不算,冒號命令也不算)都可以按英文句點來重複,要重複幾次都可以。\r\n例如:您按了 yy,然後按 p 就會複製、貼上一整行,如果要重複這個動作的話,就可以按 . ,也可以把遊標移到其它地方後再按。其它 dd,dw,r,cw 等編輯指令都可以這樣來重複。如果您要重複做某些編輯動作時,千萬千萬一定要想到有這麼一個英文句點重複指令。ㄚ,拜託啦!您一定要常用這個指令。\r\n疑難雜症\r\n    那 mouse 中鍵的剪貼功能還有嗎?當然還有,不管在 console 或 X terminal 中都照用不誤。當然在 windows 下的話就不能用了,可以用 Shift-Insert 來代替。Ctrl-v 在 vim 中另有作用,在 windows 下就不必去麻煩它了。
ㄟ,我從 netscape 用 mouse copy 東東過來的時候,常常都搞得天下大亂耶!要設成 :set paste,預設是 map 至 F9 鍵的,您要 copy 之前先按一下 F9,copy 完後再按一次 F9 來回復。這是 vim 的擴充功能,elvis 沒有。那在 elvis 怎麼辦?只好 :set noai 了。在 GUI 的版本應不會有這種情形。
 set 的功能先不必去理它,往後會有一個單元專門討論。\r\n朋友!您睡著了嗎?不要被嚇到了,您只要開個檔案,親自操作一下就能心領神會。那用 mouse 不是更方便嗎?不見得,yyp 來複制貼上一整行比較快,還是用 mouse 來拉比較快?您可以試看看。\r\n    尋找/替換
搜尋、替換的功能幾乎是每個編輯器必備的功能,那在 vi(m) 中有沒有特殊的地方呢?當然有,您忘了,vi(m) 是個性十足的編輯器。最特殊的地方是和規則表示式(regular expression,簡稱 regexp) 結合在一起。簡單的說她是一種 pattern 的表示法,在執行動作,如尋找或替換,就會依據這個 pattern 去找,所有符合 pattern 的地方就會執行您所下的動作。在這個單元裏不討論 regexp,會另立一個單元來探討,以免搞得頭昏腦脹。目前就暫不使用 regexp,您要找什麼就直接鍵入什麼就對了。\r\n尋找\r\n    / 在 c-mode 的情形下,按 / 就會在左下角出現一個 /,然後鍵入您要尋找的字串,按個 Enter 就會開始找。
? 和 / 相同,只是 / 是向前(下)找,? 則是向後(上)找。
n 繼續尋找。
N 繼續尋找(反向)。
更方便的尋找操作(vim 纔有)\r\n    * 尋找遊標所在處之 word(要完全符合)。
# 同上,但 * 是向前(下)找,# 則是向後(上)找。
g* 同 * ,但部份符合即可。
g# 同 # ,但部份符合即可。
 n,N 之繼續尋找鍵仍適用。\r\n替換(substitute)
:[range]s/pattern/string/[c,e,g,i]\r\nrange 指的是範圍,1,7 指從第一行至第七行,1,$ 指從第一行至最後一行,也就是整篇文章,也可以 % 代表。
 還記得嗎? % 是目前編輯的文章,# 是前一次編輯的文章。\r\n    pattern 就是要被替換掉的字串,可以用 regexp 來表示。\r\nstring 將 pattern 由 string 所取代。\r\nc confirm,每次替換前會詢問。\r\ne 不顯示 error。\r\ng globe,不詢問,整行替換。\r\ni ignore 不分大小寫。
 g 大概都是要加的,否則只會替換每一行的第一個符合字串。
可以合起來用,如 cgi,表示不分大小寫,整行替換,替換前
要詢問是否替換。\r\n    [實例] :%s/Edwin/Edward/g
這樣整編文章的 Edwin 就會替換成 Edward。\r\n更進階的尋找、替換的例子在說明 regexp 的時候還會再詳述。目前只知道最基本的用法就可以了!其實光這樣就非常好用了。:-)\r\n書籤功能
這又是 vi(m) 的一個祕密武器,簡單的說,您可以在文章中的某處做個記號(marks),然後跑到其它地方去編輯,在呼叫這個 mark 時又會回到原處。妙吧!\r\nmx x 代表 26 個小寫英文字母,這樣遊標所在處就會被 mark。
`x 回到書籤原設定位置。
 ` 是 backward quote,就是 Tab 鍵上面那一個。\r\n\'x 回到書籤設定行行首。
 \' 是 forward quote,是 Enter 鍵隔壁那一個。\r\nvim 對於書籤的擴充功能\r\n    小寫字母 只作用於單一檔案內。
大寫字母 可作用於編輯中之各檔案間。
數目字 可作用於前次編輯的十個檔案。
 數目字的用法比較特殊,\'0 是回到前一次編輯檔案中離開
前的最後位置,\'1 則是回到前二次編輯檔案的最後位置,
依此類推。您不必使用 m 來標示,vim 會自動記憶。
很玄吧!其實這是 viminfo 的功能,您要認真追究的話,
請 :h viminfo-file-marks。viminfo 關掉,就沒這個功能了!\r\n所謂前次指的是前次啓動的 vim。\r\n:marks 得知目前所有書籤的列表。\r\n叫檔、存檔、緊急回覆
ㄟ,是不是在灌水呀!怎麼開個檔也成一個單元?那您就錯了,在 vi(m) 裏叫檔的花樣可多了,而且又可以多檔編輯,各編輯中的檔案還可以互通訊息,這裏面學問可大著呢!vim 就更騷包了,也學人家檔案可以加密,雖說是噱頭,但也還滿好用的。\r\n     vim + 檔名
這樣開檔後,遊標會落在檔案最後一行的行尾,在檔案屁屁後幹什麼呢?方便您可以繼續編輯嘛!
vim +n 檔名
遊標會落在第 n 行的行首。
vim +/string 檔名
還記得嗎? / 就是尋找指令,這樣進入檔案後遊標就會落在第一個找到的 string 上,還可以按 n 繼續找 string 喔!哦,string 還可以使用 regexp 來表示喔。
多檔編輯
多檔編輯會有兩種情形,一種是在進入 vim 前所用的參數就是多個檔(這種情形稱爲 argument list)。另一種情形是進入 vim 後另外再開其它的檔(稱爲 buffer list)。不過都可以統稱爲 buffer。\r\n:n 編輯下一個檔案。
:2n 編輯下二個檔案。
:N 編輯前一個檔案。
 注意,這種用法只能用於 argument list 的情形。\r\n:e 檔名 這是在進入 vim 後,在不離開 vim 的情形下再開其它檔案。只要您要編輯的檔案是在目前目錄,Tab 補全鍵還是可以使用。
:e# 或 Ctrl-^ 編輯前一個檔案,用於兩檔互相編輯時相當好用。
 這種用法不管是 argument list 或 buffer list 檔案間皆可使用。\r\n還記得嗎? # 代表的是前一次編輯的檔案。\r\n:files 或 :buffers 或 :ls 會列出目前 buffer 中的所有檔案。
 在 elvis 中可使用 :b 來叫出 buffers。\r\n在 buffers 中,減號 - 表示這個 buffer 並未載入,不過,
不必擔心,載入相當快速的。加號 + 表示這個 buffer
已經修改過了。\r\n:bn buffer next。
:bl buffer last。
 以上兩個指令 elvis 不適用。\r\n:b檔名或編號 移至該檔。
 在 :ls 中就會出示各檔案的編號,這個編號在未離開 vim 前是不會變的。
這個指令 elvis 也是可以使用。\r\n當然 :e#編號 也是可以的,這樣的用法則是所有 vi clone 都通用了。\r\n如果您是使用 vim 的 GUI,那就在功能表上就會有 Buffers 這個選項,
可以很容易的知道及移動各 buffer 間。\r\n:bd(elete)
buffer 在未離開 vim 前是不會移除的,可使用這個指令移除。其實移除她幹什麼呢?vim 是您在叫用時纔會載入的,因此這些 buffers 並不是像 cache 一般要佔記憶體的。
:e! 檔名
這樣也是會開檔,但會放棄目前編輯檔案的改變,否則如果檔案已有變動,vim 預設是不讓您隨便離開的。:e! 後不接什麼的話,代表捨棄一切修改,重新載入編輯中檔案。
:f 或 Ctrl-g
顯示目前編輯的檔名、是否經過修改及目前遊標所在之位置。
:f 檔名
改變編輯中的檔名。(file)
:r 檔名
在遊標所在處插入一個檔案內容。(read)
:35 r 檔名
將檔案插入至 35 行之後。
gf
這是 vim 的特殊叫檔法,會叫出遊標所在處的 word 爲名的檔案,當然,這個檔案要在目前目錄內,否則會開新檔案。
哦!好像有點給他複雜,主要原因是偶文筆不好啦!不過您何不選個順手的來用就可以了,選定了,以後就是使用他,這樣就不會那麼複雜了。:-)
離開\r\n    :q 如本文有修改而沒存檔,會警告,且無法離開。(quit)
:q! 捨棄所有修改,強迫離開。
:wq 存檔後離開。縱使檔案未曾修改也是會再存一次檔。
:x 也是存檔後離開,但如果檔案沒有修改,則不會做存檔的動作。
ZZ 和 :x 完全一樣,隨您高興用哪一個。
:w 檔名 另存他檔。不加檔名就是寫入原檔。(write)
 :q 及 :q! 是對目前編輯中的檔案作用,如果多檔編輯的情形
並不會離開 vim,這時可下 :qa 或 :qa! 來整個離開 vim。
a 就是 all 的意思。\r\nvim 的加密功能
vim -x [檔名]
這樣進入 vim 後會要求輸入密碼。以後加密過的檔案由 vim 開啓時會自動要求輸入密碼。否則無法開啓。其它的編輯器當然是無法開啓的。\r\n進入 vim 編輯檔案中,臨時想加密,可用 :X 指令。
 小心!vim 一開檔就會有個 .檔名.swp 這個檔,是爲了緊急回覆用的,
一般是在您所開檔案的所在目錄,這是個隱藏檔,ls 要有 -a 參數纔看得到,
您加密的功能並沒有作用在這個 swp 檔,因此 root 還是知道您在
寫些什麼關於他的壞話的。:-) 當然啦!山不轉,路轉,路不轉,人轉,
您也是可以把 swap 的功能關掉的 :set noswf 就行了!但如果您編輯的是
大檔案,則不建議您把 swap 關掉,這樣會很吃記憶體的。\r\nelvis 的話,其暫存檔是統一集中存放在 /var/tmp/*.ses,
權限是檔案所有者始能讀寫。vim 的早期版本,其 *.swp
檔是依原檔案的權限來設定的,最近的版本則從善如流,
已經改成檔案所有人始能讀寫,就是 -rw------- 啦!\r\n    緊急回覆
vim -r 檔名,或進入 vim 後,下 :recover 檔名,來回復。\r\n大家來學 VIM (三)
各種標示方法及視窗操作
這個單元多了一種模式,那便是 visual mode(以下簡稱 v-mode)v-mode下的反白區(反黑區?^_^)在本文就統一稱爲標示區,不知各位是否有更好的中文名稱?ㄟㄟㄟ,視窗操作和標示有什麼關係?爲什麼擺在這裏說明?ㄚ,是因爲這兩個單元內容都不多,沒地方擺,所以就將湊在一起的啦!亂點鴛鴦譜就請各位見諒。\r\n標示指令\r\n    v 小寫 v 這是屬於字元標示(character visual),按下 v 後您就可以移動遊標,遊標走過的地方就會標示起來。再按一次 v 就會結束 v-mode。您用 mouse 拉出的標示區也是屬於這類的標示。
V 大寫 V 這是行標示(line visual),按下 V 後會整行標示起來(包括空白的部分),您移動上下鍵,會標示多行。mouse 連按三次左鈕,也是屬於此類的標示。再按一次 V 就會結束 v-mode。
 mouse 按兩次左鈕是標示一個 word。\r\nCtrl-v 這是方塊標示(block visual),可縱向標示矩形區域。再按一次 Ctrl-v 就會結束 v-mode。
 結束 v-mode 的方式亦可使用 Esc 鍵,或一使用 Ctrl-c。
windows 系統下 Ctrl-v 是複製鍵,可以使用 Ctrl-Q 來替代。
d 刪除標示區內容。
y 複製標示區內容。
 ㄟ…是要先標示好才按的。\"ay 還能不能用呢?當然可以,
這樣就會把標示區內容存於 a 緩衝區中。可以用 \"ap 來貼上。\r\nShift-> 標示區內容向右移一個 Tab。
Shift-
可設成 dark 或 light,這是兩種不同的 highlight 顏色設定,詳見 $VIMRUNTIME/syntax/synload.vim。不過您要更動顏色的設定,最好是設在 ~/.vimrc 或 ~/.gvimrc 中,原始檔最好不要去動她。
 ㄟㄟㄟ,你從沒提過 $VIMRUNTIME 好不好!其實這是最近版本的 vim
爲了不至安裝新版本時把舊版本的一些設定或 macro 檔幹掉,
所以 $VIMRUNTIME 就是 $VIM/vimxx,xx 就是版本號碼啦!
例如您使用的是 vim 5.6 版,那麼就是 $VIM/vim56。\r\nbackup(bk)
是否要 backup file。預設不打開。
writebackup(wb)
在寫入檔案前先備份一份,和 backup 的作用不盡相同,請:h backup-table。預設是打開的,所以您如果不要 backup,那要關掉的是這個項目,而不是 backup。但請先檢查一下您編譯時是不是有編譯進去,請 :ver。
backupdir(bdir)
設定存放 backup file 的目錄。預設在所編輯的檔案之所在目錄。
binary(bin)
設在編輯二進位檔狀態,這是防止存二進位檔時把 EOL 也寫進二進位檔,那就會悔不當初,如果是圖檔將會無法再觀看,如果是可執行檔就無法執行了!因此預設是 off。
 elvis 會自動判斷是否爲二進位檔,而且會分成左右兩半,左半部會以 16 進位的方式顯示,
右半部則是以 ASCII 的方式來顯示。\r\nbrowsedir(bsdir)
瀏覽檔案的目錄,GUI 版本始有。預設是上一次瀏覽的目錄。就是 GUI版本功能表上的 [File] -> [Open] 會打開的目錄。
cindent(cin)
寫 C 時很好用,indent 比一般敏感,專爲 C 程序碼而設。預設 off。編輯 C/C++ code 時會自動打開。
cmdheight(ch)
狀態列的行數,預設一行,建議設成兩行。
compatible(cp)
設爲和原始 vi 相容的狀態,vim 的擴充功能會被抑制。預設 off。
confirm(cf)
各種確認動作。預設 off。
directory(dir)swap 檔存放的目錄。前面單元已有說明。
fileformat(ff)
這是寫入檔案時置放 EOL(end of line) 的形式
dos 是以 0D 0A 來斷行。
unix 是以 0A 來斷行。
mac 是以 0D 來斷行。
預設以各系統平臺而定,在 Linux 當然是 unix 形式。
fileformats(ffs)
可指定多個,會依載入的檔案形式來調整 ff。例如 :set ffs=unix,dos ff=unix 則預設爲 unix 格式,但如讀入的是 dos 格式的檔案,會自動調整爲 dos 格式,這樣存檔時就會以 dos 格式存檔(狀態列會顯示)。此時如要改成 unix 格式,可 set ff=unix 然後存檔就會轉成 unix 格式,反之亦然。
注:\r\n如果不這樣設,也就是您不管 ff 或 ffs 都設成 unix,那讀入dos 格式的檔案時在每行尾會出現 ^M 這個字元(就是 0D 啦!)這時縱使 :set ff=unix 也來不及了!只好 :%s/^M//g 來消去這個^M。ㄟ,還記得怎麼替換嗎?就是把 ^M 換成沒有啦!而且 ^M 怎麼打出來的還記得吧!翻一翻前面的單元吧!
Hey,你怎麼知道是 0D 呀!好吧!告訴您一個密祕,您把遊標移到^M 那個位置,然後按 ga 在狀態列就會顯示 10,16,8 進位的值。其它的字元也是可以如此顯示。a 就是 ascii 的意思。但這是 vim 的擴充功能,elvis 沒有。
elvis 縱使載入 dos 格式的檔案,也是會自動把 ^M 隱藏起來。
ignorecase(ic)
尋找時不分大小寫,這對中文會造成困擾。預設 off。
incsearch(is)
加強式尋找功能,在鍵入 patern 時會立即反應移動至目前鍵入之 patern 上。預設 off。
hlsearch(hls)
尋找時,符合字串會反白表示。預設 off。如果您是使用 vim 的預設的 vimrc 檔的話,會設在 F8 鍵來切換。
textwidth(tw)
是一種 word wrap 的功能,從左起算之固定每行的最大字元寬度。超過此寬度就會自動折行,這可是真的折行,也就是說在折行處會插入 EOL。預設是 0,也就是沒有 word wrap 的功能。
wrapmargin(wm)
和 textwidth 作用相同,只是是從右視窗邊向左算起要幾個字元起折行。預設是 0。textwidth 與 wrapmargin 的功能目前並不適用於中文,打中文還是您自行按 Enter 吧!
wrap
這也是折行功能,可是隻是螢幕效果的折行,實際上並沒有插入 EOL。
wrapscan(ws)這和折行沒有關係,是指尋找時,找至檔尾時,是否要從檔首繼續找。預設是要。
paste
這是防止在做剪貼時位置會不正確,前面單元已有說明。
ruler(ru)
會在狀態列顯示遊標所在處之行列狀態,預設不打開,但建議打開。最右邊之代號的意義如下:
Top 檔案第一行在螢幕可見範圍。
Bot 檔案最後一行在螢幕可見範圍。
All 檔案首尾皆在一個螢幕範圍內。
如非以上三種情形,則會顯示相對百分比位置。
statusline(stl)
狀態列顯示的格式,使用預設就可以了,如果您想騷包一下的話,那就請您 :h stl。
shiftwidth(sw)
指由 >> 移動整行內容時,一次移動的字元寬度,一般是使用 Tab 的值,但可由這個設定來改變。
tabstop(ts)
一個 Tab 鍵寬度。預設是 8 個字元寬度。最好不要隨便改,以免您寫的東西由其它編輯器來閱讀時造成困擾,爲解決這個問題,vim 有一種 softtabstop 的機制,在下一節會詳細說明。
showcmd(sc)
在狀態列顯示目前所執行的指令。
showmode(smd)
在狀態列顯示目前的模式,例如是 Insert mode 或是 Visual mode。當然平常的 normal mode(commond mode)是不顯示的。
viusalbell(vb)
以螢幕閃動代替 beep 聲。
number(nu)
顯示行號。注意,冒號命令也有 :nu 這是顯示遊標所在行的行號,您嫌多打一個字的話,:# 也行。不過如果 ruler 打開的話,在狀態列本就會顯示門前遊標所在處的行列值。
list
這也可以算是一種模式,list mode。就是 Tab 的地方會以 ^I 顯示,而行尾之 EOL 會顯示成 $。可以讓您清楚的知道 Tab 在哪裏,折行是不是真的。
swapfile(swf)
是否需 swap 至磁碟。如果設爲 noswf 的話,那將不會有 swapfile產生,通通會載入在記憶體中。預設是要 swapfile。
fileencoding(fe)
首先先鼓掌一下,啪啪啪…,因爲有支援 taiwan,也支援 XIM,也就是說可以使用 xcin-2.5x 來作輸入,當然您用 xcin-2.3x 配合XA 也是可以啦!目前支援簡繁中文、日文、韓文,unicode 尚未植入。但前提是您要把 multi_byte 編譯進去,這在一開始就講過了。預設是使用 ansi。set guifont 及 set guifontset 已在一開始講過,在此就不重複了。
history(hi)
記錄冒號命令的歷史紀錄檔,就是可以用上下方向鍵叫出來的那鍋。預設是 20 筆。
關於 softtabstop(sts)
幾乎所有的 OS 及軟件都設定 Tab 就是 8 個字元長,這已經是個公認值,您硬要去改變它的話恐怕帶來許多不便,但實際上關於程序風格,許多人又認爲 8 個字元太長了,幾個巢狀迴圈下來就需折行,反而不方便。因此 vim 體貼您,內建了 softtabstop 的功能,就是由 vim 來代您製造出一個假的Tab,實際上是空白字元組成的 Tab。\r\n 舉個例子來說明比較清楚。
 set softtabstop=4
set shiftwidth=4\r\n    這樣會由 4 個空白字元取代一個 Tab,您按 Tab 鍵 vim 就跳 4 格,需注意的是,如果您按了三次 Tab 鍵,那就是一個實際的 Tab 加上四個空白字元,可不是 12 個空白字元喔!是混合 Tab 及 space 的。\r\n問題來了!那我要按真正的 8 字元的 Tab 時怎麼辦?簡單,還記得怎麼按特殊字元嗎? Ctrl-v Tab 或 Ctrl-v I 就可以了,那就是如假包換的 8 字元長之 Tab。當然,您按兩次 Tab 不就得了!:-)\r\n關於折行
前面已說過 set wrap 就可以造成螢幕折行,可是卻會把一個英文單字折成兩半,實在很不雅觀。好了,vim 再體貼您一次,set linebreak(lbr) 就會避免這種問題發生,會在空白或標點符號的地方來折行,但也仍屬螢幕折行,並不會插入 EOL。這個功能目前在中文判斷上還是會出槌!:-(\r\n規則表示式的運用
在本系列文章一開始就說明了學 vi(m) 可以順便學規則表示式(regular expression,以下簡稱 regexp),那爲什麼到現在纔來講呢?因爲 regexp 說簡單也算不很難,但您要深入去使用的話,有時會馬上看不出一個複雜的 regexp 在說些什麼的,就曾有人形容 regexp 爲「有字天書」!而且在 vi(m) 整體都還沒一個概念就加入 regexp 的話,那後面的單元恐怕就沒人看了!而 regexp 各家有各家的 extensions,這也是大家視爲畏途的原因之一,不過總是大同小異,只需注意一下就可以了。目前先不必管別家怎麼說,就讓 vim 暫時先成爲我們的「標準」,以後碰到其它程序的 regexp 應該就可以觸類旁通。以下我們儘量由實例去了解。當然,小小的一篇文章是沒有辦法詳盡介紹,只能撿重點來說明了。如有疑問,可 :h pattern 或在Un*x 系統中可 man 7 regex,甚至 man ed,man sed,man grep,man awk,man perlre 裏面也是會說些 regexp,但要注意和 vim 差異的地方!其中 perl 的 regexp 應該是最完整的了,如果您的系統沒有 perl 那應該是「稀有動物」了!:-) ㄟㄟㄟ!vim 只是一個編輯器,可不是獨立的程序語言!\r\n基本的匹配\r\n    * 指前所綁住的字元或字元集合,出現 0 次或 0 次以上。
+ 和 * 作用相同,但不包括出現 0 次。
= 指前所綁住的字元恰好出現 0 或 1 次。
| 這是多選,就是 or 的意思,被 | 隔開的 pattern,任一個符合的話就算符合。注:
+, =, | 會加上一個 ,是因原字元在 vi(m) 就具有特殊意義,在一般的 regexp 中是 +,?,| 就可以了,只是提醒您一下,以免搞混了!
在 elvis 及 ed 中是使用 ? 來匹配出現 0 或 1 次,而不是 =,這裏要非常小心!
[實例]
 dg*\r\n    指 * 前所綁住的字元 g 出現 0 次或 0 次以上。也就是說 d(出現 0 次),dg,dgggg,dgggggggg 都是符合這個 pattern。如果您下尋找指令 /dg*,那符合這個 pattern 的字串都會被找出來。如果用在代換就要非常小心了,像 extended 中的 d 也是會被置換掉的。例如您下 :%s/dg*/test/g 的話,那 extended 這個字會換成 extentestetest。注 : shell 中使用的通用字元爲 pattern matching notation 和 regexp 不同的。dg* 在 shell 中是解爲以 dg 開頭的任意字串,這就不包括 d 在內了,也就是說在 shell 中,* 是代表任一字元或字串。\r\n[實例]
 dg+\r\n    dg, dgg, dgggggg 皆符合,但 d 則不符合。如果是 dg= 的話,就只有 d、dg 這兩個符合了。\r\n[實例]
 :%s/The|All/test/g\r\n    全文中只要是 The 或 All 都會被替換成 test。注意,如果文中有 There 也是會被替換成 testre!要如何避免這種情形呢?下面會另述及限定使用法。\r\n[實例]
 /123-=4567\r\n    這樣會找出,123-4567 及 1234567。當然 123-456789 也是會被找出來。\r\n[...] 字元集合,表示中括號中所有字元中的其中一個。
[^..] 這是上述 [...] 的補集,表非中括號內字元的其中一個。
. 除換行字元外的任一單一字元。指本身,非指前所綁之字元。就好像 shell 中的 ? 一樣。如果要指定真正的英文句點,要用 來 escape,就是說 . 這時的 . 是代表真正句點,而不是 regexp 中的特殊意義。其他如 * 亦同。
[實例]
 [Aa]\r\n    A 或 a 其中的一個。\r\n     [12345]\r\n    12345 其中的一個數目字。可用 [1-5] 來表示。連續性的數目字或字元可用 - 來隔開,寫出頭尾來代表就可以了。[0-9] 就表 0 到 9 的數目字,[a-d] 就代表 abcd 四個英文字母。\r\n[實例]
 W[0-9]*.cc\r\n    這個例子是說以 W 開頭,後接 0-9 其中一個或多個數目字或不接什麼,然後是一個句點,最後是 cc。所以 W.cc,W1.cc,W2.cc,W345.cc,W8976543287.cc 皆符合。如果要表示 W 及 .cc 間夾一個以上的數目字,要寫成 W[0-9][0-9]*.cc。\r\n[實例]
 .*\r\n    這代表任意字元或字串,或什麼都沒有,腦筋急轉彎,對照前面的定義想 一下。\r\n[實例]
 [^M]\r\n    表除 M 以外的任意字元。
 [^Tt]\r\n    表 T 及 t 以外的任意字元。
 [^0-9]\r\n    表非數目字之字元。
 [^a-zA-Z]\r\n    表非英文字母之字元。\r\n注:\r\n注意,^ 要在中括號內,且在最開頭的地方,否則另有含意。^ 匹配行首,指其後綁住的字串,出現在行首才符合。$ 匹配行尾,指其前綁住的字串,出現在行尾才符合。含換行字元。
不是在行首的 ^ 指的是 ^ 這個字元。不是在行尾的 $ 是指 $ 本身這個字元。
[實例]
 /^What\r\n    這樣只有在行首的 What 纔會被找出來。注意! Whatever, What\'s 也是會被找出來。如果是 /What$ 則是在行尾的 What 纔會被找出來。\r\n[實例]
 ^$\r\n    這是什麼東東?行首也是行尾的行。ㄚ,就是空白行嘛!當然也不能說這個行是沒有什麼東東啦!空白行至少也是會有個換行字元。在後面會詳述如何消除全文的空白行。\r\n(...) 記憶 pattern,可由 1, 2...9 來叫出。
[實例]
 :%s/([a-z])1/test/g\r\n    這樣 aa, bb, cc, dd, ..., zz 都會被 test 替換掉。這和 :%s/[a-z][a-z]/test/g 是不一樣的意思,後者會把 aa, ab, ac... ba, bb, bc...zz 都換成 test。也就是說 (...) 由 1 叫出時會有對稱性的配對出現。\r\n[實例]
 :%s/(.)(.)r21/test/g\r\n    會將中間爲 r,前有二個任一字元,後有兩個具對稱性的字元所組成的字串替換成 test。例如:12r21,cfrfc,7grg7 等都會被替換成 test。\r\n匹配字尾。這就是前所提及的限定用法,被 括住的 pattern 就會被限制住,使 regexp 不能再向右(左)擴充解釋。
注: ed 及 perl 中可以 來表示這兩個符號,但 perl 中只支援 ,ed 則 及 皆支援。在 vim 中 是表示 即 backspace 鍵。功能上而言,這是和 ^ $ 一樣的定位樣式(anchor pattern)指所綁住的字串必須是單字邊界(word boundary),前或後或前後除了空白字元及標點符號外不可再有其它字元。\r\n[實例]
 :%s//test/g\r\n    這樣只有 abbbc 纔會被替換成 test。如果沒有這樣限定, :%s/abbbc/test/g,那 deabbbcly 中的 \"abbbc\" 亦會被替換成 test。所以前面 :%s/The|All/test/g 可換成 :%s/|/test/g 這樣一來,There 就不會被替換成 testre 了!\r\n[實例]
 :%s/]*$/d\r\n    在 vim 或 elvis 裏您可以如此照打,也就是 代表空白字元, 代表按 Tab 鍵的結果。在原始 vi 則不行,得自行按出特殊字元出來,就是 Ctrl-v Space 及 Ctrl-v Tab。或採更簡單的打法:
 :g/^s*$/d\r\n    還記得中介中元嗎?好用吧!少打了不少字。:-) 意思就是刪除含 0 或 1 個以上空白字元的行。注: 有些書中寫成 :%s/^$//g 可以刪除空白行,這是錯誤的,因爲 :s 這個指令只更動一行裏的內容物,但不會做刪除一行的動作。\r\n& 替代變數
代表置換時合於 patern 的字元或字串。\r\n[實例]
 :%s/uddddddddd>/ID:&/g\r\n    這樣全文中的身份證字號前就會加上 ID: 字樣,也就是說 T123456789 會被換成 ID:T123456789。還記得嗎? d 就是 [0-9],u 代表大寫的英文字母。加個 > 是防止 T12345678999 也被換掉。當然前面再加個\r\n    就是刪去行首的二個空白啦!\r\n[實例] 將全文的 Edward 這個單字,前後加上中括號
 :%s//[&]/g\r\n    [實例] 將全文的 Edward 這個單字,改成大寫的。
 :%s//U&/g\r\n    注: ㄟ!U 不是代表非大寫字母嗎?喔!您搞錯位置了。U 在 pattern 的位置的時候是指非大寫字母的樣式,即 [^A-Z],但如果是在置換字串位置的時候是指將其後的字串通通改成大寫。與其相對的是 L,會將其後的字串改爲小寫。詳細請 :h sub-replace-special。\r\n[實例] 將全文每行最後加上
這個 HTML tag。
 :%s/.*/&/g\r\n    怎麼樣,是否已感覺到 regexp 威力無窮了呢?還是您已經快睡著了呢?:-) 不過也請您想想,如果是在沒有 regexp 功能的編輯器裏,範例中的一些動作您會怎麼做呢?一個一個去改?\r\ngreedy 陷阱
regexp 會有貪心的傾向,什麼意思呢?就是說在同一行內,如果有多個符合 pattern 的情形,會找最長的那一個。\r\n注: 注意!greedy 的特性是針對會反覆比對的 regexp 而言,例如:*, =, +, {} 等。前面所舉的 .* 的例子,由於 greedy 的關係,在整篇文章中做替換時,會被當成是每一行整行,因爲 regexp 會去找每一行最長符合的那一個。\r\n[實例] This is a test. Test for regexp. 如果您下
 :%s/[Tt].*t/program/g\r\n    原意是想把所有的 Test 或 test換成 program 的,結果由於 regexp 的貪心,整個 \"This is a test. Test\" 會換成 program。結果原文就變成了program for regexp. 因此在全文替換時要非常小心,避免使用彈性太大的 regexp。像此例,只要下
 :%s//program/g\r\n    就可以了!\r\n最後提醒您,這可不是 regexp 的全部,礙於篇幅及在下功力的問題,當然是沒辦法全面詳盡的向各位做介紹,在下只是將各位領進門,修行就得看各位了!如果還想更深入的研究 regexp,可參考: Mastering Regular Expressions(O\'Reilly & Associates) 一書。\r\n__________________ 每臨大事有靜氣 不信今時無古賢\r\nThis is very, very simple:\r\n:noremap <F1> #*\r\nI find this helpful when editing multiple files and I want to search for the word under the cursor in *another* file.
I then type F1, C-^, n.
Using Insert mode to insert a single character feels clumsy (you need
3 keypresses for one character), so here\'s a slightly easier way:\r\n:nmap <space> i_<esc>r\r\nNow, when in Normal mode, just press space followed by what
it is you want to insert.\r\nBUG: Repeating the insertion with . doesn\'t work.\r\n  rate this tip  Life Changing Helpful Unfulfilling\r\n<<Syntax highlighting is \"out of sync\", seems to correct itself with refresh ?? | easy (un)commenting out of source code >>\r\nAdditional Notes
 [email protected], July 23, 2002 2:59
Very good tip, but I prefer <C-I> as a {lhs}.  It is unused and fits better to the insert logic of VIM, although it saves less key strokes.
reiss_david AT yahoo DOT com, July 29, 2002 10:30
I use
:map gt i$<esc>r
:map gb a$<esc>r
These macros were derived from one I found in a Vi FAQ.
Anonymous, May 20, 2003 10:44
yeah, both comments get to the point, but the author was looking for a way to save a keystroke. both solutions are 3 keystrokes long.
You can use the :redir command to redirect the output of an ex command to
a register and then paste the contents of the register into a Vim buffer.
For example:\r\n:redir @a
:set all
:redir END\r\nNow, register \'a\' will have the output of the \"set all\" ex command.  You
can paste this into a Vim buffer.  You can also write a Vim function
to do the above.\r\nFor more information, read :help redir
I love using the visual block feature to move columns around (<ctrl-v>, blockwise-visual).
However, this does not work conveniently on the last column
when  lines are not of equal length. <ctrl-v> marks then a block which
is equal in width to the shortest line.\r\nIn order to pad all lines to a given width with trailing blanks
you can use the following functions:\r\n\" truncate line \'line\' to no more than \'limit\' width
function! Truncate( line, limit )
    call cursor(a:line,a:limit)
    norm d$
endfunc\r\n\" Pad all lines with trailing blanks to \'limit\' length.
function! AtOnce( limit )
    norm mm
    g/^/norm 100A
    g/^/call Truncate( getline(\'.\'), a:limit )
    let @/=\"\"
    norm \'m
endfunc\r\nYou may alternatively use the oneliner:
:g/^/exe \"norm! 100A\" | call cursor(getline(\'.\'), 79) | norm d$\r\nI even saw someone use a standard vi (non vim) oneliner to achieve the
same, but I forgot how. Any ideas?
【 在 neman (行勝於言) 的大作中提到: 】
: 標  題: Re: win Gvim不顯示菜單和工具條
: 發信站: BBS 水木清華站 (Tue Jun  8 20:47:50 2004), 站內
:
:
: 【 在 qnx (OS) 的大作中提到: 】
: set guioptions=
: map <F2> :call SwitchShowMenus()<CR>
: function! SwitchShowMenus()
:     if &guioptions==\"gmrLtT\"
:         set guioptions=
:     elseif &guioptions==\"\"
:         set guioptions=gm
:     else
:         set guioptions=gmrLtT
:     endif
: endfunction
:
: \"gmrLtT可以顯示工具條和菜單,gm僅僅顯示菜單
:
:
: 你的這個功能我的那個也是能實現的,
: 本來是介紹一個經驗的,結果沒有說明白,:)
:
: 我的問題是:
:     1、我不想要title條, set notitle 它只是把title的文字去掉了。
:     2、窗口最大化後最下邊的無用空白條太大了,看起來不美觀
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~這個白邊確實沒有什麼用, 不知道哪位niu能弄掉?
: 有辦法解決沒有? 謝謝 :)
精華區文章閱讀
發信人: vale (淺谷·等待溪流), 信區: VIM
標  題: VIM中不易發現的強勁功能
發信站: BBS 水木清華站 (Mon May 31 10:54:41 2004), 站內\r\n在我最初使用Vim時,有些功能並不知道,等發現後真後悔自己幹了那麼久的體力活。\r\n1. * (super star)
向下查找光標下(或附近)的<word>。向上找用#。g*查找則不限制whole word。\r\n2. C-R (magic insert)


在insert模式下,C-R (register) 插入register裏的內容,一個有趣的reg是\"=\".
假設你想輸入123K的具體字節數,不用打開計算器,試試這個“<C-R>=1024*123<CR>”,
“125952”就出來了!
另外在命令行裏C-R C-W和C-R C-A是必用的技巧,它們將光標下的<word>和<WORD>
考到命令行裏,省了你無數的typing。\r\n3. C-X (auto complete)
在insert模式下,C-X C-P/N/L/F等自動完成前面的詞、行、文件名等,是編程時必用的
命令。其中C-P和C-N可以不用C-X。\r\n4. [p & ]p (smart paste)
paste同時自動根據目標行的縮進調整來源行的縮進。在copy代碼段的時候非常有用。\r\n5. C-O (fast out, fast in)
在insert模式下,用C-O後可以執行一個normal命令,然後立即返回insert模式,省去了
用ESC的麻煩。\r\n6. [I (fast grep )
[I顯示文件中包含光標下<word>的所有行。我常用來瀏覽某個id在程序中的引用情況。
還有很多相關的命令::h include-search\r\n7. object-select
iw, aw, ib, i], i} ... 都非常有用!看help吧
:h object-select\r\n先寫這麼多,以後再補充吧。\r\n例如你想把所有的\"...\"形式的串替換成\'...\'的形式
但引號裏的內容不變
你就可以用
%s/\"\\(.*\\)\"/\'\\1\'/來做
上面這個正則表達式\"\\(.*\\)\"裏 \\用來表示()是元字符
第一個在括號裏的被匹配的串就可以被\\1來代表, 以後依次是\\2 \\3。
順便說一句,我到現在還不
知道怎麼限制vim里正則表達匹配的貪婪算法。\r\n------------------------------------\r\n裏面說的非貪婪匹配是 \\{-},
    也就是 %s/\"\\(.\\{-}\\)\"/\'\\1\'/g
    \\ 太多了可以用 \\v,
        %s/\\v\"(.{-})\"/\'\\1\'/g
詳細
    :h /\\{-
    :h \\v
另外 和 perl 正則表達式的區別在 :h perl-patterns
把aaaaa.20300.2000.com 替換爲aaaaa.com
  ~字符 ~~~~~數字和點\r\n我用s/\\(^.*)\\(\\.\\d*.\\)com/\\1.com/
結果爲 aaaaa.20300.com
請問有沒有好點兒的辦法?謝謝\r\n
☆─────────────────────────────────────☆
   alphatan ( C ) 於  (Tue Aug 10 09:27:19 2004)  提到:\r\n【 在 qiaolin (風兒) 的大作中提到: 】
: 把aaaaa.20300.2000.com 替換爲aaaaa.com
:   ~字符 ~~~~~數字和點
: 我用s/\\(^.*)\\(\\.\\d*.\\)com/\\1.com/
  1. \\(^.*\\) 一下子把整個字符串吞進去了. \\1 = aaaaa.20300.2000.com
  2. 遇到com把 com從\\1中吐出來. \\1 = aaaaa.20300.2000.
  3. 遇到.把com前面的\\.吐出來   \\1 = aaaaa.20300.2000
  4. 遇到\\d*, 再把隨後的2000吐出來 \\1 = aaaaa.20300.
  5. 遇到\\., 把.也嘔出來了.  \\1 = aaaaa.20300
所以, 得到你要的結果.
可以用\\{-}進行非貪婪匹配.\r\n但爲什麼不直接把數字跟它們的點去掉呢?
s/[0-9.]\\+//g\r\n: 結果爲 aaaaa.20300.com
: 請問有沒有好點兒的辦法?謝謝
☆─────────────────────────────────────☆
   qiaolin (風兒) 於  (Tue Aug 10 09:36:27 2004)  提到:\r\n謝謝大俠,有問題請教:
貪婪匹配的順序是怎樣的呢?
在這個例子中,先匹配第一個pattern,再從最後面的pattern一個一個“吐”出來?
【 在 alphatan ( C ) 的大作中提到: 】
:   1. \\(^.*\\) 一下子把整個字符串吞進去了. \\1 = aaaaa.20300.2000.com
:   2. 遇到com把 com從\\1中吐出來. \\1 = aaaaa.20300.2000.
:   3. 遇到.把com前面的\\.吐出來   \\1 = aaaaa.20300.2000
:   4. 遇到\\d*, 再把隨後的2000吐出來 \\1 = aaaaa.20300.
:   5. 遇到\\., 把.也嘔出來了.  \\1 = aaaaa.20300
: 所以, 得到你要的結果.
: 可以用\\{-}進行非貪婪匹配.
: 但爲什麼不直接把數字跟它們的點去掉呢?
: s/[0-9.]\\+//g
這裏沒有這樣用是因爲aaaaa也可能是a123a,可不可以用/w呢?
在查找、替換命令 使用以下正則表達式元字符,功能強大。
也可用在:g/命令中\r\n& 代表最近匹配串
~ 代表最近替換串
. 任一字符
^ 行首 或 表示 非
$ 行末
\\< 詞首
\\> 詞尾
*            0次或多次
\\( \\)  分節指定與其中正則式匹配的部分,在替換時候可以用 \\1 \\2 \\3  ... 引用匹配部
分
[] 表示選擇
- 表示範圍 ,例如 [0-9]代表數字,[a-z]代表小寫字母 [^0-9a-zA-Z] 代表非數字和大小
寫字母
\\{m,n\\} 前面部分的從 m 次 至 n 次出現,m n 爲數值
\\{m\\}                精確m次出現
\\{m,\\}               大於等於m次出現\r\n以下舉幾例子,歡迎大家提出問題來共同探討。
1.在20列後插入串
:%s/^.\\{20\\}/&insert something here/g\r\n2.把C++語言裏 //註釋 修改爲 /* */ 格式
:%s/\\/\\/\\(.*\\)$/\\/\\*\\1\\*\\//g\r\n3.在建存儲過程的sql文本里,在每個create procedure procname()
  前加上drop procedure  procname ;  [  ]裏輸入的是一個空格和TAB鍵。
:%s/^[  ]*[cC][rR][eE][Aa][tT][eE][     ]*[pP][Rr][oO][cC][eE][dD][uU][rR][eE][     ]*
\\([^(]*\\)/drop procedure \\1;Ctrl_VCtrl_Mcreate procedure \\1/g\r\n----------------\r\n數字加減, CTRL-A, CTRL-X\r\n----------------\r\nvim裏自動縮進一段
把光標移動到某個花括號,
按 =% 縮進整段。
把整段不按格式往外縮一個tab
>%
縮兩個
>>%
往裏縮
<%\r\n注意%匹配很多東西,
如果你想從
#ifdef
縮到
#endif
也可如此\r\ntry :help c_CTRL-R
    :help c_CTRL-D\r\n<C-R><C-W>: 將光標下的keyword拷貝到命令行緩衝區中
<C-R>*: 從系統剪貼版中拷貝內容
<C-R>=: 表達式求值
<C-R>\": 拷貝buffer中的內容
....\r\n<C-D>: 命令和文件提示
常用命令:
------------------------------
    CTRL-Z      vim 切換到後臺\r\n    :g/xxx      列出所有含 xxx 的行; 適合想到含 xxx 的某行, 但不知道行號,
                    /xxx 又太慢\r\n    q: q/ q?    編輯長命令時比較舒服, 執行按回車, 按 CTRL-C 再次進入
                    : / ? 原來的輸入狀態, 再按一次關閉.\r\n    CTRL-W=     所有窗口等高, 適合 diff 時自己移動了 window 大小
    CTRL-Wo     等效於 :only
    CTRL-Wc     等效於 :close!\r\n    gvim -u     用 NONE 的話必須大寫, 可以用 nul 文件, gvim -u nul, 而且不
                        區分大小寫\r\n         -s     執行腳本文件, 是 normal 時的指令, cmd 的命令要 :, 但不用加<CR>
         -w     把所有按鍵記錄 appedn    到指定文件中
         -W                    overwrite
                這 2 個適合不會 perl sed 的 vimer\r\n        --servername
        --remote-silent     這 2 個搭配着用, 可以總在一個 vim 裏打開新文件, 比如
                gvim.exe  --servername smarter  --remote-silent  test.text
                命令太長, 可以自己 alias 一下(win32 下用 doskey 就可以)\r\n    再次選中 上次選中的內容, 用 gv
    在選中的區域首尾跳動, 用 大寫 O\r\n    :redi       把輸出信息重定向, 比如 保存所有 set 選項到 剪切板
                    :redi   @*
                    :se all
                具體 :h redi\r\nc\\c++ 下常用的:
------------------------------
    [[
    ]] 在 C 的 {} 形成的段落中移動 (在第一列 { 之間跳動,
        一次一個函數,一個結構或類的定義)\r\n    [# 和 ]# 在 #if #else #endif 的上下位置間移動
    [{    ]}
    [(    ])
    [/    ]/ 在註釋 /* */ 間移動
        這樣在這些塊的中間位置, 就能迅速到塊頭和塊尾
        如果已經在這些行上, 如果不是到對應點,
            會到上一級範圍, 如 { 上按 [{ 到上一級
                ]}  則到對應點\r\n    (vim 裏常用 [ 表示 \"向上\",
                ] 表示 \"向下\",
        比如上面的例子, 以及 [i ]i, diff 時候的 [c ]c 等)\r\n    %  在 ()   {}  []  #ifdef #endif  /* */之間跳轉
        可以 :so  $VIMRUNTIME/macros/matchit.vim
        這樣可以在 if endif <tr> <\\tr> 之間使用\r\n    對 1 個塊的操作, 具體 :h v_a
        裏面的 iX aX 什麼的都很好用\r\n    ctags 用 -a 附加新 tags 到 ctags 文件後\r\n    --- 對 c
    --- ctags  -R  --c-types=+px  d:\\mingw\\include (etags)
    --- 因爲 ctags 確省不把函數聲明作爲 tag\r\n    --- 對 c++
    --- ctags -R --language-force=c++ --c++-types=+px --verbose --extra=+q
            extra=+q 用來增加生成 Class::member 的形式, 默認沒有
            這樣就可以用 :ts CView::OnDraw 這種形式看
    --- 因爲 c++ 一些頭文件不用 .h 所以要用 --language-force\r\n    --- 對 java
    --- ctags -R --languages=java c:/jdk131/src
    --- 要把 src.jar 展開\r\n    :che    檢查 include 的文件在 path 中是否存在, 注意會遞歸驗證\r\n插入模式
------------------------------
    insert 模式下的:
        CTRL-W      回刪一個 word, 具體 :h i_ctrl-w
        CTRL-U      回刪在當前行輸入的內容\r\n        CTRL-R      用某個 reg 的內容\r\n        CTRL-E
        CTRL-Y\r\n       0CTRL-D      這 2 個對縮進, 具體 :h i_0_CTRL-D
       ^CTRL-D\r\n        CTRL-C      退出 insert\r\n       另外, ascii 第 1 - 26 個對應的就是 CTRL-A 到 CTRL-Z
            所以下面幾個也常用
        CTRL-H  對 <BS>
        CTRL-J  對 <LF> vim 裏叫 <NL>
        CTRL-M  對 <CR>\r\n    不使用 ab:  輸入 縮寫 後, 按 ctrl-v 接着輸入以後的字符
發信人: sysfree (蟲), 信區: VIM
標  題: 插入模式下的命令彙總
發信站: BBS 水木清華站 (Wed Nov 17 14:36:29 2004), 站內\r\n插入模式下有用的鍵盤命令:
(注意:以下命令都是在插入模式用的,也就是左下角要顯示\"--Insert--\")\r\nCTRL-[ or CTRL-C: 退出插入模式。如果嫌<Esc>太費事,可以試試這個。
CTRL-A: 插入先前插入過的內容。看起來比較有用,但是飄忽不定,很難把握。
CTRL-N/CTRL-P: 搜索匹配,自動完成單詞(超級有用)。
CTRL-R: 插入寄存器內容。例如<C-R>*會插入windows剪貼板的內容。:reg命令查看全部寄存器。
CTRL-T/CTRL-D: 將本行縮進/去縮進,無論光標在什麼位置
CTRL-Q: 當CTRL-V不能用時,可以試試這個。
CTRL-Y: 輸入和上面一行相同的字符。有時候可能用的着。
CTRL-E: 輸入和下面一行相同的字符。
CTRL-X: 進入CTRL-X模式。\r\nCTRL-X模式基本上是用來自動完成的。vim的自動完成可以包含當前文件、頭文件、tag文件、字典文件等。
CTRL-X模式中的主要命令:
CTRL-X    CTRL-L: 整行自動完成
    CTRL-P/CTRL-N: 在當前文件中自動完成單詞
    CTRL-I: 在頭文件中查找匹配的單詞
    CTRL-]: 在tag中補全單詞
    CTRL-F: 自動完成文件名
    CTRL-D: 在頭文件中查找宏定義
以上命令都可以再緊跟CTRL-P或CTRL-N,表示繼續向前或向後搜索。
例如:按CTRL-X CTRL-L補全了一行,但不是自己想要的,可以繼續按CTRL-L查找,也可以按CTRL-P或CTRL-N繼續查找。找到後如果再按CTRL-X CTRL-L將會把找到的那一行的下面的行也複製過來,很過癮吧?
下面兩個命令也在CTRL-X模式,但是不屬於自動完成:
CTRL-X CTRL-E: 在插入模式下讓屏幕往上滾一行
CTRL-X CTRL-Y: 同上,屏幕下滾一行\r\n其它不常用的命令沒有列出。歡迎補充。\r\n去掉菜單   set go-=m
去掉工具條  set go-=T
去掉右邊的滾動條  go-=r
去掉下邊的滾動條  go-=b
4 最好的辦法,編輯_vimrc.
加入set fileformats=unix,dos,mac
不管什麼格式都可以識別了。按說vim可以自動轉換的,不知道爲什麼
要自己加,我的是vim63 windows版。
你想要的是 \'cscopequickfix\' 這個選項吧?\r\n首先,你要設置 \'cscopequickfix\' 這個變量,比如
set cscopequickfix=s-,c-,d-,i-,t-,e-
再打開 quickfix 窗口
copen
然後,比如你要找出所有出現 elephant 的地方,可以
cscope find s elephant
所有的結果都顯示在 quickfix 窗口裏面了,可以雙擊或者回車來選擇。\r\n發信人: ann77 (ann), 信區: VIM
標  題: Re: 請教如何將vim和編譯器整合使用
發信站: BBS 水木清華站 (Wed Jul  7 12:49:16 2004), 站內\r\n我做了一個試驗,也許對你有幫助。\r\nVIM和其他編譯器一起工作的原理就是把
compiler 的stderr 重定向到一個臨時文件中。\r\n然後用 :cfile 打開這個臨時文件,
用 errorformat 來解釋臨時文件的內容。\r\n下面我的具體做法,
我是在 BASH 下。
$for i in * ; do echo \"2:$i:$(head -n 1 $i)\" ; done > x
生成一個錯誤文件,內容如下
2:scr:#!/bin/bash
2:screenshell:#!/bin/bash
2:view-data.py:#!/usr/bin/python
2:view-data.sh:#!/bin/bash
2:x:2:scr:#!/bin/bash
每一行的格式就是
行號:文將名稱:錯誤信息。\r\n然後用 vim
:set errorformat=%l:%f:%m\r\n設定 errorformat 的格式, :help errorformat for more information
:cfile x
打開錯誤文件。\r\n然後就可以想 make 出錯的時候一樣,打開每一個文件的第2行了。\r\n
我認爲,你切換到了新的 compiler 後,你要做的事情就是
觀察新的 compiler 的錯誤輸出,編寫一個新的 errorformat
就行了。\r\n調試的時候,可以
$ make 2>temp-error-file
然後 vim 中
:set errorformat=?????
:cfile tmp-error-file\r\n【 在 Charity (花無缺) 的大作中提到: 】
: 在RH下,我已經習慣了
: GCC + Vim + Make整合使用,
: Vim好像可以直接利用GCC編譯器生成的Error List,
: ...................
標  題: Re: 如果查看一個10000000行的文件,如何提高速度?
發信站: BBS 水木清華站 (Fri Jul 23 11:03:37 2004), 站內\r\n只要就是顏色高亮引起的, 只要syntax off 或是set filetype= 就可以了
這個在打開那些一行xml文件時尤其明顯(xml可以set filetype=html)\r\n【 在 thinelephant (嚴重消化不良) 的大作中提到: 】
: 主要是翻頁的速度,如果向下一點一點的翻頁速度還可以,但是向上翻頁或者滾動就很慢,或者跳到文件末也要等一會。退出也要等一會。
: 呵呵,我已經找到解決方案了:只讀打開,set compatible,syntax off。
: 速度不錯,關閉也是瞬間。
: ...................
\'d\r\nd 表示0-9的數字,
代表最近打開的文件
發信人: windblown (......), 信區: VIM
標  題: Re: 問一個替換怎麼寫
發信站: BBS 水木清華站 (Tue Dec 14 10:08:39 2004), 站內\r\n用sed吧
sed -e \'
:REPEAT
s/\\([[:alpha:]]*\\) \\([0-9]*\\),/\\1 \\2\\n\\1 /
t REPEAT
\' yourfile\r\n【 在 thinelephant (嚴重消化不良) 的大作中提到: 】
: 每一行都是 \\S\\+ \\(\\d\\+,\\)*\\d\\+ 的形式,想把每行的逗號分割的數字展開成多行。
: 例如
: elephant 13,18,19
: ...................
vim 使用的一些小技巧。 \r\n在每行後面插入一行68個-號,用下面的命令:
:%s/\\n/\\r---------\\r/
暫時沒弄明白前面爲什麼用\\n,而後面用\\r。\r\n
vim的列模式。
在命令模式下,按v(or V)可進入可視模式,但是隻能按行選擇。要進入列模式,使用ctrl+v。\r\n
VI是VIsual editor的意思,ex是他的“不可視”版本。如果多許多文件進行同樣的編輯,用vim一個一個弄,就顯得很麻煩。這種情況,我們可以採用ex進行自動化處理。例如要把當前目錄下所有的html文件編碼由big5轉換成gb2312,可以執行下面的腳本:
#!/bin/bash
for I in *.html;do
ex - $I<<EOF
:set encoding=big5
:setfileencoding=gb2312
:wq
EOF
done\r\n
基於GTK2的gvim在gbk的locale下,菜單和編輯區中文字全亂碼,而gb2312和utf-8 locale下均正常。解決辦法:在自己的home目錄下,創建一個.gvimrc文件,其中包括:
set encoding=gb2312
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
其原理似乎也是使用了gb2312的locale。gvim(GTK)本身不支持gbk?\r\n
vim具有的fold功能,可以把相連的某些行摺疊起來,在需要的時候展開。
選中要摺疊的行,zf命令創建一個fold並摺疊起來,zr命令展開。z打頭的很多命令都和fold操作有關,具體請:help z\r\n
假設你在編輯一篇html文件,可以使用如下命令對它進行排版:
:%!tidy -iq
tidy是一個html/xml格式化工具,同時還具有查錯和轉換功能。\r\n
vim對很多源文件提供彩色顯示功能,能否把vim中顯示的彩色發佈到web上呢?下面的命令能幫你完成。
:TOhtml\r\n
使用y命令在vim中複製的時候,可以保存在a-z26個寄存器中,其實還有兩個寄存器可以使用:*和+,放置在*寄存器中的文字(\"*yy),可以通過鼠標中健粘貼到其它程序中,比如mozilla,+號寄存器中的文字(\"+yy),通過右健菜單中的paste粘貼出來。反之亦然。(這一招學到smth上acura的,在此表示感謝!) 
********************************************************************************
件,然後在裏面加入一行就可以打開所有的編碼的文件了(暗爽):\r\nset fileencodings=ucs-bom,utf-8,cp936,big5,euc-jp,euc-kr,latin1
保存從新起動vim,打開文件 ok了。說到這裏我感覺vim裏面還有一個顯示行號和語法高亮是我常用的功能,每次在 vim裏面輸入syntax on太他嗎的煩了,我這種懶人是不能容忍這種事情發生的,算了,往裏面在寫兩行字符,讓他打開的時候自動的開啓吧:\r\nset nu           #打開顯示行號的功能 
syntax on           #打開語法高亮的功能
這樣打開一個源代碼文件感覺就比較爽了,效果太好了,不好,這麼正規的軟件代碼也有bug ,我改改,去除那個bug section,我自己往裏面寫,輸入代碼,可是怎麼不會自動縮進呀,這讓我們這些人怎麼能夠忍受呀,好了,聽說有個vim給寫好的配置文件,是推薦的,拷貝了直接使用,估計就可以了,在終端輸入命令一條吧。 \r\ncp /etc/vim/vimrc /usr/share/vim/vim63/vimrc_example.vim
好了,就這樣從新打開 vim,一切 ok 了,如果能有鼠標控制,有 menu 就更好了,我們繼續添加,不就是網 .vimrc 裏面加己行字嗎,呵呵:\r\nset mouse=a      #加入鼠標支持 
set wildmenu
這樣就差不多了,基本上可以滿足一般人的需求了,可是我這種程序源的話可能在讀源代碼的時候會經常的在多個文件中間轉換,如果每次都退出在用vim 打開的話很麻煩的,怎麼辦,分屏打開多個文件,這個可以,使用:new命令就可以,可以分屏的,但是我的可是15 的顯示器,分分還有什麼呀,還是想個其他的方法吧,能不能用一個簡單的命令在不退出vim的情況下來回轉換呀,答案是肯定的,偉大的 vim什麼做不到呀。還是在.vimrc裏面加入幾句話,不過這才麻煩點,呵呵\r\nif has(”unix”) 
    map ,e :e <C-R>=expand(”%:p:h”) . “/” <CR> 
else 
    map ,e :e <C-R>=expand(”%:p:h”) . “\\” <CR> 
endif
保存重新打開 vim,然後用 vim 打開一個源代碼文件,在正常模式下輸入,e 就會有一個框出來,上面羅列了當前目錄下的所有文件,你用 tab 建來選擇打開那個文件,太爽了。基本上 vim 的東西就這些了,還有的就是一些漢化的了,我在 linuxfans.org下載了 vim 的中文文檔,解壓安裝了,使用的不錯,我先去吃飯,回來繼續。
********************************************************************************
vim tips 之五\r\n \r\n
vim設置自動格式化文本:\r\n \r\n源碼:--------------------------------------------------------------------------------
:set formatoptions=croamq\r\n  :help formatoptions 看幫助;
  t 在文本寬度內,自動換行,對註釋行無效;
  c 對於註釋,在文本寬度內自動換行,並自動插入註釋前導;
  r 在插入模式下,回車後自動插入當前註釋前導;
  o 在正常模式下,用o或O插入空行時,自動插入當前註釋前導;
  q 允許用\"gq\"格式化註釋。但格式化不改變空行或只帶註釋前導的行。
  m 對於255以上的多字節字符也進行斷行。這對於每個字符就是一個字的亞洲文本特別
    有用。
  n 對於帶. ) ] }的數字,如1., 1)等等,自動換行對齊;要求自動縮進選項ai打開。
    例如:1. test
             wraps.
          2. test2...
********************************************************************************
具體的可以help看幫助\r\n討論到的自動縮進是 autoindent
主要是 c 代碼等
拷貝粘貼  就在已經縮進的基礎上再縮進 很不美\r\n於是就可以 set noautoindent 解決
或者設置 set paste\r\n具體 vim 網站有 Tips
Tip #330: how to stop auto indenting
http://www.vim.org/tips/tip.php?tip_id=330
********************************************************************************
摘要:vim的一個有趣的用法 
 
 \r\n
如果想在vim裏面達到這個效果,在vimrc中加入一下兩行:
au BufWinEnter *. exe \'set list listchars=tab:\\|\\ \'
au BufWinEnter *. exe \'command Seetab :set list listchars=tab:\\|\\ \'\r\n當你編程序時, 就會達到這個效果. 源自:http://www.vim.org/tips/tip.php?tip_id=460\r\n用法:
當你不想看到對齊線時 在vim的normal模式下 :set nolist
如果你想看到對齊線時 在vim的normal模式下 :Seetab
 
在我們談起Vim編輯器似乎只是覺得他只是一個類似於一個命令行方式的文本編輯器。而事實上不是這樣的。Vim在窗口環境中也可以完美的完成我們的工作。在窗口環境下,我們不僅可以使用那些在Vim文本方式下的命令來完成工作,而且還有許多的菜單和其他的選項。這些都使得我們可以完美的來完成我們的工作。
我們要啓動圖形界面的Vim可以用下面的命令:gvim file。這樣就可以打開圖形界面來編輯文本file。圖形界面下的Vim編輯器的外觀因你所用的操作系統的不同而有所不同,就是同樣的操作系統也會因你所使用的工具集不同(Motif,Athena,GTK)而會呈現不同的外觀。而值得向大家推薦的是GTK版本的Vim編輯器,當然其他版本的也是可以來完美的完成我們的工作的。
在Windows系統中我們可以在標準形式下用鼠標來選擇文本,而在X Window系統中我們也會有一個標準的系統來使用鼠標,但是這兩種標準是不同的。然而比較幸運的是我們可以定製我們的Vim編輯器。我們可以使得我們的Vim中的鼠標的行爲看起來像是X Window系統中的鼠標的行爲。下面的命令是設置鼠標的行爲爲X Window風格的鼠標行爲::behave xterm。而下面的命令則是使得鼠標的行爲是Windows風格的行爲::behave mswin。在UNIX和Linux系統中的鼠標風格是xterm風格,而在Windows中的鼠標風格是在安裝過程中選擇的。爲了控制鼠標的行爲,命令:behave有以下這些選項:
        Setting for        Setting for
Option        :behave mswin        :behave xterm
\'selectmode\'    mouse,key        (empty)
\'mousemodel\'    popup            extend
\'keymodel\'    startsel,stopsel    (empty)
\'selection\'    exclusive        inclusive
xterm的鼠標風格的行爲主要有以下一些:
左鍵:        移動光標
拉動左鍵:    在可視化模式下選擇文本
右鍵:        選中光標處到右鍵點擊處的文本
中鍵:        在光標處粘貼選中的文本
Windows的鼠標風格的行爲主要有以下一些:
左鍵:        移動光標    
拉動左鍵:    在選擇模式下選中文本
<S-Left Mouse>    選中到光標處的文本
<S-Right Mouse>    顯示彈出菜單
中鍵:        將系統剪切板中的文本粘貼到文件
(注:其中的S爲Shift鍵)
其他的一些特殊的用法:
Shift+左鍵:    向前搜索光標處的文本
Shift+右鍵:    向後搜索光標處的文本
Ctrl+左鍵:    跳轉到以光標處的文本爲名字的標記(tag)處
Ctrl+右鍵:    跳轉到前一個標記處
在圖形界面的Vim編輯器還有一個有趣的特徵,那就是當我們點開一個菜單時就會發在子菜單的第一行有一條虛線,點擊此虛線就可以將這個菜單移其他的地方。關閉後Vim的菜單結構又恢復到正常的狀態了。在GTK版本和Windows版本中的圖形界面的Vim還有一個工具欄,這些工具可以快速的完成我們的工作。\r\n \r\n
vi編輯器的學習使用(一) 
vi編輯器是Unix的世界中一個相當強大的可視化編輯器,有人曾這樣的說過在世界上有三種人:一種是使用Vi的,另一種是使用是Emacs的,剩下的是第三種人。由此可以看出Vi和Emacs的強大。在有關Linux的論壇中關於Vi和Emacs的論爭也是一直不斷的。現在看來這樣的論爭也實在是沒有辦法的,這兩個編輯器是同樣的強大,同樣有不同的人在支持。在個人看來就是同時喜歡這兩個的。然而他的這種強大也是要會付出一定的代價,他的學習和使用也是相當的複雜的,在學習的起點常常會面臨着一個巨大的學習困難。但是隻要過了這樣的一段時間你就可以來體會Vi的強大了。\r\n一 Vi的啓動與退出在現在的Linux世界中還有一個發行版本被稱爲是Vi的改進版本,所以被稱爲是Vim,也就是Vi Improved的意思。在現在的一般的Linux的發行版本中常常是Vim的。要啓動Vi可以終端窗口輸入vi或是vim,這樣就可以終端窗口打開一個Vi的編輯窗口。或者是輸入gvim,這樣就可以打開一個類似於gedit這樣的文本編輯器,他有一些菜單,但是大部分的功能仍是通過命令行的方式來完成的。在vi中有兩種模式:一是命令模式,一是編輯模式。命令模式是用來輸入命令行來完成工作的。而編輯模式是用來編輯文本的。在兩種模式中切換可以通過Esc來完成。在我們完成了文本編輯以後可以這樣的來退出:\r\n:q 這是退出的命令,如果你已經做過了改動,那麼就會提示錯誤。\r\n:q! 這也是一個退出命令,與上一個不同的是,我已經做過了改動,但是我想放棄這些改動,從而用這樣的命令。\r\n:w 這是文件寫入的命令,但是執行完這個命令後並沒有退出vi. \r\n:wq 這個命令的意思是保存並退出\r\n二 Vi的基本編輯命令在啓動了Vi以後是在命令模式的,這是可以輸入i(insert)進入插入模式。這時會在Vi窗口的下端顯示出你這時的狀態。這時你就可以來輸入文本了。在這樣的情況下,你可以用Backspace來Delete來刪除一個字符。用方向鍵來控制光標。其實在知道了這樣的幾個命令後就可以用來編輯文檔了。但是這樣的幾個命令並不能保證你能高效的來完成你的工作。而事實上在命令模式下我們用鍵盤來移動光標而不用將手離開鍵盤去按方向鍵,這樣就可以大大的增強你的編輯速度。\r\n我們可以用h(left),j(down),k(up),l(right)這幾個鍵來移動光標。我們可以將光標放在一個字符上同時按下x鍵來刪除這個字符。\r\n我們可以將光標放在某一行同時按下dd,這樣就可以將這一行刪除。\r\n當然有的時候也許我們做了一些事情,不過我我們覺得以前的要更好一些,我們想要恢復到以前的狀態,在這樣的情況下我們可以u和U這兩個命令。u要撤銷上一次的修改,而U將是撤銷所記錄的所有的修改。\r\n而有的時候我們覺得現在的工作要好一些,我們希望撤銷剛纔所做的撤銷工作,也就是我們要重做這些工作,這時我們可以使用CTRL_R命令來達到我們的目的。\r\n有時我們可以使用新增的命令,使用a和A來完成這樣的工作。a在當前光標所在的字符後面進入插入狀態,而A是在一行的末尾進入插入狀態。使用這兩個命令可以方便我們進行文本的插入操作。\r\n在vi的編輯模式中,是將回車換行看作新的一行的開始。有時我們希望新插入一行,這時可以使用o和O這兩個命令來完成。o是在文本的下面新增一行並進入插入模式,而O是在文本的上一行新增一行並進入插入模式。\r\n有了這些命令,現在的我們就可以比較方便的來完成我們的文本編輯工作了。但是有時候得到在線的幫助對於我們來說顯得更爲重要,要得到vi的幫助,可以在命令的模式下輸入:help,這樣就可以得到vi的在線幫助了。要想退出幫助,可以輸入退出命令,:q.\r\n爲得到更明確的幫助,我們可以明確的指明我們所需要知道的內容。例如我們想知道關於x一些更詳細的內容我們可以輸入:help x.我們要想得到其他的幫助,我們就可以這樣來得到我們想要的幫助。\r\n在vi中可以使用數字和命令組合的方式得到新的命令,例如3h,這樣就可向左移動3個字符。同樣可以使用數字和其他的移動鍵進行組合來達到快速移到的目的。也可以是數字和其他的命令組合形成新的命令,例如3x就可一次刪除3個字符。爲了我們更快速的掌握vi的使用,vi本身也提供了一個學習的教程,只要你能耐心的做下來,我想使用vi對你來說應不再是一件難事了。進入vi的學習教程,可以在終端輸入vitutor.這樣就可以進入vi的學習教程,爲了得到更多的幫助信息,可以在vi的窗口內輸入:help tutor.這樣就會得到更多的關開Tutor的幫助信息的。\r\n
vi編輯器的學習使用(二) 
vi學習筆記之二在上一節的學習中,我們只是學習一些使用vi進行文本編輯的基本的命令。有了這些的基本命令我們就可以完成一般的文本編輯任務。在這一節中我們要學習一些其他的一些編輯命令,這些命令將包括其他的一些光標移動命令,如何在一行中快速的查找我們想要的東西,其他的一些文本刪除和更改的命令,鍵盤宏和特殊字符的輸入。在vi的編輯中,我們可以有多種的光標移動命令:我們可以用w命令向前移動一個字符,用b命令向後移動一個字符。就像其他的vi命令一樣,我們也可以用數字來做前綴從而組成新的命令,來快速的移動。例如4w就是向前移動4個單詞,而5b則是向後移動5個單詞。而我們在編輯的過程中又如何來快速的移到一行的開始或是結尾處呢?在vi中$和^可以來完成這樣的工作。$可以使光標移到一行的結尾處,而^可以使光標移到一行的開始處。$命令可以和數字進行組合形成新的移動命令,而^也可以和數字進行組合,但是組合後組成的新的命令中數字卻不起任何的作用。在我們的文本編輯中我們就會移動光標是我們經常要做的事情,但是我們很快就會發現查找我們要找的字符串也是我們經常要做的一件事。那麼如何在文本編輯中快速的查找到我們想要的字符呢?在vi的編輯命令有幾個這樣的小命令可以幫助我們來完成這樣的工作:f是向前搜索的命令。例如fx是向前搜索字母x.利用f向前搜索的命令我們也可以快速的移動到指定的位置。而F是向左搜索的命令,也就是向後搜索。例如Fx是向後搜索字母x。與f和F這兩個命令相類似的是t和T這兩個命令。t命令類似於f向前搜索命令,所不同的是t搜索到時並不是將光標停在目標字符上,而是停在目標字符的前一個字符上。和他相反的就是這個F命令。當然這幾個命令都可以和數字組合來形成新的命令來完成我們的工作。在搜索的工作過過程我們可以使用ESC來退出搜索而開始我們新的工作。在我們的工作中常常要求我們移動到指定的行,那麼我們如何來做到這一點呢?我們當然可以使用數字和方向鍵組合來完成。雖然這種方式不夠快速,但是確實可以來實現。而在vi中提供了一個新的命令來完成,那就是G。例如3G可以使我們快速的移到第3行。而1G則可以使我們移到文章的最頂端,而G則是定位到文章的最後一行。那麼在vi的編輯中我們又如何來知道我們在第幾行呢?我們可以使用:set number來叫vi加上行號,這樣我們就可以很容易的知道我們所在的行號了,取消行號的命令爲:set nonumber。那麼在沒有行號的文章中我們又如何來知道我們所處在的位置呢?我們可以使用ctrl+G命令來知道。這個命令可以清楚到告訴我們總共有多少行,而當前我們又在多少行,以及所佔的百分比等信息。在我們進行編輯的過程中我們可以使用CTRL-U和CTRF-D來進行上下的翻頁。當然這樣的功能也可以通過功能鍵來實現。在我們的文本編輯過程中另一件我們要常做的事情就是文本的刪除了。我們可以使用dd來刪除一行,我們還可以使用dw來刪除一個字符。刪除的命令操作d是一個相當靈活的命令,我們可以用他來進組合來完成工作。例如d3w則是一次刪除3個字符,而3dw則是指一次刪除一個字符,而這樣的操作進行3次,即總的是也是刪掉3個字符。而在d$則是刪除從當前位置到本行結束的所有字符.也d命令相類似是的c命令,這是一個更改的命令,所不同的是他在刪除一個字符的同時進入插入狀態,這樣我們就可以進行另外的文本操作了。另一個有興趣的命令則是.命令。.命令可以使vi重複執行剛纔執行的命令。在我們進行文本編輯的時候,有時要用到合併行的命令,也就是將幾行合併爲一行,這時我們可以使用J命令。這個命令可以將本行和下一行合併爲一行。當然,就像大多數的Linux命令一樣,我們可以使用數字來使幾行合併爲一行。例如3J就可以將當前行下的三行(包括當前行)合併爲一行。那麼我們又如何時來做替換文本的工作呢?我們可以使用r的命令。例如rx就可以當前光標下的字符替換爲x。我們當然也是可以用數字來組合以形成新的命令來進行工作,例如5rd就是將當前光標以後的5個字符替換爲d。有時我們要進行大小寫的轉換,這時我們就可以用~命令。這個命令可以實現在大小寫的轉換。在vi中一個比較有趣的東西便是鍵盤宏了,這個可以使我們實現多個命令的記錄,有時這樣可以高效的完成我們的工作。例如我們現在的文本是 stdio.h stdlib.h math.h 但是我們都知道在C語言的編輯中我們所需要的是 #include #include #include 如何來做到?如果你有足夠的耐心可以一句一句的來加,但是在這裏我們可以使用鍵盤宏來完成我們的工作,這樣我們就可以體會到他的強大之處了。開始輸入qa.其中的a是一個宏的名字,我們可以用任何我們喜歡的字母來代替,q是開始錄製宏的命令標誌。這樣我們就可以開始我們的宏輸入了: ^ 移到一行的開始 i#include < 在一行的開始插入#include < $ 移到一行的結束 a> 在結束處加入> j 移到下一行 q 結束宏的錄製這樣當我們要使用宏時就可以輸入@a,這樣就可以執行這個宏了。我們還可以在執行命令前加上數字來告訴vi執行幾次。這樣我們就可以快速的完成我們的一些工作了。在vi的編輯中我們還可以輸入一些由平常的鍵盤不可以輸入的字符,有關這樣的信息我們可以輸入:help digraphs得到更多的信息。 (注:在vi中我們通常所指的一行是以回車做爲標誌的,即只有輸入回車纔算是一行的結束,從而開始新的一行) 
vi編輯器的學習使用(三) 
vi學習使用筆記之三我們在使用vi進行編輯文本的時候常作的一件事就是要在所編輯的文本中進行查找。如何快速的查找到我們想要的東西呢?在vi中我們可以使用f,F和t,T來進行向前或是向後查找。除了這些命令,我們還可以使用其他的一些命令來快速高效的完成我們的工作。在vi的編輯操作中,我們可以使用/string命令來查找字符串string,打下回車後,光標就能跳到正確的地方。在這個命令中/後的字符是我們想要查打的字符,而回車鍵則表明了命令的結束。但是有時我們所想要查找的字符具有特殊的意義,例如.*[]^%?$~等等,那麼我們又如何來查找這些具有特殊意義的字符呢?這時我們可以使用\\放在所要查找的字符前,這樣再使用/來查找就可以正確的查找了。有時我們在進行查找操作時想要查找的內容並不僅在一處,我們想要做的是在整個文章中進行查找。那麼我們又如何來進行我們剛纔的查找命令呢?我們可以這樣的來做:/。這樣我們就可以繼續我們剛纔的查找操作了。在這裏回車是命令結束的標誌。我們還可以使用n命令來繼續剛纔的查找命令。這兩個命令都能達到同樣的效果,但是顯然用n可以有更少的鍵盤操作。偷懶嘛:)在vi中他還具有記錄查找命令歷史的作用,這樣我們就不用輸入剛纔輸入的查找命令了,而是只需要在他所記錄的查找命令進行一下查找就可以了。例如你剛纔做過的三次查找分別是:/one,/two,/three.而現在輸入/,然後按方向鍵的上或是下我們就看到剛纔查找的內容顯示在vi的下面,這時只要打下回車我們就會找到我們要找的內容了。當然在vi中還在一些其他的查找選項,例如我們可選擇高亮的顯示查找的文本,命令爲::set hlsearch,關閉高亮顯示的命令爲::set nohlsearch.如果也想同時關掉剛纔高亮顯示的結果,可以用這樣的命令::nohlsearch。在我們進行查找的選項中,我們還可以有這樣的命令::set incsearch。在我們打開這個選項以後,我們在進行查找時就會顯示出不斷匹配的過程。例如你想查找的內容是include,在打開這個選項後你可以輸入/i,光標定位在i上,再繼續輸入n光標定位在in上,如此直到查打到我們所要求的。關閉這個選項的命令爲::set noincsearch。一般來說我們在進行查找時總是在向前查找,那麼又如何來向後查找呢?我們可以使用?命令。這個命令就是向後查找的命令。而還有一個命令N是逆向查找的命令,他可以實現立即反向查找。(注:在查找的時候我們還可以用一些其他的表達式來進行查找,例如/^string是在開頭進行查找,而/string$是在一行的末尾進行查找。不過看書我的理解是這樣的,不過總是試驗不成。而/c.m則是查找所有第一個字母爲c,而第三個字母爲m的字串,由此可以實現一些查找的匹配 
vi編輯器的學習使用(四) 
vi學習使用筆記之四我想我們在接觸了vi以前一定會用一些其他的編輯器,在那些的編輯器裏複製,剪切和粘貼都是最平常的操作,而在vi中這些操作也是同樣的存在的。在vi編輯器有一個註冊的概念(concept of register),正是這個概念使我們可以時行多次的剪切和粘貼等的操作。在一般的編輯器中我們被限制只有一個剪切板可以用,而在vi中我們最多時可以有26個剪切板可以來使用,這樣就會大大的提高我們的完成工作的效率。而在vi中更是有一個相當強大的功能那就是他可以同時處理多個文件。如此強大的功能我們又來如何的操作呢?在vi的編輯中我們可以使用d或是x來刪除文本,但是經過這樣的操作所刪除掉的文本並沒有被vi所丟棄,而是被保存起來。我們可以使用p命令來粘貼剛剛所刪掉的內容。下面我們可以來試一下看一下他是如何工作的。我們可以在vi中隨意的輸入幾行,然後我們移動到其中的一行,用dd命令來刪掉其中的一行,這時我們就不會再在vi中看見他。如何叫他再回來?我們可以將光標移到任意的地方,然後用p命令,我們就會看到剛纔被刪除掉的內容又回來了。同樣我們使用x命令來刪除的東西也可以這樣的粘貼回來。所不同的就是我們用dd來刪除一行再用p命令時是在當前光標的下一行粘貼,而刪除一個單詞再用p命令來粘貼時是在當光標處粘貼。有了這樣的命令有時我們就可以來處理我們輸入錯誤的單詞了。例如我們不小心將the輸入成了teh,這時我們可以將光標移到e的位置,用x命令刪掉,再用p命令粘貼回來,這時我們就會發現現在的輸入正是我們想要的輸入了。p命令可以在一個文件中使用幾次,每一次都可以將剛刪除的內容重新粘貼在我們所希望的地方。當然這個命令也可以使用數字做前綴來明確的指出所要執行的次數。在使用vi進行文本編輯的過程中我們還可以對某一行進行標記,做法爲我們將光標移到某一行,用命令ma來進行標記。在這裏m是標記的命令,a是我們對這一行所做的標記的名稱,當然我們也可以使用其他的標記名稱,必竟我們是有26個字母可以用的嘛:)。在做了這樣的標記以後我們可以快速的移到被標記的地方,‘a就可以使我們快速的移到剛纔我們所做標記的地方。這裏’是單引號,這時我們就會移到被做標記那一行的行首。我們也可以使用`a來移到我們所做標記的地方,這裏`是反引號,也就是數字鍵1左邊的那一個,不要弄錯了噢:),這時我們就會移到所做標記時光標所在的位置,可以說是更精確啊。這也是這兩個命令的不同之處。在進行文本編輯時我們可以列出當前所做的所有的標記。命令爲 ::marks。這時vi就會列出當前的所有的標記。當然如果我們將做了標記的那一行刪除的話所做的標記也就不存了。我們用標記不僅可以快速的移到做了標記的行,而且還可以用標記來刪除掉一行,例如我們在某一行用ma做了標記,然後我們移到這一行的底部,這樣我們就可以用在d‘a來刪掉這一行。可以說這也是標記命令提供給我們的方便吧。在vi中還有一個命令可以提供複製的操作,那就是y命令。yy命令可以複製一行,然後我們可以用p命令來粘貼。這時我們也可用標記命令來組合使用,我們可以在一行用ma標記此行,然後將光標移到這一行的底部,用y’a命令就可以來複制這一行了。然後到我們所希望的地方用p命令來粘貼。我們也可以使用Y命令來複制一行,或是用數字做前綴來明確的指明覆制幾行,然後用p命令粘貼到我們所希望的地方。在vi中還有一個比較有趣的命令便是!命令。這個命令告訴vi編輯器我們要來運行一個系統命令,這時vi就會將以後的輸入做爲一個命令來運行,運行的結果也就是輸出將替代當前光標所在的行的內容。例如我們在 Linux中知道sort是一個排序的命令,他是將一個文件或是一些輸入進行排序後輸出到屏幕或是其他的文件。那麼我們想對vi中的內容進行排序來如何做呢?這時我們可以將光標放在文本的開頭的一行,輸入!10G,這時vi就知道要到10行,也就是我們要操作的內容是第1行到第10行,這時在vi的下端就會顯示出!,這時我們就可以輸入命令了,sort。也就是我們要輸入的完整的命令應爲:!10Gsort。這樣回車以後vi就會對文本中的10行進行操作,將操作的結果替換掉現在vi中的文本來顯示。而!!是在一行運行命令,並且輸入的結果爲當前行的內容。例如我們輸入!!ls,就會將ls的執行結果顯示在vi中,並且是當前的內容,如果此行原先有內容將會被替換掉。如果我們完成一個文件的編輯而要開始一個新的編輯時我們最平常的做法就是退出當前的文件而重啓vi開始一個新的編輯。事實我們可以直接在vi中輸入:vi file而開始一個新文件的編輯。如果當前的文件你沒有保存,vi會給出警告的信息,這時你可以輸入:write來保存當前的文件。你也可以用:vi!file強制開始一個新文件的編輯。與vi相類似的一個命令是:view,所不同的是他以只讀的方式打開一個文件,這時vi會給出警告信息,但是你也可以進行修改,只是你不能進行保存,如果你要保存,vi就會給出提示。當然在這樣的情況下你可以用命令:write!來強制保存。我們還可以使用vi來編輯多個文件。我們可以在終端輸入vi file1 file2 file3,這樣我們就可以來編輯多個文件了,在默認的情況下vi來顯示第一個文件,如果要切換到下一個文件我們可以輸入:next,這樣我們就可以切換到第二個文件了。如果你沒有保存,vi會給出提示信息,這時也就不可能切換到第二個文件了。這時我們可以輸入:write進行保存然後再切換到第二個文件,或者是我們輸入:write:next.來保存後再切換到第二個文件。或者是我們可以用:wnext來簡寫這個命令。當然我們也可以用命令:next!來強制切換到第二個文件。當然這樣你所做的改動也就會丟失掉。爲了避免這樣的情況,我們可以打開vi的自動保存功能。:set autowrite.這樣我們就不會爲沒有保存而收到提示信息了。關閉自動保存的命令爲::set noautowrite.當然next命令也可以用數字做前綴來指明所要執行的次數。如何來確定我們在編輯哪一個文件呢?我們可以用這樣的命令來明確我們所編輯的文件::args.這個命令會顯示出我們所打開的文件,同時會顯示我們正在編輯的文件。如果我們想要回到上一個文件我們可以用這樣的命令::previous或是:Next.如果你要保存當前的文件並切換到前一個文件可以用這樣的命令::wprevious或是:wNext.如果我們要編輯第一個文件我們可以用:first或是:rewind來快速的切換到第一個文件,同理如果我們要編輯最後一個文件我們可以用:last來快速切換。如果我們在一個文件中進行一些改動,再切換到另一個文件中進編輯,這時我們就可以用CTRL_^來切換這兩個文件。 
vi編輯器的學習使用(五) 
在使用vi進行文本編輯的時候我們也可以打開多個窗口進行編輯。這也正是vi編輯器的強大這處。那麼我們如何來打開多個窗口進行文本編輯呢?我們又如何在多個文本窗口中進行切換呢?如何來控制窗口的大小呢?在vi編輯器還有一個緩衝區的概念,利用緩衝區我們可以進行多文本的編輯。打開一個窗口最簡單的方法就是下面的命令::split。輸入這樣的命令後vi就會將當前的窗口平分爲兩個。並且在這兩個窗口中顯示的是同一篇文章。如果你在其中的一個窗口進行文編輯,那麼另一個窗口也會同步的顯示出你所做的工作。如何在兩個窗口中進行切換呢?在gvim中要方便得多,只要用鼠標就可以進行窗口的切換。而在vim中則需要用命令來實現。CTRL_Ww這個命令可以實現在兩個文本窗口中進行切換。切換窗口還有另外的命令:CTRL_Wj 可以將光標定位在下一個窗口中,而CTRL_Wk可以將光標定位在上一個窗口中。如果想關閉 一個窗口可以用命令ZZ或是:q.當然了CTRL_Wc也可以做到同樣的事情。我們打開一個窗口一般並不是要在兩個窗口中顯示同一個文件,我們常常需要的是在兩個窗口中顯示兩個文件來加快文件編輯的工作。如何在新窗口中打開一個文件來進行編輯呢?我們可以用這樣的命令::split file.這樣我們就可以在另一個窗口中打開文件file開始我們的編輯工作了:)。那麼我們如何來控制窗口的大小呢?我們在輸入split命令時可以帶上一個參數,這個參數 也就指定了打開的窗口的大小。例如我們可以這樣的輸入::3 split file。這樣我們就可 以在一個新窗口中打開文件file,而這個窗口的大小有三行。當然我們也可以將這個命令中的空格去掉,也就是寫成::3split file這樣也可以達到同樣的作用。與split命令相類似的一個命令就是:new命令。所不同的就是split命令打開一個新窗口,但是在兩個窗口中顯示同一個文件,而new命令則是打開一個新窗口開始一個新文件的編輯.我們還可以打開一個新窗口,在這個窗口中打開一個文件來讀。命令爲:sview。這個命令是:split和:view這兩個命令的組合。在這樣的多文本窗口中進行操作時我們常做一個工作就是要改變窗口的大小。可以使我們來改變窗口大小的命令爲: CTRL_W+這個命令增大窗口,默認增量爲1 CTRL_W-這個命令減小窗口,默認值爲1 CTRL_W=這個命令可以將幾個窗口的大小變得相等。另外還有一個命令countCTRL_W_可以使得當前窗口變得count這樣的高。如果沒有指定count將會使得當前窗口變得儘可能的最大。 :buffers 這個命令就會列出當前的編輯中所有的緩衝區狀態。在這個狀態列表中,前面的數字就是緩衝區的數字標記,第二個標記就是緩衝區當前的狀態,而後一個則表明與空上緩衝區所關聯的文件名。他的一些狀態是這樣的: - 非活動的緩衝區(Inactive Buffer) h 隱藏的緩衝區(Buffer is hidden) % 當前的緩衝區(current buffer) # 交換緩衝區(Alternate buffer) + 文件已經被修改如果我們要選擇一個緩衝區我們可以用這樣的命令::buffer number number就是緩衝區狀態列表中所顯示出來的數字。我們也可以用文件名字來選擇緩衝區: :buffer file 關於緩衝區有一些有用的命令可以快速的完成我們的工作:我們可以用下面的命令來分割當前的窗口開始編輯一個緩衝區::sbuffer number 如果我們指明瞭數字,那麼當前窗口就會顯示數字所標記的那緩衝區中的內容,而如果沒有指明數字,那麼就會利用當前的緩衝區。當然這個命令我們也可以用文件名來做爲參數進行操作。對於緩衝區還有一些其他相關的命令: :bnext 到下一個緩衝區 :count bnext 到下一個緩衝區執行count次 :count sbnext 命令:split 和 :count bnext組合形成的命令 :count bprevious 到前一個緩衝區count次 :count sbprevious :count bNext 與:bprevious作用相同 :blast 到最後一個緩衝區 :brewind 到第一個緩衝區 
vi編輯器的學習使用(六) 
vi編輯器學習使用之六在現在的vi版本,或者是說是在vim中,與其先輩區分開來的一個特徵就是現在的版本中有一個可視模式。這種可視模式可以使你加亮一個文本塊然後整體進行命令操作。例如你可以用高亮顯示出一個文本塊,然後用d命令來刪除這個文本塊。這種可視模式與其他的編輯相比的一個好處就是你可以在做改動以前看到你的操作對於所編輯的文本產生的影響。那麼我們如何爲用這種有趣的可視化模式來進行我們的文本編輯工作呢?要進入可視化模式,我們可以輸主命令v,這樣在vi的狀態行就會顯示我們已經進行可視化模式了。在這樣的模式下,我們移動光標,那麼在光標起始的位置和光標現在的位置之間的文本都會以高亮顯示的。這時我們可以對這些高亮顯示的文本整體進行命令操作,例如這時我們可以輸入d命令,那麼這些高亮顯示的文本就會被刪除掉。一般來說可以化模式可以具體的分爲三種可視化模式,一種就是我們剛纔用v命令進入的所謂的字符式可視模式(character-by-character visual mode)。在這種模式下,我們在進行文本選擇以高亮顯示時是以字符爲單位的,我們可以一個字符字符的來選擇。而第二種就是所謂的行可視化模式(linewise visual mode),這時我們可以輸入V命令來進入這種可視化模式。這時我們所進行的操作是在以行爲單位來進行的。還有一個命令可以使我們進入可視化模式,這就是CTRL_v,這就是我們所要說到第三種可視化模式,他可以使一個矩形內的文本高亮顯示,然後以這些文本爲整體進行編輯操作。在可視模式下我們也可以得到一些相關的幫助信息。當然在輸入命令時要在所希望幫助的名稱前有v_做爲前綴。例如我們想得到一些關於在可視模式下進行刪除操作的命令,我們可以這樣的來得到幫助信息::help v_d 當我們要退出可視化模式時,我們可以按ESC鍵退出。當然CTRL_c也可達到同樣的作用。與ESC作用相同的還有CTRL_和CTRL_N. 在可視化模式下我們可以進行各種各樣的編輯操作。如d命令可以刪除那些高亮顯示的文本內容,而D命令只是來刪除一行,哪怕這一行中只有部分文本是高亮顯示的。與d和D命令類似的是複製y和Y命令。y命令是將高亮顯示的文本複製下來,而Y只是將一行文本複製下來。c命令可以將以高亮顯示的文本刪除掉然後進入編輯模式,而C命令的作用與其相類似,所不同的只是C命令只是刪除一行文本。我們還可以利用可視化模式將幾行文本合併爲一行。J命令可以將高亮顯示的文本內容合併爲一行,同時以空格來區分各行,而如果我們不希望看到這些空格,我們可以使用gJ命令。我們在可視模式下進行文本編輯時也可以進行可視化模式的選擇和切換。你可以在任何情況下進行這種切換,而切換的做法只是簡單的輸入那種可視化的命令操作。例如現在我們在字符模式的可視化模式下進行操作,而現在我們想切換到塊模式的可視化模式,這時我們只是要簡單的輸入CTRL_v可以了。當然我們也可以先用ESC來關閉當前的可視化模式,然後再選擇我們所希望的可視化模式. 對於程序員來說似乎這種可視化模式會有更大的用處,我們可以用一種可視化模式來高亮顯示文本,然後用>命令來進行文本的縮進,我們還可以用<命令來進行相反的縮進。我們更可以用CTRL_]跳轉到某一個函數定義的地方。我們還可以利用可視化模式的高亮文本進行做法關鍵字用man命令來得到更多的信息。當然這必須是man可以查找得到的內容對於可視化模式的文本編輯還有一個有趣的現象,這個主要的表現在CTRL_v所定義的文本塊內。例如我們用這個命令來定義了一個文本塊,然後輸入Istring,這個命令中I是插入文本的命令,string是我們要插的文本,而Esc則是結束插入操作的命令。這時就會看到我們所輸入的文本顯示在文本塊的左側,也就是開頭的地方,當我們結束插入操作時我們就會驚奇的發現我們所輸入的文本也會同時出現我們所定義的文本塊內所包含的其他行的開頭部分。同樣當我們用c命令來操作時我們也會發現類似的情況。當然了,在用c這個命令進行操作時你所輸入的文本應不超過一行,否則的話將會只有第一行的文本會被改動。而C命令也會有相類似的情況。我們也可以類似的來得到一些關於塊操作的命令幫助:例如::help v_b_r 
vi編輯器的學習使用(七) 
vi編輯器學習使用之七
vi是一個強大的編輯器,他不僅可以用來處理我們平時的文本工作,他還可以用寫程序文件。在vi中有許多命令可以方便的完成我們的程序處理工作。在用vi進行程序處理時,vi充分的顯示出來了他的強大之處,他可以實現在語法加亮顯示,實現自動縮進,實現括號匹配,還可以在程序中實現查找和跳轉。
我們可以用這樣的命令在vi中打開語法加亮顯示的功能::syntax on。這樣以後我們在輸入的字符中,vi就會自動的識別出關鍵字,字符串以及其他的一些語法元素,並以不同的顏色來顯示出來。這對於程序員來說是一個巨大的幫助。當然你可以自定義語法加亮顯示的顏色。
一般情況下,vi的這種語法加亮顯示的功能可以工作的很好,但是有時我們也遇到一些小小的麻煩。也許我們都遇到過背景是白色而字體是淺黃色的情況,在這樣的情況下是非常難讀的。vi編輯器有兩種語法加亮的辦法,一種是當背景爲淺色時用,而另一種是當背景爲深色時用的。當我們啓動vi時,他會檢測我們所使用的端是哪一種背景顏色,是淺色還是深色,然後再應用語法加亮的顏色方案。當然了,有的時候vi也是可以檢測出錯的。我們可以用這樣的命令來知道我們的背景的情況::set background?。這樣vi就會在底端給出我們具體的顯示。如果vi檢測的並不正確,我們可以用這樣的命令來爲他賦下正確的值::set background=light或是:set background=dark.當然我們要清楚的知道,這樣的操作要在打開語法加亮的命令之前來執行。vi實現語法加亮顯示的功能是通文件的擴展名來文件的類型從而實現功能的。但是有時我們在編輯一個C程序文件時並沒有使用傳統的擴展名,那麼我們如何來告訴vi我們正在編輯的文件的類型呢?解決的辦法就是用filetype這個選項。例如我們要告訴vi我們正在編輯的是一個C程序文件我們可以這樣的來做::set filetype=c。這樣以後vi就會知道我們正在編輯的是一個C程序文件並正確的加亮語法顯示。
除了語法加亮顯示的功能以外,vi還提供了縮進的功能。命令<<將使當前行向左移動一個移位寬度,而命令>>將使當前向右移動一個移位寬度。這個所謂的是移位寬度具體是多少呢?在vi中默認的是八個空格的寬度。然而平時的經驗可以表明當縮進是四個空格寬度時最有利於程序的閱讀。那麼我們如何將這個移動寬度定爲四個空格的長度呢?這時我們就可以用下面的命令來做到::set shiftwidth=4.而這時的命令僅是對當前的一行有效,我們也可以像其他的vi命令一樣的在命令前用數字做爲前綴還指定命令作用的範圍。如5<<就將縮進五行。
在vi中還有許多自動進行縮進的選項,一般有以下的幾種:C縮進(cindent):這是C語言的縮進形式,採用這樣的縮進方式的程序語言有:C,C++,Java等。當採用這種縮進格式時,vi就會自動的採用標準的C語言形式。還有一種形式是smartindent:在這種縮進模式中,每一行都和前一行有相同的縮進量,同時這種縮進形式能正確的識別出花括號,當遇到右花括號(}),則取消了縮進形式。另外的一種縮進形式便是所謂的自動縮進(autoindent):在這種縮進形式中,新增加的行和前一行有相同的縮進形式。vi編輯器可以很好的識別出C,C++,Java以及其他的一些結構化程序設計語言,並且能用C語言的縮進格式來很好的處理程序的縮進結構。我們可以用這樣的命令來打開C語言形式的縮進結構::set cindent.這樣以後vi編輯器就會用C語言的縮進形式來正確的處理程序文件。一般而言C縮進結構可以滿中絕大多數人的需要,當然了不同的人有不同的編程風格,如果你不喜歡這樣的縮進結構,你可以自己定義自己的縮進形式。也許我們做程序設計的人並不想每一次想要編輯C程序文件時都要用命令:set cindent來打開C縮進形式,爲了解決這樣的問題,我們可以改寫vi的配置文件來使vi能夠自動的完成這樣的工作。我們在.vimrc(UNIX/LINUX)或是_vimrc(WINDOWS)中加入下面的幾句:
:filetype on
:autocmd FileType c,cpp:set cindent
第一行是打開vi文件類型識別功能,第二行是如果所識別的文件類型爲C或是C++文件那麼便打C縮進形式。
在vi中除了C縮進形式以外我們還有smartindent縮進形式可以來用。在smartindent這種縮進模式中能夠正確的識別出{和}。同時增加了識C語言關鍵字的功能。如果一行是以#開頭的,那麼這種格式將會被特殊對待而不採用縮進格式。這種縮進格式不如cindent,但是卻強於autoindent。另外的一種縮進形式便函是autoindent。在其他的一些結構化程序設計語言如Pascal,Per或是Python語言中,我們所希望的是新的一行能和上一行有相同的縮進形式,這時我們便可以打開autoindent縮進形式,:set autoindent。這樣就可以很好的來滿足我們的要求了。
vi不僅有這些功能,而且還有更多的功能來快速的處理程序文件。其中一個便是可以快速的在文件中定位變量及宏定義等。其中一些常用到的命令有:
[CTRL_I/]CTRL_I    在本文件中以及在由#include命令包含進來的文件中進行查找光標下面的文字
gd/gD    查找變量的定義
[CTRL_D/]CTRL_D    跳到宏定義的地方
[d/]d/[D/]D    顯示宏定義


這幾個命令中有一些需要說明的地方:[CTRL_I/]CTRL_I命令用來查找光標下面的文字,查找的範圍不僅是在本文件中進行查找,而且還要查找由#include所包含進來的文件中進條查找。變顯查找的命令gd和gD有時並不能完美的完我們想要做工作。這是因爲vi在理解C和C++的語法方面有一些小的限制。但是大多數的情況下這幾個命令還是可以很好的來完成我們工作的。[d/命令可以顯示以當前光標下的內容爲爲名字的第一個宏定義,]d也有着同樣的作用,所不同的只是後者是從當前光標處查找下一個宏定義。當然這兩個命令也可以在由#inlcude所包含進來的文件中進行查找。[D/]D命令可以用來列出文件中的宏定義。這兩個命令有着同樣的作用,所不同的只是前者是列出當前光標以後的宏定義,而後者是從當前光標處的下一個宏開始列出文件中的宏義。(注:此處由此書看來似乎是這樣的,但是自己親自來做時並沒有出現這樣效果)

我們在編寫程序時常常要做的一件事便是括號的匹配,我們在vi中可以用%命令來確定匹配的括號。例如我們將光標定位在其中一個括號處,然後執行命令%,光標就會定位在與其相匹配的括號處。有時我們在編寫了一段程序後卻想着要將這一段程序進行縮進,這時我們可以用這樣的命令來做到:將光標定位在第一個或是最後一個包含着所要縮進的程序塊的括號處,然後執行下面的命令:>%,這樣就可以將這個程序右縮進一段距離。但是我們發現執行這個命令後花括號也一樣的進行了縮進,有時我們這並不是我們想要的,我們想要的是僅括號內的文本進行縮進。這時我們又應如何來做呢?這時我們可以用這樣的命令:>i{.這個命令是說僅括號內的文本進行縮進。我們還可以用可視化的模式來縮進文本塊,具體的做法是這樣的:
1 將光標定位在左括號或是右括號處。
2 進入可視化模式:v
3 選中括號內的文本:i}
4 縮進:>
當我們用vi來編輯我們的程序文件時,他提供給了我們定位程序函數的功能。這對於我們想要理解一個程序是非常有幫助的。vi所定位的函數被包含在一個由ctags的程序建立的文件當中。要建立一個名爲tags的這樣的文件,我們可以輸入這樣的命令來完成:$ctags *.c
這樣以後當我們在vi中來編輯我們的程序文件時我們就可以任意的跳轉到我們想要去的函數處,當然這得要求我們想要到函數存在。我們可以用這樣的命令來到達我們要到的地方:
:tag function
這個命令甚至可以查找得到在其他文件中的函數。
在完成函數跳轉的功能命令中還有幾個強大而有趣的命令。CTRL_]命令跳轉到以光標下的字符串爲函數名的函數處。這樣就大大的方便了我們在C程序查找函數的需要。例如你正在看一段名爲write_block的函數程序,而在這個程序中調用了函數write_line。這個被調用的函數具體是來做什麼的呢?我們可以將光標定位在這個函數上,然用執行命令CTRL_]。這樣vi就會馬上跳轉到這個函數的定義處。我們就可以清楚的看到這個函數的實現的方法。而在這個函數中又調用了函數write_char,這時我們可以用同樣的方法來查看這個函數的定義過程。命令:tags可以列出我們已經訪問過的函數名稱。但是我們在走了一段路以後想回去又該怎麼來做呢?命令CTRL_T可以使我們回到上一個訪問的函數處。我們爲了在函數跳轉的命令,我們要用命令ctags建立這文件來存放在C程序中所出現在的函數名,這時vi要建立一個棧來存入函數名。我們用命令CTRL_T回到上一個訪問的函數處,這時我們還可以用命令:tag來向前走一步,即回到前一個訪問的函數處。我們也還可以像其他大多數的vi命令一樣在此命令之前用數字來做前綴,指明要執行的次數。我們還可以用這樣的命令::tag function。這樣我們就可以來到指定的函數處。
當我們用命令:tag時是將當前窗口中的內容由函數的內容所代替了。我們也可以打開一個新窗口來顯示函數的內容。這時我們就要用到下面的命令::stag tag。這個命令是要打開一個新窗口來顯示tag指定的函數內容。我們也可以用命令CTRL_W_]來打開一個新窗口顯示以光標下的字符串爲函數名的函數內容。我們也可以在這個命令前加下數字count做爲前綴,這打開的窗口就是count這樣的高度。
我想我們常會有這樣的情況,那就是我們想要跳到一個函數處卻記清他的名字究竟是什麼?這是我們要怎麼辦呢?在vi中有一個很好的解決辦法,那就是我們可以用:tag /name來找到你想要的內容。例如在我們上面所舉過的例子中曾提到了函數write_line。但是現在我們記不得他的全名了,只是記得好像有一個line。這時我們如何來找到呢?我們可以用這樣的命令來做::tag /line。這樣vi就會將我們帶到write_line定義的地方。我們還可以藉助於一些表達式來精確的定位我們要去的地方。例子如我們似乎記得有一個函數是以read開頭的,這時我們可以這樣的來查找::tag /^read。這個是說read所要查找的內容是以read開頭的。或者說我們不能十分清楚的記得一函數的名稱是DoFile,do_file還是Do_File。這時我們也可以這樣的來查找::tag /DoFile\\|do_file\\|Do_File。或者是我們可以寫成這樣的表達式::tag /[Dd|o_\\=[Ff|ile。這樣我們就可以找到我們想要的內容了。一般情況下我們用這樣的命令來查找時並不能精確的得到我們想要的東西,而是得到許多匹配的選項。而我們可以用命令:tselect來列出所有這些合要求的內容。這個列表一般由這樣的一些內容組成:
第一列的數字是這些標記(tag)的編號,第二列這些內容的優先級,他一般包含三個字母:F完全匹配,如果沒有則是忽略的情況;S靜態標記,如果沒有,則是全局標記;C則是說是這個標在當前的文件中。在執行完這個命令後,:tselect會給我們一個機會,我們可以選擇到標號爲哪一個的內容處去,或者是選擇離開。命令g]與命令:tselect相類似,只是他是以光標下的內容爲查找內容的。命令:tjump的作用與:tselect命令相同,所不同的只是當執行的結果只有一項內容時,則自動的選中這個結果。命令gCTRL_]與此相同,只是他是當前光標下的內容爲查找對象的。其他的一些相關的命令如下:
:count tnext    到下一個標記處
:count tprevious    到上一個標記處
:cout tNext    到上一個標記處
:cout trewind    到第一個標記處
:cout tlast    到最後一個標記處
命令:stselect與:tselect命令相同,所不同的只是前者將打開一個新窗口來顯示執行的結果。與其類似的命令還有:stjump.
當我們在編寫makefile文件時我們所需要的縮進是一個tab,而不是8個空格。這樣的區別是很難在屏幕上看出來的。這時我們可以用這樣的命令::set list,這樣以後tab則顯示爲^I,同時在每一行的末尾顯示$,這樣我們就會很好的來區分這些細小的分別了,同時還有助我們來檢查我們程序的正確性。當然我們也可以選擇用其他的字符來顯示,通過listchars選項我們可以做到這一點。如果我們設置了expandtab選項,那麼我們輸入一個tab時,vi實際上插入的空格。這對於我們編寫makefile文件時是很不方便的。如果我們想真正的輸入一個tab,而不是插入空格,這時我們可以輸入CTRL_V<Tab>,這時的CTRL_V告訴vi不要忽略以後的字符。有時在一個makefile文件中包含許多的文件,我們可以對這些文件進行排序,具體的做法如下:
1 將光標放在文件列表的起始點
2 用命令標記這個位置:ma
3 到這個列表的底部
4 執行命令排序:!\'a sort
我們也可以在可視模式下來排序:
1 移動到要排序的文本的頂部
2 進入可視化模式:V
3 移動到文本的底部
4 執行命令:!sort
vi編輯器還可以允許我們在vi中執行編譯程序的make命令,其命令爲:make,這時就會來編譯程序,同時會顯示出錯誤來。這時我們就可以移到到出錯的地方來修正我們的錯誤,然後再重新編譯,直到成功。如果我們的程序編譯有錯誤,vi就會顯示出錯誤的提示信息和錯誤的地方,同時vi會自動到第一個出現錯誤的地方。我們在修改完錯誤以後,可以用命令:cnext來到下一個出錯誤的地方繼續我們的工作。命令:cprevious和命令:cNext可以回到上一個錯誤的地方。命令:clast可以到最後一個出錯的地方,而命令:crewind可以到第一個出現錯誤的地方。而命令:cnfile可以到下一文件第一個出錯的地方。如果我們此時忘記了出現在的錯誤是什麼,我們可以用這樣的命令來顯示出錯信息::cc,如果我們想看到一個錯誤的列表,我們可以用這樣的命令來完成::clist。我們還可以用命令來顯示一定範圍內的錯誤。如:
:clist3,5    顯示第三行到第五行的錯誤
:clsit,5    顯示第一行到第五行的錯誤
:clsist5,    顯示第五行到最後一行的錯誤
如果我們已經運行make命令並且生成我們自己的錯誤信息的文件,我們可以用這樣的命令來告訴vi這些情況::cfile error-file。error-file是make或是編譯輸出的文件。如果我們沒有error-file文件,那麼我們可以使用errorfile這個選項在。退出錯誤的狀態可以用命令::cquit.這些命令對於我們在使用一個集成的開發環境時會顯得更有用一些.
errorfile選項會建立一個默認的文件,這個文件會被命令:clist和-q命令行選項所使用,但是這個文件並不會成爲:make命令的輸出文件。如果我們想要建立自己的默認錯誤文件可以使用下面的命令::set errorfile=error.list
:grep與:make相類似,他是執行外部的命令程序grep並顯示輸出。例如我們要在程序文件中查找變量ground_point我們可以使用下面的命令:
:grep -w ground_point *.c
-w 是告訴grep程序包僅查找單詞ground_point,而不是任意匹配的結果。與前面的命令相類似,:cnext,:cprevious,:cc等命令可以在這個匹配的列表中進行移動,:crewind,:clast分別移到到列表中的第一個和最後一個。:cnfile到下一個文件是的第一個。
vi編輯器的學習使用(八) \r\nvi編輯器可以很好的完成一些我們要做的一些重複性的工作。例如我們可以在vi中設置縮寫,這樣當我們在輸入一個單詞時只需輸入其中的一部分,而要vi來完其餘的部分。當然了,我們可以將我們喜歡的一些設置寫入vi的配置文件,這樣就不要我們每一次都要通過命令來完成了。除了這個功能以外,我們還可以在vi中定義我們自己的功能按鍵,而不會影響到系統中的功能鍵。這樣的功能是不是很有趣呢?
我們可以在vi中用一個縮寫的字符來代替一個單詞,然後在我們想要輸入這個單詞時只要輸入這個縮寫的字符就可輸入我們想要的單詞了。我們如何來做到這些呢?這時我們要用到的vi命令是:abbreviate.例如我們可以用ad來vi編輯器可以很好的完成一些我們要做的一些重複性的工作。例如我們可以在vi中設置縮寫,這樣當我們在輸入一個單詞時只需輸入其中的一部分,而要vi來完其餘的部分。當然了,我們可以將我們喜歡的一些設置寫入vi的配置文件,這樣就不要我們每一次都要通過命令來完成了。除了這個功能以外,我們還可以在vi中定義我們自己的功能按鍵,而不會影響到系統中的功能鍵。這樣的功能是不是很有趣呢?
我們可以在vi中用一個縮寫的字符來代替一個單詞,然後在我們想要輸入這個單詞時只要輸入這個縮寫的字符就可輸入我們想要的單詞了。我們如何來做到這些呢?這時我們要用到的vi命令是:abbreviate.例如我們可以用ad來代替advertisement。這樣我們在想輸入advertisement的時候只要輸入ad然後打一下空格或是tab就可以輸入advertisement了。具體的做法是這樣的:
:abbreviate ad advertisement 這個命令就是在告訴vi我們設置advertisement的縮寫爲ad,這樣我們在要輸入advertisement的時候只要輸入ad就可了,剩下的工作vi會爲我們完成的。當然了這個命令也可以爲多個單詞設置縮寫。例如我們可以設置Jack Berry的縮寫爲JB。命令爲::abbreviate JB Jack Berry 這樣我們在輸入了JB以後打下空格或是Tab,vi就會自動的用我們設置的單詞來替換JB。對於程序員來說這樣命令爲我們提供了巨大的便利。例如我們可以做出這樣的設置:
:abbreviate #b /*************************
:abbreviate #e <space>**********************/
這個縮寫可以在加快我們添加註釋的速度。我們在編寫程序文件時常有這樣的習慣,那就是在程序的開頭總是要加上一個註釋塊,來標明我們此程序的目的等。在這個縮寫中有一點要我們注意的地方,那就是我們希望在寫程序的註釋塊時下一行要和上一行對齊,要做到這一點就要求第二行的註釋開頭的兩個字母要是空格,但是在這個縮寫命令中會忽略到空格的作用,因而我們在寫這個縮寫時在開頭寫上<space>,這樣就會滿足我們的要求了。也許有時我們會在一個文件中設置了多個縮寫,我們可以命令:abbreviate來列出我們這個文件中所有的縮寫的設置。
另一個比較有趣和強大的命令就是:map命令,這個命令可以使得我們將鍵盤上的一個按鍵與vi中的命令綁定在一起。例如我們現在將一個單詞用花括號括起來,例如我們要將amount變成{amount}的形式,這時我們就可以這樣的來應用這個命令:
:map <F5> i{<Esc>ea}<Esc>
在這個命令中:map是vi中的命令,而F5則是說將下面的命令與F5鍵綁定,後面的則是具體的命令內容,i{<Esc>是說插入字符{,然後退回到命令狀態。e是移到單詞的結尾處,a}<Esc>則是增加字符}然後退至命令狀態。
在我們做過這樣的工作以後我們就可以來執行我們的命令了,我們將光標定位在一個單詞上,例如amount,按下F5鍵,我們就會發現這時就變成了{amount}的形式。
在這裏我們要注意的一點就是我們最好不要將在vi中有特殊命令的功能熱鍵與某些命令進行綁定,如果是這樣的話就會給我們帶來麻煩。
同上面的:abbreviate命令相類似,我們也可以用命令:map來列出在這個文件中所有的功能鍵,包括我們自己定義的以及系統定義的。
我們在做過這樣的設置以後,有時希望這樣的設置在下一次使用時會繼續有效,這時我們就要用命令:mkvimrc將我們所做的這些設置寫入文件中。這個命令的格式如下:
:mkvimrc file
在這裏file就是我們要將這些設置寫入的文件名。我們可以用命令:source file來讀出文件並執行文件中的內容。
在vi的啓動過程中,vi會首先查找初始化文件。如果找到就會自動執行文件的內容。而這些初始化文件一般來說是這樣的一些文件:
$HOME/.vimrc
$HOME/_vimrc
$HOME/.exrc
$HOME/_exrc
而在Windows和Dos系統中則是這樣的一些文件:
$HOME/_vimrc
$HOME/.vimrc
$VIM/_vimrc
$VIM/.vimrc
$HOME/_exrc
$HOME/.exrc
$VIM/_exrc
$VIM/.exrc
而如果我們用一些圖形界面的話,那麼還會讀一些其他的配置文件。如果我們要執行gvim那麼$VIMRUNTIME/menu.vim也會被讀進來。用命令:version我們可得到這些配置文件的信息。
例如我們可以在.vimrc中寫入以下的一些語句:
:syntax on
打開語法加亮功能
:set shiftwidth=4
設置縮進寬度爲4
:ab #d #define
將#define縮寫爲#d
:ab #b /************************
:ab #e <space>*********************/
我們還可以加入一些其他的東西,這樣就可大的方便我們的工作了。而這也正是vi的強大之處 。\r\nvi編輯器的學習使用(九) 
現代的Vim編輯器是基於一個古老的名爲vi的編輯器設計而成的,而vi基於一個更古老的基於命令行方式的ex編輯器設計而成的。ex編輯器是在屏幕產生以前相當流行的一個編輯,他是爲那時古老的標準打印而設計的。
僅管ex是基於命令行方式的,然而他也是真正意義上的一個強大而高效的編輯器。即使是在今天他也是發揮着作用。僅管現在的Vim編輯器有一套的命令系統,可是有些事情還是要用ex的命令方式纔可以更好的來完成。因而現在的Vim編輯器設計了與ex編輯器的接口,我們可以在Vim中使用ex方式的命令。而那些以冒號開頭的命令就是一個ex方式的命令。
如果你想執行單一的命令行方式的命令,那麼你只輸入:然後輸入命令就可以了。例如我們在前面討論的:set number.事實上他就是一個命令模式的命令。在執行完這個命令以後,Vim編輯器又回到了他原來的狀態。我們可以通過命令:ex選擇進入命令行模式。Q命令也有同樣的作用。如果要選擇回到正常模式(normal mode)也就是可視化模式(Visual mode),我們可以使用命令:visual.
命令:print(簡寫爲:p)可以打印出選定的行。如果沒有傳遞參數,他僅是打印當前的行。打印完成以後回到打印行的開頭。我們也可以指定要打印的行的範圍。例如命令:1,5 print就是要打印1到5行。嚴格來說你不必須在數5和print之間輸入空格,但是如果這樣做後我們就會現這個命令看起來會更好。如果你僅僅是想打印第5行,你可以用這樣的命令::5 print.當然了我們也可以使用一些特殊的數字標記,例如字符$是指最後一行,因而如果我們想要打印全文的時候我們可以用這樣的命令::1,$ print.而字符%是指整篇文章(1,$),因而我們也可用這樣的命令來打印整篇文章::% print,而.則是指當前行,我們要打印當前可以用:print命令而不帶任何參數,也可以用這樣的命令:.print。我們還可以用指定句子中內容來打印選定的行。例如在我們的文章中我們可以用這樣的命令來打印含有字符ex的行::/ex/ print。這樣就會打印出含用ex的行,並會高亮顯示出ex。同樣命令:?ex? print也會達到同樣的作用,而命令:?ex? print也正是打印含有ex字符的命令格式。
在前面的學習中我們曾學過標記命令m,例如我們可以在任何地方用命令ma做上標記,然後在其他的地方可以用命令‘a回到做了標記的地方。這個命令也可以與print命令組合。例如我們可以在一個地方用命令ma做上標記,然後在其他的地方用命令mb做上另外的標記,然後我們就可以執行下面的命令來打印這兩個標記之間的內容了::\'a,\'b print
我們也可以在可視化的模式下來選定要打印的內容。例如我們用命令V進入可視化模式並選定一段內容,這時我們輸入:就會在Vim的底部顯示<,>兩個字符,這兩個字符分別指我們的選定內容的開頭和結束部分。
命令:substitute可以使我們將指定的字符換成其他的字符。這個命令的格式是這樣的:
:range substitute /from/to flags
在這個命令中range是指定了範圍,也就說是在哪些行裏做替換。而後是說將字符串from替換成字符串to。在默認的情況下,這個替換命令僅是將一行中第一個出的的字符替換成給定的字符。而如果我們想將所有出現的字符都替換成給定的字符我們就用g這個標記命令。例如::% substitute /from/to/g.這個命令就達到將所有出現from的地方全部替換成to。其他的標記(flags)包括:p(print),這個命令是告訴substitute打印所做的改動。c(confirm),這個命令是告訴substitute命令在做出這樣的改動以前要詢問是否要做這樣的改動例如如果我們執行下面的命令::1,$ substitute /Professor/Teacher/c.在Vim就會顯示我們將要做改動的文本,並顯示下面的內容:
Prfessor: You mean it\'s not supposed to do that?
replace with Teacher(y/n/a/q/^E/^Y)?
這時你可以做出以下這樣的回答:
y 執行這個替換
n 跳過這個替換
a 執行所有的替換不要做詢問
q 退出,不做任何改動
CTRL─E  向上翻滾一行
CTRL-Y 向下翻滾一行
在Vim的命令還有一些命令可以幫助我們很好的完成我的工作:例如命令:read filename可讀進一個文件並將讀進和內容插在當前行的後面。而命令:write是將文件寫入。這是一個保存我們工作的方法。我們也可以用命令:write newfile將當前的文件內容寫入一個新的文件。一般情況下:write命令並不會覆蓋已經存在的文件。我們可以用強制操作(!)選項來完成我們所需要的操作並覆蓋當前已經存在的文件。而這個命令對於我們要將一個大的文件分拆爲小的文件時顯得更有用。我們可以用可視化模式選定一個範圍然後將這個選定的範圍寫入新的文件,從而實現了分拆的目的。
我們還可以Vim中不需要退出而執行Shell命令。命令:shell可以使們進入命令終端執行我們需要的命令。當我們要退出終端回到Vim中時可以執行exit命令。我想這對於程序人員來說真是一個巨大的幫助。:)\r\nvi編輯器的學習使用(十) 
在我們談起Vim編輯器似乎只是覺得他只是一個類似於一個命令行方式的文本編輯器。而事實上不是這樣的。Vim在窗口環境中也可以完美的完成我們的工作。在窗口環境下,我們不僅可以使用那些在Vim文本方式下的命令來完成工作,而且還有許多的菜單和其他的選項。這些都使得我們可以完美的來完成我們的工作。
我們要啓動圖形界面的Vim可以用下面的命令:gvim file。這樣就可以打開圖形界面來編輯文本file。圖形界面下的Vim編輯器的外觀因你所用的操作系統的不同而有所不同,就是同樣的操作系統也會因你所使用的工具集不同(Motif,Athena,GTK)而會呈現不同的外觀。而值得向大家推薦的是GTK版本的Vim編輯器,當然其他版本的也是可以來完美的完成我們的工作的。
在Windows系統中我們可以在標準形式下用鼠標來選擇文本,而在X Window系統中我們也會有一個標準的系統來使用鼠標,但是這兩種標準是不同的。然而比較幸運的是我們可以定製我們的Vim編輯器。我們可以使得我們的Vim中的鼠標的行爲看起來像是X Window系統中的鼠標的行爲。下面的命令是設置鼠標的行爲爲X Window風格的鼠標行爲::behave xterm。而下面的命令則是使得鼠標的行爲是Windows風格的行爲::behave mswin。在UNIX和Linux系統中的鼠標風格是xterm風格,而在Windows中的鼠標風格是在安裝過程中選擇的。爲了控制鼠標的行爲,命令:behave有以下這些選項:
        Setting for        Setting for
Option        :behave mswin        :behave xterm
\'selectmode\'    mouse,key        (empty)
\'mousemodel\'    popup            extend
\'keymodel\'    startsel,stopsel    (empty)
\'selection\'    exclusive        inclusive
xterm的鼠標風格的行爲主要有以下一些:
左鍵:        移動光標
拉動左鍵:    在可視化模式下選擇文本
右鍵:        選中光標處到右鍵點擊處的文本
中鍵:        在光標處粘貼選中的文本
Windows的鼠標風格的行爲主要有以下一些:
左鍵:        移動光標    
拉動左鍵:    在選擇模式下選中文本
<S-Left Mouse>    選中到光標處的文本
<S-Right Mouse>    顯示彈出菜單
中鍵:        將系統剪切板中的文本粘貼到文件
(注:其中的S爲Shift鍵)
其他的一些特殊的用法:
Shift+左鍵:    向前搜索光標處的文本
Shift+右鍵:    向後搜索光標處的文本
Ctrl+左鍵:    跳轉到以光標處的文本爲名字的標記(tag)處
Ctrl+右鍵:    跳轉到前一個標記處
在圖形界面的Vim編輯器還有一個有趣的特徵,那就是當我們點開一個菜單時就會發在子菜單的第一行有一條虛線,點擊此虛線就可以將這個菜單移其他的地方。關閉後Vim的菜單結構又恢復到正常的狀態了。在GTK版本和Windows版本中的圖形界面的Vim還有一個工具欄,這些工具可以快速的完成我們的工作。\r\n
vi編輯器的學習使用(十一) 
雖然現在的專業的文字處理軟件例如MS Word,Star Office,Open Office等可以很好的來完成的一些文檔處理的工作,但是人們仍然是喜歡用純文本的形式來處理手中的文本.這裏因爲用純文本處理的文件比較容易閱讀,不像那些專業的字處理軟件,有專門的文件存儲格式,少了許多的麻煩.Vim是一個強大的文本編輯器,他也可以像那些專來的字處理軟件一樣來處理我們手中的文本工作,從而使得我們的工作來得更漂亮.
Vim在默認的情況下是不會自動換行的,這也就是說我們在默認的情況下我們不得不自己決佇回車的位置.這樣的設置對於處理程序文件來說是一件相當好的事情,因爲這樣可以由我們自己來決定回定回車換行的位置,從而可以很好的來完成我們的程序設計工作.但是如果我們是在處理一些文檔工作,那麼這個問題就有一些成爲困撓我們的問題了.幸運的是Vim提供了這樣的功能可以使我們來解決這樣的問題.當我們指定了textwidth這個選項後,Vim就會自動的在相應的地方加上換行符.例如我們可以用下面的命令來指定一個只有30列的文本:
:set textwidth=30
這樣以後當我們再輸入文本時如果達到30這個限制,Vim就會自動的依據情況來加上換行符.在Vim中我們可以有兩種方法來選擇換行的方式.例如下面的命令是告訴Vim從左面算起30個字符時換行::set textwidth=30
而下面的命令則是告訴Vim從右面算起當達到margin個字符的空白時要換行:
:set wrapmargin=margin這裏的margin是空白字符的個數.例如如果你有一個80個字符寬的文本,下面的兩個命令則是起到了同樣的作用:
:set wrapmargin=10
:set textwidth=70
Vim並不是那些專業的字處理軟件,在我們指定了文本寬度的情況下,當我們將一行中的前幾個文字刪掉的話,Vim並不會像那些專業的字處理軟件那樣將後面行中的文本移到前面的行上,而是形成了一些長短不一的段落.這樣看起來不是很好,因爲我們需要的是有同一風格的文本形式.在Vim中這樣的情況可以有幾種處理方法:一是在可視化模式下選中這些文本,然後用gp命令來格式化選中的段落.另一種方法就可以使用gqmotion的命令來完成格式.例如我們要格式化5行,我們就可以用下面的命令:gq4j.這個命令是告訴Vim編輯要格式化本行,同時要格式化下面的4行.這樣就達到了格式化5行的目的.在這樣的情況下,向前移動的命令}這時就會爲我們提供更大的便利了.這時我們的做法是這樣的:將光標放在我們要格式化段落的第一行上,然後執行命令gq}.這樣就可以達到我們的目的了.這樣方法要簡便得多,因爲我們不必要再數細數我們要格式化多少行了.命令gqip可以格式化當前的段落.這個命令要比上一個的格式命令還要簡便一些,因爲在這樣的情況下我們不必要將光標放在一個段落的第一行了.最後如果我們要想格式化一行的可以使用命令gqgq,當然了我們也可以簡記爲gqq.
我們都知道在專業的文字處理軟件中有文本對齊的選項,而這在Vim當中也是可以做到的.如果要將文本居中對齊我們可以用這樣的命令::range ceter width.在這個命令中如果我們沒有指定textwidth的值,他將使用我們設置的textwidth的值,如果我們也沒有設置這個值,那麼他將使用系統定義的80.例如我們要將1到5行的內容居中對齊,我們可以使用下面的命令:
:1,5 center 30
同理右對齊的命令也可以類似的寫成:
:1,5 right 30
但是左對齊的命令就與這兩個命令有一些不同了,左對齊的命令爲:
:range left margin
在這個命令中左對齊的參數並不是文本的寬度,而在文本左邊的空白字符的寬度,如果爲0,那麼將緊靠屏幕的左邊沿.在Vim中並沒有內置的方法來對齊文本,但是我們可以使用一個簡潔的宏包來完成這樣的工作.要使用這個包先執行下面的命令:
:source $VIMRUNTIME/macros/justify.vim
在這個包中定義了一個新的可視化的命令_j.要對齊一個文本塊,可以在可視化模式中高亮顯示這個文本塊,然後執行命令_j.
J命令可以使兩行合併爲一行,同時用空格爲分格這兩行.在文本處理中有一個joinspace的選項,如果設置了這個選項,那麼可果一行是以標點符號來結尾的,那麼在用這個命令後會用兩個空格來區分這兩行.也就是說如果我們用命令:set nojoinspace ,用J命令來合併這兩行時會用一個空格來區分.但是如果我們用命令::set joinspace ,用J命令來合併這兩行時會用兩個空格來區.這就是這個選項所要起到的作用.
在Vim編輯器中我們可以通過設置formatoptions選項來設置Vim中的文本和註釋的換行方式.這個命令爲:
:set formatoptions=character
在這個命令中character一組格式化的標記,他可以是下面的一些字符:
t    文本自動換行
c    註釋自動換行,同時自動在行首添加註釋標記
r    當添加新行時自動添加註釋符
o    當用O和o開始新的一行時自動在行首添加註釋符
q    允許使用gq來格式化文本
2    第二行縮進兩個字符
v    採用老的vi換行方式,當你輸入空格時換行
b    在達到textwidth以前當輸入空格時換行
l    在插入模式下不換行,只用gq來完成相應的工作
下面讓我們來看一下這些選項是如何來工作的:
當需要文本自動換行時要打開t標記,當需要註釋自動換行時要打c標記.所以對於一個要處理程序文件的人來說打開註釋自動換行似乎要有更大的幫助:
:set formatoptions=c
這樣在註釋中的一個長句就會自動換行,而正常的程序文本就不會被自動換行.事實上我們常做些這樣的選項:
:set formatoptions=cq
這個選項是告訴Vim編輯器不僅註釋要自動換行,而且這些註釋可以使用gq命令來格式化.
Vim編輯器可以很好的處理註釋的問題.在C程序風格的程序文本處理過程中,當註釋自動換行時Vim會自動在註釋的開頭加下注釋標記.但是在這樣的設置也還是存在一個問題的,那就是當你回車時Vim就不會在下一行的開頭自動加上註釋標記了.如果這一行仍寫的是註釋,那麼就要你親自來加上了.但是當我們打開r這個標記後就會解決這個問題了.這時如果你打回車,Vim編輯器還會在新的一行加上註釋標記.這時如果你要想在下一行寫程序文本,那麼就不得不動手刪除註釋標記了.如果你希望當用O或是o添加新的一行時要自動添加註釋標記就要打開o這個格式標記了.
格式標記選項是告訴Vim編輯器在格式文本中要從第二行開始而不是第一行.設置這個選項的命令爲:
:set formatoptions+=2
而v標記則控制一個句子從哪裏進行分裂.例如現在我們有一個句子:
This is a test of the very long warpp.
現在我們要在這個句子的後面新增一個詞logic
如果沒有v標記結果就會變成:
This is a test of the very
long line warpping logic.
而如果打開v標記,結果就會變成:
This is a test of the very long line wrapping
logic.
令管已經存在的文本已經遠遠的超過了textwidth的限制,但是因爲設置了v標記,所以Vim編輯器也不會換行,相反只有你新增了一個詞時纔會換行.
在默認的情況下vim編輯器是使用內部的格式程序來模式文本,當然了我們也可以使用外部的格式程序來格式我們的文本.在UNIX和Linux系統中有一個標準的程序fmt可以很好的來做這樣的工作.如果我們想用命令gq來執行這個處部命令,我們可這樣的來進行設置:
:set formatprg=fmt
即使是沒有進行這樣的設置,我們也可以使用命令!來格式文本.例如如果我們想用程序fmt來格式一個段落,我們可以用這樣的命令:!}fmt.!是開始了一個過濾命令,而}是告訴Vim過濾一個段落.fmt是我們要使用的命令的名字.
在早期的打印機的時代,開始新的一行要佔用兩個字符的時間.如果到了一行的結尾處,你要他快速的回到新的一行的開頭,打印的針頭在紙面上飛快到掠過,常常就會在紙面的中間留不希望的污點.這個問題的解決辦法就是用兩個字符來解決:一個字符<Return>來移到第一列,而字符<Line feed>來新增一行.計算機產生以後,存儲較爲昂貴,在如何解決回車換行這個老問題上,人們產生了不同的意見.UNIX人認爲在到達一行的結尾時新增一行(<Line feed>),而蘋果人則認同<Return>的解決辦法,MS則堅持古老的<Return>,<Line feed>的方法.這就意味着如果你將一個文件從一個系統轉移到另一個系統,你就面臨着回車換行的問題.而Vim編輯器則會自動的認出這種文件格式方面的區別,並會爲我們做出相應的處理.
fileformats選項包含了許多當編輯一個新文件時會用到的一些文件格式.例如下面的命令就是告訴vim編輯器將UNIX的文件格式做爲第一選擇,而將MS-DOS的文件格式做爲第二選擇:
:set fileformats=unix,dos
檢測到的文件格式會被存放在fileformat選項中,我們可以且下面的命令來查找我們所使用的文件格式:
:set fileformat?
我們還可以應用fileformat這個選項將一個文件從一種文件模式轉換成另一種文件格式.例如我們有一個名爲readme.txt的MS-DOS文件格式的文件,而我們想將他轉換爲UNIX文件格式的文件.我們可以按照下面的方法來做:
首行編輯該文件:
$ vim readme.txt
其次將文件格式改爲UNIX文件格式:
:set fileformat=unix
然後保存該文件,此時這個文件就轉換成爲了UNIX文件格式的文件.
在默認的情況下Vim編輯器認爲我們的文件是由行組成的,也就是他認爲文件中的最後一行是以<EOL>爲結束符的.有時我們會遇到不包含有結束標記行的文件,當Vim遇到這樣的文件時,他就會設置noendofline選項,而當遇到正常結束符的文件時則會設置endofline選項.如果你想設置你的文件以<EOL>結束符結尾則可以用下面的命令:
:set endofline
如果你想設置一個文件不以<EOL>結束符來結尾,則可以用下面的命令:
;set noendofline
在Vim中,我們有一系列的命令可使得我們在文件中進行移動,例如)命令向前移動一個句子,而(是向後移動一個句子,}向前移動一個段落,而{是向後移動一個段落.
曾經Troff是UNIX系統上專業的字處理程序,雖然在現代這個程序已經很少用了,可是Vim還是包含了一些選項使得我們可以用這種曾經的方式來處理文本.Troff需要用宏來告訴他應做一些什麼.其中的一些宏開始一個新的段落.因爲Troff要用許多的宏包來,因而Vim需要知道哪些宏將開始一個新的段落.paragraphs選項可以做這些工作.這個選項的格式如下:
:set paragraphs=\"macromacro...\"
每一個宏是兩個字符的Troff宏名,例如:set paragraphs=\"P LP\"是告訴Vim宏.P和.LP開始一個新行.在默認的情況下paragraph的選項如下:
:set paragraphs=IPLPPPQPP LIpplpipbp
這個命令列出下面的一些開始一個新段落的宏名:
.IP .LP .PP .QP .P .LI .pp .lp .ip .bp
我們可以使用命令[[和[]向前移動一個區間,而使用命令]]和][向後移動一個區間,一個區間是用頁分隔符(CTRL-L)定義的文本.我們也可以用Troff的宏來定義一個區間,section選項有些類似於paragraph選項,所不同的是前者定義一個宏用來分隔區間,而後者是段落.默認情況下是這樣的;
:set section=SHNHH HUnhsh
在用Vim進行文本處理時我們還可以對文本進行加密處理,這種加密處理是最弱的一種加密處理方法,常常用新聞的發佈.這時我們要用到的命令爲g?motion.例如我們可以用命令g?g?或者是g??來加密當前行.當我們對一文本進行兩次加密處理就爲解密處理了.\r\n
vi編輯器的學習使用(十二) 
我們在用Vim來處理文件時可以使用Vim的自動完成功能來大大加速我們的工作速度.所謂的自動完成也就是說當我們輸入一個單詞的一部分以後,按CTRL-P,Vim就會自動的來完成剩下的部分.我們在前面的學習過程中曾用:abbreviate命令來簡記某一個單詞來達到自動完成的目的,而在這裏我們將看到是一個更加強大的自動完成功能.Vim能非常簡單和靈活的來決定要用哪一個單詞來自動完成. 我們在使用Vim這個強大的自動完成功能的同時,還可以自已定義我們的自動完成的特徵,而且還可以使用不同類型的自動完成功能.
如果我們在編寫C程序,而我們所謂得到的下面的一個句子:
total=ch_array[0]+ch_array[1]+ch_array[2]
這時我們輸入total=ch_array[0]+ch_,然後按下CTRL-P,Vim就會自動的替我們完成其餘的部分,這時我們得到將是
total=ch_array[0]+ch_array
由此可以看到我們在處理文件時用這樣的方式可以大大的加快我們的處理速度.
那麼Vim是如何找到匹配的單詞的呢?在默認的情況下,Vim在查找一個單詞時是按照如下的步驟:
1 在當前文件中進行查找
2 在其他窗口中進行查找
3 在其他的已裝入的緩衝區中進行查找
4 在沒有裝入緩衝區的文件中進行查找
5 在當前的標記(tag)列表是進行查找
6 在所有的由當前文件的#include包含進來的文件中進行查找
當然了我們也可以自定義我們的查找順序.
我們在使用自動完成功能時的命令CTRL-P是向後查找匹配的單詞,而還有一個命令CTRL-N是向前查找匹配的單詞.他們有同樣的功能和作用,所不同的只是查找方向上的不同.
Vim還提供了許多的命令可以使得我們來自定義我們的一些查找上的特徵.例如我們可以用下面的命令來告訴Vim在在自動完成的查找過程中忽略大小寫的區別:
:set ignorecase
這樣以後如果我們輸入ins,Vim就會認爲是INSERT,Inside或者是instep.當然了前提是在我們所編輯的文本中含有這些詞,要不就會找得到了.
爲了能夠精確的進行查找來自動完成,我們並不希望上面的情況出現,我們可以設置一些選項來告訴Vim區分大小寫的情況.這時我們要用到下面的命令:
:set infercase
這樣以後如果我們再輸入ins,與其相匹配的列表就成爲了instep,inside,insert.我們可以通過按CTRL-P或是CTRL-N來進行匹配完成.
在大多數情況下,Vim默認的設置可以很好的來完成工作,但是有時我們要定義自己的一些完成的選項,這時我們就要用到complete這個選項了.這個選項的格式如下:
:set complete=key,key,key
而這個命令中可能出現的key值如下:
.    當前文件
b    已被裝緩衝區,但是沒有在窗口內的文件
d    在當前的文件中定義和由#include包含進來的文件
i    由#include包含進來的文件
k    由dictionary選項定義的文件
kfile    名爲{file}的文件
t    標記(tags)文件
u    沒有載入的緩衝區
w    在其他窗口中的文件
我們可以使用path選項來告訴Vim如何來查找我們在當前文件中所包含進來的文件.我們還可以指定一個字典,這個選項的格式如下:
:set dictionary=file,file,....
這個選項定義了由命令CTRL-P和CTRL-N進行匹配查找時所要查找的文件.在Linux系統中這個定義文件在/usr/dict/words中,所以如果我們要將這個文件添加進來進行查找的話,我們就要用到下面的命令:
:set dictionary=/usr/dict/words
如果我們要使用一個我們自己的文件也可以這樣的來設置
:set dictionary=/home/oualline/words,/usr/doc/words
我們也可以指定一個字典文件和k選項組合使用:
:set dictionary=k/usr/oualline/words
我們也可以多次的使用k這個標記選項:
:set dictionary=k/usr/dict/words,k/usr/share/words
在上面提到的CTRL-P和CTRL-N進行查找匹配時查找的範圍比較的寬範,我們當然也可以使用命令進行一些比較嚴格的查找.這時我們可以使用命令CTRL-X.當我們輸入CTRL-X時我們會進入CTRL-X的一個子模式.這時我們可以使用下面的命令進行查找:
CTRL-D    宏定義
CTRL-F    文件名
CTRL-K    字典
CTRL-I    當前文件以及由#include包含進來的文件
CTRL-L    整個行
CTRL-]    標記(tags)
CTRL-P    向前查找,與沒有CTRL-X命令時相同
CTRL-N    向後查找,與沒有CTRL-X命令時相同
CTRL-X
CTRL-D命令查找宏定義.他也會查找#include文件.當我們執行完這個命令以後就可以使用CTRL-P,CTRL-N來進行匹配查找.
例如我們可以編輯下面的測試文件:
include.h文件中的內容
#define MAX(x,y) ((x)<(y)?(y):(x))
#define MIN(x,y) ((x)<(y)?(x):(y))
int sum(int i1,int i2)
{return (i1+i2);}
main.c文件中的內容:
#include \"include.h\"
#define MORE \"/usr/ucb/more\"
這時我們開始編輯main.c文件,如果我們按下CTRL-X我們就會進入CTRL-X的子模式.如果我們要查找一個宏定義,我們可以按下CTRL-D,這時就會在屏幕的底部簡單的顯示出有多少匹配的選項.這樣我們就可以用CTRL-P和CTRL-N來進行自動完成的功能了.而命令CTRL-X CTRL-]則是查找下一個標記(tag),標記是一個C函數的定義.我們可以用命令ctags命令來生成一個C函數定義的列表.我們可以這樣的來使用這個命令:
$ctags *.c *.h
這樣以後我們就可以在插入模式入下用CTRL-X CTRL-]命令來進行標記的查找和匹配了.
在默認的情況下,vim編輯器只是簡單的顯示出標記的名字,我們可以執行下面的命令,這樣以後就可以顯示出整個標記了:
:set showfulltag
我們可以使用CTRL-X CTRL-F命令來匹配文件名.他會在當前的目錄下查找文件並會顯示出匹配的內容,這時你就可以用CTRL-P和CTRL-N命令來選擇你想要的匹配選項了.
到目前爲止我們所說還只是對單詞進行操作,我們可以用命令CTRL-X CTRL-L對一行進行匹配操作,同樣的我們也可以用CTRL-N和CTRL-P來進行選項的匹配.我們還可以在輸入CTRL-X命令後用CTRL-Y向下滾動文本,而用CTRL-E向上滾動文本.\r\n
vi編輯器的學習使用(十三) 
Vim最大的一個優點就是他的靈活性.使得他具有如此靈活性的一個重要原因就是自動命令.所謂的自動命令就是一條命令,所不同的只是他可以在某些事件發生時自動執行.
例如通過Vim的這樣自動命令,我們可以使用Vim來編輯壓縮文件,這是因爲我們可以定義一個自動命令在我們讀取文件時解壓縮,在我們寫入文件時進行壓縮.
我們在處理文件時有時希望文件在保存時在文件的結尾處插入當前的日期,而這在Vim當中我們可以使用自動命令來完成.我們可以定義這樣的一個函數:
:function DateInsert()
:    $read !date    \"在文件的結尾處插入日期
:endfunction
當我們要保存文件時可以調用這個函數:
:call DateInsert()
然後我們就可以保存退出了.
我們還可以將這個功能綁定在一個按鍵上:
:map <F12>:call DateInsert()<CR>\\|:write<CR>
這種方法使用問題的解決更簡單,因爲我們只需在要保存文件時按一下F12鍵就可以了.
但是也許有時我們會忘記這樣的步驟,而使用正常的保存命令,那麼這時這個函數也就失去了意義.我們希望這個插入日期的命令可以自動被執行,這也正是自動命令的意義所在.
下面的命令就可以來滿足我們的要求了:
:autocmd FileWritePre * :callDateInsert()<CR>
這個命令會使得所有的文件在保存之前調用這個插入日期的函數.我們並不需要每一次都要輸入:write來保存文件,也就是說當我們定義了這個命令以後,當我們輸入一次:write命令,vim就會自動檢查所有未保存的文件並執行我們定義的這個命令,然後執行保存命令.
:autocmd命令的一般格式如下:
:autocmd group events file_patter nested command
在這個格式中組名(group)是一個可選項,他被用於管理和調用命令.參數事件(events)是一個事件列表,指明引發命令的事件,而嵌套標記(nested)可以允許嵌套自動命令,最後是所要執行的命令.
命令:augroup可以使得我們定義一組自動命令.這個組名最好應是一個和我們要定義的一組自動命令相關聯的名字,如下面的例子:
:augroup cprograms
:    autocmd FileReadPost *.c :set cindent
:    autocmd FileReadPost *.cpp :set cindent
:augroup END
在這裏因爲這些自動命令是在:augroup的作用域之內的,所以他們被放在cprogram這個組內.這組自動命令是在讀取C和Cpp之後執行的.如果我們想在這個組中添加關於頭文件的自動命令,我們可以使用:augroup命令,或者是在我們的定義中包含這個組名.
如果我們正在編輯的文件名爲sam.cx,而我們想將他當作C程序文件來對處理.這時我們可以通過命令來告訴Vim編輯器在文件讀入以後將他與*.c文件相匹配.我們所用的命令如下:
:doautocmd group event file_name
在這個命令執行的時候,Vim是將假定當前文件的名字爲file_name,而實際上這並不是他真正的文件名.如果在這個命令中我們並沒有指明組(group),那麼所有的組都會被用到.而且我們必須指明事件,並且Vim會認爲這個事件已經發生.與命令:doautocmd相類似的是命令:doautoall,所不同的只是後者是針對每一個緩衝區(buffer).這個命令的格式爲:
:doautoall group event file_name
我們可以使用下列的命令來引發命令:
BufNewFile            當編輯一個新文件時引發命令
BufReadPre    BufReadPost    在讀入之前或是讀入之後引發命令
        BufRead        BufReadPost的另一種說法
BufFilePre    BufFilePost    在通過:file命令更改緩衝區名字之前或是之後引發
FileReadPre    FileReadPost
在用:read命令讀入文件之前或之後.在文件讀入之後,在文件的開頭和結尾處有由[和]來標記
FilterReadPre    FilterReadPost    在用過濾命令(filter)讀入文件之前或之後
FileType            當FileType設置時有效
Syntax                當Syntax設置時有效
StdinReadPre    StdReadPost    由標準輸入設備讀入或是輸出
BufWritePre    BufWritePost    在將整個緩衝區寫入文件之前或是之後
BufWrite            BufWritePre的另一種說法
FileWritePre    FileWritePost    將部分緩衝區內容寫入文件之前或是之後
FileAppendPre    FileAppendPost    將一個文件由過濾命令輸入之前或之後
FileChangedShell
這個事件是在Vim運行Shell命令而文件的修改時間已經改變時引發
FocusGained    FocusLost
這個事件是在Vim編輯器得到或是失運輸入光標時引發.這意味着vim運行圖形界面,並且是Vim成爲當前窗口或是其他的成爲當前窗口
CursorHold
用戶停止輸入的時間長於由updatetime所指定的時間時引發
BufEnter    BufLeave    當進入或離開緩衝區時引發
BufUnload            在緩衝區未載入之前引發
BufCreate    BufDelete    在緩衝區產生以後或是在緩衝區刪除以前引發
GuiEnter            啓動GUI時引發
VimEnter            Vim啓動而初始化文件還沒有讀入進引發
VimLeave            退出Vim編輯器而.viminfo還沒有改寫時引發
FileEncoding            fileencoding已經被設置時有效
TermChanged            term選項被更改時引發
User
並不是一個真正的事件,而是命令:doautocmd一起使用的一個事件
當存文件時,只有下列事件成對出現時才引發:
BufWritePre    BufWritePost
FilterWritePre    FilterWritePost
FileAppendPre    FileAppendPost
FileWritePre    FileWritePost
當讀文件進,只要下列事件中的一個被設置則會引發:
BufNewFile
BufReadPre    BufReadPost
FilterReadPre    FilterReadPost
FileReadPre    FileReadPost
文件名類型與UNIX標準系統相匹配.下面列出是一些特殊字符匹配的情況:
*    匹配任意長度的任意字符
?    匹配單個字符
\'    分隔交替的類型
\\?    字符?
\\,    字符,
\\character
將這個字符看作是一個要查找的類型字符,例如:a\\+可以匹配,aa,aaa等等
一般情況下一個命令的執行結果並不會引發另一個事件.例如Syntax的執行結果並不會引發FileReadPre事件.但是如果我們在自動命令中加入nested關鍵字就可以來引發了,例如下面的命令:
:autocmd FileChangedShell *.c nested e!
我們可以使用命令:autocmd列出所有的自動命令.
如果我們想要得到所有這些命令中的一個子集命令,我們可以使用如下的命令:
:autocmd group event pattern
在這個命令中如果我們指定了group,那麼就會所有與group相匹配的命令.event可以是以前定義的或是所有的事件,pattern指了與類型相匹配的文件選項.只有那些與命令相匹配的命令纔會被列出來.
我們可以建立我們自已的自動命令,當然了我們也可以移除那些我們不再需要的自動命令.例如命令:autocmd!就可以移除所有的自動命令.
我們也可以用下面的命令來移除指定的組命令:
:autocmd! group
在這個命令中我們當然也可以爲這個組指定事件或是類型
:autocmd! group event pattern
event可以用*代替所有的事件
我們可以用命令:autocmd!來移除那些已經存在的自動命令,我們還可以同時在一個命令中再新建一個我們自己的自動命令.這個語法的格式如下:
:autocmd! group event pattern nested command
這個命令等價於下面的兩個命令:
:autocmd! group event pattern
:autocmd group event pattern nested command
有時我們並不想引發某個命令,在這樣的情況下我們可以設置eventignore選項來指定那些要忽略的事件.例如下面的命令將進入窗口和離開窗口的事件忽略掉:
:set eventignore=WinEnter,WinLeave
如果要忽略所有的事件,可以用下面的命令:
:set eventignore=all\r\nvi編輯器的學習使用(十四) 
Vim編輯器的不僅可以使得我們編輯各種各樣的文件,而且還有一些附加的功能來完成我們的作.例如說Vim可以實現在對文本文件進行加密,而且我們還可以通過一命令行參數來控制我們對文件的處理.我們還可以通過交換文本來實現對文件的修復.
我們在用Vim時常用一些有用的命令行參數,在這些命令行參數中最有用的一個要算是--help,這個命令行參數可以簡單的列出一個幫助屏幕,在這個屏幕上列出所有的命令行參數.這個命令的執行結果如下:
這個命令的格式如下:
$ vim --help
如果要查出我們所使用的Vim的版本,我們可以使用下面的命令:
$ vim --version
我們可以用-R參數來在只讀狀態下打開一個文件,命令格式如下:
$ vim -R filename\r\n在大多數的系統中,這個命令與下面的命令是相同的:\r\n$ view filename
-x參數可以告訴Vim編輯器對某一個文本文件進行加密處理.例如我們想要建立一個文件來保存一些我們自己的小祕密時就可以使用下面的命令:
$ vim -x filename
這時Vim編輯器就會要你來輸入加密和解密時所需要的密碼.這樣以後我們就可以在正常的狀態下來編輯我們的文本文件了,當我們完成編輯工作要退出時,Vim就會將文本進行加密處理後退出.當我們想用cat或是type命令來打印出已進行過加密處理的文件時會得到一些無意義的信息.
我們當然是可以在加密和非加密兩種狀態下進行選擇和切換.選項key包含了加密時的密碼.如果我們將這一項設爲空,那麼也就意味着我們關閉了加密選項.這個命令爲:
:set key=
如果我們設定了一個密碼,那麼我們就打開了加密選項.例如下面的命令:
:set key=
保存退出.此時的文件就沒有密碼,我們可以通cat和type命令來打印文件中的內容.
而我們也可以通過樣的命令來重置我們的加密密碼.例如下面的命令:
:set key=secret
但是這樣的設置並不是一個好主意,因爲在輸入這個命令時你所輸入的密碼是可以明文顯示的,別人在旁邊晃動一下肩膀也許就可以看到了,因而這是一個不安全的加密方法.爲了避免這樣的問題,我們可以使用:X命令,這個命令可以將我們所輸入的密碼用*打印出來,因而不易被人看到,所以安全得多.
但是我們要清楚的認識到,Vim所採用的這種加密算法是很弱的.也許他可以防住偶爾路過的小偷,但是不可能防住一個很有時間的密碼學專家.同時我們還要認識到我們在編輯文件時所使用的交換文件(swap file)並沒有經過加密,因而當我們在進行文件編輯時,一個有着超級權限的人可以通過交換文件得知我們所編輯的內容.一個解決的辦法就是我們在編輯文件時不使用交換文件.如果我們在命令行參數中指定-n參數,我們就可以在編輯文件時不使用交換文件,這時我們所輸入的內容是存在內存中的.例如我們可以使用下面的命令來編輯一個加密的文件同時不使用交換文件:
$ vim -x -n filename
但是我們應該知道在不使用交換文件的情況下,防止了別人偷看我們編輯器的內容,而我們也不可能通過這個交換文件來恢復我們的文件了.
因爲不使用交換文件時我們所輸入的內容存在於內存中,因而就百以文本方式存在的.任何人都可以通過查看編輯器的內存來發現我們文件中的內容.如果你真的是想保密你的文件,那只能在使用一個不用聯網的電腦,使用好的加密工具,當電腦不用的時候我們要安全的鎖起來了.要不我們可要怎麼辦呢?!:-)
想一下,如果我們要處理許多的文件,而要將這些文件中的字符串-person-換成Jones.我們應怎麼樣來做呢?一個辦法就是我們要輸入許多次來手工的更改(想一想這樣的事情有多的恐怖),另一個解決辦法就是我們可以寫一個Shell腳本或是批處理文件來做這樣的工作.Vim作爲一個原始的屏幕編輯器在正常模式下啓動可以極好的完成這樣的工作.然而要批處理,Vim並不會產生一個空的有註釋的文件,因而我們要使用ex的命令模式.這種方式給了我們一個極好的命令行的接口可以很容易的放入批文件中.
在我們這個例子中我們所需要的命令如下:
:%s/-person-/Jones/g
:write
:quit
我們將這些命令放入一個名爲change.vim的文件中,然後在批模式下運行Vim,這時我們可以使用這樣的命令:
$ vim -es file.txt<change.vim
這個是告訴Vim是ex命令模式下運行處理文件file.txt並從change.vim中讀入文件.-s標記告訴Vim不要給出任何的輸出提示一類的內容.
還有另外的一些命令行參數使得我們可以更好的來控制Vim編輯器:
-R    打開一個文件只讀
-m    允許修改.這個選項允許我們可以設置write選項和修改文件
-Z
受限模式.這個命令參數可阻止我們使用:shell命令或是其他的一些命令來使用外部的Shell.但是這個選項並不會阻止我們使用:vi命令來編輯文件.
另外還有一些命令行參數可以允許我們決定讀取哪一個初始化文件:
-u file
使用file爲初始化文件,而不是使用.vimrc作爲初始化文件.如果沒有這個文件,那麼就不會用任何的初始化文件.
-U file
使用file而不使用.gvimrc作爲初始化文件.如果沒有這個文件,同樣不使用任何的初始化文件.
-i file        使用file而不使用.viminfo作爲初始化文件.
在UNIX系統中,Vim編輯器實際上是一個有着不同的名字或鏈接的文件.Vim編輯器在哪種模式下啓動,取決於我們用什麼樣的命令或是名字來啓動他.一些常用的命令如下:
vim    在終端模式下啓動(在當前窗口內啓動編輯)
gvim    在圖形模式下啓動(編輯器啓動他自己的窗口來進行編輯)
ex    在ex模式下啓動
view    在正常模式下啓動,只讀
gview    在圖形模式下啓動,只讀
rvim    在終端模式下啓動,受限
rview    在終端模式下啓動,只讀,受限
rgvim    在圖形模式下啓動,受限
rgview    在圖形模式下啓動,只讀,受限
vi    Linux下的啓動命令,同vim
我們也可以通過命令行參數來設置初始化模式:
-g    在圖形模式下啓動vim(與命令gvim相同)
-v    在可視化模式下啓動(與命令vim相同)
-e    在ex模式下啓動(與大多數系統上使用ex命令相同)
我們還可以使用一些命令行參數來調試我們的Vim編輯器,常用的命令行參數有下面的一些:
-Vnumber
顯示額外的信息以使我們知道在編輯器的內部都做了一些什麼.數字越大,我們得到的輸出信息也就越多.這個參數常用來調試我們的Vim編輯器腳本.
-f
前景.我們不要在背景模式下啓動圖形界面.這個啓動對於那些只有一個程序執行完畢纔開始執行另一個程序的情況顯得尤爲有用.當然了這個選項對調試也是相當有用的.
-w script
將用戶輸入的所有字符存入腳本文件.如果這個文件已經存在,那麼就追加在文件後面.
-W script    -W相類似,只是這個選項會覆蓋掉已經存在的數據
-s script    用-w選項來恢復腳本記錄
-T terminal
設置終端類型.在UNIX系統中,這會改寫$TERM的環境變量(當然了,如果$TERM環境變量錯誤,其他的許多程序都將會崩潰)
我們還有一些兼容的命令行參數.這些參數可以使得我們的Vim運行起來更像是Vi;
-N
這個參數可以使得Vim以自己的方式來運行,而不是不是像Vi的方式運行.這個參數是被.vimrc文件默認定義的.
-C
兼容模式.這個參數關掉了許多Vim的自己的特徵,而是儘量的像Vi的方式一樣的運行.
-l
Lisp模式.這種模式完全是由老版本的vi延續下來的.他設置了lisp和showmatch選項.這時的Vim的與文件類型相關的命令都可以很好的處理Lisp程序,並且這是可以自動完成的.
最後還有一些不知道該將他們歸爲哪一類的命令行參數:
-d device    打開編輯給定的設備文件
-b        二進制模式.設置了noexpandtab,textwidth=0,nomodeline,binary
在一般的情況下,vim是不產生備份文件的.如果我們希望他產生備份文件,我們可以使用下面的命令:
:set backup
產生的備份文件的名稱是在原始文件名的最後加上了~.例如我們有一個名爲data.txt的文件,那麼由Vim所產生的備份文件名即爲:data.txt~.
如果我們不喜歡這個備份文件的擴展名,我們可以定義我們自己的備份文件擴展名.這時我們要到下面的命令:
:set backupext=string
例如如果我們設置了backupext的值爲.bak,那麼新的備份文件名即爲data.txt.bak    
如果我們設置了patchmode選項,那麼Vim編輯器就會以當前文件名加上patchmode的值爲文件名備份正在編輯的文件.但是我們要注意的是隻有以這個文件名爲文件名的備份文件不存在時纔會產生這樣的備份文件.例如我們執行下面的命令:
:set patchmode=.org
如果我們是第一次編輯一個已經存在的文件:data.txt.當我們執行了這樣的命令保存退出想要看一下事實是否是這樣的.因爲以前這個備份文件並不存在,所以會產生一個備份文件,名爲:data.txt.org.但是當我們再一次編輯這個文件保存退出後,因爲這個備份文件已經存在,所在現在的備份文件名:data.txt~.
通常情況下Vim編輯器會將備份文件放在與文件相同的目錄下,我們可以通過設置backupdir選項來選擇我們的備份文件存放的地方,例如我們想將備份文件放在~/tmp目錄下,我們可以通過執行下面的命令來做到:
:set backupdir=~/tmp/
但是這樣的設置有時也會產生問題的,如果我們在不同的目錄下編輯具有相同文件名的文件,當我們保存退出時,Vim會將備份文件放在~/tmp/目錄下,名字的衝突會使得老的備份文件丟失.同時我們還要知道的就是這個選項可以同時設置幾個值,中間用逗來分隔.Vim會將備份文件放在第一個目錄下.
一般情況下,當Vim保存文件時,會執行下面的步驟:
1
Vim要檢查Vim外面的文件是否被做了改動.例如也許有的人已將這個文件重新命名了,如果發生這樣的情況,Vim就會給出警告並詢問是否繼續.
2
如果設置了writebackup或是backup選項,Vim就會將舊的備份文件移除,同時產生一個當前文件的副本做爲新的備份文件
3 將緩衝區的內容寫入文件.
4
如果設置了patchmode選項而不存patch文件,那麼Vim就會將備份文件重命名成爲patch文件
5 如果沒有設置backup選項,而是設置了writebackup選項,就會移除備份文件
Vim覆蓋已經存在的文件的原因是因爲要保護UNIX系統上的硬鏈接.在非UNIX系統上,備份文件只是通過重命名當前文件來產生
注意:如果我們設置了nobackup和nowritebackup選項,Vim會覆蓋已經存在的文件.這在磁盤已滿而更新文件時會造成數據的丟失.
在默認的情況下,Vim設置了writebackup選項.這就意味着Vim很難會丟失數據.通過採用這樣的方法,在磁盤已滿的情況下,我們就沒有機會丟失文件.也許我們會不能寫入新文件,但是我們不會丟失我們的舊文件.
我們在用Vim來編寫時,Vim會在我們編寫的過程中產生一個臨時的交換文件,這個交換文件中包含着我們所做過的所有修改,當我們完成編寫工作,保存退出後,這個臨時文件會被刪掉.但是如果Vim遇到了意外情況而退出時,這個臨時文件會因爲來不及刪除而存在於硬盤上.當Vim啓動時他會檢查在當前目錄中是否存着交換文件,如果存在,則意味着有一個Vim正在編輯此文件,或者是我們在Vim編輯器的過程中遇到意外而退出,從而留下交換文件.這時Vim就會給出警告信息,並會給我們機會要我們自己來決定我們下一步要怎麼做.這時我們可以有以下四個選項:
Open Read-Only(以只讀方式打開)
這個選項會告訴Vim以只讀方式打開.如果我們想要看到文件中的內容或是有另一個編輯過程正在運行,我們可以選擇這個選項
Edit anyway
如果我們選擇這個選項我們可以對這個文件進行編輯.我們最好不要選擇這個選項,除非我們對我們正在做的事情有着絕對的把握.這時我們應該知道,如果同時有兩個或是多個編輯過程同時編輯一個文件,只有最後一個保存的編輯過程有效
Recover
如果我們正在編輯我們的文件,而由於系統故障或是其他的原因而導致vim意外退出時我們可以選擇這個選項.此時Vim會檢查交換文件,並試着從我們意外退出的地方重新開始
Quit    取消對此文件的修改
在我們選擇了其中的一項後我們就可以正常的開始我們的編輯工作了.如果我們選擇了Recover我們要十分小心,因爲我們以前所做過的修改並不一定被保存下來.
如果我們記得Vim意外退出時我們正在編輯的文件,我們可以用-r命令參數在修復模式下啓動Vim.例如我們在編輯文件commands.c時Vim意外退出,我們就可以用下面的命令在修復模式下啓動vim:
$ vim -r commands.c
如果我們想得到一個可以修復的編輯器程序列表,我們可以用下面的命令:
$ vim -r
這樣Vim就會在當前目錄和標準的臨時的目錄下查找交換文件,命令的執行結果就像下面的樣子:
$ vim -r
找到以下的交換文件:
   在目前目錄:
1.    .vi14.txt.swp
            所有者: mayuelong    日期: Wed Jul 27 19:19:39 2005
              文件名: ~mayuelong/Documents/vi14.txt
            修改過: 是
            用戶名: mayuelong      主機名: localhost.localdomain
           進程 ID: 3070 (正在執行)
   在目錄 ~/tmp:
      -- 無 --
   在目錄 /var/tmp:
      -- 無 --
   在目錄 /tmp:
      -- 無 --\r\nVim在意外退出的情況下並不會覆蓋舊的交換文件.例如第一次編輯時產生的交換文件名爲.file.txt.swp.如果我們再編輯又遇到意外退出時所產生的交換文件名爲.file.txt.swo,到第三次時所交生的交換文件爲.file.txt.swn,如此類推.
我們在啓動Vim時可以指明用哪一個交換文件來修復文件,命令如下:
$ vim -r .file.txt.swo
如果想知道我們當前正在使用的交換文件的名稱可以使用下面的命令:
:swapname
這樣就會顯示交換文件的名稱.
通常情況下,交換文件會每4秒或是每隔200個字符保存一次.這個數值是由updatecount和updatetime選項來控制的.我們可以用下面的命令來設置交換文件每23秒保存一次:
:set updatetime=23000
(注:這個數值是以微秒計的)
或者是我們可用下面的命令來設置vim每400個字符保存一次:
:set updatecount=400
如果我們將updatecount的值爲0,那麼交換文件就不會被保存了.
事實上我們可以來控制是不是要在編輯的過程中產生交換文件,例如下面的命令是在產生交換文件,而這也正是Vim所默認的:
:set swapfile
我們也可以用下面的命令來使Vim不產生交換文件:
:set noswapfile
我們可以對每一個編輯的文件將這個選項設置或是重置.如果我們正在編輯一個大文件而我們又不想可以修復,我們可設置noswapfile.如果我們同時正在另一個窗口編輯一個文件,那麼這個窗口中的文件仍是使用交換文件的.
在UNIX或是Linux系統中,當我們要保存文件時,通常數據被裝入內存緩衝區,並肯是在系統認爲是一個合適的時纔會被寫入文件.這通常只是幾秒鐘的事情.如果我們想要確認數據到達了磁盤,我們可以使用下面的命令:
:set swapsync
這個命令是告訴Vim編輯器在每一次將文件寫入交換文件的同時寫入磁盤.swapsync選項可以是fsync或是sync,這個取決於我們要保存文件時的系統調用.
通常情況下,Vim是在和當前文件相同的目錄下產生交換文件,我們可以通過directory選項來更改交換文件產生的目錄.例如下面的命令可以將產生的交換文件放在/tmp目錄下:
:set directory=/tmp
這並不是一個好主意,因爲如果我們是在不同的目錄下編輯具有相同文件名的文件時會產生名字衝突.
我們也可以將這個選項設成一個目錄列表,中間用逗號來分隔.最好的方法就是將當前目錄(.)設爲目錄列表的第一個選擇.在存放交換文件時首先放在列表的第一項指的目錄處,這樣交換文件首先會被存放在當前目錄下.
如果我們已經做許多的改動,我們想保存我們當前所做工作,我們可以使用下面的命令:
:write
但是這個命令是用我們當前所做的改動來重寫已經存的文件,與其相關的一個命令是
:preserve
這個命令是將我們所做工作存入交換文件,而原始的保持不變,直到我們用:write或是ZZ命令退出時纔會被重寫.在這樣的情況下,如果Vim遇到意外,我們可以用交換文件來修復我們所做的工作,哪怕是原始文件已經丟失.如果沒有用這個命令,我們就不得不同時修復原始文件和交換文件.
我們不僅可以在啓動vim時修復文件,還可以用下面的命令來修復文件:
:recover file.txt
這個命令與下面的有着同樣的作用:
$ vim -r file.txt
如果我們用:recover命令試圖修復我們正編輯的文件則會返回錯誤.如果沒有指定文件名,則默認的當前緩衝區中的文件.如果我們想要放棄我們所做的修改並試圖修復時,我們可以使用下面的命令:
:recover! file.txt
vi編輯器的學習使用(十五) 
Vim大量的工作是通過命令行的方式來完成,這樣的命令行方式對於則接觸Vim新手來說也許會覺得難於操作,可是當我們習慣了這樣的工作方式後,我們就不得不佩服Vim的強大功能,正是這些命令使得我們可以高效的來完成我們的工作.而在Vim當中還有一些其他的命令.
命令:ascii或者是ga可以用ASCII碼和八進制及十六進制打印出來.當我們編輯多字節文件時,例如說我們的漢語,這個命令就可以打印所有的字節.
命令countgo可以到達當前文件中由count所字的字符數的位置.例如命令3go就可以到達文件中的第三個字符處.而命令gCTRL-G可顯示出當前文件中的字符數的信息,同是顯示出當前行,當前列以及其他的一些信息.
而命令:goto offset可以將光標置於由offset所指定的字符處.而命令gg則與我們以前見到過的G命令相類似,他也可以到達由count所指定的行.例如5gg可以到達第5行.gg命令與G命令所不同的地方只是在沒有指定count值時前者回到第一行,而後者要到最後一行.
而命令CTRL-L可以起到重畫屏幕的作用.這個命令在我們使用終端窗口或是在屏幕上存在着一些系統信息時顯得尤爲有用.而命令:sleep time可以使得我們的Vim編輯器在指定的時間不做任何事情(Sleep嘛:-)).在這個命令中如果時間是以m結尾則是指的微秒.這個命令在我們想暫停執行宏時顯得更爲有用.而命令count gs命令也有同樣的作用.
在大多數的終端上,CTRL-S可以停止輸出,如果我們要重新啓動他,則要CTRL-Q命令.這兩個命令並不是Vim命令中的一部分.爲了避免鍵盤的衝突,我們在Vim中並不用這兩個命令.我們最好也不要試着用:map命令將一些功能和這兩個鍵進行綁定,因爲在執行這兩個命令時是鍵盤得到命令而不會到達Vim.
如果我們是在UNIX或是LINUX系統的終端模式下進行工作,我們可以用命令CTRL-Z來中止我們的正常編輯狀態.如果我們要繼續編輯則要使用Shell命令fg.而命令:suspend也會有同樣的作用.
在一般的情況下我們可以使用:help或是F1鍵來顯示幫助屏幕,從而得到一般的幫助信息.
我們可以使用z height<CR>來調整當前窗口的高度.如果當前僅有一個窗口,這個命令只是影響到窗口中的行數.
我們在沒有輸入文件名的情況下啓動Vim時會看到一個介紹的屏幕,這個屏幕在我們輸入任一字符後消失,如果我們想再看到他,可以使用下面的命令:
:intro
vi編輯器的學習使用(十六) 
Vim是一個強大的文本編輯器,這個強大的文本編輯器的大部分工作是通過命令行的方式完成的.Vim一系列的命令可以使得我們快速高效的完成我們的各種各樣的工作.下面我們就來看一下在Vim的編輯中常出現的問題的一些解決辦法.
在我們快速的輸入文本的時候,很容易使得一些單詞輸入錯誤.例如我們本應輸入的是the,而我們卻錯輸入成了teh,這時我們可以通過簡單的命令使得這e和h這兩個字母交換一下位置來達我們改錯的目的.我們可以將光標放在e上,然後輸入命令xp,x命令刪除掉字母e,而p命令則是將他放在當前光標的後面,也就是h字母的後,從而就達到了改錯的目的.
在我們進行文本編輯的時候有時要做一些文本替換的工作,例如是將文中所有的字符串idiots替換成managers.這時我們可以使用下面的命令:
:1,$s/idiots/manages/g
這個是命令是以冒號(:)開頭的,則表明這是一個ex模式的命令.所有的ex命令都指明瞭命令要作用的範圍.在這種情況選定了當前的所有文本,從第一行到最後一行($).我們可以也可以用%來簡單指整篇文章.而s命令是命令:substitute的縮寫.舊的文本放在前面,而新的文本則放在後面,g標記則指明這是一個全局的替換,這樣就不會出在一行中多交出現要替換的文本而只替換第一個的情況了.
但是有時我們希望在進行文本替換以前Vim可以向我們進行一些詢問,然後由我們來決定下一步的操作.在這樣的情況下我們可以按照下面的方法來做:
1 執行命令1G到文檔的開始處.
2 執行命令/idiot來查找文章中出idiot的地方
3 執行命令cwmanager<ESC>,當我們執行cw命令時當前光標處的文本被刪除並進入插入模式,這時我們就可以將我想要替換成的文本輸入,並退回到命令狀態.
4 執行命令n重複上一次的查找
5 執行命令.重複上一次的編輯操作,如果在這一步我們不想進行替換,我們可以跳過這一步,進行下一次的查找.
6 重複以上兩步直到將文件中的所有字符idiot替換成manager
我們還可以執行下面的命令來達到同樣的作用:
:%s/idiot/manager/cg
在這個命令中我們是用%來指代文章中的所有的行,與上一個命令不同的地方是我們加入了標記c,這個標記可以告訴Vim每一次在替換之前都要進行詢問.
我們在進行文本編輯時想要進行文本的移動操作我們又該如何來做呢?這時我們可以按照下面的步驟來做:
1 將光標移到我們要移動的段落的開頭部分
2 用命令ma在此處做上標記.
3 將光標移到這個段落的底部
4 執行命令d\'a來刪除剛纔做了標記的文本.
5 將光標移到我們想放置文本的地方.
6 執行命令p將這段文本放在此處
這樣我們就達到移動文本的目的.
我們可以按照下面的方法來做,可以達到同樣的效果:
1 用光標放在第一行並將其標記爲a


用命令}移動到這個段落的底部,標記爲b
3 輸入命令:\'a,\'b move來移動文本.
老版本的Vi編輯器不能很好的來處理多文件.但是Vim在處理多文件上卻顯得優秀得多.我們有多種不同的方法在不同的文件之間進行文件拷貝.我們可以使用傳統的Vi風格的命令,也可以使用Vim可視化模式.我們還可以利用系統的剪切板來進行不同文件間的文本拷貝,所有的這些方法都可以很好的來工作,採用哪一種方法這就要看我們個人的喜好了.
使用傳統的Vi風格命令來在不同的窗口之間進行文本的拷貝可以按照如下的方法來做:
1 編輯第一文件
2 執行命令:split second_file打開另一個窗口並開始編輯第二個文件
3 使用命令CTRL-W p回到含有原始文件的前一個窗口
4 將光標移動到要拷貝文本的第一行
5 用命令ma標記這一行
6 移動到要拷貝文本的最後一行
7 執行命令y\'a來複制當前光標位置到所做標記之間的文本.
8 使用命令CTRL-W p 回到將要放置文本的這個文件.
9 將光標移到將要插入文本的地方,複製的文本將會放到這一行的前面.
10 使用命令P命令將複製的文本粘貼到文件中.
(注:p命令則是將文本放在光標所在行的後面)
用可視化模式在兩個窗口中進行文本的拷貝可以按照如下的方法:
1 編輯第一個文件.
2 執行命令:split開始編輯第二個文件.
3 使用命令CTRL-W p 回到前一個包含有原始文件的窗口.
4 移動到將要複製文本的第一行.
5 執行命令V進入可視化模式.
6 移動到將要複製文本的最後一行,被選中的文本將會被高亮顯示.
7 執行命令y複製選中的文本
8 使用命令CTRL-W p 回到將要放置文本的文件中.
9 移動到將要插入文本的地方,所複製的文本將會被放置在光標所在行的前面.
10 使用命令P來放置所複製的文本.
在不同的vim程序間實現在文本的拷貝可以照如下的方法:
1 編輯第一個文件.
2 啓動Vim程序並編輯第二個文件
3 回到含有第一個文件的窗口.
4 移到要複製文本的第一行.
5 執行V命令進入可視化模式.
6 移到要複製文本的最後一行,選中的文本將會被高這顯示.
7 使用命令\"*y命令將文本複製到系統剪切板.
8 回到另一個窗口.
9 移動到將要放置複製文本的地方,複製的文本將會被放到當前光標的前面.
10 執行命令\"*P將複製的文本放在這個文件中.
(注:這個方法似乎只在Gvim中有效)
也許我們經常會編輯一些文件,其中含有一個名字的列表,這時我們希望做到的是將這個名字列表按照一定的順序進行排列.例如我們可以按照字母的順序進行排列,可是按照ASCII的順序進行排列.我們可以按照下面的方法進行:
1 將光標移到要排列的內容的第一行.
2 使用命令ma進行標記.
3 將光標移到要排序的內容的底部.
4
執行命令!\'asort進行排序.!命令告訴Vim通過UNIX命令來執行.\'a則是告訴Vim這個命令作用的範圍.
我們還可以按照下面的方法進行排序:
1 將光標移到要排序內容的第一行.
2 執行命令V進入可視化模式.
3 移到光標到要排序內容的底部,這時選擇的文本將會被高亮顯示.
4 執行命令!sort進行排序.
Vim編輯器是一個程序員開發給程序員的編輯器.我們可以用這個編輯器在C或是C++程序文件中進行函數的定位.我們要想使用這個功能,我們首先要生成一個名爲tags的文件,在這個文件中含C或是C++程序文件中所有函數的信息.我們可以使用下面的命令來當前我們工作的目錄下的所有C程序生成一個tags文件:
$ ctags *.c
如果是對於C++文件,我們可以使用下面的命令來生成:
$ ctags *.cpp
如果我們是使用其他的擴展名,我們可以使用相應的擴展名,而不一定非要使用C或是C++的擴展名.
在我們生成這個文件以後,如果我們要利用這個文件來編輯我們的程序文件,這樣Vim就會查找相應的文件並會在函數中進行定位,例如我們要編輯的文件爲write_file,我們可以使用下面的命令來開始我們的編輯工作:
$ gvim -t write_file
假如我們正在看一個名爲write_file的函數,而在這個函數中調用了函數setup_data,而我們又想要知道這個函數的詳細內容,這時我們可以將光標位在這個函數的開頭部分,然後按下CTRL-],這樣Vim就會跳到這個函數定義的地方.哪怕是我們要查找的函數在其他的文件中,Vim也可以爲我們進行精確的定位.
如果我們編輯了當前文件在沒有保存的情況下使用了這個命令,那麼Vim會給出警告信息,並且會忽略這個命令.
有許多和標記函數相關的命令可以使得我們在所標記的函數中進行向前或是向後的跳轉和搜索,還可以打開一個新窗口並將被調用的函數在新窗口中打開.
我們在編寫程序的時候常常會在程序的開頭部分寫上一個註釋的邊框,在其中寫一些表明程序用途等等的信息.在Vim我們可以利用在~/.vimrc這個初始化文會寫上一些命令來快速的完成這樣的工作.例如我們可以其中加入下面的內容:
:ab #b /***************************
:ab #e <space>**************************/
這樣就在Vim當中定義的一個簡寫的標記,在我們要寫註釋時,只要輸入#b<Enter>就可以了.
而我們要輸出下面的註釋只要輸入#e<Enter>就可以了.這樣的命令對於那些每天要有大量程序寫的朋友們來說是不是一個巨大的幫助呢!:)
我們還可以利用vim來讀man幫助手冊頁,但是用這樣的方法並不是太好,因爲man顯示的結果中一些下劃線在Vim中顯示會有一些困難.爲了去除這樣的字符,我們可以使用標準的UNIX命令ul -i.這樣就會去除那些很難閱讀的控制字符.例如我們可以用下面的命令來讀date的man手冊頁:
$ man date | ul -i | vi -
我們還要用這樣的技巧來使用Vim:
:%s/.\\b//g
這個命令是告訴Vim移除那些退格符(\\b),從而使用文件更易讀.
位於文件行後面的空格符或是製表符有時是沒有用,而他們的存在也使得文件看起爲不是太舒服,去除這些多餘的符號我們可以使用下面命令:
:%s/\\s*$//
冒號是表明進入命令模式,所有的命令模式都要指明命令作用的範圍,在這裏我們是指整個文件(%),這個命令是使得Vim將文件行末的空白符(\\s)重複0次或是多數(*).
假如我們正在編輯一個文件,而且在這個文件中我們做了許多的改動.這是一個很重要的文件,我們不希望因爲偶然的改動而造成損失,這時我們可以將這個文件進行寫保護.當我們用Vim來編輯一個有寫保護的文件時我們並不會得到警告或是隻有很少的警告,但是當我們想保存退出出Vim會給出錯誤信息,指出這是一個寫保護的文件,並且Vim並不會退出.這時我們要怎麼辦呢?我們可以使用命令:w!強行保存或是使用:w otherfilename來以另一個文件名進行保存.
在UNIX或是Linux系統中我們可以使用Vim和grep命令組合來編輯一些含有同一個給定單詞的文件.這對我們編寫程序的朋友們來說是有着極大的幫助,因爲有時我們也許可以希望查看或是編輯含有同一個變量的文件.例如我們所有含有frame_counter的C程序文件,這時我們就可以使用下面的命令:
$ vim `grep -l \'frame_counter\' *.c`
grep命令是在所有的文件中查找含有指定單詞的文件,因爲我們指定了-l選項,所以這個命令只是會列出含這個單詞的文件而不會打印出這一行的信息.這樣Vim就會打開grep命令列出的文件進行編輯,而我們也就可以使用:n或是:rewind命令在這些文件中進行跳轉.
我們還可以在Vim內部使用:grep命令來查找我們想要的字符串,例如我們要在所有的C程序文件中查找含有error_string的字符串,我們可以使用下面的命令:
:grep error_string *.c
但是這個命令是使用外部的UNIX或是Linux命令,而且Vim會打開第一個匹配的文件,並將光標置於第一個查找到的字符串處.
vi編輯器的學習使用(十七) 
在Vim編輯器有着相當豐富的命令和設置.有許多的命令設置可以說我們是根本就不會用到的.下面的只是簡要的介紹一些這樣的命令和設置的方法.
命令cscope可以檢查C或是C++程序文件併產生一個含有程序中函數和變量信息的數據庫.我們可以使用Cscope程序來查看這個數據庫從而可以得函數定義和使用的一些信息.Cscope可以從下處得到:
http://cscope.soureforge.net
我們可以使用下面的命令來得一些詳細的幫助信息:
:help cscope
Cscope一些相關的命令如下:
:cs arguments
:cscope argument
處理一些與Cscope程序相關聯的活動
:cstag procedure
定位到Cscope數據庫中名爲procedure的函數標記處
:set csprg=program
:set cscopeprg=program
定義CScope程序名(默認爲Cscope)
:set cst
:set cscopetag
:set nocst
:set nocscopetag
如果設置了cscopetag選項就可以在使用Cscope數據中使用命令(:tags,CTRL-])來瀏覽標記
:set csto=flag
:set cscopetagorder=flag
這個選項設置了CScope標記查詢命令的查詢順序.如果是默認的0,那麼會先查Cscope數據庫,然後是標記;如果是1,則首先查在標記中查找.
:set csverb
:set cscopeverbose
:set nocsverb
:set nocopeverbose
如果設置了cscopeverbose選項,那麼在Vim查找Cscope數據庫並且查找失敗時給出錯誤信息,而Vim默認的設置爲nocscopeverbose
OLE系統是運行在Windows下面的程序彼此之間進行通信的方法.而Vim編輯器可以來扮演一個OLE服務器的角色.這就意味着我們可以來編寫Window程序並與Vim通信.我們可以用下面的命令來得到更詳細的幫助信息:
:help ole-interface
與Perl的接口可以使得我們在Vim中執行perl命令,同時可以提供給Perl程序一個接口,使得他可以訪問Vim的功能.我們可以使用下面的命令來得一些更詳細的幫助信息:
:help perl
Perl的一些接口命令如下:
:pe command
:perl command    執行單一的perl命令
:range perld command
:range perldo command    在幾行上執行perl命令
與Perl相類似是Python.我們可以用命令:help python得到更詳細的幫助信息.
Python的一些接口命令如下:
:range py statement
:range python statement    執行單一的Python命令描述
:range pyf file
:range pyfile file    執行文件中的Python程序
Sniff+的一些接口命令如下:
:sni command
:sniff command    通過與Sniff+的接口來執行命令.如果沒有提供命令,則會顯示出當前連接信息.
同樣我們可以通過命令:help sniff來得到Vim提供的幫助信息.
Tcl的一些接口命令:
:tc command
:tcl command    執行單一的Tcl命令
:range tcld command
:range tcldo command
在所列出的行中每行執行一次Tcl命令
:tclf file
:tclfile file    在給定的文件中執行Tcl腳本
Vim編輯器可以處理各種不同的語言.在這裏列出我們一些常用字的用其他語言來編輯文件的命令.如果我們要想得到一些更詳細的說明,則要查閱Vim文檔或是我們的系統文檔了.
下面的是一個固定的常用的命令:
<F8>    在從左到右和從右到左兩種模式間切換
:set rl
:set rightleft
:set norl
:set norightleft
通過這些選項的設置我們可以選擇是從左到右的模式還是從右到左的模式
:set ari
:set allowrevins
:set noari
:set noallowrevins
通過設置這些選項我們可以通過CTRL-_來設置revins選項.這個可以使得我們選擇語言的輸入的是從左到右還由右至左.
:set ri
:set revins
:set nori
:set norevins
通過這些選項設置,我們可以選擇在插入模式下是由左至右還是由右至左.如果設置了allowrevins選項我們可通過CTRL-_來在這幾個選項間進行切換.
:set gfs=f1,f2
:set guifontset=f1,f2
定義英語使用f1字體,而另一種語言使用f2字體
這個選項只有在我們編譯Vim編輯器時允許進行字體設置並且是隻在UNIX系統纔可以正常的工作.
:set lmap=ch1ch2,ch1ch2
:set langmap=ch1ch2,ch1ch2
爲外文本設置鍵盤映射
Vim編輯器對漢字的輸入支持由左到右,由右到左幾種模式.他還支持傳統的中文和簡體中文.與中文相關的命令如下:
:set fe=encodning
:set fileencoding=encoding
設置文件的編碼.對於中文這個選項可以是對於傳統中文的taiwan或是對於簡體中文的pre.
如果我們要編輯Vim編輯器時打開了Farsi的支持,我們就可以在用這種語言來編輯文件了.可以用-F選項在啓動Vim時進入Farsi模式:
$ vim -F file.txt
我們可以得到更詳細的信息:
:help farsi
與Farsi相關的命令如下:
:set fk
:set fkmap
:set nofk
:set nofkmap
通過這些選項的設置我們可以告訴Vim我們正在使用Farsi鍵盤
:set akm
:set altkeymap
:set noakm
:set noaltkeymap
通過設置這些選項我們可以告訴vim編輯器鍵盤映射是Farsi還是Hebrew
CTRL-_    在Farsi和正常模式下進行切換
<F9>    在標準的ISIP-3342編碼和擴展的ISIR-3342編碼之間進行切換
Hebrew是由右到左的另一種語言.採用Hebrew模式進行編輯可以使用下面的命令:
$ vim -H file.txt
:help hebrew可以使得我們得到更多的幫助信息.
與Hebrew相關的一些命令:
:set hk
:set hkmap
:set nohk
:set nohkmap
通過這些選項我們可以打開或是關閉Hebrew鍵盤映射
:set hkp
:set hkmappp
:set nohkp
:set nohkmapp
通過這些選項我們可以告訴Vim編輯器我們正在使用Hebrew鍵盤還是標準的英語鍵盤(默認爲nohkmapp,即標準的英語鍵盤)
CTRL-_    這個命令可以使得我們在Hebrew或是正常插入狀態下進行切換
:set akm
:set altkeymap
:set noakm
:set noaltkeymap
如果設置了altkeymap選項,那麼與其交換的鍵盤映射爲Farsi.如果設置了noaltkeymap選項,那麼則是Hebrew鍵盤映射.(默認爲noaltkeymap)
Vim編輯器還可以支持日文,與日文相關的一些命令如下:
:set fe=japan
:set fileencoding-japan
告訴Vim編輯器當前文件採用日文編碼.
我們可以通過命令:help hangul得到更多的韓文幫助信息.與韓文相關的命令如下:
:set fe=korea
:set fileencoding=korea
告訴Vim編輯器當前的文本採用韓文的編碼.
我們還可以使用Vim編輯器來編輯二進制文件,相關的命令如下:
:set bin
:set binary
:set nobin
:set nobianary
如果我們設置了insertmode選項,那麼Vim默認的便爲插入模式.我們可以通過命令CTRL-O切換到正常模式.相關的命令如下:
:set im
:set insertmode
:set noim
:set noinsertmode
CTRL-L    如果設置了insertmode選項,則保留這種設置
vi編輯器的學習使用(十八) 
我們在Vim編輯器的學習使用(二)曾學過一些基本的編輯命令,有了這樣的一些基本的編輯命令,我們可以完成絕大多數的編輯任務.在這一次的學習中我們將會接觸到更多的更深一些的東西.
Vim編輯器有着各種不同的命令可以使得我們任意的移到一個單詞的開頭或是結尾.但是有我們卻可以通過Vim的一些選項的內容來自定義一個單詞的定義.w命令可以使得光標向前移到一個單詞.而命令e也是向前移到一個單詞,但是這個命令是將光標定位在一個單詞的結尾處.
而命令ge則是向後移到一個單詞到達前一個單詞的結尾處.
那麼怎麼樣來定義一個單詞呢?我們也許都知道單詞只是一系列的字母的組合.然而在C程序中size56卻會被認爲是一個單詞,因爲在C程序中我們是通過字母,數字和下劃線來定義一個單詞的.但是在LISP程序中我們可以在變量名中使用-,這時他們會認爲total-size是一個單詞,而在C程序中這卻會被認爲是兩個單詞.我們如何來解決這樣的衝突呢?Vim的解決辦法是產生一個選項來定義哪些是一個單詞中的,而哪些不是.例如下面的命令定義了屬於一個單詞中的字母:
:set iskeyword=specification
查看當前選項的值我們可以使用下面的命令:
:set iskeyword?
下面的是一般的值:
iskeyword=@,48-57,_,192_255
在這些值中間中用逗號來分隔的.
如果我們想要單詞中的字母是專一的元音,我們可以使用下面的命令:
:set iskeyword=a,e,i,o,u
我們還可以使用橫線來指定字母的範圍.如果要指定所有的小寫字母,我們可以用下面的命令:
:set iskeyword=a-z
對於那些不能直接指定的字符我們可以使用十進制的數字來表示.如果我們要指定小寫字母和下劃線爲一個單詞,我們可以使用下面的命令:
:set iskeyword=a-z,45
(短橫線的十進制數字表示爲45)
字母@指代C函數isalpha()返回值爲真是的所有的字符.這個要取決於我們所使用的C編譯器和我們編譯Vim所使用的操作系統)
排除某一個字符我們可以在這個字符前加上一個前綴^.例如我們可以使用下面的命令來定義一個單詞,這個單詞可以由除了q以外的小寫字符組成,也就是說在由空格分格的字符串組成,q爲一個單詞,而其他的字符串的組合爲一個單詞:
:set iskeyword=@,^q
而字符@則是由@-@所指代.
iskeyword選項一些特殊字符如下:
a    字符a
a-z    所有由a到z的字符
45    十進制數字45(短橫線-)
@    由函數isalpha()所定義的所有字符
@-@    字符@
^x    除了x以外的字符
^a-c    除了a以處的到c的字符,即b和c
命令iskeyword可以簡記爲isk
iskeyword選項可以控制哪些字符可以是一個單詞而哪些不是.下列的一些相似的命令可以控制其他類型的字符:
isfname        文件名
isident        定義
isprint        打印字符
選項isfname在使用命令gf時會用到,這個命令將會編輯以光標下的單詞爲文件名的文件.
選項isident在使用命令[d時會用到,這個命令將會查找以光標下的單詞爲名稱的宏定義.
選項isprint定義了哪些字符可以顯示在屏幕上.但是對這個我們要小心,如果我們弄錯了,屏幕就會被弄得一團糟.這個選項還可以用特定的查找命令\\p,這代表可打印的字符.
也許到了現在我們已經明白了什麼是單詞(words).而Vim編輯還有一些命令影響到WORDS.雖然這只是大小的不同,但是他們卻代到了兩種不同的事物.word是指由iskeyword選項定義的字符串,而WORD則是指沒有空白符的字符.在這樣的觀點上,that-all是兩個單詞(word),但是卻是一個WORD.
W命令是向前移動WORDS,而B命令是向後移動WORDS.
與WORD相關的一些命令如下:
[count]B    向後移動count個WORDS
[count]E    向前移動count個WORDS,並且將光標置於WORD的末尾.
[count]gE    向後移動count個WORDS,並且將光標置於WORD的末尾.
[count]W    向前移動count個OWRDS.
我們可以使用命令將光標移動到一個句子中第一個沒有空白符的字符處.如果我們要到達一行的開始處,我們可以命令用0命令.
我們可以使用命令fx在當前行光標的後面查找字符x.如果我們要重複這個查找操作可以使用命令;.就像大多數的Vim命令一樣這個命令可以用數字來指明查找的次數.;命令是按照前一次f或是F的查找方向繼續查找.如果我們要向相反的方向查找我們可以使用命令,.
命令-可以向上移動到第一個沒有空白符的前一行處.我們可以指定參數來移到幾行.
命令+可以向下移到到第一個沒有空白符的後一行處,我們可以指定參數來移到幾行.
命令_可以移動到當前行第一個沒有空白符的字符處.
還有一些命令可以使得我們在屏幕的不同地方進行移動.H命令可以將光標移到屏幕的頂端.如果指定的數字參數則可以移動到從屏幕頂端算起的由數字所指定的行處.與H命令相類似是L命令,所不同的只是這個命令移動到屏幕的底端.M命令可以將光標移到屏幕的中間位置.
Vim編輯器還可以記錄你曾經到過的地方,並且可以使得我們回到前一次到過的地方.例如我們在編輯一個文件的時候執行了下面的命令從而到過不同的行處:
1G    到第一行
10G    到第十行
20G    第第二十行
現在我們執行下面的命令:
:jumps
這樣我們就會看到一個我們曾到過的行數的列表.在這個列表中>指的是這個列表中的當前項.這樣在我們處在命令模式下我們就可以使用命令CTRL-O跳回一行.這樣>所指的就會上移一項.而命令CTRL-I或是<TAB>可以使得我們在這個列表中向下跳轉.應用這樣的命令我們就可以實現在文件中進行快速的瀏覽和跳轉.
在通常的情況下,當光標位於一行的開頭是結尾的時候Vim是不可以移動光標的.但是我們可以通過設置whichwrap選項來控制光標是否可以越過一行的結尾並且Vim處於哪種模式.whichwrap選項一些可能的值如下表所示:
Character    Command        Mode(s)
b        <BS>        正常模式或是可視模式
s        <Space>        正常模式或是可視模式
h        h        正常模式或是可視模式
l        l        正常模式或是可視模式
<        左移        正常模式或是可視模式
>        右移        正常模式或是可視模式
~        ~        正常模式
我們可以通過命令CTRL-G來使用Vim在屏幕的下端顯示出我們所在的位置的一些信息.然而只要我們來發問我們就可以得到一些更詳細的信息.爲了得到更詳細的信息,我們可以在CTRL-G命令加上一個數字參數.這個數字越大我們得到的信息就越詳細.例如命令1CTRL-G會告訴我們文件的全路徑.而命令2CTRL-G會同時顯示緩衝區的數字標號.而命令gCTRL-G則可以顯示當前光標所在的行號,列號以及文章的字符數等一些詳細的信息.
我們在前面曾討論過,CTRL-U命令可以使得vim編輯器向上翻滾半屏,但是我們可通過設置scroll選項來控制這個命令翻滾的行數.例如下面的命令可以使得Vim一次翻滾10行:
:set scroll=10
我們也可以通過防變CTRL-U命令的參數來改變翻滾的行數.例如命令2CTRL-U可以使得Vim編輯器一次向上翻滾兩行,直到有命令來翻滾的大小爲止.
如果我們要一次翻滾一行我們可以使用CTRL-Y命令.當然這個命令也可以在前面設置參數來控制翻滾的行數.而CTRL-B命令則是一次翻滾一屏.
與向上翻滾的命令相對是向下翻滾的命令,這樣的命令有如下的一些:
CTRL-D    向下翻滾.這個數值我們可以通過scroll的值來控制.
CTRL-E    一次向下翻滾一行.
CTRL-F    一次向下翻滾一屏.
當光標到達窗口的上端或是下端的時候窗口要發生滾動.我們可以通過設置scrolljump選項來控制這個翻滾數值的大小.默認情況下爲1,當然了我們也可以將其改我們希望的樣子.如下面的命令將翻滾量設爲5:
:set scrolljump=5
與其相類似的就是sidescroll選項,所不同是後者來控制水平的翻滾.
通常情況下,窗口的翻滾是當光標到達窗口的頂部或是底部時才發生的,我們也可以通過scrolloff選項來控制光標與頂部或是底部有多少距離時發生:
:set scrolloff=3
這個命令將其爲3,當光標與頂部距離爲三行時發生翻滾,且翻滾後光標與底部相距三行.
也許我們在編輯文件的過程中有時希望將指定的一行放在屏幕頂端.當然了這樣的問題我們可以使用CTRL-E或是CTRL-Y命令來一行一行的移動直支滿期足要求爲止.我們還可以將光標放在指定的行上,然後輸入z<Enter>.我們這一行就會出現在屏幕的頂端了.
這個命令在沒有任何參數的情況是將當前行置於屏幕的頂端,我們還可以指定參數,這樣就可以將指定的行置於屏幕頂端了.例如命令8z<Enter>就是將第八行置於屏幕頂端.這個命令不僅可以將指定的行置於頂端,還可以將光標移動到本行第一個沒有空白符(non-blank)的字符處.如果我們要將光標保持在一行的某一位置不變我們可以使用命令zt,這樣在這一行的位置發生變化,光標的位置也會保持不變.
如果我們要將指定的一行放在屏幕的底部,我們可以使用命令z-或是zb.所不同的只是前者是將光標放在這一行中第一個沒有空白符的字符,而後者是保持光標的位置不變.
命令zz或是z.可以將指定的行放在屏幕的中部.這兩個命令的不同就是前者保持光標的位置不變,而後者是將光標置於第一個沒有空白符的字符處.
D命令可以將光標所在處到這一行的結尾的文字全部刪掉.我們也可以在這個命令前面加上數字做爲前綴,這樣在執行這個命令以後,Vim不僅會將光標到光標所在行結尾處的字符全部刪除,而且會再刪除這一行以下的count(數字前綴)-1行文本.
與D命令相類似的是C命令.所不同的僅是C命令在刪除文本以後會進入插入模式使得我們可以接着進行文本的編輯.
s命令可以刪除單個的字符並進入插入狀態.如果我們在前面加上數字做爲前綴,那麼Vim就會刪除數字所指定的那麼多的字符,然後進入插入狀態.
而S命令是刪除當前行然後進入插入狀態.我們可以指定數字count做爲前綴,這樣Vim就會刪除count個行,然後進入插入狀態.這個命令與C命令的不同之處只是S命令作用整個行,而C命令僅是光標所處的位置到行末.
x命令是刪除當前光標下的字符,如果指定count作爲參數,則是向右查找count個字符並刪除,而X命令是刪除當前光標前的一個字行,如果指定count作爲參數,則是向左查找count個字符並刪除.
在進入插入模式時我們可以使用i或是I命令.i是在當前光標處開始插入字符,而I則是一行的開頭部開始插入字符.(所謂的開頭是指第一個沒有空白符的字符處).如果我們要在一行中的第一個字符處開始插入我們可以使用gI命令(不論有沒有空白符).a命令是在當前光標的後開始插入,而A命令與a命令相類似,只是他是在一行的後面開始插入狀態.
Vim還可以對於文本進行簡單的算術運算.命令CTRL-A可以將當前光標下的數字加1,我們還可以在前面指定參數,這樣就可以指定的數字加在光標下的數字上了.如果這個數字是以0開頭,那麼Vim就會認爲這是一個八進制的數.例如0177在我們執行這個命令後就會變爲0200.如果一個是以0x或是0X開頭的Vim就會這是一個十六進制的數,例如0x1E在我們執行這個命令後就會成爲0x1F.與CTRL-A命令相類似的是CTRL-X命令.所不同的只是這個命令會使得當前光標下面的數字減1.Vim是一個精巧的編輯器,他可以很好的來處理十進制,八進制,十六進制的數字計算問題.
在默認的情況下,Vim可以識別出八進制和十六進制的數字.我們可以通過nrformats來控制Vim所識別的數字形式.如果要使得Vim識別出十進制和八進制的數字,我們可以使用下面的命令:
:set nrformats=\"\"
如果我們要使Vim只識別出八進制數,我們可使用下面的命令:
:set nrformats=octal
默認的情況下我們Vim可以識別出十進制,八進制,十六進制數字:
:set nrformats=octal,hex
我們可以使用J命令將當前行和下一行合併爲一行.在合併後Vim會加入一空格來分隔這兩行.如果我們不希望用空格來分隔,我們可以使用gJ命令.這個命令與J命令類似,只是他不會加入空格來分隔這兩行.
R命令可以使得Vim進入替換模式.在這種模式下,我們輸入的每一個字符都會替換光標下面的字符,直到我們按<ESC>退出爲止.我們還可以指定數字作爲參數來指明這條命令所要執行的次數.(注:這裏我做的結果是r命令可以指定參數來指明執行次數,而R命令則不成)
當我們在替換的文本中有<Tab>鍵時,替換命令就會出現問題.因爲他也會將<Tab>替換爲相應的字符,這樣就影響了我們文本的縮進.在這樣的情況下我們可以使用gr命令來進行替換.如果光標下的字符是Tab的一部分,那麼就會跳過而替換別的字符,這樣就不會影響我們文本的縮進了.我們還可以使用gR命令進入虛替換模式(virtual replace mode),這時我們輸入的字符就會替換屏幕空白處的一個字符.
我們可以通過執行命令CTRL-K character1 character2來插入一個特殊字符.我們也可以用下面的命令爲定義們的自己的特殊字符:
:digraphs character1 character2 number
這就是告訴Vim編輯器當我們輸入CTRL-K character1 character2命令以後要插入數字表示爲number的字符.
如果我們的工作要我們插入很多的特殊字符,我們可以用下面的命令打開digraph選項:
:set digraph
關閉這個選項的命令爲:
:set nodigraph
(注:這部分內容部是看不明白,也做不出結果)
命令~可以改變字母的大小寫.~命令的執行結果是由選項tildeop的值來控制的.如果我們沒有設置這個選項,那個這個命令就像正常一樣的動作:
:set notildeop
但是如果我們設置了tildeop選項,那麼這個命令的語法就變成了~motion的形式:
:set tildeop
例如下面的句子:
this is a test
如果我們沒設置這個選項,那麼在我們執行命令時就會實單個字符的大小轉換.但是在我們設置了這個選項以後,我們將光標放在第一t上並執行~ft的結果則爲
THIS IS A Test
這個命令會使得當前光標以後第一t和光標間的字符全部轉換爲大寫.如果在這個句子中還有小寫的字符,那麼這個命令還可以執行第二次.直到句子中的字符全部爲大寫爲止.
這時的命令還可以指定字符轉換的個數和方向.例如命令3~l是從當前字符開始向右3個字符進行大小寫的轉換.與這個命令方式相類似的是g~motion格式的命令,所不同的僅是後者不依賴於tildeop選項的設置.命令g~g~或是g~~是進行整個一行的轉換.
其他的一些大小寫轉換的命令還有:
gUmotion命令是使得當前光標處到motino所指處的字符全部變爲大寫.而gUU或是gUgU則是作用在整個行上.如果指定了參數count則所指定的行都會發生變化.而gumotion,guu,gugu則是和上面所說的命令相類似,所不同的只是他們是將字符變爲小寫.
我們在用Vim進行編輯的時候可以進行多次的撤銷命令,這個次數是由選項undolevels來指定的.如果我們要將這個值設爲5000,那麼我們可以用下面命令來做到:
:set undolevels=5000
命令ZQ是命令:q!的另一種說法.這個會放棄我們所做更改然後退出.
命令:write則是保存文件.命令:quit是退出Vim.我們可以使用一個縮寫來達到保存退出的目的::wq
這個命令可以用參數來指定保存退出時使用的文件名,如:
:wq filename
如果這個文件存在且是一個只讀文件時我們會得到一些錯誤信息,當然了我們可以強制執行這個命令:
:wq! filename
我們還可以將指定的行進行保存:
:1,10 wq filename
與命令:wq相類似的命令是:xit
vi編輯器的學習使用(十九) 
Vim編輯器強大的搜索引擎可以使得我們快速的執行各種類型的查找,從而大的方便了我們的編輯工作,使得我們的編輯工作更加快速和高效.
我們在進行查找的過程中可以打開高亮顯示選項,這樣在我們找到我們想要的字符後,Vim就會將字符串進行高亮顯示,我們也可以很方便的知道我們要找的字符串在哪裏.我們可以使用下面的命令來打開高亮顯示選項:
:set hlsearch
關閉這個選項的命令爲:
:set nohlsearch
在默認的情況下Vim編輯器是很敏感的,也就是Vim編輯器可以很好的來區分一個單詞的大小寫,從而可以準確的查找得到我們想要的字符串.例如如果一個文件中有這樣的幾個字符串:
include,INCLUDE,Include.當我們使用命令/include來查找字符串時只有include字符會被高亮顯示.
但是如果我們打開ignorecase選項後再執行這個命令結果就不一了,這時所有的類似的字符都會被高亮顯示.打開這個選項的命令爲:
:set ignorecase
但是這樣的查找結果並不是我們想要的,也不是我們所希望發生的,因而我們常用下面的命令選項設置:
:set noignorecase
這樣Vim就可以正確的查找我們想要的字符串.
如果我們設置了ignorecase選項後,我們想要查找字符串word,而匹配的則可能是word,Word,WORD.如果我們要查找字符串WORD,匹配的結裏也是一樣的.但是如果我們設置了以下的兩項後的執行結果就會變得不一樣了:
;set ignorecase
:set smartcase
經過這樣的設置以後,如果我們輸入的是小寫字符,那麼Vim就會匹配各種可能的組合,這時與設置了ignorecase的情況相同,但是如果我們在輸入中有一個大寫字符,那麼這時的查找就變成了精確查找了,與設置了noignorecase的情況相同.
在默認的情下,我們輸入要查找的字符串,vim是從當前光標處向前查找,直到文件的結尾,如果沒有打到,那麼就會從文件的開頭開始查找,直到光標所處的位置.我們可以通過設置選項nowrapscan來禁止這種循環查找的方式,這個命令如下:
:set nowrapscan
這樣以後如果已經查找到文件的底部時就會在Vim底部顯示出一條錯誤信息.如果我們想要回到正常的狀態,我們可以使用下面的命令;
:set wrapscan
如果我們正處在一個很長的查找過短中而我們想要停止這一查找開始我們新的工作,這時我們可以使用CTRL-C命令,如果是在Windows系統上則要使用CTRL-BREAK命令.
我們在編輯文件的過程中還可以使用立時查找的命令.如果我們想快速查找當前光標下的字符串,我們可以使用命令*,這個命令可以向前查找與當前光標下的單詞精確匹配的字符串.而命令#則向前查找與當前光標下的字符精確匹配的字符串.換句話說如果當前光標下的字符串爲word,在執行*命令查找時並不會與Word相匹配.與這個立時查找命令相類似的就是g*命令.這也是一個立時查找的命令,只不過他不會進行嚴格的整字匹配,如果用這個命令來查找word那麼就有可能和Word相匹配.而g#命令與其相同,只不過他是向相反的方向進行查找匹配.
在默認的情況下,在查找時Vim會將光標放在第一個匹配的結果的開始處.我們也可以指定查找結束後光標所處的位置.對於向前查找的命令我們可以斜線後用數字來指明光標所處的位置,如下面的命令:
/set/2
這個命令會在查找結束後將光標入在第一個set字符串後第二行的開始處.
在這個命令中這個數字可以是正數也可以是負數.如果僅是一個簡單的數字,光標會被放在第一個匹配字符串處後或是前的數字所指定的行的開始處.正是向後,負數是向前.如果斜線後是b和數字的,那麼在查找結束後,光標將會被置於第一個匹配字符串的開始處,然後向左或是右移動n個字符,這裏的n即爲數字所指定的數.如果爲正數則是向右移動,如果是負數,則是向左移動.如下面的命令:
/set/b2
這個命令會使用Vim在查找結束後將光標放在第一個匹配字符的開始處,然後向右移動兩個字符,也就是說最後光標會位於第一個匹配字符串中的t的位置.將b改爲s也是一樣的效果.
與參數b或是s相類似是e參數,這個參數會使得光標放在第一個匹配字符串的結尾處.同樣我們也可以指定數來指是向右還是向左移動光標以及移動的字符數.如下面的命令:
/set/e
這個命令會使光標放在第一個匹配字符處的結尾處,在沒有指定數字時是這個樣子的.而下面命令:
/set/e2
這個命令是會將光標放在第一個匹配字符串的結尾處,然後向右移動2個字符.這裏的數字如果是正數則向右移,如果爲負數,則向左移.
例如下面的命令:
/set/e+2
這個命令是告訴Vim在查找set字符串結束後將光標放在第一個匹配字符串的結尾處,然後向右移動兩個字符.在這裏我們將這個數字稱爲偏移量.如果我們要重複上一次的查找但是需要不同的偏移量我們可以用下面的命令:
//5
不使用偏移量時我們可以指明一個空的偏移量,如:
//
例如下面的一些例子:
/set/e+2
向前搜索字符串2,並將光標放在第一個匹配字符串的結尾處,然後向右移動2個字符
/    重複前一次的查找,使用相同的偏移量.
//    重複前一次的查找,但是不使用偏移量.
我們還可以使用查找命令?來進行類似的查找,例如:
?set?b5
這個命令是告訴Vimu將光標放在最後一個匹配字符串的開頭部分,然後向右移動5個字符
??-2命令則繼續前一次的查找命令,但是使用新的偏移量.
??命令是繼續前一次的查找命令,但是不使用偏移量.
但是有一件事我們要清楚的就是我們在用偏移量進行光標定位時的查找是從當前光標所在處開始的,這會給我們帶來一些麻煩.例如我們在執行命令/set/-2時Vim會將光標放在第一匹配的字符串處,然後上移兩行.當我們用n命令來重複上一次的查找時,我們會找到我們剛纔找到過的那個字符串,然後再向上偏移兩行.這個結果就是不論我們輸入了多少的次n命令,我們仍是在原地踏步的,哪裏也去不了.
Vim使用通用的表達式(regular expressions)來進行邏輯查找.我們在以前討論過用簡單的字符串進行查找,但是這裏我們將要看到的通用字符串查找要簡單字符查找的功能強大得多.通過在我們的命令中使用通用表達式,我們可以查找任何一種字符類型,例如我們可以查找以t開頭而以ing結尾的字尾串(通用表達式爲\\<t[^]*ing\\>).然而這種強大的功能也是要付出一定的代價的.通用表達式是神祕的和簡潔的.也許我們要花上很上的一段時間纔會習慣這種查找方式,然後才能掌握這個強大的查找工具.
在學習這些通用表達式的查找的過程中我們最好將高亮顯示這個選項打開,這樣就可以使Vim高亮顯示最後一次查找的匹配結果.打開高亮顯示的命令爲:
:set hlsearch
一個通用表達式是由一些元素組成的.這些元素是通用表達式中最小的匹配單位.一個元素可以是一個字符,例如a,與字符a相匹配,或者是一個特殊字符,例如$,匹配一行的結束.還可以是其他的字符,例如\\<,是指一個單詞的開始.
在通用表達式中,我們用\\<來匹配一個單詞的開始,用\\>來匹配一個單詞的結束.也就是說要將我們想要查找的字符串放在這兩個中間.這樣我們就可以精確的來查找我們想要查找的字符串,而不會有其他的一些匹配情況.而如果我們用簡單字符串形式來查找,我們就會得到許多的匹配情況,甚至在一個單詞中的組成部分也可以成爲匹配情況.例如在文件中有Californian,Unfortunately.如果用命令/for來查找,那麼就會找到這兩個單詞.而如果我們用通用表達式\\<for\\>來進行查找,則只會精確的查找到for,而不會用其他的匹配情況.這時的命令形式如下:
/\\<for\\>
我們在進行查找的時候還可以使用一些修飾符來進行表達式的組合.例如修飾符*就可以表示一個字符可以匹配0次或是多次.換句話說,Vim編輯器會進行儘可能多的匹配.所以通用表達式te*可以匹配te,tee,teee等等.基於還可以匹配t,爲什麼呢?因爲在這裏e可以匹配0次,所以就可以匹配t.而修飾符\\+則表明這個字符可以匹配一次或是多次.所以表達式te\\+可以匹配te,tee,teee等等.但是這一次這個表達式不可以再匹配t了,因爲這裏e最少要匹配一次.
最後一個修飾符\\=表示一個字符匹配0次或是一次.這就是說表達te\\=可以匹配t,te,但是不可以是tee,雖然這個命令會匹配tee的前兩個字符.
還有一些特殊的字符可以來匹配一定範圍的字符.如\\a匹配一個字符,而\\d匹配任何數字.所以表達式\\a\\a\\a可以匹配任意三個字符.例如下面的命令可以查找任意四個數字:
/\\d\\d\\d\\d
我們還可以用下面的命令來查找任意後帶一個下劃線的三個字符:
/\\a\\a\\a_ 
\\a可以匹配所有的字符(小寫的或是大寫的).但是假如我們現在只要匹配元音字符又該如何來做呢?這時我們可以使用範圍作用符[].範圍作用符可以匹配一系字符中的一個.例如[aeiou]只匹配一個小寫元音字符.所以表達式t[aeiou]n可以匹配tan,ten,tin,ton,tun.
我們還可以通過短橫線來在括號內指明字符的範圍.例如[0-9]可以匹配0到9中的任一字符.
我們還可以組合其他的字符.例如[0-9aeiou]可以匹配任意一個數字或是小寫的元音字符.
而修飾符^可以指代除本身以外的所有字符.
下面列出一些匹配的情況:
表達式        匹配結果
one[\\-]way    one-way
2\\^4        2^4
2[\\^*]4        2^4,2*4
如果我們要指找所有的大寫字符又應如何來做呢?一個辦法就是使用表達式[A-Z].還有一個辦法就是我們可以使用預先定義的字符類.[:upper:]可以匹配大寫字符.所以我們要指找大寫字符也可以這樣的來寫:[[:upper:]].我們可以使用字符類來寫出所有的字符:
[[:upper:][:lower:]].
在Vim中還有許多不同的字符類定義
我們還可以通過表達來指出一個字符重複的次數.這個的一般格式如下:
\\{minimum,maximum}
例如表達式a\\{3,5}可以匹配3到5個a.在默認的情況下Vim將會儘可能多的進行匹配.所以表達a\\{3,5}最多可以匹配到5個a.
在這個命令格式中最小次數可以省略,Vim默認的情況下最小次數爲0.所以表達式a\\{,5}可以匹配0到5個a.最大次數也可以省略,在這種情況下Vim默認匹配無窮大.所以表達式a\\{3,}最少可以匹配3個a,最多是儘可能的多.
如果我們只指定一個數字,那麼Vim就會精確的匹配相應的次數.例如a\\{5}只會精確的匹配5次.
如果我們在數字前加了一個負號(-),那麼Vim在查找時就會儘可能少的進行匹配.
例如a\\{-3,5}匹配3到5個a,但是會儘可能少的進行匹配.事實上這個表達式僅會匹配3個a,哪怕是我們的文件中用aaaaa,Vim也只會儘可能少的進行匹配.
表達式a\\{-3,}匹配三個或是更多個a,並且儘可以少地的進行匹配.而表達式a\\{-,5}可以匹配0到五個字符.表達式a\\{-}可以匹配0到無窮大個字符.在通常情況下這個表達式匹配0個符,除非在他的後面還有字符或是表達式.例如[a-z]\\{-}x將會匹配.cxcx中的cx.而表達式[a-z]*x將會匹配整個cxcx.最後表達式a\\{-5}將會精確的匹配5個字符.
我們還可以使用運算符\\(和\\)定義一個組.例如表達式a*b可以匹配b,ab,aab,aaab等等.而表達式a\\(XY\\)*b可以匹配ab,aXYb,aXYXYb,aXYXYXYb等等.
我們還可以用或運算運符\\|來查找兩個或是多個可能的匹配.例如通用表達式foo\\|bar可以查找foo或是bar.
現在我們知道了這樣多的表達式的表示方法,那麼我們如何來應用他們呢?例如我們現在要查的內容爲1MGU103.這個字符串是由1個數字,3個大寫字符,3個數字組成的.可以有幾種方法來表示:
一是先表示前面的一個數字:[0-9],然後加入大寫字符後就成爲了:[0-9][A-Z].因爲有三個大寫字符我們可以加入精確匹配的數字:[0-9][A-Z]\\{3}.最後我們再加入最後面的三個數字.所以最後的結果就成了:[0-9][A-Z]\\{3}[0-9]\\{3}
另一種利用\\d指任何的數字,而\\u指任何的大寫字符.所以用這樣的方法寫成的表達示就爲:
\\d\\u\\{3}\\d{3}.
從這裏我們可以看到用這樣的方式來查找要比第一種方法快得多.如果我們編輯的文件在採用這兩種方法進行查找時會看出差別,那麼我們的文件也許就是太大了.
我們還可以用這樣的表達示:\\d\\u\\u\\u\\d\\d\\d,這個也可以找到我們想要的內容.
最後我們還可以用字符類來寫出我們的表達式:
[[:digit:]][[:upper:]]\\{3}[[:digit:]]\\{3}
這四種方法都可以很好的來完成我們的工作,我們只要記住一種我們容易記住的就可以了.畢竟我們可以記住的簡單的方法要比我們不能記住的精妙的方法快得多啊.
到現在我們所有的討論和方法都是在認爲我們已經打開magic選項的基礎上來做的.如果這個選項被關閉了,那麼我們在通用表達式中的許多的特殊字符就失去了他們神奇的魔力,我們只有通過字符轉義纔可以正常的來使用.
關閉magic的選項命令爲:
:set nomagic
這時*,.,[,]就都被認爲只是平常的字符了.如果我們還想用*來指0次或是更多次就要用到轉義:\\*.
所以我們應保證magic選項是打開的,這樣我們也纔可以使用Vim強大的搜索能力,而這也正是Vim默認情況下所做的.
一些常用的偏移(Offset)定義:
+[num]        光標置於第一個匹配字符下第num行的開始處.
-[num]        光標置於第一個匹配字符上第num行的開始處.
e        匹配字符串的結尾處.
e[num]
光標置於第一個匹配字符串的結尾處,然後移動num個字符,如果爲正,向右移,爲負,向左移.
b s        第一個匹配字符串的開始處.
b[num]
s[num]
光標置於第一個匹配字符串的開始處,然後移動num個字符,如果爲正,向右移,爲負,向左移.
常用的通用表達式如下:(認爲magic選項打開)
簡單的元素:
x    字符x    
^    一行的開始處
$    一行的結尾處.
.    單一的字符
\\<    查找字符串的開始標記
\\>    查找字符串的結束標記.
範圍運算符:
[abc]        匹配a,b或是c
[^abc]        匹配除abc以處的字符
[a-z]        匹配從a到z的所有小寫字符
[a-zA-Z]    匹配所有字符,包括大小寫.
字符類:
[:alnum:]    匹配所有的字符和數字
[:alpha:]    匹配所有的字符
[:ascii:]    匹配所有的ASCII字符
[:backspace:]    匹配退格符<BS>
[:blank:]    匹配空格和Tab
[:cntrl:]    匹配所有的控制字符
[:digit:]    匹配所有的數字
[:escape:]    匹配Esc
[:graph:]    匹配所打印的字符,不包括空格
[:lower:]    匹配所有的小寫字符
[:print:]    匹配所有的要打印字符,包括空格
[:return:]    匹配所有的行末符號(包括<Enter>,<CR>,<NL>).
[:punct:]    匹配所有的功能符號
[:space:]    匹配所有的空白符
[:tab:]        匹配Tab
[:upper:]    匹配所有的大寫字符
[:xdigit:]    匹配十六進制數字.
類型:
\\(pattern\\)    標記一個類型以後使用
\\1        與第一個在\\(\\)中的子表達式匹配的字符串匹配相同的字符串
例如表達式\\([a-z]\\)\\1可以匹配aa,bb或是類似的.
\\2        與\\1相類似,但是是使用第二個子表達式
\\9        與\\1相類似,但是是使用第九個子表達式
特殊字符:
\\a    大小寫字母字符
\\A    除了a-zA-Z以外的字母字符
\\b    <BS>
\\d    數字字符
\\D    非數字字符
\\e    <ESC>
\\f    由isfname選項定義的文件名字符
\\F    文件名字符,但是不包含數字
\\h    單詞的頭字符(A-Za-z)
\\H    不是單詞的頭字符(A-Za-z)
\\i    由isdent選項定義的字符
\\I    定義的字符,但是不包括數字
\\k    由iskeyword選項定義的關鍵字字符
\\K    關鍵字字符,但是不包括數字
\\l    小字字符(a-z)
\\L    非小寫字符(除了a-z以外的字符)
\\o    八進制數字
\\O    非八進制數字
\\p    由isprint選項定義的可打印字符
\\P    可打印字符,但是不包括數字
\\r    <CR>
\\s    空白符<Space>和<Tab>
\\S    非空白符
\\t    <Tab>
\\u    大寫字母字符(A-Z)
\\U    非大寫字母字符
\\w    單詞字符(0-9A-Za-z)
\\W    非單詞字符
\\x    十六進制數字
\\X    非十六進制數字
\\~    匹配最後指定的字符串
修飾符:
*    匹配0次或是多次,儘可能多的匹配
\\+    匹配1次或是多次,儘可能多的匹配
\\=    匹配0次或是1次
\\{}    匹配0次或是多次
\\{n}
\\{-n}    匹配n次
\\{n,m}    匹配n次到m次
\\{n,}    匹配n次到多次
\\{,m}    匹配0次到m次
\\{-n,m}    匹配n次到m次,儘可能少的進行匹配
\\{-n,}    至少匹配n次,儘可能少的進行匹配
\\{-,m}    匹配到m次,儘可能少的進行匹配
\\{-}    匹配0次到多次,儘可能少的進行匹配
str1\\|str2    匹配str1或是str2
vi編輯器的學習使用(二十) 
Vim編輯器有不同的方法來處理各類事物.我們在Vim編輯器的學習使用(四)已經討論過文本塊和多文件的處理方法.有了這些命令,我們就可以很好的來完成我們的工作.在這一次的學習中我們會討論一些更多的內容.從而使得我們的Vim編輯工作來得更完美一些.
當我們插入文本行的時候可以使用p命令或是P命令.所不同的是p命令是在當前行的下一行進行插入,插入後光標移動到新行的開頭處,而P命令是在當前的上一行進行插入,插入後光標移到新行的下一行的開頭處.而我們還可以使用gp或是gP命令.不同的是gp命令是將光標移動到新行的結尾處,也就是新行的下一行的開頭處.gP命令與此相類似,是在當前的上一行進行插入,插入後,光標移動新行的結尾處,也就是下一行的開頭處.
在Vim編輯器中還有一些特殊的標記符,如單引號\'是指光標上一次的位置,但是這個位置不包括由方向鍵移動的位置.其他的一些特殊的標記包括:
]    上一次插入的文本的開頭
[    上一次插入的文本的結尾
\"    當我們離開文件時光標所處的位置
(注:這個地方看書是這樣寫的,但是自己做時卻只可以是\',[,],而且是要按兩次鍵才行,不解:().
到現在爲止我們所做的所有的複製和刪除文本時我們並沒有指明我們要使用哪一個寄存器.如果我們沒有指明要用哪一個寄存器,Vim就會使用默認的沒有命名的寄存器.用來指明這個寄存器的標記符是兩個雙引號(\"\").在這裏前一個雙引號用來指示一個寄存器,而後一個雙引號則是這個寄存器的名字.這樣\"a就是指我們使用a寄存器.
我們可以在我們的複製文本或是刪除文本這前來指明我們的所複製或是刪除的文本要放在哪一個寄存器中,指明寄存器的命令格式如下:
\"register
在這裏register是一個小寫字母,是我們所指定的寄存器的名字,這樣我們就可以有26個寄存器可以使用.
在通常的情況下我們使用yy所複製的文本是被放在沒有命名的那個寄存器中,我們可以使用命令\"ayy將我們所複製的文本放在指定的寄存器中.當然如果我們使用這樣的命令,我們所複製的文本也會被放入未命名的寄存中的.
如果我們想知道寄存中都包含有哪些內容,我們可以使用下面的命令:
:registers
一般我們複製或是粘貼的文本會被入以字母命名的寄存器中,當然我們也可以使用一些特殊的寄存器.
我們可以通過給命令:registers一個參數,我們可以來查看特定寄存器中的內容,例如我們可以用下面的命令來查看寄存器a和x中的內容:
:registers ax
當我們使用命令\"ayy我們是將當前文本行的內容放入寄存器中,而當我們再使用相應的大寫字母來指定寄存器時,如\"Ayy我們是將當前行內容追加到寄存器\"a中,這時候在這個寄存器中就存兩行文本,在寄存器中^J是指一行的結束.
在Vim中還有一些特殊的寄存器,第一個就是我們已經知道的未命名寄存器,他的名字是一個雙引號\".其他的還有1到9寄存器,寄存器1中含有我們上一次刪除的文本,依次類推.
在古老時代的Vi中,Vi只可以撤銷三次.如果我們將dd命令執行了三次,也許我們就沒有太多的好運來使用u命令將我們刪掉的文本再恢復過來.但是幸運的是這三個文本被分別存放在寄存器1,2,3中.我們可以通過命令\"1P,\"2P,\"3P將這些文本再粘貼回來,或者是我們可以使用下面的命令來達到同樣的結果:
\"\"P..
其他的一些特殊的寄存器:
寄存器        描述            可複寫
0        上一次複製的文本    是    
-        上一次刪除的文本    否
.        上一次插入的文本    否
%        當前文件的名字        否
#        交替文件的名字        否
/        上一次查找的字符串    否
:        上一次\":\"命令        否
_        黑洞(black hole)    是
=        表達式            否
*        由鼠標選中的文本    是
黑洞寄存器(_)(The Black Hole Register)
黑洞寄存器是一個特殊的寄存器,我們放入其中的任何文本都不復存在.當然我們也可以使用p命令來粘貼這個寄存器中的文本,但是這樣做是沒有意義的,因爲在這個寄存器中根本就不存在任何內容.這樣的寄存器也有着相當重要的作用.如果我們想永久刪除某一文本而不是將他放入1-9中某個寄存中,我們可以使用這個寄存器.例如命令dd刪除一行文本並將這一行文本存在寄存器1中,而我們用命令\"_dd則是將這行文本放入黑洞寄存器中,這些文本也就會永久地消失了,而寄存器1中的文本會保持不變.
表達式寄存器(=)(The Expression Register)
我們可以使用表達式寄存器來在文本中輸入表達式.當我們輸入表達式寄存器開始的命令時,就會在Vim的下部顯示一個提示行,這就是給我們一個機會,我們就可以在這裏來輸入我們的表達式了.然後我們可以使用命令p將表達式的結果粘貼到文本.
例如我們要在文本中插入38*56的值,我們可以這樣來做:
進入命令模式,輸入表達式寄存器開始的命令\"=,這時就會在Vim的下端顯示出=來等待我們的輸入,我們可以輸入38*56,回車,然後輸入命令p,這樣就可以將我們的計算結果插入文本中了.
在表達式寄存器中我們不僅可以使用通常的算術運算符,還可以使用Vim特定的函數和運算符.如果我們不僅僅是用常用的算術運算符來完成我們的工作,也許我們就需要來查閱表達式文檔了.例如我們可以通過表達式寄存器來得到環境變量的值.如果我們輸入\"=$HOME我們就可以得到HOME變量的值了.
剪切板寄存器(*)(The Clipboard Register)
剪切板寄存器可以使得我們通過系統的剪切板來讀寫數據.如果是在UNIX系統上,這個要在圖形界面下使用.這樣我們就可以通過剪切板寄存器來在不同的Vim編輯器或者是其他的程序包之間進行文本的剪切和複製.
我們在UNIX或是Linux系統中可以使用Vim編輯器和grep命令處理包含某一個指定詞的所有文件.這對於我們有着極大有用處,因爲我們可以用這個組合來查看或是處理包含某一個變量的程序文件.例如現在我們要編輯包含有變量frame_counter的C程序文件.這時我們就可以使用下面的命令:
$ vim `grep -l \'frame_counter\' *.c`
(注:在這裏最外面的是反外號,即數字鍵1旁邊的,而裏面的是單引號)
在這個命令中,grep命令在一系列文件查找包含有指定單詞的文件.在這裏我們指定-l選項,這樣這個命令就會列出包含有這個單詞的文件,而不會打印找到的字符串.在這裏我們要查找的字符串frame_counter,我們可以使用這個命令來查找其他的字符串或是表達式.而整個的命令由反引號包括起來.這就可以告訴UNIX Shell來運行這個命令,並假定認爲這個命令的執行已由命令打印輸出.所以這個命令的執行結果就是運行grep命令併產生一個文件的列表,這些文件名放在Vim的命令行中,這樣Vim就可以來編輯這些文件了.
也許有的人會說爲什麼要在這裏展現這個命令呢?這是UNIX Shell的特徵而不是Vim作品的一部分.而這正是使得Vim更加完美.
我們可以用下面的命令來設置參數列表:
:arg `grep -l \'frame_counter\' *.c`
在這個參數列表中我們可以用命令來指定我們想要編輯的文件,例如如果我們要編輯第三個文件我們可以用下面的命令:
:argument 3
這個命令可以使得我們用文件在參數列表中的位置來編輯這個文件.如果我們是用下面的命令來啓動Vim的:
$ gvim one.c two.c three.c four.c five.c
這時如果我們要編輯第四個文件我們可以用下面的命令:
:argument 4
當我們在命令行中用命令來指定一系列文件時,我們完成文件列表的初始化工作.但是我們可以用命令:args來指定新的文件列表.例如下面的命令:
:args alpha.c beta.c gamma.c
執行完畢這個命令以後我們開始編輯文件alpha.c,然後是文件beta.c.
有時我們在編輯文件時希望文件在打開後光標能定位我們希望在的行,這我們該如何來做到呢?例如我們要第12行開始編輯文件,我們可以用命令打開這個文件,然後執行命令12G來使得光標到指定的行.我們也可以在vim啓動時在命令後面加上行號來指明光標要到的地方.如下面的命令:
$ gvim +12 file.c
我們還可以用這樣的命令形式+/string來使得文件在裝入以後光標放在指定的字符串.例如我們希望文件在打開後光標放在第一個包含字符#include處,我們可以用下面這樣的命令:
$ gvim +/#include file.c
當然我們可以在+後面放上任何命令模式的命令.
我們可以用多種多樣的命令來指明+cmd的參數.通常:vi命令格式如下:
:vi [+cmd] {file}
下面的這些命令也可以帶上+cmd的形式:
:next [+cmd]
:wnext [+cmd]
:previous[+cmd]
:wprevious [+cmd]
:Next[+cmd]
:wNext[+cmd]
:rewind[+cmd]
:last[+cmd]
標記符a-z只是當前文件的標記.換句話說,我們可以在一個文件標記a,也可以在另外一個文件中標記a.如果我們執行命令\'a我們就可以跳轉到當前文件中的a標記處.而大寫字母(A-Z)的標記符則就不一樣了.他不僅標記了當前文件中的某一行而且也標記當前文件.例如我們正在編輯文件one.c而且在其中用A做了一處標記.然後當我們在編輯文件two.c時我們就可以執行命令\'A,這樣就可以跳轉到one.c文件中的標記處
當我們用插入模式進入文本時我們也可以執行種不同的命令.例如<BS><BackSpace>可以清除光標前面的字符,而CTRL-U會清除整個一行或者至少是你剛輸入的內容,CTRL-W會清除光標前面的字符.當我們在插入模式時我們也可以來移動光標,這時我們不可以再用傳統的h,j,k,l,但是這時我們可以使用小方向鍵來移動光標.<HOME>可以移動到一行的開頭,<END>可以移動到一行結尾.<PageUp>可以向上翻屏,<PageDown>可以向下翻屏.
在插入模式下如果我們輸入CTRL-A,Vim編輯器就會插入我們上一次在Vim插入狀態時所輸入的文本.例如如果我們在文件中一行裏輸入#include,然後我們用命令j向下移動一行並插入新的一行,這時如果我們想輸入#include,可以用命令CTRL-A來完成.CTRL-@命令與其相類似,所不同的只是在執行完這個命令後會退出插入模式.我們還可以用命令CTRL-V來引用下一個字符,換句話說任何有着特殊意義的字符他都將被忽略掉.例如如果我們輸入CTRL-V<Esc>會在文本中插入空白符.我們也可以用命令CTRL-Vdigits來插入這個數字所指的字符,例如如果我們輸入CTRL-V64就會在文本中插入@.在默認的情況下CTRL-V是使用十進制的數字,但是我們也可以插入十六進制的數字.
CTRL-Y命令可以輸入光標上面的字會,當我們想要重複上一行時這個命令就會顯得尤爲有用.
與CTRL-Y命令相似的是CTRL-E命令,不同的是這個命令可能重複光標下面的字符.
命令CTRL-Rregister可以使得我們寄存器中的內容插入文本中.如果寄存器的內容含有類似於<BS>這樣的特殊字符時,這些特殊會被重樣解釋,就像我們從鍵盤中輸入這些字符一樣.如果我們想這樣,只是想着將這些字符作爲普通字符業對待,我們可以用這樣的命令:CTRL-R
CTRL-R register
例如我們輸入下面的文本:
This is a test.
然後我們用命令\"ayy將這些文本複製到寄存器a中,完成以後我們進入插入模式,輸入命令CTRL-Ra,我們就會剛纔我們複製的內容就會出現在文本行了.
如果我們不希望特殊字符被重新解釋我們可以用命令CTRL-R CTRL-R register.
命令CTRL-\\CTRL-N可以離開插入模式而回到正常模式下.換句話這個命令與<ESC>相類似,但這個命令可以在任何模式下使用,就這一點而似乎是要比<ESC>命令強大一些啊.
最後要介紹的就是CTRL-O命令,這個命令可以回到命令模式執行Vim命令在執行完以後又回到了插入模式.例如我們執行命令CTRL-Odw,Vim就會回到命令模式執行命令dw,在執行完畢後又回到了插入模式.
我們在使用全局標記時遇到的一個問題就是當我們退出Vim以後我們所設定的那些全局變量就不在存在.而我們希望能將這些保存下來.文件viminfo就是設計成爲一個用保存標記信息以及下面的一些信息的文件:
命令行歷史
查找歷史
輸入歷史
寄存器
標記
緩衝區列表
全局變量 
保存某一項的辦法是我們要打開這個保存的選項,我們可以下面的命令來做到:
:set viminfo=string
這裏的string表明了我們要保存的內容.
這裏的string的語法是一個選項字符跟上一個參數.中間用逗號來分隔.首先\'option用來表明我們要爲少文件保存局部標記,我們可以選一個合適的數字,例如我們要選1000,那麼這時的命令形式如下:
:set viminfo-\'1000
而f選項則用來控制是否要保存全局標記.如果這個選項的值爲0,則不保存,如果值爲1或是我們沒有指明f選項,那麼vim都會保存這些全局標記.如果我們要用這一特徵,我們可以用下面的命令:
:set viminfo=\'1000,f1
選項r會告訴Vim一些關於可移動介質的情況.在Vim中爲可移動介質上的文件所做標記是不會被保存的,原因就是我們在Vim中要跳轉到軟盤文件的標記處是一個很難的操作.我們多次來表明r選項.如果我們在Windows系統上就可以用下面的命令來告訴Vim磁盤A和B是可移動介質:
:set viminfo=\'1000,f1,rA:,rB:
在UNIX系統並沒有標準的軟盤名稱.在一般的情況下我們總是將軟盤掛載在/mnt/floppy文件下,所以我們可以用下面的命令:
:set viminfo=\'1000,f1,r/mnt/floppy
\\\"選項用來控制每一個寄存器可以保存多少行.在默認的情況下,所有的行都會被保存.如果是0就不會保存.一般情況默認的設置已經可以很好的來滿足我們的要求了,所以我們可以不必加入我們自己的設置.
:選項可以用來控制:歷史行的記錄.我想100應是可以滿足我們的要求了吧:-):
:set viminfo=\'1000,f1,r/mnt/floppy,:100
/選項可以用來定義查找歷史記錄的大小,100也已是很充足的了:
:set viminfo=\'1000,f1,r/mnt/floppy,:100,/100
(注:Vim不會保存那些超過他的記錄能力的內容,這是在選項history中設置的)
通常,當我們啓動Vim以後如果我們已經設置了hlsearch選項,編輯器就會高亮顯示上一次查找的內容.要關閉這個選項,我們可以viminfo的選項列表中加入h標記,或者是我們在Vim啓動後執行命令:nohlsearch來關閉這個選項.
@選項用來控制輸入歷史記錄的行數.輸入歷史會記住我們輸入的所有內容.
如果我們設置了%選項,我們就可以保存緩衝區列表記錄.如果我們沒有在命令行指定一個文件來編輯,緩衝區列表就會被重新保存:
:set viminfo=\'1000,f1,r/mnt/floppy,:100,/100,%
!選項用保存全局變量,這些全局是名字全部爲大寫字母的變量:
:set viminfo=\'1000,f1,r/mnt/floppy,:100,/100,%,!
最後n選項用來指明viminfo的文件名.在UNIX系統中默認的爲$HOME/.viminfo
我們可以將這些命令以及一些其他的初始化命令放在初始文件vimrc中.這樣viminfo文件就會在Vim退出時自動保存,啓動時來讀取初始化.
如果我們要更清楚一些的來保存和讀取這個文件,我們可以用下面的命令來以另外的文件名保存:
:wviminfo[file]
這樣我們的這一些設置信息就會被寫入這個文件中了.
我們可以用下面的命令來讀取這個文件:
:rviminfo [file]
這樣就會從這個文件中讀入設置信息.如果這些信息與當前的設置有衝突,那麼我們的這些設置信息就不再起作用了.我們可以用下面的命令來強制這些設置信息起作用:
:rviminfo![file]
有時我們會編輯一些文件中一行的寬度要超過屏幕的寬度.當行寬超過屏幕的寬度會發生什麼事情呢?這時vim會將這一行進行回折以適應屏幕的寬度.如果我們設置了nowrap選項,則Vim會用單行來處理文件的第一行文本.這時超出屏幕的部分就會不再出現,從而從屏幕消失.
在默認的情況下,Vim並不會顯示水平滾動條,我們可以用下面的命令來使得Gvim顯示小平滾動條:
:set guioptions+=b
這樣Gvim就可以水平滾動了.
當我們設置了nowrap選項後,命令^將光標移動當前行的第一個非空字符處.g^命令可以將光標移動到當前屏幕的第一個非空字符處.在執行這們執行這樣的命令時如果在窗口的其他部分有文本,那麼這一部分的文本將會被忽略.類似的一些命令如下:
命令     命令      含義
^        g^        向左移動當前屏幕的第一個非空字符處
<Home>        g<Home>
0        g0        向左移動當前屏幕的第一個字符處
<End>        g<End>
$        g$        向右移動當前屏幕的結尾處
        gm        移動到屏幕的中間
命令count|可將光標移動屏幕中指定的列.
命令countzh可以向左移動屏幕,移動的量度爲count個字符.而命令countzl與其相類似,只是這個命令是向右移動屏幕.
命令zH可以向左移動個屏幕,而命令zL可以向右移到半個屏幕.命令j或是<Down>可以下移一行.在這裏我們要知道的就是如果我們設置了wrap選項,那麼下移一行在屏幕上顯示也許就會是幾行,這時我們要清楚,此時的幾行正是設置了nowrap時的一行.
當我們設置了wrap選項,一個很長的一行Vim就會折成幾行顯示在屏幕上,這時我們可以用命令gj或是g<Down>來下移屏幕屏幕中顯示的一行,這時也許我們移動的並非是真正的一行.而命令gk或是g<Up>命令與其相類似.
在默認的情況下,Vim編輯時會折回很長的一行,這時他首先是儘可能多的在屏幕的第一行放置文本,如果這一行的文本超出了屏幕的範圍,Vim就會將其打斷,然後在屏幕中的下一行顯示其餘的部分.我們也可以通過下面的命令來並閉這個選項:
:set nowrap
這時一個很長的句子超出屏幕的部分就在從屏幕上消失.我們可以通過沿着這個句子來移動光標,這樣屏幕就會進行水平滾動,我們就可以看到這一行的其餘部分了.
當然了我們也可以來自定義我們自己的句子回折形式:
首先我們可以告訴Vim在合適的地方來打斷一個句子.我們可以用下面的命令來實現:
:set linebreak
那麼又如何來定義一個合適的地方呢?這個是由breakat選項中的字符來確定的.在默認的情況下這些默認的字符是^I!@*-+_;:,./?如果我們不希望在下劃線_處打斷句子,我們可以用下面的命令來將_從這個列表移除就可以了:
:set breakat-=_
在通常的情況下,如果一個句子被打斷Vim是不會在句子的連接的地方顯示任何內容的.我們可以通過設置showbreak選項來顯示我們所希望顯示的內容信息:
:set showbreak=\"->\"
我們最後要討論的一個問題就當我們要在屏幕的結尾處打斷一個句子我們應如何來做呢?這時我們可以用兩個選擇:一是我們可以不顯示半行.這時Vim編輯器會在屏幕的底部來顯示@以表時這是一個長句子,我們不能把他全部放在屏幕內.二是我們可以顯示半行.
Vim默認的是採用第一種方法.如果我們要採用第二種方法我們可以用下面的命令來實現:
:set display=lastline


vi編輯器的學習使用(二十一)
我們在Vim編輯器的學習使用(五)中曾結討論了一些基本的窗口使用命令.這些命令可以使得我們在不同的窗口內進行編輯工作,從而使得我們編輯多個文件成爲可能.而在這裏我們將會討論一些更多的與窗口相關的命令操作.
當我們使用多個窗口進行文件編輯時,我們如何來進行窗口的切換操作呢?我們可以使用命令CTRL-Wj回到下一個窗口,而使用命令CTRL-Wk回到上一個窗口.我們還可以使用下面的命令來進行窗口的切換操作:
CTRL-Wt        切換到頂部的窗口
CTRL-Wb        切換到底部的窗口
CTRL-Wp        切換到我們進行切換操作以前我們所在的窗口
countCTRL-Ww    向下切換一個窗口.如果是在底部,則進行迴環.如果指明瞭數字,則切換到        數字所指定的窗口.
countCTRL-WW    向下切換一個窗口,如果是在頂部,則進行迴環,如果指蝗了數字,則切換到        數字所指定的窗口
我們在使用多個窗口進行文本編輯的時候,我們還可以進行窗口的移動,命令CTRL-Wr命令可以使得窗口向下進行循環移動.這個命令可以帶一個數字作爲參數,可以指明向下循環移動所執行的次數.與其相類似的命令是CTRL-WR命令,這個命令可以使得窗口向上循環移動.
命令CTRL-Wx可以使得我們將當前窗口與下一個窗口進行位置的對換.如果當前是一個底部,則沒有下一個窗口,這時執行這個命令時是將當前窗口與上一個窗口進行位置對換.
當我們在用多窗口進行多文件的編輯時我們可以用命令對這些文件進行共同的操作.:write命令可以保存當前文件.我們可以用下面的命令來實現對所有已經修改過的文件,包括隱藏緩衝區中的文件,進行保存操作:
:wall
命令:quit可以退出當前文件.如果這是一個文件的最後一個窗口,那麼這個文件將會被關閉.如果我們同時打開了多個窗口進文本的編輯,我們可以用下面的命令來退出所有的文件:
:qall
如果在這些文件中有文件進行了修改但是沒有保存,在執行這個命令時會給出警告信息,這樣我們就可以保存那些我們沒有保存的修改了,但是如果我們想要放棄我們所做修改工作而強行退出我們可以用下面的命令:
:qall!
我們還可以將這個兩個命令進行組合來實現對所有文件的保存退出的命令:
:wqall
命令CTRL-Wo可以使得當前窗口成爲屏幕上的唯一的一個窗口,而其他的窗口全部關閉.系統會認爲我們在其他的每一個窗口中都執行了命令:quit.
如果我們通過命令:args file-list指定了一個文件列表或是在啓動vim時指定了一個文件列表,那麼:all命令就會爲每一個文件打開一個窗口,這樣我們就可以進行多文件的編輯工作了.
下面的命令由命令:all變化而來的,這個命令可以每一個隱藏的緩衝區打開一個窗口:
:unhide
這個命令還可以帶一個參數,用來指明一次打開的窗口數.例如如果我們要打開所有的緩衝區但是在屏幕上顯示不超過5個窗口,我們可以用下面的命令:
:unhide 5
我們還可以用CTRL-W CTRL-^命令來分裂窗口來編輯交替文件.這個命令是新打開一窗口,並在這個窗口中裝入交替文本並進編輯.而命令CTRL-^則是通過切換窗口來編輯交替文件.
命令CTRL-W CTRL-I會分裂當前窗口,然在查找當前光標下的單詞第一次出現的地方.這樣的查找不不僅是在當前文件中查找,也會在由#include所包含進來的文件中進行查找.
在Vim中還有許多縮寫的命令可以來快的完成工作,如下面的一些命令:
:countsnext        :split與:countnext的組合
:countsprevious        :split與:countprevious的組合
:countsNext        :split與:countNext的組合
:srewind        :split與:rewind的組合
:slast            :split與:last的組合
:sargument        :split與:argument的組合
CTRL-WCTRL-D        :split與]CTRL-D的組合
CTRL-Wf            :split與:find的組合
CTRL-Wg]        :split與CTRL-]的組合
在這些命令一個算是優點的地方就是如果命令執行失敗那麼是不會打開一個新的窗口的.
我們在用Vim編輯器進行文件編輯的時候可以用不同的緩衝區裝入不同的文件,我們可以在啓動Vim時指定要編輯的文件列表,我們也可以在編輯的過程中用下面的命令新增一個緩衝區:
:badd filename
這樣這個指定的文件就會被加到緩衝區的列表中.這個文件的編輯過程只有我們切換到那個緩衝區時纔會開始.這個命令還可以帶參數,來指明當我們爲這個緩衝區打開窗口時,光標所處的位置:
:badd +lnum filename
我們可以用下面的命令來刪除一個緩衝區:
:bdelete filename
或者是也可以用下面的命令:
:bdelete 3
:3 bdelete
我們還可以用下面的命令來刪除指定範圍的緩衝區:
:1,3 bdelete
如果我們使用了!選項,那麼我們在緩衝區所有的所有的改動都會被放棄:
:bdelete! filename
命令:bunload會卸載一個緩衝區,這樣這個緩衝區就會從內存中卸載,所有爲這個緩衝區打開的窗口也會關閉.但是這個文件名文件名仍然會存在於這個緩衝區列表中.:bunload命令與:bdelete命令的用法相類似.
我們可以用下面的命令來爲每一個緩衝區打開一個窗口:
:ball
我們可以用laststatus選項來控制最後一個窗口是否顯示狀態行,這個選項的值如下:
0     最後一個窗口從不顯示狀態行
1
如果在屏幕上只有一個窗口,那麼不顯示狀態行.如果有兩個或更多個,則要在最後一個窗口顯示狀態行.
2    在窗口上總是顯示狀態行,哪怕屏幕中只有一個窗口.
我們可以用winheight選項來控制一個窗口最小的行數.但是這個並沒有一個硬性的限制,如果窗口顯得太擁擠了,Vim會減少窗口的尺寸.
當我們打開equalalways選項後,Vim會以相同的尺寸來分裂窗口,而這也正是Vim編輯器默認的情況,但是如果我們設置了noeqaulalways選項後我們就可以用不同的尺寸來分裂一個窗口.
winheight選項用來控制當前窗口的最小高度.而winminheight選項則用來控制其他窗口顯示的高度.
在通常的情況下,:split命令是在當前窗口的上方打開一個新窗口.而splitbelow選項可以使得Vim在當前窗口的下方打開一新窗口.
假如我們正在編輯一個很長的文件,而現在天已經晚了,我們想着退出工作並在第二天接着做.這時我們可以將我們正在編輯的文件信息存成一個文件,在我們要第二天要接着編輯這個文件時只要讀入這個文件就可以了.這樣的一個文件包含了所有我們正在編輯的文件信息,例如文件列表,窗口,標記,寄存器以及其他的一些信息等等.
我們可以用下面的命令來產生一個程序文件:
:mksession filename
例如我們存儲的文件是:
:mksession vimbook.vim
如果我們要接着工作,想要裝入這個程序文件時只要用下面的命令:
:source vimbook.vim
我們也可以在啓動Vim時指明要讀入的程序信息文件:
$ vim -c \":source vimbook.vim\"
我們可以使用sessionoption選項來控制我們在這樣的文件存入什麼樣的內容.他是由逗號分開的一系列的關鍵的字符串組成的.例如默認的設置是這樣的:
:set sessionoptions=buffers,winsize,options,help,blank
可能的關鍵字的值如下:
buffers        保存所有的緩衝區.包括在屏幕上顯示的以及隱藏的和卸載的緩衝區.
globals        保存全局變量.這些全局變量是由大寫和至少一個小寫字母組成的.
help        幫助窗口
blank        屏幕上的空窗口
options        所有的選項和鍵盤映射
winpos        GUI窗口的位置
resize        屏幕的尺寸
winsize        窗口的尺寸
slash        在文件名中用斜線來代替空格.
unix        用UNIX的行結尾格式來保存程序信息文件.\n\r\nvi編輯器的學習使用(二十二) 
我們在Vi編輯器的學習使用(六)學習了基本的可視化模式,這時我們可以執行簡單的可視化命令.在這裏我們將會討論更多的與可視化相關的命令.這些命令中的許多隻有很少的觀衆,如果我們可以看這一次的學習,也許這很少的觀衆中就會包括我們.
我們在Vi編輯器的學習使用(四)知道了如何來用寄存器實現複製,粘貼和刪除的工作.我們也可以在可視化模式中來實現這些操作.例如要刪除一個文本我們可以這樣的來做:在可視化模式中高亮顯示這些文本,然後執行d命令.如果要將這些文本刪除後放入寄存器中,我們可以用下面的命令來實現:\"register d.要複製文本到寄存器中我們可以使用y命令.而D和Y命令與其相對應的小寫字母的命令相類似,只是他們作用在一整行,而d和y命令是作用於高亮顯示的部分.
在塊可視化模式中,$命令可以使得選中的文本擴展到所有的選中行的結尾處.當我們上下移動光標時,可以使得選中的文本擴展到這一行的結尾處.如果新行要比當前行長得多,這樣的擴展也是會發生的.
gv命令可以重複前一次可視化模式時選中的文本.如果我們已經在可視化模式狀態下,執行這個命令時會選中前一次選中的文本.如果我們重複執gv命令,就會在當前選中的文本和前一次選中的文本之間進行切換.
在Vim編輯器的可視化模式下的許多命令都是用來幫助我們高亮顯示我們想要的文本的.例如命令aw高亮顯示下一個單詞.事實他不僅高亮顯示這個單詞,而且也包括這個單詞後的空格.在一開始也許我們會認爲這個命令沒有太大的用處.因爲w命令可以向前移動一個單詞,我們爲什麼不用這個命令呢?
這是因爲當我們執行選擇文本的操作時,選中的是從老的光標所在處到新的光標所在處之間的文本.當我們使用命令w來移動文本時,結果是光標置於下一個單詞的第一個字符上.如果這時我們要執行刪除操作,我們命令的執行是不僅刪掉了我們要刪掉的單詞,也同時刪除了下一個單詞的第一個字符.
而aw命令是將光標放在下一個單詞的第一個字符的前面.換句話說,我們選中的是下一個單詞前面的單詞以及空格,而不是選中的下一個單詞.
而另外一個使用aw命令而不使用w命令的原因就是不論光標置於一個單詞的哪一個字符上,aw命令都可以選中整個單詞,而w命令只是選中當前光標處和這個單詞結尾之間的字符.
如果我們僅僅是想選中一個單詞我們可以使用iw命令.
我們還可以使用下面的命令來選擇文本:
countaw        選中一個單詞以及其後的空格.
countiw        僅僅是選中一個單詞.
countaW        選中一個WORD以及其後的空格.
countiW        僅僅是選中一個WORD
countas        選中一個句子以及其後的空格.
countis        僅僅選中一個句子.
countap        選中一個段落以及後面的空格.
countip        僅僅是選中一個段落.
counta(        在括號所包括的文本內,選擇直到括號的文本幷包括括號.
counti(        與上面的命令相類似,只是不包括括號.
counta<        選擇<>內的文本,包括<>
counti<        選擇<>內的文本,不包括<>
counta[        選擇[]內的文本,包括[]
counti[        選擇[]內的文本,不包括[]
counta{        選擇{}內的文本,包括{}
counti{        選擇{}內的文本,不包括{}
在可視化模式下,當我們選中一些文本以後,我們可以用命令o來使用光標移動選中的文本的另一個結尾處.然後我們可能再次執行o命令,來使得光標移動選中文本的另一個結尾處,也就我們來的地方.
而O命令可以在塊可視化模式下將光標移動選中文本的另一角.換句話說,O命令是將光標移動選中文本中的同一行的結尾處.
在可視化模式下選中的文本,我們可以用命令~來實現大小寫的轉換.而U命令是使得選中的文本變成大寫的形式,而u命令是將選中的文本變爲小寫的形式.
我們可以在可視化模式下選中文本,然後用命令J將這些選中的行合併爲一行,並用空格來分隔這些行.如果我們希望在合併以並沒有空格來分隔,我們可以用命令gJ.
我們可以用命令gq來格式化可視化模式下選中的文本.
我們還可以用g?命令來加密高亮顯示的文本,在這個命令中我們採用的是Vim中所採用的rot 13加密算法.如果我們對同一個文本進行兩次加密操作,就相當我們進行了解密操作.
在可視化模式下我們還可以用命令:來對指定的範圍進行命令行操作.例如我們要將文本塊寫入一個文件我們可以這樣的來做:
在可視化模式下選中我們要寫入文件的文本,然後執行下面的命令:
:write block.txt
這樣就可以將指定的文本塊寫入文件了.
命令!是使用外部的命令來對我們所要編輯的文件中的文本進行操作.例如我們可以使用!sort來使用UNIX下的sort程序進行文本的排序.我們可以這樣的來做:
在可視化模式下選中我們要進行操作的文本,然後執行下面的命令:
:!sort
這樣就可以對這些我們選中的文本進行排序操作了.
選擇模式是另一種的可視化模式,他可以允許我們對選中的文本進行的快速的刪除作替換的操作.我們使用選擇模式也是很簡單的操作.我們可以高亮顯示文本,然後用<BS>來刪除這段文本.我們也可以高亮顯示文本,然後用我們所輸入的內容來替換這些文本.
那麼選擇模式和可視化模式相比較又如何呢?在可視化模式下,我們可以高亮顯示我們選中的文本,然後執行命令操作.換句話我們要用命令來結束可視化模式.而在選擇模式下,命令僅限於<BS>(用於操作刪除操作)和可打印的字符(用於替換操作).這樣就會使得我們的操作變得更爲簡單,因爲我們不需要來輸入命令了,然而與可視化模式相比較他也有着太多的限制.
我們可以用下面命令來開始一種選擇模式:
gh        進入字符選擇模式
gH        進入行選擇模式
gCTRL-H        進入塊選擇模式
在選擇模式下移動光標比在正常模式下要顯得困難一些.因爲如果我們輸入任何的可打印字符,Vim就會刪掉我們選中的文本並進插入狀態開始我們的輸入.所以要選擇文本我們只好使用小方向鍵,CTRL以及功能鍵.
如果我們進行了如下的設置我們還可以用鼠標來選擇文本:
:set selectmode=mouse
(注:如果沒有設置這個選項,可以在可視模式下執行鼠標操作而不可以在選擇模式下執行鼠標操作)
在選擇模式下,我們可以用命令<BS>或是CTRL-H來刪除我們選中的文本.如果我們輸入可打印的字符Vim編輯就會刪除我們選中的文本然後進入插入模式.
我們可以用命令CTRL-O來從選擇模式切換到可視化模式.如果我們要可視化模式和選擇模式中進行切換,我們可以使用CTRL-G命令.
在通常情況下,當我們選擇文本後,這些文本仍會保持選中的狀態.有時即使是我們在執行了命令以後,這些文本仍然保持選中的狀態.gV命令可以選得選中的文本在命令執行過後消失選中狀態.這個在我們使用宏時顯得更爲有用.我們用他來一些工作,工作完成以後,我們就希望他能消失.\n\r\nvi編輯器的學習使用(二十三)) 
Vim編輯器由一羣需要一個好的文本編輯器的程序員們所寫出來的.正因爲是這樣,Vim中包含了許多的命令,我們可以用這些命令來自定義並且使我們的程序編輯工作變得更爲簡單.
例如如果我們現在正在編輯我們的程序文件.我們設置了autoindent選項,並且現在正處在第三層次的縮進上.而現在我們要加入一個註釋塊.這是一個很大的註釋塊,我們希望能將這個註釋塊放在文本的第一列.這時我們就需要禁止所有的自動縮進形式.爲了這樣的目的,一種方法是可以輸入幾次CTRL-D命令,或者是使用0CTRL-D命令.
命令0CTRL-D是在插入模式下移除所有的自動縮進的設置,並將光標放在第一列(在這裏我們要注意的,當我們輸入0時,我們所輸入的0會顯示在屏幕上,這時Vim會認爲我們要在文本中插入一個0,然後我們執行命令CTRL-D,這時Vim就會意識到我們要做的是執行命令0CTRL-D,並且這時0會就會從屏幕上消失.
當我們使用0CTRL-D命令以後,光標會回到第一列,而且下一行也是從第一列開始的.
然後如果我們正在輸入一個標籤或是我們要輸入#ifdef時我們只需要一行中的光標移動第一列就可以了.這時我們可以使用命令^CTRL-D.這個命令只會將當前行的光標放在第一列.當我們開始下一行時,這種縮進形式又會自動的執行.
CTRL-T命令與<Tab>命令相類似,只是前者在文本中插入一個縮進,而這個縮進的大小由shiftwidth選項來控制的.如果我們設置了shiftwidth選項的值爲4,我們輸入<Tab>,光標會移動以後第八列處,這是因爲<Tab>縮進的大小是由tabstop選項來控制的,而在默認的情況下這個值爲8.但是如果我們輸入了CTRL-T命令就會將光標移動以後的第四列處.這兩個命令在一行的任何一點都是可以正常工作的.所以我們可以輸入一些文本然後執行CTRL-T命令將其縮進,然後用CTRL-D來取消這樣的縮進形式.
在通常的情況下當我們用命令CTRL-R來插入寄存器中的內容時,這些內容是自動縮進的.如果我們不希望這樣的事情發生,我們可以用CTRL-RCTRL-Orgister命令.或者是如果我們要插入寄存器中的內容,並希望Vim編輯能正確的完成我們的要求我們可以用下面的命令CTRL-R CTRL-P register.這樣的命令在我們的程序文件中進行剪切和複製時顯得尤爲有用,因爲在這時的程序文件中一般是設置了自動縮進選項的,而如果我們剪切或是複製後再粘貼時就會用兩次的縮進操作,而這不是我們所希望的,這時我們就要用這些命令了.
在通常的情況下,命令\"registerp命令是將指定寄存器中的文本插入到緩衝區中,而命令\"register]p命令與此相類似的,所不同的是這個命令在插入時會有自動縮進的設置.而與此相類似的是命令\"register]P與\"registerP.
在計算機產生以前的時代,存在着一個交流的工具被叫作打印機.打印機的一些模塊可以執行tabs.但是很不幸的是這些tab的大小被設置成爲八個空格.而在計算機產後以後,他的第一個終端就是打印機.後來有一些更爲現代的設備代替了打印機,但是古老的八個空格大小的tab被保留了下來,以保持與以前的相兼容.
但是這樣的設計爲我們以後的程序設計工作帶來無盡的麻煩.因爲有研究可以顯示最易讀的程序是四個字符的縮進,而Tab是八個字符的縮進.我們如何來調合這樣的事實.人們想出了許多解決的辦法,如下:
1 在我們輸入代碼時結合使用空格和Tab.如果我們需要12個字符的縮進,我們可以使用一個Tab和四個空格.
2 告訴機器將Tab設爲四個字符的大小,然後在任何的地方使用Tab.
3 放開我們的雙手並且認爲Tab是一個工作的魔鬼,而且我們總是使用空格.
幸運的是Vim編輯器支持以上的三種方法.
如果我們使用空格和Tab的組合,我們可以像正常一樣的進行編輯.在默認的Vim設置情況下就可以很好的來工作.
但是我們可以通過設置softtabstop選項的值的來使我們的工作變得再簡單一些.這個選項告訴Vim編輯使得Tab鍵看上去和感覺上是使用softtabstop選項販值,但是實際上我們是使用Tab和空格的結合在做事情.
例如我們可以用下面的命令來使得以後每一次我們在按下Tab鍵時光標位於以後的第四列處::set softtabstop=4
當我們第一次按下Tab時,Vim會在文本中插入四個空格.當我們第二次按下Tab鍵時,Vim就會去掉剛纔的四個空格,然後在文本中插入一個Tab.也就是說當有八個空格相當於一個Tab時,Vim就會用一個Tab來代替這八個空格.
另一個相關的選項就是smarttab選項.我們可以用下面的合謀來設置這個選項:
:set smarttab
當我們設置了這個選項以後,插入一行開頭的Tab就會被看作是軟Tab.在這種情況下,Tab的大小所使用的值就是shiftwidth選項所設定的值.但是在其他的地方插入的Tab就會像是正常的Tab一樣的.在這裏我們要注意的就是當我們要讓這個選項來正常工作時,一定要使軟Tab關掉(:set softtabstop=0).
精巧縮進(smart indent)是軟Tab和正常Tab的組合.當我們執行下面的命令,Vim編輯器就會區別對待一行開頭的Tab:
:set smarttab
例如如果我們有下面的設置:
:set shiftwidth=4
:set tabstop=8
:set smarttab
在這些設置中我們是設置Tab是八個空格而縮進是四個空格.當我們在一行的開始輸入Tab時,光標就會移動一個縮進的大小,也就是四個空格.當我們輸入兩個Tab時,光標就會移動兩個縮進的大小,也就是八個空格.
下面的內容則顯示出了我們在一行的開始輸入特定的內容時的顯示:
<Tab>            四個空格
<Tab><Tab>        一個Tab
<Tab><Tab><Tab>        一個Tab,四個空格
<Tab><Tab><Tab><Tab>    兩個Tab
但是當我們在一行的其他地方輸入Tab時,就會顯得像正常的一樣.
我們可以用下面的命令來設置一個Tab爲四個空格:
:set tabstop=4
事實上我們可以用這個命令來將Tab設置成任何我們想要的值.
如果我們在我們的文件中含有Tab字符,我們可以通過設置expandtab選項來控制.當我們設置了這個選項,一個Tab鍵就會插入一系列的空格.在這裏我們要知道的就是expandtab選項並不會影響文章中的其他的Tab鍵值.換句說文檔中的Tab值仍然會保持.如果我們要將Tab轉換爲空格,我們可以使用:retab命令.
我們可以使用:retab命令來實現在文章中不同Tab設置之間的轉換.我們可以用這個命令來使得文章中一系列的空格轉換爲Tab,或者是將一個Tab轉換爲一系列的空格.例如現在我們有一個文件使用是四個空格的Tab設置.但是這並不是標準的設置,而我們希望將他轉換爲八個空格的設置.我們希望這兩個文件看起來是一樣的,只是Tab的值不同.我們可以按照下面的方法來做:
:set tabstop=4
:%retab 8
這樣以後我們的文件看起來就像是沒有做過修改一樣的,因爲Vim將空白符與tabstop的新值相匹配.
再比如我們需要一個沒有Tab的文件.首先我們執行命令設置expandtab選項.這樣就會使得我們輸入的新文本中的Tab成爲空格.但是老文本中的Tab依然存在.要將這些Tab轉換爲空格,我們可以用下面的命令:
:%retab
因爲我們沒有指定一個新的Tab值,Vim就會使用現在的tabstop的值.但是因爲我們又設置了expandtab這個選項,所以所有的Tab就會用空格來代替.
在這些Tab設置中存在的問題就是會有不同的人用不同的習慣來使用Vim處理文件.所以說如果我們可以很好的處理三種不同類型的人寫的文件,我們就可能容易的確處理各種不同的Tab設置.這個問題的一個解決辦法就是我們在寫文件的時候在文件的開頭或是文件的結尾下加上一個註釋塊,在其中標出我們所使用的Tab設置.例如:
/*vim:tabstop=8:expandtab:shiftwidth=8*/
當我們知道這些以後我們可以建立我們自己所喜歡的格式.但是Vim是一個精巧的編輯器,他可以理解類似這樣的註釋並且爲我們配置這些設置.但是有一點是要嚴格執行,那就是註釋必須是這種形式的,而且是必須是在一個程序文件的前五行或是後五行纔可以.這種類型的註釋就叫做模式行(modeline).
假如我們設置了shiftwidth的值爲四,而我們在一行的開始輸入了三個空格.那麼當我們執行命令>>時會是什麼樣呢?會在前面插入四個空格的縮進還是移動到最近的一個縮進處呢?答案取決於我們所設置的shiftround選項的值.
以通常的情況下,這個選項是沒有設置的,所以會新增四個空格的縮進.但是如果我們執行了下面的命令,那麼光標就會移動到最近的一個縮進處:
:set shiftround
當我們執行命令=時我們可以使用通過equalprg選項所指定的程序來進行文件的格式化工作.如果沒有設置這個選項或者是我們沒有編輯一個Lisp程序,那麼Vim就會使用他自己的縮進程序來縮進C或者是C++的程序文件.如果我們想要使用GNU的縮進程序我們可以執行下面的命令:
:set euqalprg=/usr/local/bin/indent
我們還可以要求Vim來格式化註釋而且他可以很好的來完成我們的要求:
例如我們有下面的一段註釋:
/*
 *This is a test.
 *Of the text formatting.
 */
我們可以通過下面的命令來格式化這段註釋:
1 將光標放在這段註釋開始的地方.
2 用命令v進入可視化模式.
3 將光標移動到這段註釋的結尾處.
4 用命令gq來格式化這段註釋.
結果如下:
/*
 *This is a test.Of the text formatting.
 */
(沒有達到預期的效果,想來應處理程序文件中才有用)
我們可以通過comments選項來定義哪些是註釋而哪些不是.我們還可以用命令gq{motion}來完成註釋的格式化工作.
我們可以使用comments選項來定義哪些文本是註釋而哪些文本不是註釋.這個選項由成對出現的標記:字符串格式組成(flag:string).
可以使用的標記(flags)如下:
b
後面必須跟上空格.這就是說如果一個字符後面跟上空格或是其他的空白符,那麼這個字符開始了一個註釋.
f    只有第一行有註釋字符串.在下一行不要重複這個字符串,但是要保持縮進格式
l
當使用在三段註釋的情況下,必須保證中間一行要與註釋的開始和結束相對應.而且必須使用s或是e標記.
n    指明瞭嵌套註釋
r    與l相類似,所不同的只是右對齊
x
告訴Vim在三段註釋的情況下我們可以在下面的三種情況下僅輸入最後一個字符就可以結束注註釋:
1 我們已經在註釋的開頭輸入了.
2 註釋有中間部分.
3 結束字符串的第一個字符是這一行的第一個字符.
對於三段註釋的情況,下面的一些標記適用:
s    開始三段註釋
m    三段註釋的中間部分
e    三段註釋的結尾
number    在三段註釋的中間部分的縮進中添加指定的空格
一個C程序的註釋用/*開始,有中間部分*,以*/結尾.就像下面的一樣:
/*
  * This is a comment
  */
這樣的註釋結果是由comments選項所指定的:
sl:/*,mb:*,ex:*/
在這個設置中sl表明這是一個三段註釋的起始處並且在這個命令中的其他行需要縮進一個額外的空格.這個註釋是以/*開始的.
這個註釋的中間部分是由mb:*來定義的.m表明了一箇中間部分,而b則是說在我們輸入的任何內容後必須有一個空格.這段文本以*開始註釋.
註釋的結束是以ex:*/來指定的.e表明註釋的結束,而x則是表明了我們只需要輸入結束標記的最後一個字符來完成註釋.而結束的定界符是*/.
那麼我們如何來使這樣的定義工作呢?首先我們要設置下面的選項:
:set formatoptions=qro
下面的一些選項在我們要格式化文本時會顯得更爲有用:
q    允許使用gq來格式化化註釋
r    在我們輸入回車後自動的加入註釋的中間部分
o    我們用o或是O命令來開始一個註釋行時自動的添加註釋行的中間部分
下面讓我們看一下這樣的設置會如何的工作:
我們要開始一段註釋,我們在這一行輸入註釋的開始標記/*,然後我們打下回車,因爲在格式選項中我們設置了r,所以在下一行中會自動的添加註釋的中間部分並且會在後面添加一個空格.當我們在再輸入回來也會出現同樣的情況,但是這時我們要結束我們的註釋輸入了,我們就如何結束呢?Vim是一個精巧的編輯器,當我們在這種情況下只輸入/時,光標就會向後移動一格插入/,這樣就正確的結束我們的註釋輸入了.結果如下:
/*
* This is a test
*/
我們還可以使用各種不同的格式命令來格式化文本或是註釋.
C程序文件的縮進過程是由下面的一些選項來控制的:
cinkeys        定義了引發縮進事件的關鍵字
cinoptions    定義瞭如何縮進
cinwords    定義了C和C++的關鍵字
cinkeys選項定義了哪些字符會引起縮進的變化.這個選項事實上是一對輸入字符和關鍵字字符的組合(type-chars key-chars).
輸入字符如下:
!    他後面的字符不會被插入.這在我們要定義一個字符來格式化一行使之重新縮進時會顯得更爲有用.在默認的情況下,CTRL-F就被定義爲重新縮進.
*    這一行會在這個字符輸入之前進行重新縮進.
0    如果這是一行中第一個輸入的字符就會影響這一行的縮進發生變化.(這並不是說他是這一行的第一個字符,因爲這一行會進行自動縮進.他只是指第一個輸入的字符)
關鍵字符如下:
^X    控制字符CTRL-X
o    告訴Vim在我們用命令o開始一個新行時要縮進該行.
O    與o相同
e    當我們輸入最後一個else中的e時重新縮進此行.
:    當我們在一個標籤或是事件的描述後輸入:時會重新縮進此行.
<^>,<<>,<>>,<o>,<e>,<O>    在尖括號中的精確的字符
而cinkeys選項默認的值如下:
0{,0},:,0#,!^F,o,O,e    
cinoptions選項來控制每一行縮進的大小.這個選項是由一系列的關鍵字和縮進(key indent)所組成的.這裏子關鍵字是一個單一的字符,用來指明影響程序的哪一部分.而縮進(indent)則是告訴程序要用多大的縮進.這個縮進可以是幾個空格(如8個),或者是負數量的空格(如-8個).還可以是由s所指定的shiftwidth選項值的倍數.例如1s是指一個shiftwidth,而0.5s是指半個shiftwidth,而-1s則沒有縮進一個shiftwidth.
關鍵字    默認    描述
>    s    沒有被其他字符所覆蓋,正常縮進.
e    0    以花括號爲結束標記的行後面的行的額外縮進.
n    0    在if,while後的沒有在花括號內的單一行的額外縮進.
f    0    添加到函數體的額外縮進.包括定義函數的{}.
{    0    添加到開始{的空格
}    0    添加到結束}的空格
^    0    添加到開始於第一列的{}內的文本的空格.
:    s    在switch語句中的自動縮進
=    s    在case語句後的額外縮進
g    s    對於C++中的保護關鍵字(public,private,protected)的縮進
h    s    保護關鍵字語句後的語句的縮進
p    s    K&R風格的縮進
t    s    在單一行進行函數類型聲明的縮進
+    s    連續行的縮進
c    3    多行註釋中間部分的縮進(如果沒有指定*)
(    2s    表達式中間部分一行的縮進,事實上是指一對括號內部的縮進.
u    2s    嵌套括號內的一行的縮進,與(相類似,只是這個要更深一層.
)    20    指定用來查找一對閉括號()的行數.
*    30    指定用來查找沒有結束的註釋的行數
選項cinwords用來定義哪一些單詞可以使得下一個C語句在精巧縮進(smartindent mode)模式下和在C縮進模式下(Cindent mode)縮進一個層次.默認的選項值如下:
:set cinwords=if,else,while,do,for,switch
假如我們要用盡量少的編輯動作來比較兩個文件的不同,那麼我們要怎麼樣的來做呢?這時我們可以打開兩個窗口,分別在兩個窗口中進行編輯.然後我們在每一個窗口中執行下面的命令:
:set scrollbind
這樣以後如果有一個窗口發生滾動,那麼另一個窗口也就會有相同的動作.
就你是我們要在兩個文件窗口中進行動作一樣,也許有的時候我們會需要移動一個窗口而不要移動另一個窗口,這時我們可以我們要移動的窗口內執行下面的命令就可了:
:set noscrollbind
如果我們要同步滾動,我們可以執行下面的命令:
:set scrollbind
選項scrollopt可以用來控制scrollbind如何的來工作.我們可以將其設爲如下的值:
ver    垂直同步滾動
hor    水平同步滾動
jump    當我們在兩個窗口中進行切換時,一定要使用偏移(offset)爲0
最後如果我們要使兩個窗口同步,我們可以使用下面的命令:
:syncbind
假如我們正在看一個文件的兩個版本,我們需要在這兩個文件中進行滾動查看.也許我們爲了查看一些東西而關掉了scrollbind.這樣這兩個文件就會停在不同的地方.而我們還希望他們可以再一次同步滾動.這時我們可以分別到這兩個文件所在的窗口然後將他們移動相同的地方.而事實上我們可以叫Vim來完這樣的工作.在這樣的情況下,我們可以分別在兩個文件中設置scrollbind,然後執行下面的命令:
:syncbind
這樣Vim就使得兩個文件同步了.
假如我們正在看一個程序文件,但是卻碰到一個我們並不理解的函數調用.我們可以用命令CTRL-]跳轉到函數定義的地方.但是這樣做卻有一個問題,那就當前的文件被函數定義的內容所替代,我們也就不可以從屏幕上看到這個文件的內容了.
這個問題的一個解決辦法就是我們使用被稱爲preview的特殊窗口.我們可以通過執行下面的命令來打開preview的特殊窗口,在這個窗口中顯示函數定義的內容:
:ptag function
如果我們已經打開了一個preview窗口,那麼他就會切換到當前正在查看的函數定義內容.如果我們要關閉這個窗口,我們可以執行下面的命令:
:pclose
命令CTRL-Wz和ZZ也可以有關閉這個窗口的作用.
在preview窗口中我們執行下面的命令來完成我們的工作:
:ppop        在這個窗口中執行一個:pop命令.
:ptselect identifier    打開一個新的preview窗口並執行:tselect命令
:ptjump identifier    打開一個新的preview窗口並執行:ptjump 命令
:count ptnext        在這個窗口中執行:count tnext命令
:count ptprevious    在這個窗口中執行:count ptprevious命令
:count ptrewind        在這個窗口中執行:count ptrewind命令
:ptlast            在這個窗口中執行:ptlast命令.
CTRL-W}            以當前光標下的內容執行一個:ptag命令
CTRL-Wg}        以當前光標下的內容執行一個:ptjump命令
matchpairs選項可以用來控制哪些字符可以用%命令來進行匹配.這個選項默認的值如下:
:set matchpairs=(:),{:},[:]
這就告訴Vim要匹配(),{},[]
匹配<>,我們可以用下面的命令:
:set matchpairs=<:>
這個命令在我們要編寫HTML文件時會顯得更爲有用.
這個命令僅僅是匹配<>.如果我們要同時匹配其他的字符,我們可以用下面的命令:
:set matchpairs=(:),{:},[:],<:>
這樣的命令顯得似乎是有一些太長了,我們可以用+=命令來達到同樣的目的.例如上面的命令我們可以用下面的命令來作到:
:set matchpairs+=<:>
如果我們希望我們在輸入括號時,光標會跳轉到與其匹配的地方進行顯示,我們可以執行下面的命令來做到:
:set showmatch
通常情況下這個跳轉持續的時間爲0.5秒(半秒),我們可以用matchtime選項來控制這個時間.例如如果我們希望這個時間持續1.5秒,我們可以用下面的命令:
:set matchtime=15
在這裏是以0.1秒爲單位的.
我們在Vim編輯器還可以用命令來查找未匹配的括號.如[{查找前一個未匹配的{,]{查找後一個未匹配的{.[}查找前一個未匹配的},而]}查找後一個未匹配的}.
])查找後一個未匹配的),而[(查找前一個未匹配的(.[#查找前一個未匹配的#if或者是#else.而]#查找後一個未匹配的同類情況.
下面的命令可以移動一個Java方法的開頭或結尾:
[m    向後查找一個方法的開頭
[M    向後查找一個方法的結尾
]m    向前查找一個方法的開頭
]M    向前查找一個方法的結尾
在Vim編輯器還提供了許多的移動命令來幫助程序人員在他們的程序文件中進行瀏覽.下面的一些命令可以找到位於第一列的{和}:
count[[        向後查找位於第一列的前一個{
count[]        向後查找位於第一列的前一個}
count]]        向前查找位於第一列的後一個{
count][        向前查找位於第一列的後一個}
命令[/和[*可向後移動他可以找到的第一個C註釋的開始處,而]/和]*可以向前移動他可以找到下一個C註釋的結束處.
隨着一個程序文件變得越來越大,我們會將這個程序文件分在不同的目錄中,這樣就會大大的方便我們的管理.讓我們來看一下一個小的工作,我們有一個包含有main.c和main.h的主目錄,其餘的目錄就是含有lib.c和lib.h的lib目錄(庫文件).
我們從主目錄中開始我們的編輯工作.第一件事就是告訴Vim關於是我們的新目錄的情況.我們可以用:set ^=將這個目錄放在查找路徑的上部:
:set ^=../lib
假如我們正在編輯文件main.c,而這個文件的內容類似於下面的:
#include \"main.h\"
#include \"lib.h\"\n\r\nint main(int argc,char*argv[])
現在我們要查看一下lib.h中一個子程序的聲明.一個辦法是我們可以執行下面的命令:
:vi ../lib/lib.h
這個命令是假定我們知道lib.h的位置所在.但是在這裏我們會有一個更好的方法.首先我們將光標放在下面一行中的文件名上:
#include \"lib.h\"
然後我們執行命令gf.這就告訴Vim編輯試着編輯以光標下的內容爲文件名的文件.編輯器就會在path(路徑)變量的每一個目錄中進行查找.
假如我們要編輯文件lib.c,而這個文件名並沒有出現在現在的文本內容,我們就沒有辦法來用gf命令,這時我們可以用下面的命令:
:find lib.c
這個命令類似於:vi命令,所不同的只是他要在路徑中進行查找.下面的命令與其相類似,只是他是分裂當前窗口進行查找:
:sfind lib.c
gf命令與:find命令相類似,只是這個命令認爲當前光標下的內容是我們要編輯的文件.如果在path中有不只一個文件與指定的文件相匹配,這時我們可以通過給定gf命令一個參數來選擇我們要編輯的文件.
換句話說如果我們將光標放在param.h上然後執行命令2gf,Vim就會編輯通過path選項指定的路徑目錄中查找的文件列表中的第二個文件.
path選項用來告訴Vim在哪裏查找被當前文件包含進來的文件,這個選項的格式如下:
:set path=directory,directory,...
在這裏的directory是指我們要查找的目錄,如:
:set path=/usr/include,/usr/X11R6/include
我們還可以在這個命令中使用通配符來進行匹配,如:
:set path=/usr/include,/usr/include/*
下面是一些特殊的目錄:
**    匹配整個目錄樹,如:
    :set path=/usr/include/**
    這個命令查找目錄/usr/include及其所有的子目錄.下面的命令指定了在所有以/ho
me/oualline/progs開始以include結束的目錄內的文件
    :set path=/home/oualline/progs/**/include
\"\"    空字符串指當前目錄
.    指我們正在編輯的文件所在的目錄
例如下面的命令是告訴Vim查找的目錄包括/usr/include及其所的子目錄,我們正編輯的文件所在的目錄(.)以及當前目錄(,,):
:set path=/usr/include/**,.,,
如果我們想確定一下我們可以查找到所有的#include文件,我們可以使用下面的命令:
:checkpath
這個命令的作用範圍不僅僅是我們正在編輯的#include目錄,而且包括任何他們#include的目錄,結果就是要查看所有的#include文件.
在這種情況下,有許多的文件要包含文件stddef.h和stdarg.h.但是Vim卻不能找到這些文件.如果我們要告訴VimLinux特殊的include目錄,我們要以執行下面的命令:
:set path+=/usr/include/linux
但是:checkpath命令只是列出所以不能找到的文件,如果我們要列出所以的#include文件,我們可以用下面的命令:
:checkpath!
Vim編輯器知道C和C++的宏定義.但是如果是其他的語言又會怎麼樣呢?選項define包含了一個長規的表達式,Vim編輯器可以通過他來查找一個定義.例如如果我們要使Vim查找以字符串function開頭的宏,我們可以使用下面的命令:
:set define=function
選項include定義一個包含(include)的目錄是什麼樣子的.這個選項可以用來爲我們使用命令]CTRL-I,[CTRL-I,]d,[d在這些我們所包含進來的文件中進行查找.這個選項也可以爲命令:checkpath所用.正如define選項一樣,這個選項的值也是一個長規的表達式.
命令[i用來查找光標下的內容第一次出現的地方.註釋的文本會被忽略掉.
命令]j用來查找光標下的內容下一次出現的地方.註釋的文本會被忽略掉.
命令[I會列出所有包含當前光標下的內容的句子,命令]I與其相類似,只是這個命令是從當前光標處開始.
:make命令會產生一個錯誤列表.Vim編輯器會記住我們前10次:make命令和:grep命令的執行結果.如果我們要到前一次的錯誤列表,我們可以用下面的命令:
:colder
如果我們要到一個新的錯誤列表,我們可以用下面的命令:
:cnewer
當我們執行:make命令時所要執行的程序名稱是由makeprg選項來定義的.在通常的情況下會設爲make,但是Visual C++的用戶可以通過下面的命令將其設爲nmake:
:set makeprg=nmake
:make命令會重定向Make的輸出到一個錯誤文件.這個文件的名字是由makeef選項來控制的.如果這個選項包含有字符##,字符##就會被專一的數字所代替.這個選項默認的值取決於我們正在使用的操作系統.默認的值如下:
Amiga        t:vim##.Err
UNIX        /tmp/vim##.err
Windows        vim##.err
我們可以在命令中包含指定的Vim關鍵字.%字符可以擴展當前文件的名字,所以我們執行下面的命令:
:set makeprg=make\\%
然後我們執行命令:
:make
他就會執行下面的命令:
$ make file.c
file.c就是我們正在編輯的文件的名字.這個並沒有太大的用處,所以我們可以重新定義這個命令並使用:r(root)的權限:
:set makeprg=make\\%:r.o
這樣我們就會執行下面的命令:
$ make file.o
選項errorformat可以用來控制Vim如何來組織錯誤文件以使得他可以知道文件名以及錯誤發生的地方.這個選項的格式如下:
:set errorformat={string},{string},{string}
這裏的字符是由特殊字符%所指出的典型的錯誤信息用來指明特殊的操作(與標準C函數scanf很相像).這些特殊的字符如下:
%f    文件名
%l    行號
%c    列號
%t    錯誤類型(單一字符)
%n    錯誤行號
%m    錯誤信息
%r    匹配一行中的剩餘
%*{char}匹配並跳過由{char}所指定的scanf轉換
%%    字符%
當我們在編譯一個程序的時候,我們也許要在幾個目錄中進行遍歷.GNU make程序會在當我們進入一個目錄或是離開一個目錄時打印出相應的信息.
如果要正確的得到文件名,Vim就要清楚的知道這些目錄的變化.下面的一些錯誤格式用來在目錄發生變化時告訴Vim一些相關的信息:
%D    當進入一個目錄時打印出指定的信息.字符串的%f指明我們所進入的目錄
%X    指定離開目錄時的信息.字符串中的%f指明瞭make已用畢的目錄.
一些編譯器,例如GNU GCC編譯器,會輸入一些冗長的錯誤信息.如果我們正在使用默認的errorformat就會導致三種錯誤信息.這實在是夠討厭的.但是幸運的是Vim編輯器可以識別出不同的錯誤信息.處理不同信息的模式代碼如下:
%A    開始多行信息
%E    開始多行錯誤信息
%W    開始多行警告信息
%C    連續多行信息
%Z    結束多行信息
%G    全局.只有在+或是-連接時纔有用
%O    單行文件信息:重新讀入匹配的部分
%P    單行文件信息:將%f文件壓入棧
%Q    單行文件信息:將最後一個文件壓出棧
+或是-可以放在任何字符的前面,從而組成下面的內容:
%-letter    不要包含輸出中的匹配行
%+letter    包含%m錯誤字符串的整個匹配行
在通常的情況下,我們執行:make命令並有錯誤發生,Vim會在當前的窗口中顯示錯誤文件.如果我們通過設置switchbuf選項來進行窗口的分裂,Vim就會在一個新的窗口來顯示錯誤文件.:grep命令會運行由選項grepprg所指定的程序.這個選項包含了我們要用的命令行.#和%字符會擴展到當前文件名和交替文件名.而字符串$*將會被:grep命令的參數所代替.
在這裏我們要注意的就是在UNIX系統上,grepprg默認是指grep -n.在Windows系統上,默認是指findstr/s
:grep命令使用grepformat選項來告訴Vim如何來組織Grep的輸出文件.
在通常的情況下,Vim是使用二分法進行查找指定的標記名字.如果一個標記文件是按序排列的,這樣的方法可以是很快速的.否則的話我們可以使用線性查找的方法.如果要強制進行線性查找,我們可以用下面的命令;
:set notagbsearch
這個選項會在我們的標記文件不是有序的時有用.
有一些系統會限制我們在函數名中所使用的字符數.如果我們要在Vim中加入這樣的限制,我們可以通過設置taglength選項來限制我們函數名的最大長度.
我們可以用tags選項來指定標記文件名.這個可以用來指其他目錄中的文件.如:
:set tags+=/home/oualline/tools/vim/tags
但是這會帶來一些令人費解的地方.是我們在當前目錄中啓動並告訴ctags將標記文件放在目錄/home/oualline/tools/vim還是我們在當前的目錄執行了ctags呢?現在的Vim編輯器已經用其他的選項來解決了這個問題了.如果我們進行下面的設置,所有的標記都會和含有標記文件的目錄有關係:
:set tagrelative
否則的話,他們會和當前目錄有關係.
如果我們設置了tagstack選項,那麼:tag命令和:tjump命令就會建立一個標記棧.否則是不會保持棧的.
Vim編輯器允許我們自定義用來進行語法高亮顯示的顏色.Vim編輯器識別下面三種不同的終端:
term    平常的白色背景色,黑色前景色的終端(沒有顏色)
cterm    彩色終端,例如xterm或者是Windows的DOS
gui    Gvim所產生的窗口
要改變通常的終端的高亮顯示的顏色,我們可以用下面的命令:
:highlight group-name term=attribute
這裏的group-name是我們要高亮顯示的語法組.這是我們要設置的語法匹配的規則用來告訴Vim程序中的哪一部分要進行高亮顯示.而attribute是終端的屬性.對於平常的終端如下:
bold    underline    reverse    italic    standout
我們可以用逗號來組合這些屬性,如:
:highlight Keyword term=reverse,bold
假如我們有一個不是通常代碼的終端.我們可以通過start和stop高亮顯示的選項來定義我們自己的屬性.這些定義一個用來發送的字符串來開始一個顏色和結束一個顏色.例如:
:highlight Keyword start=<Esc>X stop=<Esc>Y
有了這樣的定義,當Vim要顯示關鍵字時,例如顯示if就會顯示爲<Esc>Xif<Esc>Y
如果我們對UNIX的終端定義的文件較爲熟悉,我們可以使用終端代碼.us定義了開始下劃線的代碼,而ue則是退出下劃線模式的字符串.要指定這種高亮顯示的方法,我們可執行下面的命令:
:highlight Keyword start=t_us stop=t_ue
顏色是由cterm的設置來定義的.我們可以使用cterm=attribute的方式來進行我們的設置.
但是對於一個彩色終端來說還有許多其他的選項.ctermfg=color-number可以用來設置前景色.ctermbg=color-number用來設置後景色.Vim可以識別出顏色的名稱.例如下面的命令可以告訴Vim在顯示註釋時後景色爲藍色,而前景色爲紅色,並且有下劃線:
:highlight Comment cterm=underline ctermfg=red ctermbg=blue
GUI終端可以使用選項gui=attribute的方式來在圖形窗口下顯示語法元素的屬性.選項guifg和guibg定義了前景和後景的顏色.這些顏色是名稱來進行區別的.如果名稱中包含空格,那麼這個顏色的名稱就要用單引號括起來.爲了事物的可移動性,Vim建議我們只使用以下的顏色:Black    Blue    Brown    Cyan    DarkBlue    DarkCyan    DarkGray    DarkGreen    DarkMagenta    DarkRed    Gray    Green    LightBlue    LightCyan    LightGray    LightGreen    LightMagenta    LightRed    LightYellow    Magenta    Orange    Purple    Red    SeaGreen    SlateBlue    Violet    White    Yellow
我們可以使用X11的顏色數字來定義我們的顏色.這就可以在所有的系統上正確的顯示,而不論是否使用X11系統.這種模式爲#rrggbb,在這裏rr是紅色的數量,bb是藍色的數量,gg是綠色的數量.
我們還可以在一個高亮顯示行來定義幾種終端的顏色,如:
:highlight Error term=reverse \\ cterm=blod ctermfg=7 ctermbg=1
語法元素是由$VIMRUNTIME/syntax中的宏來定義的.然而爲了使得事情變得更爲簡單,我們常會用下面的一些名字:
Boolean        Character    Comment        Conditional
Constant    Debug        Define        Delimiter
Error        Exception    Float        Function    
Identifier    Include        Keyword        Label
Macro        Number        Operator    PreCondit
PreProc        Repeat        Special        SpecialChar
Structure    Tag        Todo        Type
Typedef
除了這些語法元素,Vim還定義了下面的許多事物:
Cursor        光標下的字符
Directory    目錄名稱以及其他列出的特殊名稱
ErrorMsg    在最底行顯示出的錯誤信息
IncSearch    增長(Incremental)查找的查找結果
ModeMsg        在左下角顯示的模式名稱
MoreMsg        當Vim在顯示一個很長的信息並且要顯示更多的信息時的提示
NonText
Vim編輯器會在超出文件結尾時顯示~.我們可以用@來表明一行不會在顯示一屏上.這些語法元素可以用來定義用哪些顏色來顯示語法元素
Question    當Vim詢問問題時.
SpecialKey    命令:map列出鍵盤的映射.這個選項定義了用特殊鍵來進行高亮顯示
StatusLine    當前窗口的狀態行.
StatusLineNC    其他窗口的狀態行
Title        命令:set all,:autocmd的輸出標題
Visual        這個顏色用來高亮顯示可文本塊
syntax選項包含有用於當有語法高亮顯示的語言.我們可以用下面的命令來關閉語法顯示:
:set syntax=off
如果想要打開,我們就用下面的命令:
:set syntax=on
vi編輯器的學習使用(二十四) 
在這一次的學習中我們會介紹一些更多的關於縮寫和鍵盤映射的問題.
我們在編輯的過程中可以用:abbreviate命令來設置一個縮寫,那麼我們如何來移除一個縮寫呢?我們可以用命令:unabbreviate來移除一個縮寫.例如我們用下面的命令來設置一個縮寫:
:abbreviate @a fresh
如果我們要移除這個縮寫我們可以用下面的命令:
:unabbreviate fresh
如果我們要清除所有的縮寫,我們可以用下面的命令:
:abclear
我們用上面的命令定義的縮寫可以正常的工作在插入模式和命令行模式兩種狀態下.如果我們是在文本中輸入@a,他就會擴展爲fresh,而如果我們在:命令行中輸入@a,他也可以擴展成爲fresh.如果我們要定義一個只工作在插模式下的縮寫,我們可以用這樣的命令:
:iabbreviate @a fresh
這也就是說如果我們在命令行輸入@a,那麼他僅是@a,而不會擴展爲fresh.如果要取消一個插入模式的縮定義,我們可以用下面的命令:
:iunabbreviate @a
同樣的我們可以用下面的命令來清除所有的插入模式的縮寫定義:
:iabclear
相類似的,如果我們要定義一個只在命令行模式下工作的縮寫,我們可以用命令:cabbreviate來完成,而取消這個定義的命令爲:cunabbreviate,如果要清除所有的縮寫列表,我們可以用下面的命令:
:cabclear
如果我們要列出所有的縮定,我們可以用下面的命令:
:abbreviate
在這個命令的執行結果第一列顯示出縮寫的類型,標記如下:
c    命令行模式
i    插入模式
!    兩種模式均可
CTRL-C命令可以使得Vim離開插模式.這個命令與<Esc>命令的不同之處就在於在回到正常狀態的過程中並不會檢查一個縮寫.
map命令可以使得我們將一定的模式與鍵盤對應起來.例如如果我們要使用F5來複制來選中的文本到寄存器v中,我們可以用下面的命令來定義:
:map <F5>\"vy
這樣的定義的F5在正常以及可視模式下都可以使用.但是也許我們真正希望的是隻在可視模式下來使用這個命令,這時我們可以用下面的命令來進行定義:
:vmap <F5>\"vy
這裏的v是告訴Vim這樣定義的命令是隻在可視模式下使用.
如下面的列表:
Command    Normal    Visual    Operator Pending    Insert    Command Line
命令    正常    可視    運算符延伸        插入    命令行
:map    y    y    y    
:nmap    y    
:vmap        y
:omap            y
:map!                        y    y
:imap                        y
:cmap                            y
現在假如我們要定義<F7>以使得命令d<F7>可以刪除C程序的文本塊.與此相類似的,y<F7>可以將程序塊複製到未命名寄存器中.所以我們要做就是要傅F7來選擇當前的文本塊.我們可以使用下面的命令:
:omap <F7>a{
這個命令會使得<F7>在operator-pending模式下選擇文本塊.有了這樣的映射,當我們輸入d<F7>命令中的d時,我們就進入了operator-pending模式.然後執行命令<F7>就可以地命令a{了,這樣我就可以選擇文本塊了.因爲我們執行了d命令,所以這個文本塊被刪除了.
其他的一些映射命令如下:
:map lhs rhs
這個是將lsh映射到rhs,所以當我們按下lhs時我們實際上執行的是rhs
如下面的映射命令:
:map ^A dd
:map ^B ^A
執行了這樣的命令以後,當我們輸入CTRL-A時Vim會刪除一行.而CTRL-B也會是同樣的作用.當我們使用控制字符時,我們必須用CTRL-V來引用他.換句話說如果我們要達到:map ^A dd的目的,我們就可以用下面的命令來完成:
:map CTRL-VCTRL-A dd
(似乎這個命令這樣的做是不成的)
如果我們要重新映射,我們可以使用命令:noremap,例如:
:noremap lhs rhs
如果我們要取消一個映射,可以使用:unmap命令,如:
:unmap lhs
如果我們取消所有的映射,我們可以使用命令:
:mapclear
但是我們在使用這個命令時要注意,因爲這個命令也會移除所有我們自定的默認映射.
如果我們要列出所有的映射,我們可以用下面的命令:
:map
第一列的標記指明瞭這樣的映射可以在哪一種模式下工作:
字符    模式
<space>    正常,可視,運算符(operator-pending)
n    正常
v    可視
o    operator-pending
!    插入和命令模式
i    插入模式
c    命令模式
第二列指出各種lhs的任何映射.第三列是rhs的映射值.如果rhs是以*開頭的,那麼這個rhs是不可以重新映射的.
:map命令可以列出所有的映射,而:map!只列出插入和命令行模式的映射.而:imap,:vmap,:omap,:nmap命令只是列出指定模式的映射.在默認的情況下,Vim允許循環映射,要關掉這個特徵,可以執行下面的命令:
:set noremap
如果我們執行下面的命令:
:abbreviate @a ad
:imap ad adder
這樣當我們輸入@a時,字符ad會被插入,然而ad又映射到插入模式的字符串adder,所以字符串adder會被插入到文本中.如果我們使用用命令:noreabbrev就可以避免這樣的問題.\n\r\nvi編輯器的學習使用(二十五) 
雖然Vim編輯器在可視的情況下可以極好的完成我們的工作,但是有時我們是也需要使用命令行命令的.例如在腳本中命令行命令的使用會更容易,同時有許多特別的命令是隻在命令模式下纔可以實現的.
:delete命令可以刪除一個範圍內的文本行.例如我們要刪除1到5行,我們可以用下面的命令來做:
:1,5 delete
:delete命令的一般格式如下:
:range delete register count
在這個命令中的register是我們的刪除的文本要放入的寄存器.這個可以是我們用a-z命名的寄存器中的一個.如果我們使用大寫的字符做爲寄存器的名字,那麼這些文本就會被添加到已經存在文本的寄存器中.如果沒有指定這個參數,那麼就會使用未命名的寄存器.而count則指出要刪除的行數.range則是指明要使用的行.
我們還可以使用命令來刪除含有指定字符串的行.如我們可以用下面的命令來刪除從第一個包含字符串hello到第一個包含字符串goodbye的行之間所有的行:
:/hello/,/goodbye/ delete
在這裏我們要注意的就是如果goodbye在hello之前出現,那麼這個命令就不會正常的工作了.我們還可以使用偏移量(offset)來重新定義要查找的字符串.例如/hello/+1是指含有hello字符串行的下一行,因而我們還可以使用下面的命令來進行刪除的操作:
:/beach/+1,/seashore/-1 delete
我們還可以使用下面的一些簡寫的運算符:
\\/    向前查找上一次使用的模式
\\?    向後查找上一次使用的模式
\\&    向前查找上一次使用的子模式
(注:這個地方不懂,也不曉如何來用)
我們還可以使用鏈式的模式,例如下面的命令在找到字符串first以後要查找second字符串:
/first//second
所以我們還可以使用下面這樣的刪除命令:
:/hello//goodbye/ delete
我們還可以指定行號,用來指明在第幾行進行查找,如果我們要從第七行開始查找,我們可以使用下面的命令:
7/first/
如果我們只是執行一個:命令,那麼Vim編輯器就會進行命令行模式然後允許我們指定一個要刪除的範圍.如果我們在這個命令之前指定了一個數字,例如5:,那麼要刪除的範圍就是這個數字所指定的範圍(包括當前行).事實上這樣指定的範圍如下:
:...+count-1
例如我們在一段文本中執行下面的命令:
3:delete
這實際上是執行下面的命令:
:...+2 delete
這個命令可以刪除當前行以及當前行以下的兩行,總計三行的文本.
刪除命令的另一個形式如下:
:line delete count
在這種情況下,:delete命令回到line所指定的行(默認爲當前行),然後刪除count行文本(包括當前行).
:copy命令是將幾行的文本從一個地方複製到另一個地方.這個命令的一般格式如下:
:range copy address
如果沒有特別指定,range默認是指當前行.這個命令是拷貝range所指定的範圍行的文本到address指定行的後面.
與:copy命令相類似的是:move命令,所不同的只是這個命令是移動而不復制.
假如我們要在我們正編輯的文本中插入一些行,而由於某些原因,我們要使用命令行的方式來完成這樣的工作.這時我們就要將光標移動我們希望新行出現的上一行.換句話說,我們是希望將插入的文本出現在當前行的後面.然後我們可以執行命令:append來開始我們的插入過程,我們輸入我們要插入的內容並用句號(.)來結束一行的輸入.例如我們在一個測試文本中執行下面的命令:
:1append
這個命令是要第一行的後面插入我們新的文本行.執行這個命令後,我們可以在Vi的底部輸入我們要插入的內容.當我們要結束我們的輸入時,只要在一新行輸入.就可以了.這樣我們輸入的內容就會出在第一行的後面了.
:append命令的一般格式如下:
:line append
我們輸入的新文本將會插入在line所指定的行後面.
:insert命令也可以插入文本,這個命令的一般形式如下:
:line insert
這個命令與:append命令相似,所不同的是後者是當前行的後面插入文本,而前者是在當前的前面插入文本.
我們不必打開number選項也可以實現在打印一行文本時打印此行的行號.命令:#與:print命令相類似,所不同的只是前者可以打印出行號.
例如在我們的測試文本中執行下面的命令:
:1 print
執行結果如下:
A UNIX sales lady,Lenore,
而我們執行下面的命令:
:1#
執行結果如下:
1 A UNIX sales lady,Lenore,
選項list可以使得不可見的字符成爲可見字符.命令:list可以列出指定的行,而且這個命令全認爲list選項已經打開.如下面的命令:
:1,5 list
這個命令就可以列出1-5行的內容.
這個命令與:print命令不同的地方只是這個命令也可以打印出回車,Tab等不可見的字符.
:z命令可以打印出一個範圍內的文本行(默認情況下爲當前行)以及這一行附近的行.例如我們執行下面的命令:
:100 z
這個命令會打印出從第100行開始的直到當前屏幕滿屏的所有的文本行.
這個命令可以指定一個數字,用來表示除了打印指定的行以外要額外打印的行.例如下面的命令:
:100 z 3
這個就使得Vim除了打印第100行還要另打印額外的三行.
:z命令以後還可以再跟上一個代碼用來表示要顯示多少的文本.可用的代碼如下:
代碼    起始行        結束行        當前行
+    當前行        向前一個屏幕    向前一個屏幕的下一行
-    向後一個屏幕    當前行        當前行
^    向後兩個屏幕    向後一個屏幕    向後一個屏幕
.    向後半屏    向前半屏    向前半屏
=    向後半屏    向前半屏    當前行
基本的substitute命令格式如下:
:range substitute /from/to/flags count
這裏的定義符可以是除了字母,數字,反斜線,雙引號或是豎線以外的任何字符.在Vim編輯器中Vim還使用一些特殊的字符來表示特殊的事物.例如*表示重複0次或是多次.如果我們設置了nomagic選項,那麼這些字符的特殊意義就會被關掉了.
命令:smgic可以執行一個替換操作,但是這個命令要求我們設置了magic選項.
例如我們可以使用只有一行的文件來測試這些命令.我們可以用命令將整個文件打印出來:
:%print
Test aaa* aa* a*
然後我們設置了magic選項並且執行替換命令 .p標記告訴編輯器打印出他所改變的行:
:set magic
:1 substitute /a*/b/p
命令的執行結果如下:
bTest aaa* aa* a*
這個命令只是改變了一行開始的部分.爲什麼會將Test變爲b*Test而且並沒有a呢?這就是因爲*可以匹配0次或是多次,而Test正是以0個a開始的.但是爲什麼只是替換了一次呢?這是因爲:substitute命令中是改變第一個出現的地方.如果我們使用g標記就可以替換全部的匹配項了,我們撤銷剛纔的命令並執行下面的命令:
:undo
:1 substitute /a*/b/pg
這個命令的執行結果如下:
bTest b*b b*b b*
現在我們在關閉magic選項的情況下再做一次:
:undo
:set nomagic
:1 substitute /a*/b/pg
這個命令的執行結果如下:
Test aab ab b
在沒有設置magic的情況下,*僅是一個*.
而:smagic命令則是在執行替換命令時強制轉換*以及其他一些字符的意義,例如我們執行下面的命令:
:undo
:smagic /a*/b/pg
這個命令的執行結果如下:
bTest b*b b*b b*
而相類似的是命令:snomagic選項強行關掉magic選項:
:undo
:snomagic /a*/b/pg
這個命令的執行結果如下:
Test aab ab b
&命令可以重複執行替換.這個命令可以保存舊的from和to的字符串,但是允許我們使用不同的範圍(range)和標記(flags).這個命令的一般形式如下:
:range & flags count
例如我們執行下面的命令:
:1 substitute /a\\+/b/p
這個命令的執行結果如下:
Test b* aa* a*
這個命令可以改變第一個出現from所指的字符的地方.但是我們希望是的整個一行都要發生相應的替換,這時我們可以重複這一次替換命令:
:&g
這一次在命令的執行過程中就不會打印執行結果,因爲我們在這裏指定的標記是g,而不是p.這個命令的執行結果如下:
Test b* b* b*
命令:&和命令:substitute在沒有指定替換字符串的情況下作用相同,都可以執行上一次的替換命令.
在正常的命令狀態下命令&可以重複上一次的:substitute命令.例如如果我們執行下面的命令就會將第五行中的字符manager變爲idiot:
:5 substitute /manager/idiot/
這時如果在正常的命令模式下我們執行命令&,那麼這一行中的下一個manager字符串也會發生變化.如果我們下移一行然後執行命令&,那麼這一行也會發生相應的變化.如果我們在這個命令中指定了count,那麼這個命令就可以作用多行.
:~命令與命令&g相類似,所不同的是前者使用的字符是上一次使用/或是?查找時使用的字符串,而不是上一次:substitute命令中的字符串.這個命令的一般格式如下:
:range~ flags count
在一般的情況下,:substitute命令只是改變一行中第一個出現指定的字符串處,除非我們使用了g標記.如果我們希望g標記能成爲默認的設置,我們可以使用下面的命令:
:set gdefault
但是這裏我們要注意的就是也許這樣的設置會打斷我們的一些腳本.
到了現在我們所說過的一些命令都是有一個限制的,那就是我們所要執行的命令只作用在相鄰的行上.然而有時我們所希望是改變含有特定類型的行,這時我們就要用到:global命令了.這個命令的一般形式如下:
:range global /pattern/command
這個命令可以告訴Vim編輯器對在指定的範圍內包含有指定的類型的所有行執地指定的命令.例如如果我們要打印出一個文件中所有包含單詞Professor的行,我們可以使用下面的命令:
:%global /Professor/ print
而命令:global!將對所有的行執行指定的命令,但是卻不匹配指定的類型.與其相類似的是:vglobal命令.
命令:ijump查找指定的類型,並且會跳轉到指定的範圍內第一個出現的單詞處.這個命令不僅會在當前文件中進行查找,而且會在由#include所包含進來的文件中進行查找.這個命令的一般格式如下:
:range ijump count [/]pattern[/]
如果我們在這個命令中指定了count,那麼就會跳轉到第count個類型出現處.這個類型會被看作是精確的文本,除非是由斜線括起來的.
例如下面的一個Hello.c的文件:
#include <stdio.h>
int main()
{
    printf(\"Hello World\\n\");
    return (0);
}
如果我們執行下面的命令就會跳轉到第一個含有 define EOF的行處:
:ijump /define\\s*EOF/
在我們目錄的情況,他是在包含進來的文件stdio.h中
與這個命令相類似的是命令:ilist,所不同的只是這個命令是列出相應的行而不是跳轉到相應的行.
命令:isearch與:ilist命令相類似,只是這個命令列出第一個出現指定內容的行.
最後命令:isplit是命令:ijump和命令:split的組合.
我們已經知道用命令[CTRL-D來跳轉到當前光標下的宏定義處.下面的命令也可以起到同樣的作用:
:djump name
例如我們要跳轉到宏MAX處,我們可以用下面的命令:
:djump MAX
執行這個命令我們並不必需要知道我們定義的宏的全名,如果我們只是知道宏名的一部分,我們就可以使用由斜線括起來的常規表達式來進行相應的查找.如下面的命令:
:djump /MAX/
我們還可以指定參數來控制這個命令的查找範圍,如下面的命令:
:50,100 djump /MAX/
這個命令只在第50到第100行內進行相應的查找.
如果我們希望查找到是第二個而不是第一個宏定義,我們可以通過指定count參數來做到.例如我們要查找第二個MAX的定義處,我們可以用下面的命令:
:djump 2 MAX
下面的命令會在一個新窗口內顯示宏定義:
:range dsplit count [/]pattern[/]
這個命令是命令:split和命令:djump的組合.
命令:dlist與命令:dsplit相類似,只是前者並不會移動到一個宏的定義處,而是列出匹配的宏定義.
而命令:dsearch只是顯示第一個匹配的宏定義.如果命令:ilist,ijump,:djump,:dlist,:dsearch帶上!選項,那麼在註釋內的定義也可以進行查找.
如果我們要改變當前Vim的工作目錄,我們可以用下面的命令:
:cd dir
這個命令與系統的cd命令相類似.如果沒有指定目錄,那麼就會回到我們的用戶主目錄.
要查看當前Vim的工作在哪一個目錄下,我們可以有用下面的命令:
:pwd
要回到前一個工作目錄,我們可以用下面的命令:
:cd -
下面的命令可以打印出當前文件的名字以及一些相關的行信息:
:file
如果我們要改變當前文件的名字,我們可以使用下面的命令:
:file name
例如我們正在編輯的文件名爲complete.txt,我們可以使用:write命令進行保存.現在我們要縮短文件並且存爲summary.txt,我們可以執行下面的命令:
:file summary.txt
如果我們繼續進行編輯,那麼所的改動都會被存入文件summary.txt中.
與:file命令相似,命令:=可以打印出當前行的行號.
:write命令可以將緩衝區或是一個文件中指定範圍內的文本存入.他還有一些其他的選項.例如下面的命令就可以將我們正編輯的文件內容追加到文件collect.txt中:
:write >> collect.txt
如果這個文件並不存在,那麼這個命令就會給出錯誤信息.如果我們要強行追加,可以使用!選項:
:write!>>collect.txt
:write命令不僅可以保存文件,而且可以將文件導入其他的程序.在Linux系統中,我們可以用下面的命令將文件發送到打印機:
:write !lpr
(注::write! lpr與:write !lpr這兩個命令的不同,前纔是強行保存文件而後者則是將文件發送到打印機)
命令:uddate與命令:write相類似,所不同的只是如果緩衝區沒有被修改,那麼這個命令就不會起作用了.
:read命令將會讀入一個文件.這個命令的一般格式如下:
:line read file
這個命令會將名爲file的文件讀入並且插入在line後面.如果沒有指定文件,那麼就會使用當前的文件,如果沒有指定要插入的行,那麼就會使用當前的行.
與:write命令相類似,:read命令可以使用一個命令而不是一個文件.如果要讀入一個命令的輸出並插入到當前行的後面,我們可以使用下面的命令:
:line read !command
我們在以前的學習曾學過如何在寄存器中錄製宏.如果我們要在命令行中使用這些宏,我們可以用下面的命令來執行寄存器中的宏內容:
:line@register
這個命令會將光標移動到指定的行,然後執行寄存器中的內容.這就意味着下面的命令執行上一次的命令行:
:@:
如果要執行上一次的:@register命令,我們可以用下面的命令:
:line@@
命令:>使得文本右縮進,:<命令使文本向左縮進.例如下面的命令將會使第五行到第十行向右縮進:
:5,10>
:change命令與:delete命令相類似,所不同的只是他還同時執行:insert命令,也就是有我們可以同時輸入我們要插入的文本.
命令:startinsert命令可以開始插入模式,就像是我們在正常模式下執行i命令一樣.
如果我們要將幾行合併爲一行,我們可以使用命令:join,在這個命令的執行中將會使用空格來分隔這幾行.如果我們不希望加入空格,我們可以用下面的命令來合併:
:join!
下面的命令可以將指定的行的文本複製到寄存器中:
:range yank register
如果沒有指定寄存器,將會使用未命名寄存器.
:put命令會將寄存中的內容粘貼到指定的文本行的後面.例如要將寄存器中的內容粘貼到第五行的後面,我們可以用下面的命令:
:5put a
如果要將文本放在這一行的前面,我們可以用下面的命令:
:5put! a
:undo命令會撤銷上一次的命令操作,與u命令相類似.而:redo命令會重做撤銷的操作,與命令CTRL-R命令相類似.
如果要標記一行的開始,可以用下面的命令:
:mark {register}
如果指定了行,那麼那一行將會被標記.命令:k將會起到同樣的作用,只是我們不需要在寄存器名前加上一個空格.例如下面的命令:
:100 mark x
:100 ka
命令:preserve可以將整個文件寫入swap文件.這就使得我們可以在沒有原始文件的情況下來修復我們的編輯部分.
如果我們要執行單一的Shell命令,我們可以用下面的命令:
:!cmd
cmd就是我們要執行的系統命令.
例如要查看當前的日期,我們可以用下面的命令:
:!date
如果我們要重複上一次的Shell命令,我們可以用下面的命令來做:
:!!
最後下面的命令可以掛起Vim而進入命令提示行:
:shell
現在我們就可以執行各種的系統的命令了.在我們完成我們的工作以後,我們可以用exit命令回到Vim編輯器.
下面的一些選項可以控制命令的執行:
shell        我們要執行的命令名
shellcmdflag    跟在命令後的標記
shellquote    在命令中的引用字符
shellxquote    命令中的引用字符和重定向
shellpipe    使用管道的字符串
shellredir    重定向輸出的字符串
shellslash    在文件名中使用向前的斜線(只在DOS中使用)
命令:history可以當前命令模式下的命令歷史
Vim編輯器可以記錄各種命令的歷史,下面的標記指出所記錄的歷史類型;
c    cmd    :    命令行歷史
s    search    /    查找字符串歷史
e    expr    =    表達式寄存器歷史
i    input    @    輸入行歷史
a    all        所有的歷史
如果我們列出所有的歷史,我們可以用下面的命令:
:history all
:history命令的一般格式如下:
:history code first,last
如果沒有指定first和last,那麼就會列出所有的命令.first參數默認是指歷史第一個輸入的,而last就是指最後一個.負數是指由歷史的結束處向前的數的第幾個.例如-2是指最後個命令的輸入.
例如下面的命令列出第一個到第五個的命令行歷史:
:history c 1,5
而下面的命令則是列出了上五次的查找歷史:
:history s -5
history選項可以用來控制記錄的歷史命令數.例如我們要將記錄的歷史命令數增加爲50,我們可以用下面的命令:
:set history=50
Vim編輯器可以記錄上幾次的錯誤以及在屏幕最後一行顯示的信息.要查看這些信息,我們可以用下面的命令:
:messages
下面的命令可以使得信息的輸出在顯示在屏幕的同時會拷貝到一個文件中:
:redir > file
如果要停止拷貝,可以使用下面的命令:
:redir END
這個命令在保存調試信息時會顯得更爲有用.
我們還可以用:redir命令將輸出追加到文件中:
:redir >> file
:normal命令可以使我們執行一個正常模式下的命令.例如下面的命令是將光標下的單詞改爲DONE:
:normal cwDONE
在行這些命令時要求命令必須是一個完整的命令.如果我們已經掛起Vim然後執行命令時,Vim顯示全直到命令完全時也會發生變化.
下面的命令會將當前的文本寫入文件,然後退出:
:exit
如果我們使用!選項,即時這個文件被標記爲只讀,那麼Vim也會強行保存.
我們還可以在命令行指定一個文件名,那麼當前的內容就會在退出以前寫入我們所指定的文件,例如下面的命令:
:exit save.txt
如果我們只是想着將文件中的一部分保存到另一個文件,我們可以指定一個範圍來保存.例如要保存100行,我們可以用下面的命令:
:1,100 exit save.txt
下面的命令與:exit命令相類似,不同的是這個命令總是會保存文件:
:range wq! file
而:exit命令只是在文件發生改變時纔會保存.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章