Ладно, прости меня за ответ дважды, но, так как моя первая попытка пропустила суть, я пойду еще раз. Это сложнее, чем я думал, но, возможно, не так сложно, как я это сделал (!).
Это теперь изменено, чтобы предложить все совпадающие имена переменных.
Прежде всего, вот функция для генерации аббревиатуры «mCC» из строки «myCamelCase»:
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 :
inoremap <c-l> <c-x><c-u>
С этим кодом в вашем vimrc вы должны обнаружить, что ввод mCC
, за которым следует CTRL-L , сделает ожидаемую замену. Если соответствующее расширение не найдено, сокращение не меняется.
Код не является водонепроницаемым, но он работает во всех простых случаях, которые я тестировал. Надеюсь, поможет. Дайте мне знать, если что-то нужно выяснить.