W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
我們新鮮出爐的"grep運(yùn)算符"工作得很好,但是寫Vimscript的目的,就是要體貼地改善你的用戶的生活。 我們可以額外做兩件事,讓我們的運(yùn)算符更加符合Vim生態(tài)圈的要求。
由于把文本復(fù)制到未命名寄存器中,我們破壞了之前在那里的內(nèi)容。
這并不是我們的用戶想要的,所以讓我們?cè)趶?fù)制之前先保存寄存器中的內(nèi)容并于最后重新加載。 修改代碼成這樣:
nnoremap <leader>g :set operatorfunc=GrepOperator<cr>g@
vnoremap <leader>g :<c-u>call GrepOperator(visualmode())<cr>
function! GrepOperator(type)
let saved_unnamed_register = @@
if a:type ==# 'v'
normal! `<v`>y
elseif a:type ==# 'char'
normal! `[v`]y
else
return
endif
silent execute "grep! -R " . shellescape(@@) . " ."
copen
let @@ = saved_unnamed_register
endfunction
我們?cè)诤瘮?shù)的開頭和結(jié)尾加入了兩個(gè)let
語(yǔ)句。 第一個(gè)用一個(gè)變量保存@@
中的內(nèi)容,第二個(gè)則重新加載保存的內(nèi)容。
保存并source文件。測(cè)試一下,復(fù)制一些文本,接著按下<leader>giw
來(lái)執(zhí)行運(yùn)算符, 然后按下p
來(lái)粘貼之前復(fù)制的文本。
當(dāng)寫Vim插件時(shí),你_總是_應(yīng)該盡量在修改之前保存原來(lái)的設(shè)置和寄存器值,并在之后加載回去。 這樣你就避免了讓用戶陷入恐慌的可能。
我們的腳本在全局命名空間中創(chuàng)建了函數(shù)GrepOperator
。 這大概不算什么大問(wèn)題,但當(dāng)你寫Vimscript的時(shí)候,事前以免萬(wàn)一遠(yuǎn)好過(guò)事后萬(wàn)分歉意。
僅需增加幾行代碼,我們就能避免污染全局命名空間。把代碼修改成這樣:
nnoremap <leader>g :set operatorfunc=<SID>GrepOperator<cr>g@
vnoremap <leader>g :<c-u>call <SID>GrepOperator(visualmode())<cr>
function! s:GrepOperator(type)
let saved_unnamed_register = @@
if a:type ==# 'v'
normal! `<v`>y
elseif a:type ==# 'char'
normal! `[v`]y
else
return
endif
silent execute "grep! -R " . shellescape(@@) . " ."
copen
let @@ = saved_unnamed_register
endfunction
腳本的前三行已經(jīng)被改變了。首先,我們?cè)诤瘮?shù)名前增加前綴s:
,這樣它就會(huì)處于當(dāng)前腳本的命名空間。
我們也修改了映射,在GrepOperator
前面添上<SID>
,所以Vim才能找到這個(gè)函數(shù)。 如果我們不這樣做,Vim會(huì)嘗試在全局命名空間查找該函數(shù),這是不可能找到的。
歡呼吧,我們的grep-operator.vim
腳本不僅非常有用,而且是一個(gè)善解人意的Vimscript公民!
閱讀:help <SID>
。
享受一下,吃點(diǎn)零食犒勞自己。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: