2009/03/31

輕輕鬆鬆寫VIM plugin: 變數及表示式

在開始之前,必需先介紹一下如何建立一個測試環境,小弟本身是有用兩種開發方式,一是開發小功能時用的,另一則是真正在開發一個plugin時用的。

先來介紹第一種開發小功能的環境,一般小弟會先在_vimrc裡建一個函式,接著再用map指令將這個函式對應到一個快速鍵,舉例來說在_vimrc裡插入以下指令將會建立一個foo函式,並且當輸入rfa時會呼叫到它。

map rfa <ESC>:call Foo()<CR>
function! Foo()
echo "Hello world 1"
endfunction


藉此我們便可將小功能先放在_vimrc裡測試,等到功能成熟時再建立一個plugin。此外,若是在反覆測試這個函式時,不想每次做小更動就必需重開VIM讓它reload檔案,可以在更動完後用:source指令來使檔案重新生效。如下,將使_vimrc的設定重新讀取:

:source $VIM\_vimrc


第二種方式就較為複雜,這種方式會用在開發一個plugin時使用,因為它包含了一個plugin前後的一些readme、檢查、command或keymap,所以目前還先不介紹。等到這些基本的語法講解完後,準備踏入plugin開發時才會說明。接著將進入本篇的主題,說明時我儘可能用範例說,少說一些廢話。


常數

數字常數除了一般十進位外,16進位的prefix為0x,8進位的為0,請看以下例子。
:echo 0x7f 036
127 30
:echo 0x7f - 036
97


字串常數則有分單引號括住及雙引號,單引號的會乎略跳脫字元,VIM的跳脫字元有很下這些:
\t <Tab>
\n <NL>, line break
\r <CR>, <Enter>
\e <Esc>
\b <BS>, backspace
\" "
\\ \, backslash
\<Esc> <Esc>
\<C-W> CTRL-W



變數

變數的命令規則跟C很像,這個不再贅述,而VIM的變數根據類型及生存空間有以下幾種:
b:name variable local to a buffer
w:name variable local to a window
g:name global variable (also in a function)
v:name variable predefined by Vim
$NAME environment variable
&name option
@r register (list all by :reg)


變數的建立及刪除有檢查存在,可用2個指令及1個函式
let
unlet
exists("s:call_count")


請看以下例子:
:if !exists("s:call_count")
: let s:call_count = 0
:endif
:echo "called" s:call_count "times"


NOTE: 關於if判別式,若是字串型態則VIM會將它自動轉成數字型態,轉成數字型態的字串是根據字串開頭的數字當成轉型後結果。若是程式寫了如下的判別式
:if "true"

則會回傳0,表false,因true的字首為t,不為一個數字,故回傳0。


表示式

數字運算
a + b add
a - b subtract
a * b multiply
a / b divide
a % b modulo


字串串接
:echo "foo" . "bar"
foobar


執行表示式(:execute)用在用我們的命令需插入變數時使用,:execute的行為與eval是十分相似(或是一樣)的,請見以下例子。
:execute "normal " . normal_commands

:let optname = "path"
:let optval = eval('&' . optname)

:exe 'let optval = &' . optname

No comments: