在Intellij Idea中,有一个功能。假设我在代码中的某处使用了变量myCamelCase
。然后,如果我键入mCC
并按 Ctrl - Enter 或某些此类组合键,它会扩展为myCamelCase
。在Vim中有类似的东西吗?
答案 0 :(得分:8)
好的,请原谅我两次回答,但是由于我的第一次尝试错过了这一点,我还会再来一次。这比我想象的要复杂得多,但可能不像我做的那么复杂(!)。
现在修改它以建议所有匹配的变量名称。
首先,这是一个从'myCamelCase'字符串生成'mCC'缩写的函数:
function! Camel_Initials(camel)
let first_char = matchstr(a:camel,"^.")
let other_char = substitute(a:camel,"\\U","","g")
return first_char . other_char
endfunction
现在,这是一个带缩写('mCC')的函数,并扫描当前缓冲区(从当前行向后)查找具有此缩写的“单词”。 返回所有匹配项的列表:
function! Expand_Camel_Initials(abbrev)
let winview=winsaveview()
let candidate=a:abbrev
let matches=[]
try
let resline = line(".")
while resline >= 1
let sstr = '\<' . matchstr(a:abbrev,"^.") . '[a-zA-Z]*\>'
keepjumps let resline=search(sstr,"bW")
let candidate=expand("<cword>")
if candidate != a:abbrev && Camel_Initials(candidate) == a:abbrev
call add( matches, candidate )
endif
endwhile
finally
call winrestview(winview)
if len(matches) == 0
echo "No expansion found"
endif
return sort(candidate)
endtry
endfunction
接下来,这是一个自定义完成函数,它读取光标下的单词并建议上述函数返回的匹配项:
function! Camel_Complete( findstart, base )
if a:findstart
let line = getline('.')
let start = col('.') - 1
while start > 0 && line[start - 1] =~ '[A-Za-z_]'
let start -= 1
endwhile
return start
else
return Expand_Camel_Initials( a:base )
endif
endfunction
要使用此功能,您必须定义“completefunc”:
setlocal completefunc=Camel_Complete
要使用插入模式完成,请键入 CTRL-X CTRL-U ,但我通常将其映射到 CTRL-L :< / p>
inoremap <c-l> <c-x><c-u>
在vimrc中使用此代码,您会发现键入mCC
后跟 CTRL-L 将进行预期的替换。如果未找到匹配的扩展,则缩写不变。
代码不防水,但它适用于我测试过的所有简单案例。希望能帮助到你。如果有任何需要澄清,请告诉我。
答案 1 :(得分:0)
在Vim中有一个名为vim-abolish的插件。使用地图crc
展开为骆驼案例。