vim: Сопоставить СЛОВО в текущем блоке со сбалансированными скобками

vim: Сопоставить СЛОВО в текущем блоке со сбалансированными скобками

При сопоставлении в vim есть слова, СЛОВА и блоки среди прочего. Теперь для редактирования кода блоки полезны, слова немного полезны, но СЛОВА в основном бесполезны, потому что они часто включают в себя некоторые открывающие или закрывающие скобки, будь то (), {}или [].

Поэтому я хотел бы, чтобы СЛОВА совпадали

  • только символы внутри текущего блока, но за исключением этого
  • полные СЛОВА (несколько при необходимости) и
  • полные блоки (поэтому нет несбалансированных скобок).

Например, рассмотрим эту строку кода:

if (array42[idx + offset] == value) {

с курсором на 4. Тогда он должен соответствовать array42[idx + offset]. WORD, конечно, будет соответствовать (array42[idx, что бесполезно.

решение1

Я создал функцию, которая визуально выбирает совпадение с помощью комбинации клавиш viWв обычном режиме.

Пожалуйста, не стесняйтесь указывать на случаи, которые я пропустил. Также, вероятно, есть другие возможности для улучшения, поскольку я не очень хорошо разбираюсь в vimscript.

"visually select current programming WORD
function! SelectSensibleWORD()
    "go to beginning of block
    normal! ?^\|[[:space:]({[]
    let l:char = matchstr(getline('.'), '\%' . col('.') . 'c.')
    if -1 != match(l:char, '[[:space:]({\[]')
        normal! l
    endif
    "enter visual mode
    normal! v
    "find brackets or end of the WORD
    normal! /$\|[[:space:]({[\]})]
    while 1
        let l:char = matchstr(getline('.'), '\%' . col('.') . 'c.')
        if -1 != match(l:char, '[({[]')
            "keep brackets balanced
            normal! %
        else
            "don't select more than necessary
            normal! h
            return
        endif
        normal! n
    endwhile
endfunction

nnoremap viW :call SelectSensibleWORD()<CR>

На основе этого можно построить другие команды:

nmap ciW viWc
nmap diW viWd
nmap yiW mwviWy`w

Жаль, что vimscript не поддерживается подсветкой синтаксиса.

Связанный контент