亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

使用python開(kāi)發(fā)vim插件及心得分享

 更新時(shí)間:2014年11月04日 15:25:09   投稿:hebedich  
Vim 插件是一個(gè) .vim 的腳本文件,定義了函數(shù)、映射、語(yǔ)法規(guī)則和命令,可用于操作窗口、緩沖以及行。一般一個(gè)插件包含了命令定義和事件鉤子。當(dāng)使用 Python 編寫(xiě) vim 插件時(shí),函數(shù)外面是使用 VimL 編寫(xiě),盡管 VimL 學(xué)起來(lái)很快,但 Python 更加靈活

vim有各種強(qiáng)大的插件,這不僅歸功于其提供的用來(lái)編寫(xiě)插件的腳本語(yǔ)言vimL,還得益于它良好的接口實(shí)現(xiàn),從而支持python等語(yǔ)言編寫(xiě)插件。當(dāng)vim編譯時(shí)帶有+python特性時(shí)就能使用python2.x編寫(xiě)插件,+python3則支持python3.x,可以使用vim --version來(lái)查看vim的編譯特性。

要使用python接口,可以用:h python來(lái)查看vim提供的幫助文檔,本文做一個(gè)簡(jiǎn)單的介紹。我們都知道在vim里可以執(zhí)行bash命令,只需要:!command即可,那么vim里可以執(zhí)行python語(yǔ)句嗎?當(dāng)然可以了,vim那么強(qiáng)大!不是嗎,是嗎?!

vim中執(zhí)行python命令

在vim中可以使用py[thon] {stmt}來(lái)執(zhí)行python語(yǔ)句{stmt},你可以用:python print "Hello World!"來(lái)驗(yàn)證一下。

只能執(zhí)行一條語(yǔ)句,沒(méi)什么用,不是嗎?所以有更加強(qiáng)大的接口,語(yǔ)法如下:

py[thon] << {endmarker}
{script}
{endmarker}

這樣我們就可以執(zhí)行python腳本{script}中的內(nèi)容了。{endmarker}是一個(gè)標(biāo)記符號(hào),可以是任何內(nèi)容,不過(guò){endmarker}后面不能有任何的空白字符。看一個(gè)簡(jiǎn)單的例子,假設(shè)下面代碼保存為script_demo.vim:

function! Foo()
python << EOF
class Foo_demo:
    def __init__(self):
        print 'Foo_demo init'
Foo_demo()
EOF
endfunction

那么在vim中我們先用:source path_to_script/script_demo.vim來(lái)加載腳本,然后就可以用:call Foo()來(lái)運(yùn)行python腳本了,整個(gè)過(guò)程如圖所示:

此外,我們還可以將python腳本放到一個(gè)單獨(dú)的.py文件中,然后用pyf[ile] {file}來(lái)運(yùn)行python文件中的程序,要注意這里pyf[ile]后面的所有參數(shù)被看做是一個(gè)文件的名字。

vim模塊

我們已經(jīng)可以在vim中執(zhí)行python命令了,但是python怎么獲取vim中的一些信息呢?比如說(shuō)我想知道vim當(dāng)前緩沖區(qū)一共有多少行內(nèi)容,然后獲取最后一行的內(nèi)容,用python該怎么做呢?

于是vim提供了一個(gè)python模塊,有趣的是模塊名字就叫做vim,我們可以用它來(lái)獲取vim編輯器里面的所有信息。上面問(wèn)題用以下python腳本就可以解決了:

function! Bar()
python << EOF
import vim
cur_buf = vim.current.buffer
print "Lines: {0}".format(len(cur_buf))
print "Contents: {0}".format(cur_buf[-1])
EOF
endfunction

你可以自己加載腳本運(yùn)行一下見(jiàn)證奇跡!上面代碼出現(xiàn)了vim.current.buffer,想必你已經(jīng)從名字猜到了它的意思了,不過(guò)還是來(lái)詳細(xì)看下吧:

vim模塊中的常量

vim.buffers: 用來(lái)訪(fǎng)問(wèn)vim中緩沖區(qū)的列表對(duì)象,可以進(jìn)行如下操作:

:py b = vim.buffers[i]    # Indexing (read-only)
:py b in vim.buffers      # Membership test
:py n = len(vim.buffers)  # Number of elements
:py for b in vim.buffers: # Iterating over buffer list

vim.windows: 用來(lái)訪(fǎng)問(wèn)vim中窗口的列表對(duì)象,和vim.buffers支持的操作基本相。

vim.current: 用來(lái)訪(fǎng)問(wèn)vim中當(dāng)前位置的各種信息,比如:

vim.current.line
vim.current.buffer
vim.current.window
vim.current.tabpage
vim.current.range

vim.vvars: 類(lèi)似字典的對(duì)象,用來(lái)存儲(chǔ)global(g:)變量或者vim(v:)變量。

還有其他的一些常量,這里不做敘述。注意這里的常量并不是真正意義上的常量,你可以重新給他們賦值。但是我們應(yīng)該避免這樣做,因?yàn)檫@樣會(huì)丟失該常量引用的值?,F(xiàn)在為止我們已經(jīng)能獲取vim中數(shù)據(jù),然后用python來(lái)對(duì)其進(jìn)行操作,似乎完美了。

