2012-05-27 77 views
2

所以,這是我在嘗試編寫插件時碰到的一種奇怪的情況。它看起來像Vim中的一個bug,但我可能會錯過一些東西,所以我轉向了StackOverflow的智慧。Vimscript - 運行正常! qm運行正常後! @m

藉此功能:

fun! Test() 
    normal! q ; Stop recording a macro. 
    let @r='kkkkkkkkkkkkk' 
    normal! @r 
    normal! qm 
endf 

基本上,我停止錄製宏,嘗試運行一個寄存器的內容,然後開始重新錄製宏。

我打qm,調用這個函數,做一些命令,然後調用函數。

我期待什麼

我想到「KKKKKK」要執行,然後記錄重新開始。

的 「KKKK」 運行發生了什麼,但記錄是再次啓動。

我不明白爲什麼!

解決方法

下面的函數我想要做什麼,但它是一個黑客。我試圖瞭解我的問題的根本原因:

好玩!測試() 正常!讓@@ = = kkkkkkkkkkkkk' 執行「正常!」。 @r 正常! qm endf

我剛剛用一個直接執行寄存器內容的執行調用代替了寄存器的運行。基本上,我欺騙vim不認爲它正在運行一個註冊表。

注:爲什麼我想這個

這是一個插件。這個功能只是我能做的最小的展品問題。不值得進入爲什麼我想要這個 - 我需要的基本功能是從一個函數內運行一個寄存器,然後再次開始記錄。在實際使用情況中,我運行和記錄的寄存器是相同的,但似乎並未影響此問題。

那麼,有什麼想法?

回答

3

爲什麼你就不能嵌入映射裏函數調用:

function Test() 
    let @r='kkkkkkkkkkkk' 
    normal! @r 
endfunction 
nnoremap Q q:call Test()<CR>qm 

?如果「M」實際上是一個非恆定值,那麼你必須使用<expr>

nnoremap <expr> Q "q:call Test()\nq".g:plugin_register 

。當然,您可以在<expr>映射中使用函數調用(因此,將normal! @r移動到函數的輸出:return '@r',因爲不允許執行緩衝區編輯,切換和移動光標的表達式)normal!

+0

首先,我不認識「q:call」語法,那是什麼?其次,功能現在做了很多其他的事情,邏輯上「qm」是功能的一部分。第三,函數實際上用「au CursorMoved:call MyFunction()」來調用,即每當光標移動時被調用。但在裏面,它有一個檢查,看看這個插件實際上是啓用的,只有插件被啓用才能完成「qm」。所以我不確定這是怎麼走的...... –

+1

@EdanMaor 1.正常! q'應該這樣做。 2.如果它是一個CursorMoved事件,你不可能做很多類似的副作用(至少如果你按照幫助的建議),禁止從''完成(儘管完成記錄一個宏實際上*是*那種副作用)。你應該可以將它翻譯成''映射rhs功能。使用映射(可能是''之一)並用事件中的'feedkeys()'調用它的關鍵點是解決您指出的問題。 3.在這種情況下,只需返回一個空字符串。 – ZyX

+0

對不起,我還是有點不清楚問題到底是什麼。我也不知道feedkey,但從文檔中不理解它與「正常@r」的不同之處,其中寄存器「r」包含我要執行的鍵。 –