Расширение CamelCase в Vim, как Intellij Idea? - PullRequest
5 голосов
/ 01 июля 2011

В Intellij Idea есть функция.Допустим, я использовал переменную myCamelCase где-то в моем коде.Затем, если я наберу mCC и нажму Ctrl - Введите или какую-либо другую комбинацию клавиш, она расширится до myCamelCase.Есть ли что-то похожее в Vim?

Ответы [ 2 ]

8 голосов
/ 01 июля 2011

Ладно, прости меня за ответ дважды, но, так как моя первая попытка пропустила суть, я пойду еще раз. Это сложнее, чем я думал, но, возможно, не так сложно, как я это сделал (!).

Это теперь изменено, чтобы предложить все совпадающие имена переменных.

Прежде всего, вот функция для генерации аббревиатуры «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 , сделает ожидаемую замену. Если соответствующее расширение не найдено, сокращение не меняется.

Код не является водонепроницаемым, но он работает во всех простых случаях, которые я тестировал. Надеюсь, поможет. Дайте мне знать, если что-то нужно выяснить.

0 голосов
/ 31 марта 2016

Для этого в Vim существует плагин, который называется vim-abolish . Используйте карту crc, чтобы перейти к делу о верблюдах.

...