使用python開發vim外掛程式及心得分享_python

來源:互聯網
上載者:User

vim有各種強大的外掛程式,這不僅歸功於其提供的用來編寫外掛程式的指令碼語言vimL,還得益於它良好的介面實現,從而支援python等語言編寫外掛程式。當vim編譯時間帶有+python特性時就能使用python2.x編寫外掛程式,+python3則支援python3.x,可以使用vim --version來查看vim的編譯特性。

要使用python介面,可以用:h python來查看vim提供的協助文檔,本文做一個簡單的介紹。我們都知道在vim裡可以執行bash命令,只需要:!command即可,那麼vim裡可以執行python語句嗎?當然可以了,vim那麼強大!不是嗎,是嗎?!

vim中執行python命令

在vim中可以使用py[thon] {stmt}來執行python語句{stmt},你可以用:python print "Hello World!"來驗證一下。

只能執行一條語句,沒什麼用,不是嗎?所以有更加強大的介面,文法如下:

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

這樣我們就可以執行python指令碼{script}中的內容了。{endmarker}是一個標記符號,可以是任何內容,不過{endmarker}後面不能有任何的空白字元。看一個簡單的例子,假設下面代碼儲存為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來載入指令碼,然後就可以用:call Foo()來運行python指令碼了,整個過程如圖所示:

此外,我們還可以將python指令碼放到一個單獨的.py檔案中,然後用pyf[ile] {file}來運行python檔案中的程式,要注意這裡pyf[ile]後面的所有參數被看做是一個檔案的名字。

vim模組

我們已經可以在vim中執行python命令了,但是python怎麼擷取vim中的一些資訊呢?比如說我想知道vim當前緩衝區一共有多少行內容,然後擷取最後一行的內容,用python該怎麼做呢?

於是vim提供了一個python模組,有趣的是模組名字就叫做vim,我們可以用它來擷取vim編輯器裡面的所有資訊。上面問題用以下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

你可以自己載入指令碼運行一下見證奇蹟!上面代碼出現了vim.current.buffer,想必你已經從名字猜到了它的意思了,不過還是來詳細看下吧:

vim模組中的常量

vim.buffers: 用來訪問vim中緩衝區的列表對象,可以進行如下操作:

: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: 用來訪問vim中視窗的列表對象,和vim.buffers支援的操作基本相。

vim.current: 用來訪問vim中當前位置的各種資訊,比如:

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

vim.vvars: 類似字典的對象,用來儲存global(g:)變數或者vim(v:)變數。

還有其他的一些常量,這裡不做敘述。注意這裡的常量並不是真正意義上的常量,你可以重新給他們賦值。但是我們應該避免這樣做,因為這樣會丟失該常量引用的值。現在為止我們已經能擷取vim中資料,然後用python來對其進行操作,似乎完美了。

不過vim並沒有止步於此,它可是Stronger than Stronger!因為我們可以在python裡使用vim強大的命令集,這樣就可以用python寫一些常用的批處理外掛程式,看下面簡單的例子:

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

可以調用上面函數Del(n)用來刪除當前緩衝區前n行的內容(只是樣本而已,現實中別這麼做!)上面用到了eval和command函數,如下:

vim模組中兩個主要的方法

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

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

也可以用vim.command("normal "+str)來執行normal模式下的命令,比如說用以下命令刪除當前行的內容:

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

vim.eval(str): 用vim內部的解譯器來計算str中的內容,傳回值可以是字串、字典、或者列表,比如計算12+12的值:

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

將返回結算結果24。

前面的Del函數還提供了一個number參數,在vimL裡面可以通過let arg=a:number來使用,在python中通過vim.eval("a:number")來使用。也可以通過參數位置來訪問,比如let arg=a:0或者是vim.eval("a:0")。我們可以使用"..."來代替具名引數來定義一個能接收任意數量參數的函數,不過這樣只能通過位置來訪問。

vim模組還提供了一個異常處理對象vim.error,使用vim模組時一旦出現錯誤,將會觸發一個vim.error異常,簡單的例子如下:

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

vim模組提供的對象

到這裡你基本能用python來對緩衝區進行基本的操作,比如刪除行或者是在指定行新增內容等。不過在緩衝區新增內容會很不pythoner,因為你得使用command來調用vim的i/I/a/A命令。好在有更科學的方式,那就是利用vim模組提供的對象來進行操作,看下面簡單的例子:

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

Append函數在當前緩衝區的結尾添加註釋內容" Demo,緩衝區對象是怎麼一會兒事呢?

緩衝區對象

vim模組提供了緩衝區對象來讓我們對緩衝區進行操作,該對象有兩個唯讀屬性name和number,name為當前緩衝區檔案的名稱(包含絕對路徑),number為緩衝區的數量。還有一個bool屬性valid,用來標識相關緩衝區是否被擦除。

緩衝區對象有以下幾種方法:

b.append(str): 在當前行的下面插入新的行,內容為str;b.append(str, n): 在第n行的下面插入新的行,內容為str;b.append(list)
b.append(list, n): 插入多行到緩衝區中;b.range(s,e): 返回一個range對象表示緩衝區中s到e行的內容。

注意使用append添加新行str時,str中一定不能包含分行符號"\n"。str結尾可以有"\n",但會被忽略掉。

緩衝區對象的range方法會返回一個range對象來代表部分的緩衝區內容,那麼range對象又有那些屬性以及方法呢? 其實在操作上range對象和緩衝區對象基本相同,除了range對象的操作均是在指定的地區上。range對象有兩個屬性start和end,分別是range對象的起始和結尾行。它的方法有r.append(str),r.append(str, n)和r.append(list),r.append(list, n)。

我們可以通過vim.windows來擷取vim中的視窗對象,我們只能通過視窗對象的屬性來對其進行操作,因為它沒有提供方法或者其他介面來操作。其中唯讀屬性有buffer、number、tabpage等,讀寫屬性有cursor、height、width、valid等。具體可以查看協助:h python-window

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.