vim中執(zhí)行python命令
創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),浙江企業(yè)網(wǎng)站建設(shè),浙江品牌網(wǎng)站建設(shè),網(wǎng)站定制,浙江網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,浙江網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
在vim中可以使用py[thon] {stmt}來執(zhí)行python語句{stmt},你可以用:python print "Hello World!"來驗(yàn)證一下。
只能執(zhí)行一條語句,沒什么用,不是嗎?所以有更加強(qiáng)大的接口,語法如下:
py[thon] {endmarker}
{script}
{endmarker}
!-- more --
這樣我們就可以執(zhí)行python腳本{script}中的內(nèi)容了。{endmarker}是一個標(biāo)記符號,可以是任何內(nèi)容,不過{endmarker}后面不能有任何的空白字符。看一個簡單的例子,假設(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來加載腳本,然后就可以用:call Foo()來運(yùn)行python腳本了,整個過程如圖所示:
此外,我們還可以將python腳本放到一個單獨(dú)的.py文件中,然后用pyf[ile] {file}來運(yùn)行python文件中的程序,要注意這里pyf[ile]后面的所有參數(shù)被看做是一個文件的名字。
vim模塊
我們已經(jīng)可以在vim中執(zhí)行python命令了,但是python怎么獲取vim中的一些信息呢?比如說我想知道vim當(dāng)前緩沖區(qū)一共有多少行內(nèi)容,然后獲取最后一行的內(nèi)容,用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
你可以自己加載腳本運(yùn)行一下見證奇跡!上面代碼出現(xiàn)了vim.current.buffer,想必你已經(jīng)從名字猜到了它的意思了,不過還是來詳細(xì)看下吧:
vim模塊中的常量
vim.buffers: 用來訪問vim中緩沖區(qū)的列表對象,可以進(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: 用來訪問vim中窗口的列表對象,和vim.buffers支持的操作基本相。
vim.current: 用來訪問vim中當(dāng)前位置的各種信息,比如:
vim.current.line
vim.current.buffer
vim.current.window
vim.current.tabpage
vim.current.range
vim.vvars: 類似字典的對象,用來存儲global(g:)變量或者vim(v:)變量。
還有其他的一些常量,這里不做敘述。注意這里的常量并不是真正意義上的常量,你可以重新給他們賦值。但是我們應(yīng)該避免這樣做,因?yàn)檫@樣會丟失該常量引用的值?,F(xiàn)在為止我們已經(jīng)能獲取vim中數(shù)據(jù),然后用python來對其進(jìn)行操作,似乎完美了。
不過vim并沒有止步于此,它可是Stronger than Stronger!因?yàn)槲覀兛梢栽趐ython里使用vim強(qiáng)大的命令集,這樣就可以用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
可以調(diào)用上面函數(shù)Del(n)用來刪除當(dāng)前緩沖區(qū)前n行的內(nèi)容(只是示例而已,現(xiàn)實(shí)中別這么做?。┥厦嬗玫搅薳val和command函數(shù),如下:
vim模塊中兩個主要的方法
vim.command(str): 執(zhí)行vim中的命令str(ex-mode,命令模式下的命令),返回值為None,比如:
:py vim.command("%s/aaa/bbb/g")
也可以用`vim.command("normal "+str)`來執(zhí)行normal模式下的命令,比如說用以下命令刪除當(dāng)前行的內(nèi)容:
:py vim.command("normal "+'dd')
vim.eval(str): 用vim內(nèi)部的解釋器來計算str中的內(nèi)容,返回值可以是字符串、字典、或者列表,比如計算12+12的值:
:py print vim.eval("12+12")
將返回結(jié)算結(jié)果24。
前面的Del函數(shù)還提供了一個number參數(shù),在vimL里面可以通過let arg=a:number來使用,在python中通過vim.eval("a:number")來使用。也可以通過參數(shù)位置來訪問,比如let arg=a:0或者是vim.eval("a:0")。我們可以使用"..."來代替命名參數(shù)來定義一個能接收任意數(shù)量參數(shù)的函數(shù),不過這樣只能通過位置來訪問。
vim模塊還提供了一個異常處理對象vim.error,使用vim模塊時一旦出現(xiàn)錯誤,將會觸發(fā)一個vim.error異常,簡單的例子如下:
try:
vim.command("put a")
except vim.error:
# nothing in register a
vim模塊提供的對象
到這里你基本能用python來對緩沖區(qū)進(jìn)行基本的操作,比如刪除行或者是在指定行添加內(nèi)容等。不過在緩沖區(qū)添加內(nèi)容會很不pythoner,因?yàn)槟愕檬褂胏ommand來調(diào)用vim的i/I/a/A命令。好在有更科學(xué)的方式,那就是利用vim模塊提供的對象來進(jì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ū)對象是怎么一會兒事呢?
緩沖區(qū)對象
vim模塊提供了緩沖區(qū)對象來讓我們對緩沖區(qū)進(jìn)行操作,該對象有兩個只讀屬性name和number,name為當(dāng)前緩沖區(qū)文件的名稱(包含絕對路徑),number為緩沖區(qū)的數(shù)量。還有一個bool屬性valid,用來標(biāo)識相關(guān)緩沖區(qū)是否被擦除。
緩沖區(qū)對象有以下幾種方法:
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): 返回一個range對象表示緩沖區(qū)中s到e行的內(nèi)容。
注意使用append添加新行str時,str中一定不能包含換行符"\n"。str結(jié)尾可以有"\n",但會被忽略掉。
緩沖區(qū)對象的range方法會返回一個range對象來代表部分的緩沖區(qū)內(nèi)容,那么range對象又有那些屬性以及方法呢?
其實(shí)在操作上range對象和緩沖區(qū)對象基本相同,除了range對象的操作均是在指定的區(qū)域上。range對象有兩個屬性start和end,分別是range對象的起始和結(jié)尾行。它的方法有r.append(str),r.append(str,
n)和r.append(list),r.append(list, n)。
我們可以通過vim.windows來獲取vim中的窗口對象,我們只能通過窗口對象的屬性來對其進(jìn)行操作,因?yàn)樗鼪]有提供方法或者其他接口來操作。其中只讀屬性有buffer、number、tabpage等,讀寫屬性有cursor、height、width、valid等。具體可以查看幫助:h python-window
start_new_thread(function, (arg1,args2,...))
第一個參數(shù)是一個函數(shù)
thread.start_new_thread(loop(i,loops[i],locks[i]),())
這樣的話,第一個參數(shù)是一個loop函數(shù)調(diào)用后的返回值,因?yàn)闆]有返回,所以就是一個None
#!/usr/bin/env python
# -*- coding: utf-8 -*-
a = input()
print "千位是: %s" % str(a)[0]
print "百位是: %s" % str(a)[1]
print "十位是: %s" % str(a)[2]
print "個位是: %s" % str(a)[3]
當(dāng)運(yùn)行程序時,在控制臺輸入2345,輸出結(jié)果是:
千位是: 2
千位是: 3
千位是: 4
千位是: 5
擴(kuò)展資料
1、python輸入用法介紹:
python輸入時使用input( )函數(shù),這個函數(shù)只能接收“數(shù)字”的輸入,返回所輸入的數(shù)字的類型( int, float )。示例:
a = input("input a: ")
print(a,type(a))
2、python字符串切割:
python中string字符串使用[]可以通過索引獲取字符串中字符,例如:
a = "Hello"
print "a[1] 輸出結(jié)果:", a[1]
a[1] 輸出結(jié)果: e
def?f():
lines=open("1.txt","r").readlines()
lens=[]
for?line?in?lines:
lens.append(len(line.strip('\n')))
lens存的每行長度