不過(guò)vim并沒(méi)有止步于此,它可是Stronger than Stronger!因?yàn)槲覀兛梢栽趐ython里使用vim強(qiáng)大的命令集,這樣就可以用python寫(xiě)一些常用的批處理插件,看下面簡(jiǎn)單的例子:

function! Del(number)
python << EOF
import vim
num = vim.eval("a:number")
vim.command("normal gg{0}dd".format(num))
vim.command("w")
EOF
endfunction

可以調(diào)用上面函數(shù)Del(n)用來(lái)刪除當(dāng)前緩沖區(qū)前n行的內(nèi)容(只是示例而已,現(xiàn)實(shí)中別這么做!)上面用到了eval和command函數(shù),如下:

vim模塊中兩個(gè)主要的方法

vim.command(str): 執(zhí)行vim中的命令str(ex-mode,命令模式下的命令),返回值為None,比如:

:py vim.command("%s/aaa/bbb/g")

也可以用vim.command("normal "+str)來(lái)執(zhí)行normal模式下的命令,比如說(shuō)用以下命令刪除當(dāng)前行的內(nèi)容:

:py vim.command("normal "+'dd')

vim.eval(str): 用vim內(nèi)部的解釋器來(lái)計(jì)算str中的內(nèi)容,返回值可以是字符串、字典、或者列表,比如計(jì)算12+12的值:

:py print vim.eval("12+12")

將返回結(jié)算結(jié)果24。

前面的Del函數(shù)還提供了一個(gè)number參數(shù),在vimL里面可以通過(guò)let arg=a:number來(lái)使用,在python中通過(guò)vim.eval("a:number")來(lái)使用。也可以通過(guò)參數(shù)位置來(lái)訪(fǎng)問(wèn),比如let arg=a:0或者是vim.eval("a:0")。我們可以使用"..."來(lái)代替命名參數(shù)來(lái)定義一個(gè)能接收任意數(shù)量參數(shù)的函數(shù),不過(guò)這樣只能通過(guò)位置來(lái)訪(fǎng)問(wèn)。

vim模塊還提供了一個(gè)異常處理對(duì)象vim.error,使用vim模塊時(shí)一旦出現(xiàn)錯(cuò)誤,將會(huì)觸發(fā)一個(gè)vim.error異常,簡(jiǎn)單的例子如下:

try:
    vim.command("put a")
except vim.error:
    # nothing in register a

vim模塊提供的對(duì)象

到這里你基本能用python來(lái)對(duì)緩沖區(qū)進(jìn)行基本的操作,比如刪除行或者是在指定行添加內(nèi)容等。不過(guò)在緩沖區(qū)添加內(nèi)容會(huì)很不pythoner,因?yàn)槟愕檬褂胏ommand來(lái)調(diào)用vim的i/I/a/A命令。好在有更科學(xué)的方式,那就是利用vim模塊提供的對(duì)象來(lái)進(jìn)行操作,看下面簡(jiǎn)單的例子:

function! Append()
python << EOF
import vim
cur_buf = vim.current.buffer
lens = len(cur_buf)
cur_buf.append('" Demo', lens)
EOF
endfunction

Append函數(shù)在當(dāng)前緩沖區(qū)的結(jié)尾添加注釋內(nèi)容" Demo,緩沖區(qū)對(duì)象是怎么一會(huì)兒事呢?

緩沖區(qū)對(duì)象

vim模塊提供了緩沖區(qū)對(duì)象來(lái)讓我們對(duì)緩沖區(qū)進(jìn)行操作,該對(duì)象有兩個(gè)只讀屬性name和number,name為當(dāng)前緩沖區(qū)文件的名稱(chēng)(包含絕對(duì)路徑),number為緩沖區(qū)的數(shù)量。還有一個(gè)bool屬性valid,用來(lái)標(biāo)識(shí)相關(guān)緩沖區(qū)是否被擦除。

緩沖區(qū)對(duì)象有以下幾種方法:

b.append(str): 在當(dāng)前行的下面插入新的行,內(nèi)容為str;b.append(str, n): 在第n行的下面插入新的行,內(nèi)容為str;b.append(list)
b.append(list, n): 插入多行到緩沖區(qū)中;b.range(s,e): 返回一個(gè)range對(duì)象表示緩沖區(qū)中s到e行的內(nèi)容。

注意使用append添加新行str時(shí),str中一定不能包含換行符"\n"。str結(jié)尾可以有"\n",但會(huì)被忽略掉。

緩沖區(qū)對(duì)象的range方法會(huì)返回一個(gè)range對(duì)象來(lái)代表部分的緩沖區(qū)內(nèi)容,那么range對(duì)象又有那些屬性以及方法呢? 其實(shí)在操作上range對(duì)象和緩沖區(qū)對(duì)象基本相同,除了range對(duì)象的操作均是在指定的區(qū)域上。range對(duì)象有兩個(gè)屬性start和end,分別是range對(duì)象的起始和結(jié)尾行。它的方法有r.append(str),r.append(str, n)和r.append(list),r.append(list, n)。

我們可以通過(guò)vim.windows來(lái)獲取vim中的窗口對(duì)象,我們只能通過(guò)窗口對(duì)象的屬性來(lái)對(duì)其進(jìn)行操作,因?yàn)樗鼪](méi)有提供方法或者其他接口來(lái)操作。其中只讀屬性有buffer、number、tabpage等,讀寫(xiě)屬性有cursor、height、width、valid等。具體可以查看幫助:h python-window

相關(guān)文章

最新評(píng)論