2016-02-17 73 views
0

我有以下代碼:Vim的功能正常模式,則執行

function CSVTableFunc(command) 
    let cursor = getpos('.') 
    let l:winview = winsaveview() 
    normal(ggVG) 
    execute a:command 
    call setpos('.', cursor) 
    call winrestview(l:winview) 
endfunction 

基本上,它是它選擇從上面的所有行至底部,隨後執行在函數傳遞的命令。

但是,在執行該命令之前,取消選中之前選擇的行。

我錯過了什麼?

乾杯!

+0

'gv'將重新選擇先前選擇的區域。然而,如果你的'command'類似'd',那麼沒有什麼可選的。 – Kent

+0

你好,感謝您的回覆!只是爲了給上下文,即時通訊調用函數作爲'CSVTableFunc(「CSVTable」)''CSVTable'作爲命令從vim插件:https://github.com/chrisbra/csv.vim –

+0

確實增加了一條線'正常! gv'到你函數幫助的結尾? – Kent

回答

0

這裏有幾個問題。

首先,您試圖使用normal(...)就好像它是一個函數。這不是(如果是的話,你反正用錯了,你會錯過call命令)。

什麼,你居然告訴Vim的是運行以下的普通模式命令:

( - 回一句

ggVG - 大概,請在緩衝區

)所有文本 - 轉發句子

一些實驗表明這可能實際上不會導致任何問題,但是這是錯誤的,並且在其他情況下可能會導致問題。

更大的問題是,除非您告訴他們,否則命令實際上並不在範圍內運行。在視覺模式下(即,當您選擇了一系列線條時),當您按時,會自動在命令行上插入'<,'>。這段文字說「在視覺選擇上運行命令」。使用execute不會自動插入此範圍。如果命令支持範圍,則需要手動將範圍放在命令的開頭。既然你沒有這樣做,你的命令只能運行在默認範圍內,通常是當前行。在你的情況下,因爲你在運行你的命令之前做了ggVG,所以你可能看到命令只運行在最後一行。

無論如何,你不需要視覺選擇。只需使用特殊範圍%而不是選擇任何東西。 %的意思是「在每一行上」。

問題是,有些命令可能不支持範圍。對於這些命令,您可能需要使用一個循環或一個:g命令,在每一個感興趣的線上逐一運行該命令。

相關問題