2009年12月31日 星期四

建立開機隨身碟

現在隨身碟隨便都可以拿到,反而是CD若不是在家中,反而比較難拿到。

USB Disk Storage Format Tool是由HP提供的免費軟體,可用來將USB隨身碟格式化,並且能載入開機程式,製作出具有開機功能的USB隨身碟。非HP的電腦也能使用這個工具。

主要功能為針對USB隨身碟切割出開機磁區,該工具本身並不提供開機系統檔案,使用者需額外準備,透過該工具將需要的檔案建立到系統內,才能建立適合自己的USB開機隨身碟。

不同於Windows XP內建的隨身碟格式化功能,USB Disk Storage Format Tool除了FAT、FAT32之外,也支援NTFS檔案系統的格式化。不過該工具並不支援在NTFS檔案格式下建立開機磁區。

若要使用開機隨身碟,電腦主機也需要支援USB裝置開機才行。

[2010.09.10 補充]
因為,常在做測試,開機隨身碟中會有許多可以執行的程式。
若放在根目錄中,會整個顯的非常的凌亂。因此,我在隨身碟的根目錄中建立一個USBTOOL的目錄,裡面都是放所有測試的執行檔,但是,這樣會有一個缺點,當我要執行SPFdisk時,就必需要進入USBTOOL的資料夾或者是直接在根目錄下打USBTOOL\SPFDisk,非常不順手。

在昨天同事的介紹下,知道在進入所有的系統中,都會去尋找根目錄下的AUTOEXEC.BAT這一個批次檔,並且去執行它。
要在AUTOEXEC.BAT裡面設定PATH的話,就直接在檔案設定要執行的內容。以下就是範例:
AUTOEXEC.BAT
PATH C:\USBTOOL

參考資料:
使用usb flash disk建立開機碟
用USB工具 建立開機隨身碟
HP 筆記型電腦 ─ 如何建立可開機的 USB 記憶體隨身碟
Free Boot Disks
UNetbootin
HPUSBFW 製作可開機 USB 隨身碟
MS-DOS 之基本使用

2009年12月30日 星期三

解決在vim下可以讀取Unicode的檔案

在vim下要讀取Unicode的檔案,vim要做以下的設定
:set encoding=utf-8

但是,如此一來,在windows下的gvim選單就會出現亂碼
解決方法如下
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim


砍掉目前選單,再重讀一次,選單就不會有亂碼了。

狀態列的中文訊息亂碼,則要加上下面這一行來解決

language messages zh_TW.UTF-8

若要把menu及訊息設定成英文,就可以設定為:
set langmenu=none
:lang mes en


參考資料:
讓 vim 在 Windows 下用 unicode 選單不亂碼的方法
vim簡介及如何使用Unicode或其他編碼
Linux 底下的編碼顯示問題
Linux作業系統Vim/Vi編程提速

2009年12月29日 星期二

RamDisk和Junction

在編譯project時,因會要編譯超多的檔案,所以,對I/O的讀取會相當多次~

今天由同學那裡知道原來有一個免費的軟體,叫RamDisk可以把記憶體當作硬碟來使用~

這樣就可以減少對硬碟的讀取了!不過,缺點是每一次重新開機後,資料都會不見!(不過,這可能也是優點,這就要看資料夾怎麼使用了!)

不過,還好,我有用SVN版本控制,可以在每一次要做project前,才把資料由svn把原始碼還原,所以整體上的效能和方便性還算不錯!

以下是我做的步驟~

因為Build這一個資料夾裡面放的是compiler的產物,為了要加速編譯的過程,所以,要建立一個RamBuild資料夾,而它是放在RamDisk上,而在原本的位置的會建立一個新的Build,而它是hard link到RamBuild這一個資料夾,換句話說,這樣就可以騙過系統,當它在存取Build資料夾時,實際上是在存取在RamDisk上的RamBuild資料夾,如此一來,就可以加快編譯的速度啦~

而在Linux下有hard link的功能,但是,在windows下確沒有hard link的功能,這個時候,我們要用junction的功能,它可以讓XP具有hard link的功能

1. 暫時把d:\下的Build改名為Build_bak,並同時建立一個新的Build資料夾
% move Build Build_bak && mkdir Build

2. 在RamDisk上建立一個新的資料夾RamBuild,並且把Build資料夾hard link到RamBuild資料夾
% mkdir r:\RamBuild && junction Build r:\RamBuild

