vim: Coincide con PALABRA en el bloque actual con corchetes equilibrados

vim: Coincide con PALABRA en el bloque actual con corchetes equilibrados

Al hacer match en vim hay palabras, WORDs y bloques entre otras cosas. Ahora, para editar código, los bloques son útiles, las palabras son algo útiles, pero las PALABRAS son en su mayoría inútiles, porque a menudo incluyen algunos corchetes de apertura o cierre, ya ()sea {}o [].

Entonces me gustaría que las PALABRAS coincidan

  • sólo caracteres dentro del bloque actual, pero aparte de eso
  • PALABRAS completas (varias si es necesario) y
  • bloques completos (por lo que no hay soportes desequilibrados).

Por ejemplo, considere esta línea de código:

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

con el cursor en 4. Entonces debería coincidir array42[idx + offset]. Por supuesto, WORD coincidiría (array42[idx, lo cual no es útil.

Respuesta1

He creado una función que selecciona visualmente la coincidencia mediante la combinación de teclas viWen modo normal.

No dude en señalar los casos que me perdí. Probablemente también haya otras posibilidades de mejora, ya que no sé mucho sobre 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>

Luego se pueden construir otros comandos a partir de esto:

nmap ciW viWc
nmap diW viWd
nmap yiW mwviWy`w

Lástima, vimscript no es compatible con el resaltador de sintaxis.

información relacionada