2010-12-15 91 views
5

我知道通過輸入@@我執行最後的@命令。但是,任何人都可以解釋什麼@@是在下面的代碼(在vim的幫助文件中找到)?:什麼是vim的@@變量?

function! CountSpaces(type, ...) 
    let sel_save = &selection 
    let reg_save = @@ 

    if a:0 
    silent exe "normal! `<" . a:type . "`>y" 
    elseif a:type == 'line' 
    silent exe "normal! '[V']y" 
    elseif a:type == 'block' 
    silent exe "normal! `[\<C-V>`]y" 
    else 
    silent exe "normal! `[v`]y" 
    endif 

    echomsg strlen(substitute(@@, '[^ ]', '', 'g')) 

    let &selection = sel_save 
    let @@ = reg_save 
endfunction 

這似乎是一個寄存器,但它不是在列表中:help registers。從閱讀代碼我猜想它是延期/刪除的默認註冊?這是記錄在任何地方?我所有的搜索只是產生執行last @命令的成語@@

+0

'@@'存放星球大戰中的AT-AT步行者。 :P – FrustratedWithFormsDesigner 2010-12-15 21:35:40

+0

有趣。它似乎是由yank和朋友使用的默認註冊表,但我找不到任何關於此的文檔。更奇怪的是,它似乎並沒有連接到'@@'命令。通常情況下,你可以把某些東西放入一個寄存器中(例如:'zy [motion]'放入z中),然後「重放」它作爲擊鍵('@ z'),但'@@'不會重放'@ '註冊。這是一個特殊的情況!我認爲重播註冊不會覆蓋yank和put所使用的默認註冊是好的,但是令人不安的是vim的行爲存在這樣的不規則性。 – 2010-12-15 21:44:35

回答

11

:help @r給我

register      *expr-register* *@r* 
-------- 
@r   contents of register 'r' 

The result is the contents of the named register, as a single string. 
Newlines are inserted where required. To get the contents of the unnamed 
register use @" or @@. See |registers| for an explanation of the available 
registers. 

因此,@@將有一個dcsx命令, 或用y命令猛拉文本刪除文本的價值。

+1

+1它的「真實」名字是@「,這是有道理的。你可以在沒有指定寄存器的情況下抽出一些東西,然後通過輸入命令「@」來「重放」它。我想知道爲什麼存在'@@'別名?還有什麼方法可以通過編程來確定'@@'命令會做什麼? – 2010-12-15 22:06:50

+0

啊哈!所以,正如LG所說,它真的是@的別名。「我想這就是爲什麼它沒有出現在寄存器列表中。 – 2010-12-15 23:36:24