首先需要再編譯vim的時候enable perl;
Perl介面的使用 *perl-using* *:perl* *:pe*:pe[rl] {cmd}
執行Perl命令{cmd}
。當前包是“main”。:pe[rl] << {endpattern}
{script}
{endpattern}
執行Perl指令碼{script}
。 {endpattern}
不能有任何前置空格。如果忽略了{endpattern}
, 就會像|:append|和|:insert|命令那樣預設到達一個點'.'。 |:perl|命令的這種形式主要是用來在vim指令碼裡麵包含perl代 碼。 備忘:當Perl沒有被編譯進vim時這條命令不能工作。為了避 免出錯請參考|script-here|。vim指令碼樣本:
function! WhitePearl()
perl << EOF
VIM::Msg("pearls are nice for necklaces");
VIM::Msg("rubys for rings");
VIM::Msg("pythons for bags");
VIM::Msg("tcls????");
EOF
endfunction
*:perldo* *:perld*:[range]
perld[o] {cmd}
對[range]
中的每行執行Perl命令{cmd}
,同時$_依次被賦值 為每行的文本,但不包括行尾的<EOL>
。改變$_會改變每行 的內容,但是用這個命令不能添加或者刪除行。[range]
的 預設值是整個檔案:"1,$"。可以試一下下面的代碼:
:perl $a=1
:perldo $_ = reverse($_);1
:perl VIM::Msg("hello")
:perl $line = $curbuf->Get(42)
*E299*在|sandbox|執行Perl命令是受限制的。":perldo"根本就不能執行。如果可能,":perl"會在安全環境下被執行。 *perl-overview*下面是在Perl下可用的函數概要:
:perl VIM::Msg("Text") # 顯示資訊
:perl VIM::Msg("Error", "ErrorMsg") # 顯示錯誤資訊
:perl VIM::Msg("remark", "Comment") # 顯示突出的資訊
:perl VIM::SetOption("ai") # 設定一個vim選項
:perl $nbuf = VIM::Buffers() # 返回緩衝區的個數
:perl @buflist = VIM::Buffers() # 返回所有緩衝區的數組
:perl $mybuf = (VIM::Buffers('qq.c'))[0] # 返回一個'qq.c'的緩衝區對象
:perl @winlist = VIM::Windows() # 返回所有視窗的數組
:perl $nwin = VIM::Windows() # 返回視窗的個數
:perl ($success, $v) = VIM::Eval('&path') # $v: option 'path', $success: 1
:perl ($success, $v) = VIM::Eval('&xyz') # $v: '' and $success: 0
:perl $v = VIM::Eval('expand("<cfile>
")') # 展開檔案<cfile>
:perl $curwin->SetHeight(10) # 設定視窗高度
:perl @pos = $curwin->Cursor() # 返回座標(row, col)
:perl @pos = (10, 10)
:perl $curwin->Cursor(@pos) # 把游標位置設為@pos
:perl $curwin->Cursor(10,10) # 把游標位置設為第10行第10列
:perl $mybuf = $curwin->Buffer() # 返回視窗的緩衝區對象
:perl $curbuf->Name() # 返回緩衝區名字
:perl $curbuf->Number() # 返回緩衝區號碼
:perl $curbuf->Count() # 返回行數
:perl $l = $curbuf->Get(10) # 返回第10行
:perl @l = $curbuf->Get(1 .. 5) # 返回第1到第5行
:perl $curbuf->Delete(10) # 刪除第10行
:perl $curbuf->Delete(10, 20) # 刪除第10-20行
:perl $curbuf->Append(10, "Line") # 在第10行後面添加一行
:perl $curbuf->Append(10, "Line1", "Line2", "Line3") # 在第10行後面添加三行
:perl @l = ("L1", "L2", "L3")
:perl $curbuf->Append(10, @l) # 添加 L1, L2 和 L3
:perl $curbuf->Set(10, "Line") # 替換第10行
:perl $curbuf->Set(10, "Line1", "Line2") # 替換第10行和第11行
:perl $curbuf->Set(10, @l) # 分別用L1,L2和L3替換10-12行
*perl-Msg*VIM::Msg({msg}
, {group}
?) 顯示訊息{msg}
。可選{group}
參數指定用來顯示這個訊息的 突出方式。 *perl-SetOption*VIM::SetOption({arg}
) 設定一個vim選項。{arg}
可以是任何":set"命令能接受的參數。 這就意味著參數裡面不允許有空格!見|:set|。 *perl-Buffers*VIM::Buffers([{bn}
...]) 沒有參數的時候,在列表上下文裡面返回所有緩衝區的列表 或者在標量上下文時返回緩衝區的個數。對於一個緩衝區名字 列表或者數量{bn}
,返回匹配{bn}
的緩衝區列表,與Vim內部函 數|bufname()|使用同樣的規則。 *perl-Windows*VIM::Windows([{wn}
...]) 沒有參數的時候,在列表上下文裡面返回所有視窗的列表或者在 標量上下文時返回視窗的個數。對於一個視窗名字數量列表{wn}
, 返回匹配{wn}
的視窗列表。 *perl-DoCommand*VIM::DoCommand({cmd}
) 執行 Ex 命令 {cmd}
. *perl-Eval*VIM::Eval({expr}
) 對{expr}
求值並返回(success,val)。success=1表示val包含{expr}
的值。success=0表示運算式求值失敗。‘@x’返回寄存器x的內容, '&x'返回選項x的值,'x'返回內部變數x的值,'$x'等價魚perl中的 $ENV{x}
。所有再命令列可以訪問的函數都對{expr}
有效。 *perl-SetHeight*Window->SetHeight({height}
) 在螢幕允許的前提下把視窗的高度設定為{height}
。 *perl-GetCursor*Window->Cursor({row}
?, {col}
?) 在沒有參數的情況下,返回視窗游標所處位置的座標(row,col)。 當有參數{row}
和{col}
的情況下,把視窗游標的位置設為{row}
和{col}
。注意{col}
是Perl風格的,從0數起的,比Vim的尺度 小1。Window->Buffer() *perl-Buffer* 返回給定視窗的緩衝區對象。 *perl-Name*Buffer->Name() 返回緩衝區的檔案名稱。 *perl-Number*Buffer->Number() 返回緩衝區的數量。 *perl-Count*Buffer->Count() 返回緩衝區中的行數。 *perl-Get*Buffer->Get({lnum}
, {lnum}
?, ...) 對每個指定的{lnum}
,返回緩衝區中第{lnum}
行的文本字元 串。通過指定一個{lnum}
列表可以傳遞一個數組。 *perl-Delete*Buffer->Delete({lnum}
, {lnum}
?) 刪除緩衝區的第{lnum}
行。當有第二個參數{lnum}
時,刪除 由第一個{lnum}
到第二個{lnum}
指定的範圍。 *perl-Append*Buffer->Append({lnum}
, {line}
, {line}
?, ...) 把每個{line}
字串添加到緩衝區的第{lnum}
行後面。{line}
列表可以是一個數組。 *perl-Set*Buffer->Set({lnum}
, {line}
, {line}
?, ...) 替代緩衝區從第{lnum}
行開始,由{lines}
指定的一行或者多行。 {line}
列表可以是一個數組。如果參數無效,就不作替代。$main::curwin 當前視窗對象。$main::curbuf 當前緩衝區對象。 *script-here*當使用嵌入式指令碼語言是,你可能想在語言不支援時跳過這些。但是這個機制不能工作: if has('perl')
perl << EOF
this will NOT work!
EOF
endif
取而代之,把Perl/Python/Ruby/等的命令放在一個函數裡面並調用他: if has('perl')
function DefPerl()
perl << EOF
this works
EOF
endfunction
call DefPerl()
endif
備忘: "EOF"必須在行首(前面不能有前置空格)。
以上摘自http://man.chinaunix.net/newsoft/vi/doc/if_perl.html
有空想想如何使用幹這些api寫一個自己vim外掛程式