3. 把所有在Build_bak資料夾下的內容複製到Build資料夾下
% xcopy Build_bak\*.* Build\ /k /e /q /y

4. 為了計算編譯的時間,所以,預先取得編譯前的時間
% set OLDTIME=%time%

5. 開始編譯,其中,若要使用到其它bat檔,當它執行完時,再回來繼續執行剩下的程式碼,則必需要使用到call,若沒有使用call的話,而直接使用bat檔的話,則當bat檔執行完後,馬上結束,不會執行這一個bat檔剩下的程式碼
% cd Build && call MultiMake.bat

6. 取得編譯完後的時間
% set NEWTIME=%time%

7. 把編譯完成之後的結果複製到Build_bak資料夾中,這裡要注意的是,這裡的Build資料夾,因為透過junction,同時也代表在RamDisk下的RamBuild資料夾,也就是存放compiler後的產物放的位置
% cd .. && xcopy Build\*.* Build_bak\ /k /e /q /y

8. 移除Build資料夾hard link到RamBuild資料夾的特性,並且把Build_bak改名為Build
% junction -d Build && move Build_bak Build

9. 刪除在RamDisk下的RamBuild資料夾,另外,因為XP沒有deltree,必需要另外到這一個頁面下載
% deltree /y r:\RamBuild

10. 顯示編譯前的時間與編譯後的時間
% echo Start Time %OLDTIME%
% echo End   Time %NEWTIME%


以下是完整的程式碼,在bat檔中,rem是表示註解的意思
fastmake.bat
rem rename Build to Build_bak
move Build Build_bak && mkdir Build

rem create a new file r:\RamBuild, if success hard link Build to r:\RamBuild in the RamDisk
mkdir r:\RamBuild && junction Build r:\RamBuild

rem copy all the Build_bak file to Build
xcopy Build_bak\*.* Build\ /k /e /q /y

rem get the current time before compiler
set OLDTIME=%time%

rem compiler...
cd Build && call MultiMake.bat

rem get the current time after compiler
set NEWTIME=%time%

rem copy the result to Build_bak
cd .. && xcopy Build\*.* Build_bak\ /k /e /q /y

rem delete the junction folder and renmae Build_bak to Build
junction -d Build && move Build_bak Build

rem delete all the file in the r:\RamBuild
deltree /y r:\RamBuild

rem show the time before compiler
echo Start Time %OLDTIME%

rem show the time after compiler
echo End   Time %NEWTIME%


MultiMake.bat
因為,不知道什麼原因,必需要重覆nmake多次才會成功,因此,在這裡設定最大try 20次
rem because there is no-reason problem, we have nmake multi-time

@echo off

rem set the MaxTry
set MaxTry=20

rem set the current count to record the TryCount
set Count=0

:start
rem when Count is less or equal than MaxTry, Count will plus one and nmake again
rem If the nmake is fail, the process will go to start label.
rem If the nmake is success, the process will go to next line instead of going to start label.

if %Count% LEQ %MaxTry% set /A Count=Count+1 && echo this is %Count% times && nmake || goto start

IF %Count% GTR %MaxTry% (
  echo exceed MaxTry, compiler fail!!!!!.
) ELSE (
  echo Compiler success!!!!!.
)

:end


[2010.01.07 補充]
也可以使用RamDisk來加快,瀏覽器的存取~

1. 首先需要先安裝 RAMDisk 軟體,把記憶體拿來劃成硬碟使用。可以參考這裡

2. 我自己是把 RAMDisk 設成 R:\

Internet Explorer
3. 開啟 IE > 工具 > 網際網路選項 > 設定 > 移動資料夾 > 指向 R:\IECache

4. 重新啟動 IE

Firefox
5. 開啟 Firefox 後,在網址列上敲上 about:config

6. 新增 > 字串 > 鍵入 "browser.cache.disk.parent_directory" > 填上字串值 "R:\FirefoxCache"

7. 確認是否有browser.cache.disk.smart_size_cached_value,若沒有新增為數值類型,並且填上225280為其數值

8. browser.cache.disk.smart_size.enabled確定為true

8. 重新啟動 Firefox

9. 在網址列寫入about:cache
可以看到目前cache的設定

Chrome
8. 直接在Chrome在捷徑加上一個參數: --disk-cache-dir=R:\ChromeCache ("R:\ChromeCache"位置可自訂)

現在 IE, Firefox, Chrome 瀏覽時的暫存檔案都會放在 RAMDisk R:\ 上,理論上是比暫存在硬碟上快些。有興趣的朋友,不妨嘗試看看囉~

[2010.01.16 補充]
以下的bat檔案,主要是在編譯不同的檔案的時候,要使用不同的compiler,這個時候要用junction來指到不同的compiler,這一個bat可以讓使用者選擇要建立Junction資料夾或是移除Junction資料夾~

@echo off

rem build a hard link from DEVTLS to target-directory
rem redirect-DEVTLS target-directory
rem Example: redirect-DEVTLS D:\DEVTLS_Tool\NTC_DEVTLS


set /P UserSelect=1. Redirect DEVTLS 2. Remove Junction Direct (D:\DEVTLS):
if %UserSelect% EQU 1 goto Redirect
if %UserSelect% EQU 2 goto Undirect
echo Your choice out of option
goto end

:Redirect
echo ==========Redirect option==========
set /P UserInput=Please input the target DEVTLS directory(ex: D:\DEVTLS_Tool\NTC_DEVTLS):

rem test the DEVTLS exist or not
IF EXIST DEVTLS (
rem DEVTLS exists, remove junction directory
junction -d DEVTLS || goto fail
echo remove the original junction directory successfully
)

rem Test the target directory
IF EXIST %UserInput% (
rem If exists, create junction directory from %UserInput% to DEVTLS
junction DEVTLS %UserInput% || goto fail
echo build create junction directory form %UserInput% to DEVTLS successfully
goto success
) ELSE (
echo target %UserInput% doesn't exist
goto fail
)

:Undirect
echo ==========Undirect option==========
rem test the DEVTLS exist or not
IF EXIST DEVTLS (
rem DEVTLS exists, remove junction directory
junction -d DEVTLS || goto fail
echo remove the original junction directory successfully
goto success
) ELSE (
echo DEVTLS doesn't exist
goto fail
)

:success
goto end

:fail
goto end

:end
echo End of Bat File...
pause


[2010.05.11 補充]
@ECHO OFF

REM build a hard link from DEVTLS to target-directory
REM redirect-DEVTLS target-directory
REM Example: redirect-DEVTLS D:\DEVTLS_Tool\NTC_DEVTLS

REM Initial the Junction folder
REM If mark SET JunctionTarget, this bat will ask user the JunctionTarget when proceduring

SET JunctionTarget=

REM ===========================================================================
REM ==== GET&SET SOURCE AND TARGET PATH (DO NOT MODIFY) =======================

IF "%JunctionTarget%" NEQ "" GOTO JunctionProcedure
ECHO ========== SET JunctionTarget Folder ==========
SET /P JunctionTarget=Please input the target directory (ex: D:\DEVTLS):

:JunctionProcedure
ECHO ========== User Selection ==========
ECHO 1. Redirect %JunctionTarget%
ECHO 2. Remove Junction Direct (%JunctionTarget%)
SET /P UserSelect=User Select:
IF %UserSelect% EQU 1 GOTO Redirect
IF %UserSelect% EQU 2 GOTO Undirect
ECHO Your choice out of option
GOTO End

:Redirect
ECHO ========== Redirect option ==========
SET /P JunctionSource=Please input the source directory(ex: D:\DEVTLS_Tool\NTC_DEVTLS):

REM test the %JunctionTarget% exist or not
IF EXIST %JunctionTarget% (
REM %JunctionTarget% exists, remove junction directory
junction -d %JunctionTarget% || GOTO Fail
ECHO Remove the original junction directory successfully
)

REM Test the source directory
IF EXIST %JunctionSource% (
REM IF exists, create junction directory from %JunctionSource% to %JunctionTarget%
junction %JunctionTarget% %JunctionSource% || GOTO Fail
ECHO Create junction directory form %JunctionSource% to %JunctionTarget% successfully
GOTO Success
) ELSE (
ECHO target %JunctionSource% doesn't exist
GOTO Fail
)

:Undirect
ECHO ========== Undirect option ==========
REM test the %JunctionTarget% exist or not
IF EXIST %JunctionTarget% (
REM %JunctionTarget% exists, remove junction directory
junction -d %JunctionTarget% || GOTO Fail
ECHO Remove the original junction directory successfully
GOTO Success
) ELSE (
ECHO %JunctionTarget% doesn't exist
GOTO Fail
)

