2017-03-06 33 views
0

我正在爲Vim編寫一個插件,我希望在執行它之後恢復默認寄存器。但是,有問題的函數是通過<C-r>=Myfunction()<CR>結構調用的,這意味着我需要在函數返回後將其恢復。我試圖做到這一點,像這樣:在<C-r>函數調用後恢復寄存器

inoremap <silent> <Space> <C-r>=Myfunction()<CR> 
function! Myfunction() 
    let oldreg  = getreg('"') 
    let oldregtype = getregtype('"') 
    let restore  = "\<ESC>:call setreg('\"','".oldreg."','".oldregtype."')\<CR>a" 

    let @" = "whatever" 

    return "\<ESC>yya ".restore 
endfunction 

正如你所看到的,"寄存器由返回的字符串的影響,所以我不能直接調用setreg。顯然這個函數並沒有做任何事情,但我使用的實際功能是相當長的。另外,如果該字符串有點難以閱讀,我表示歉意,但我並不確定是否有其他方式來完成此操作。總而言之,函數似乎在寄存器包含一個單詞時起作用,但是當寄存器中有換行符的時候失敗。 (具體錯誤是關於oldreg參數的E115: Missing quote。)我試圖通過先shellescaping oldreg來解決這個問題。但是,這會導致錯誤E121: Undefined Variable,其中未定義變量是我的註冊表中的內容。對於這裏可能會出錯的任何想法?

編輯:我找到了一個解決方案。它很毛茸茸,但它迄今爲止完美。以下是如何將解決方案應用於我的示例代碼,以防萬一它在那裏幫助任何人。

inoremap <silent> <Space> <C-r>=Myfunction()<CR> 
function! Myfunction() 
    let oldreg  = substitute(escape(getreg('"'), '\\'), '\n', '\\n', 'g') 
    let oldregtype = getregtype('"') 
    let restore  = "\<ESC>:call setreg('\"',\"".oldreg."\",'".oldregtype."')\<CR>a" 

    let @" = "whatever" 

    return "\<ESC>yya ".restore 
endfunction 
+1

檢查[如何創建一個最小,完整和可驗證的問題](http://stackoverflow.com/help/mcve)。 –

+0

目前,你的例子對我來說沒有什麼意義,因爲我沒有看到什麼妨礙你直接在函數結尾調用'setr​​eg'。什麼妨礙了這一點?爲什麼在調用函數後需要將其重置?如果函數只返回一個字符串?你需要在其他地方使用'「@」嗎?這隻有在你的通話中需要在'MyFunction'結尾和''之間使用它時纔有意義,這是不會發生的。回答這個問題,我只是想了解你的目標,因爲看起來還有其他方法可以做到。:) – sidyll

+0

@sidyll在vim中沒有名爲'@'的寄存器 –

回答

0

這裏繼續道:Vim: how to paste over without overwriting register

從那時起,我們一直生就setreg(),而且我還開發了一個通用的解決方案簡化了最有用的東西恢復(lh#on#exit() )。

在所有情況下,解決辦法是回到@=FunctionToExecute(),以及恢復將在該功能發生。

但正如其他人所說,您可能需要更清楚地瞭解您的需求,因爲可能存在更多具體的解決方案來解決它們。例如,您可以簡單地使用getline()函數,而不是與yy:yank一起移動,而不用修改所有寄存器。換一條線,有setline(),但是這會破壞重做和其他事情。

+0

您的建議有效,所以我將其標記爲正確。然而,我發現了一個稍微不同的解決方案,能更好地處理我的程序結構。 –

0

而是要你回到你的函數之後的正常模式,我覺得 你應該去裏面。這樣,您可以在其中調用setreg(),通常爲 。例如:

function! Myfunction() 
    let oldreg  = getreg('"') 
    let oldregtype = getregtype('"') 

    let @" = "whatever" 

    normal! yya 

    setreg('"', oldreg, oldregtype) 
endfunction 
相關問題