我正在爲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
檢查[如何創建一個最小,完整和可驗證的問題](http://stackoverflow.com/help/mcve)。 –
目前,你的例子對我來說沒有什麼意義,因爲我沒有看到什麼妨礙你直接在函數結尾調用'setreg'。什麼妨礙了這一點?爲什麼在調用函數後需要將其重置?如果函數只返回一個字符串?你需要在其他地方使用'「@」嗎?這隻有在你的通話中需要在'MyFunction'結尾和''之間使用它時纔有意義,這是不會發生的。回答這個問題,我只是想了解你的目標,因爲看起來還有其他方法可以做到。:) –
sidyll
@sidyll在vim中沒有名爲'@'的寄存器 –