:Success
GOTO End

:Fail
GOTO End

:End
ECHO End of Bat File...
PAUSE


參考資料:
Gavotte Ramdisk 免費「虛擬硬碟」使用教學
密技 / 塞爆4G記憶體! Gavotte Ramdisk 32 bit XP
Junction v1.05
Gavotte RAMDisk
用gavotte的ramdisk碰到問題~求解
用mklink與junction建立資料夾連結
拿 RAMDisk 加速 Firefox, IE 的瀏覽速度
Gavotte Ramdisk 使用心得
介紹好用工具:Junction ( Windows 版的 symbolic link )

2009年12月22日 星期二

vim 分割視窗功能

使用vim來比較檔案
因為比較後的結果是使用分割視窗來顯示,所以,把它放在這一個單元
% vim -d file1 file2

例子:
一開始的檔案before.txt內容為
aaaa
dddd
cccc
hhhh


而之後的檔案after.txt內容為
aaaa
xxxx
yyyy
cccc


最後,執行以下的指令
% vim -d before.txt after.txt
會出現以下的比較畫面

紅色的意思應該是說,把左邊第二行改為右邊第二行,算是屬於修改的部分!

而右邊第三行與左邊第三行表示右邊新增一個yyyy的內容

而第五行則表示邊新增一個hhhh的內容

[2010.03.13 補充]
:split 分割視窗(可加檔名順便開啟另一檔案)
:diffsplit xxx 以分割視窗和檔案xxx做比較(diff)
Ctrl-W p 跳到前一個分割視窗(在兩個分割窗來回切換)
Ctrl-W j 跳到下面的分割窗
Ctrl-W h 跳到左邊的分割窗
Ctrl-W k 跳到上面的分割窗
Ctrl-W l 跳到右邊的分割窗

參考資料:
給程式設計師的Vim入門圖解說明

vim tab功能

在vim下,可以使用類似firefox, kkman,在一個應用程式中,可以有多個畫面!
我主要分成兩大類!

一個是使用:split:vsplit,把一個畫面同時分成兩個以上的畫面,用這一個的好處就是,可以「同時」看到多個檔案開啟!

而另一個就是使用tab的方式,雖然一次只能看到一個畫面,但是,開啟多個檔案的時候,不會讓windows最下面的開啟檔案非常的複雜~而且,檔案之間,仍然可以使用vim內建的copy功能(像是yy, p...等等指令)~而這一個也是本篇文章要提到的主題~

一次 vi 數個檔案來作編輯,預設 vim (也就是 vi) 同時可開 10 個 tab (這可以透過 set tabpagemax= 的方式設定,將它加大或減少)。

也就是說,當你想同時 vim 三個檔案 (例如 file1、file2、file3),可以:

vim -p file1 file2 file3

還可以:set tabline來定義 tab 顯示方式

tab相關的功能為:
=========================================
:tabdo
可以同時對目前的所有已開啟的tabfile執行相同的動作,這一個動作對我非常有用
例如:對目前所有用tab開啟的檔案內容把originalstring轉換成newstring
:tabdo %s/originalstring/newstring/gc

另一個例子,把所有的檔案中,有Caspar-comment的行刪掉
:tabdo %!grep -v Caspar-comment
如此一來真的可以省下非常多的打指令的時間

[start-20100307-add]
可以直接使用vim內建的功能達到,而不需要使用到外部指令
:g/.*Caspar-comment.*/d
[end-20100307-add]
=========================================
:tabn(ext)
當有多個tab的時候,在execute mode下打:tabn就是移動到下一個tab
括號的部分可以打,若不打的話,就是簡寫
或是 gt, C-PageDown也可以達到相同的效果
=========================================
:tabp(revious)
當有多個tab的時候,在execute mode下打:tabp就是移動到上一個tab
或是 gT, C-PageUp也可以達到相同的效果
=========================================
:tabs
顯示目前的所有tab的情況
=========================================
:tabnew filename
開啟一個新的tab;後面可以接新的檔案名稱
=========================================
:tabe(dit) filename
開啟一個檔案,當檔案不存在的時候,直接開啟一個新的檔案
=========================================
:tabc(lose)
關掉目前正在使用的tab分頁
=========================================
:tabo
關閉其它tab分頁
=========================================
:tab(fi)r(st)
跳到編號為1號的tab分頁
=========================================
:tabfind filename
尋找名為filename的tab分頁
=========================================
:tabl(ast)
跳到編號為最後一號的tab分頁
=========================================
:tabm [N]
移動到編號為N的tab分頁
=========================================
在vimrc內容中,加入熱鍵
" 加入tabnew, tabprevious, tabnext的快速鍵
nmap <C-t> :tabnew<CR>
nmap <C-Left> :tabprev<CR>
nmap <C-Right> :tabnext<CR>

