Расширение 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 развернуть к делу верблюда.

Другие вопросы по тегам