Расширение CamelCase в Vim, как Intellij Idea?
В Intellij Idea есть особенность. Допустим, я использовал переменную myCamelCase
где-то в моем коде. Тогда, если я наберу mCC
и нажмите Ctrl-Enter или некоторую такую комбинацию клавиш, она расширяется до myCamelCase
, Есть ли что-то похожее в Vim?
2 ответа
Ладно, прости меня за ответ дважды, но так как моя первая попытка упустила смысл, я пойду еще раз. Это сложнее, чем я думал, но, возможно, не так сложно, как я это сделал (!).
Это теперь изменено, чтобы предложить все совпадающие имена переменных.
Прежде всего, вот функция для генерации аббревиатуры "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 сделает ожидаемую замену. Если соответствующее расширение не найдено, сокращение не изменяется.
Код не является водонепроницаемым, но он работает во всех простых случаях, которые я тестировал. Надеюсь, поможет. Дайте мне знать, если что-то нужно выяснить.
Для этого в Vim есть плагин vim-abolish. Используйте карту crc
развернуть к делу верблюда.