=========================================
在新的tab頁面顯示help頁面
:tab help
=========================================
參考資料:
Vim 的小玩意: tab 怎麼玩?
vim tab 功能
My editor ,Vim
Vim7 的 <C-Left> 與 <C-Right>
VIM Tab & Space
Vim Hacks

把Vim折疊(folding)

在我要去上免費課程vim之前,我把「大家來學 Vim一個歷久彌新的編輯器」看過一遍之後,
原本我認為vim的folding是不重要的!但是,在經過上次去上過免費課程vim之後,覺得似乎有那麼一點噱頭~
所以,就打算寫這一篇文章!

突然發現,vim的文章在我的blog越來越多了,所以,就新增一個vim的tag吧~

其實,大部分就是參考「大家來學 Vim一個歷久彌新的編輯器」的內容,新增這一篇文章是可以把在學習過程中使用到的相關資訊補充在這裡!

折疊的產生
zfap 將游標所在處的那個段落折疊成一行。
zf7G 自游標所在處至全文第 7 行折疊起來。
:3,9fold 將第 3 行至第 7 行折疊起來。
5zF 將游標所在處起算 5 行的內容折疊起來。

也可以將所要折疊的部份以 Shift+v 標記起來,然以按 zf 就會將標記的內容折疊起來。

折疊的操作

zo 將游標所在處的折疊打開。open。
zc 將游標所在處已打開的內容再度折疊起來。close。
zr 將全文的所有折疊依層次通通打開。reduce。
zm 將全文已打開的折疊依層次通通再折疊起來。more。
zR 作用和 zr 同,但會打開含巢狀折疊(折疊中又還有折疊)的所有折疊。
zM 作用和 zm 同,但對於巢狀折疊亦有作用。
zi 這是個切換,是折疊與不折疊指令間的切換。
zn 打開全文的所有折疊。fold none。
zN 這是 zn 的相對指令,回復所有的折疊。

折疊的記憶
我們可以使用:mkview把折疊的情形記憶起來,下一次載入同一個檔案時就可以下:loadview,記憶起以前折疊的情況。

另外,這裡要注意一點的是,在Linux下,若你的家目錄下沒有.vimfiles\的話,就出現以下錯誤
Cannot create directory: ~/.vimfiles/view
這個時候,只要在家目錄下,新增一個.vimfiles就可以了。

而在Windows下使用GVimportable的話,就必需要在App\vim\下建立一個vimfiles就可以了~

當完成上述的步驟之後,在到execute mode輸入:mkview就可以把目前的folding情況儲存起來了!而下次打開檔案的時候,在execute mode下輸入:loadview就可以把上次這一個檔案的folding載入進來~

自動折疊
以縮行為依據
:set foldmethod=indent 就會依縮行來折疊,本來預設是 :set foldmethod=normal。請注意,此時手動折疊的設定會被停止無法使用。

以特殊的表示法為依據
:set foldmethod=expr,另外還要設定 :set foldexpr=...,可參考線上使用手冊:h fold-expr的例子。

以語法為依據
這是在定義語法(syntax)檔時同時加入折疊的定義。然後,set foldmethod=syntax就會依照這個語法定義檔去折疊,請:h syn-fold

以是否更改過為依據
這在進入 vimdiff(即 vim -d file1 file2) 時會自動進入foldmethod=diff的模式,因此要 diff 設定項設在同一個螢幕顯示才行。以便整體的瀏覽。當然要自行更改預設值亦可。預設是:

setlocal diff foldmethod=diff scrollbind nowrap foldlevel=1

這樣一來,兩個檔案相同的部份會折疊起來,沒有折疊的部份就是有差異的地方。

以文件上的標誌為依據
這是跟據文章中的標誌(marker)來做折疊。這些標誌,起於{{{,止於}}},這中間的部份會折疊起來。通常這些標誌是藏在註解欄裡頭,例如 C 程式碼的/**/之間,shell script 的#之後,Vim script 的"之後,得視程式語言的不同而定,因此一般的文章就不適合使用了。

