摘要:原文地址有各種強大的插件,這不僅歸功于其提供的用來編寫插件的腳本語言,還得益于它良好的接口實現,從而支持等語言編寫插件。當編譯時帶有特性時就能使用編寫插件,則支持,可以使用來查看的編譯特性。具體可以查看幫助參考如何用寫插件
原文地址
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 avim模塊提供的對象
到這里你基本能用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中一定不能包含換行符" "。str結尾可以有" ",但會被忽略掉。
緩沖區對象的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
參考
Scripting Vim with Python
如何用python寫vim插件
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/24796.html
摘要:原文地址有各種強大的插件,這不僅歸功于其提供的用來編寫插件的腳本語言,還得益于它良好的接口實現,從而支持等語言編寫插件。當編譯時帶有特性時就能使用編寫插件,則支持,可以使用來查看的編譯特性。具體可以查看幫助參考如何用寫插件 原文地址 vim有各種強大的插件,這不僅歸功于其提供的用來編寫插件的腳本語言vimL,還得益于它良好的接口實現,從而支持python等語言編寫插件。當vim編譯時帶...
摘要:獻給所有曾試圖寫而痛苦掙扎的請不要害怕我也是你們的一員序文章源起于論壇中的一個問題由于回答的有點盡性便轉為文章題主應該是個初學者這里不對題主報有任何貶義的情感誰都是從初學過來的問題主要是如何在中編譯運行代碼勾起了我痛苦的回憶便借題發揮了更何 獻給所有曾試圖寫Java而痛苦掙扎的Vimers, 請不要害怕, 我也是你們的一員 序 文章源起于segmentfault論壇中的一個問題, 由于...
摘要:獻給所有曾試圖寫而痛苦掙扎的請不要害怕我也是你們的一員序文章源起于論壇中的一個問題由于回答的有點盡性便轉為文章題主應該是個初學者這里不對題主報有任何貶義的情感誰都是從初學過來的問題主要是如何在中編譯運行代碼勾起了我痛苦的回憶便借題發揮了更何 獻給所有曾試圖寫Java而痛苦掙扎的Vimers, 請不要害怕, 我也是你們的一員 序 文章源起于segmentfault論壇中的一個問題, 由于...
摘要:博客原文同步安裝插件安裝分兩部分,一個是插件本身,另外一個是代碼片段倉庫。一般來說把默認的代碼片段倉庫下載下來按需修改后上傳到自己的即可。這時需要使用參數選項使用正則代碼片段通常寫代碼的時候需要使用等來打印上下文中的變量。 博客原文同步 安裝 Ultisnips 插件安裝分兩部分,一個是 ultisnips 插件本身,另外一個是代碼片段倉庫。一般來說把默認的代碼片段倉庫下載下來按需修改...
閱讀 2592·2023-04-25 22:09
閱讀 2837·2021-10-14 09:47
閱讀 1889·2021-10-11 11:10
閱讀 2677·2021-10-09 09:44
閱讀 3372·2021-09-22 14:57
閱讀 2493·2019-08-30 15:56
閱讀 1615·2019-08-30 15:55
閱讀 775·2019-08-30 14:13