2010-04-23 59 views
10

看來vims python sripting被設計爲編輯緩衝區和文件,而不是很好地與vims寄存器一起工作。你可以使用一些vim軟件包命令來訪問寄存器,但不是很漂亮。你能訪問vim中的Python函數的寄存器

我使用python創建一個vim函數的解決方案使用了一個寄存器 就像這樣。

function printUnnamedRegister() 
python <<EOF 
print vim.eval('@@') 
EOF 
endfunction 

設置寄存器也有可能使用像

function setUnnamedRegsiter() 
python <<EOF 
s = "Some \"crazy\" string\nwith interesting characters" 
vim.command('let @@="%s"' % myescapefn(s)) 
EOF 
endfunction 

東西但是這感覺有點麻煩,我不知道myescapefn應該是什麼。 所以我從來沒有能夠讓設置版本正常工作。

所以,如果有一種方法做更多的東西一樣

function printUnnamedRegister() 
python <<EOF 
print vim.getRegister('@') 
EOF 
endfunction 

function setUnnamedRegsiter() 
python <<EOF 
s = "Some \"crazy\" string\nwith interesting characters" 
vim.setRegister('@',s) 
EOF 
endfunction 

甚至一個很好的版本myescapefn的我可以使用那將是非常方便的。

UPDATE:

基於由ZYX的解決方案,我用這片蟒蛇的

def setRegister(reg, value): 
    vim.command("let @%s='%s'" % (reg, value.replace("'","''"))) 
+0

'蟒蛇>> EOF'導致語法錯誤。也許你使用'python << EOF'? – ZyX 2010-04-23 02:25:26

+0

你忘了'endfunction'。 – ZyX 2010-04-23 02:27:25

+0

Thx ZyX。現在修復。 – 2010-04-23 04:17:56

回答

6

如果使用單引號,你所需要的一切就是用兩個單來代替單引號的每一次出現引號。 類似的東西:

python import vim, re 
python def senclose(str): return "'"+re.sub(re.compile("'"), "''", str)+"'" 
python vim.command("let @r="+senclose("string with single 'quotes'")) 

更新:該方法嚴重依賴於差分的

let abc='string 
with newline' 

execute "let abc='string\nwith newline'" 

之間的(無證)功能:當第一次失敗了第二次成功(和它不是:execute中的換行處理和純文件之間差異的單個示例)。在另一方面,eval()是較爲預計將處理這種因爲string("string\nwith newline")回報完全一樣的東西senclose呢,所以我寫的這個東西現在只用vim.eval

python senclose = lambda str: "'"+str.replace("'", "''")+"'" 
python vim.eval("setreg('@r', {0})".format(senclose("string with single 'quotes'"))) 
+0

這似乎很好地工作。謝謝。除了最後一行,在哪裏。需要替換爲+ – 2010-04-23 04:28:51

+3

稍微整潔的是:vim.command(「let @r ='%s'」%arg.replace(「'」,「''」)) – 2010-04-23 04:36:41

+0

不知道替換方法。謝謝。 – ZyX 2010-04-23 12:05:08