При сопоставлении в 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 не поддерживается подсветкой синтаксиса.