2010-12-06 27 views
0

下面的代码已从this blogVIM codewalk通过

function! Privatize() 
    let priorMethod = PriorMethodDefinition() 
    exec "normal iprivate :" . priorMethod . "\<Esc>==" 
endfunction 

function! PriorMethodDefinition() 
    let lineNumber = search('def', 'bn') 
    let line  = getline(lineNumber) 
    if line == 0 
    echo "No prior method definition found" 
    endif 
    return matchlist(line, 'def \(\w\+\).*')[1] 
endfunction 

map <Leader>p :call Privatize()<CR> 

我试着拿起,但我不明白PriorMethodDefinition方法。有人可以通过这段代码走过我吗?

回答

1

PriorMethodDefinition返回光标上方第一个方法定义的名称。

它通过search为包含文本'def'的行向后执行此操作。搜索功能返回行号,getline用于检索该行的内容。

函数在使用正则表达式获取方法的名称并返回之前,检查它是否找到了有效的行。

,如果您想了解具体情况你可以阅读更多有关这些功能 - 见:

:help search 
:help getline 
:help matchlist 

编辑:你也可以阅读有关正则表达式模式

:help pattern 

但起初我觉得有点困惑,所以请允许我稍微解释一下。下面是使用的表达:

'def \(\w\+\).*' 

这将搜索匹配以下模式的任何文字:“后面紧跟着零个或多个字符.*一个或多个‘字’字\w\+文本def”。匹配单词字符的部分被放入一个组(或原子)中,由逃脱的零部件指定\( & \)。有关单词字符等的定义的更多信息可以在上面的帮助链接中找到。

matchlist函数返回匹配列表,其中第一个[0]是与正则表达式匹配的全文,后跟子匹配(即我们的组)。我们感兴趣的第一个这样的submatch,因此[1]

+0

真棒。你的回答给了我一些指示,开始阅读vim的书。谢谢。 – 2010-12-06 23:43:32