這些預設的標誌也可以由 foldmarker 來更改,但為了文件的流通性,建議使用預設值就可以了。

當然,一些程式碼載入時再來設定:set foldmethod=marker就太麻煩了,這個設定可以設在文件內,例如:
#!/bin/sh
# 這是一個 sh script
# {{{
……
這裡是 script 內容,由 vim 打開這
個檔時,這個部份會自動折疊起來。
……
# }}}
# vim:fdm=marker:ts=2

最後一項不是很懂,留到以後再說吧~

參考資料:
把 Vim 折疊(folding)?

2009年12月19日 星期六

Vim script

按鍵對應

[實例] :map <F5> bi{<Esc>ea}<Esc>
這樣一來,只要在英文單字任意處按 F5,這個英文單字的前後就會加上大括號。

說明如下:
bi{<Esc> 按 b 移至英文單字的第一個字母處,並按 i 進入插入模式,寫入 { 這個字元,並按 Esc 鍵,回復常態模式。
e 移動至這個英文單字的最後一個字母處。
a}<Esc> 進入插入 append 模式,並輸入 } 這個字元,再回到常態模式。

需注意的是,在命令列模式前頭會有個冒號,因為在 vim 裡頭,要按個冒號才會進入命令列模式。但如果是設在 Vim script 檔裡頭當然就沒有冒號了。以上的例子也是可以對應至一些較容易記憶的按鍵,例如:

map ,b bi{<Esc>ea}<Esc>

這樣按 ``,b'' 就會有同樣的作用,但 ``,'' 及 ``b'' 之間不能相隔太久的時間,這樣 Vim 才會知道這兩個按鍵是結合在一起的。而 b 在此就代表 braces(大括號)。

如果要知道目前的按鍵對應的情形,可 :map 就會列出所有的目前按鍵對應,前面標示的記號就是各種模式的代表字母,例如 n 代表 normal,i 代表 insert。

縮寫對應
縮寫對應是把一長串的字串對應到簡單的幾個代表性字串。縮寫的對應只能用在插入模式、取代模式及命令列模式。主要用於輸入時節省時間及避免拼錯。這裡利用例子來做說明:

[實例] :ab gl GNU Linux
把 gl 這個按鍵對應成 GNU Linux。

ab 是 abbreviate 的縮寫,這樣一來,在插入模式時,只要輸入 gl,再按 Sapce 鍵或 Ctril+],這個 gl 就會變成 GNU Linux 這個字串。SapceCtril+] 的區別在於前者會多留個空白,方便繼續輸入其他文字;而後者則不會多留個空白。要注意的是,這在取代模式、命令列模式也是可以作用,如果是使用 :ia[bbrev],那只會在插入模式及取代模式有作用。

以下是一些常會用到的指令:

:ab[breviate] 不接任何參數,這會列出目前所有的縮寫對應。其中標有 `i' 的,代表作用於插入模式;標有 `c' 的,代表作用於命令列模式;標有 `!' 的,則兩種模式皆有作用。
:ab gl 這會列出 gl 是對應成什麼字串。
:una[bbreviate] gl 取消 gl 這個對應。
:ia[bbrev] 和 :ab 的定義一樣,但只作用於插入模式。
:cb[bbrev] 和 :ab 的定義一樣,但只作用於命令列模式。
:norea[bbrev] 用於防止重對應已有對應的字串。
:abc[lear] 取消所有由 :ab 所定義的對應。
:iabc[lear] 取消所有由 :ia 所定義的對應。
:cabc[lear] 取消所有由 :ca 所定義的對應。

" 設定加入函式註解的快速鍵(F5)
nmap <F5> o<Home>/*++^M^M<Home>Routine Description:^M<Home>  Description context^M^M<Home>Arguments:^M<Home>  Variable                  - the description for variable^M^M<Home>Returns:^M<Home>  EFI_SUCCESS               - operation successfully^M^M<Home>--*/<Esc>
其中^M是表示Enter動作,需要用Ctrl+v+M產生出來,其中nmap是表示只有在normal才會有作用,另外,要注意的是,上面的所有資料都是在同一行

[2010.10.10 補充]
設定在visual mode時有效的map
vunmap

參考資料:
Vim script 簡介