vim: corresponde ao WORD no bloco atual com colchetes equilibrados

1

Quando combinando no vim, há palavras, WORDs e blocos, entre outras coisas. Agora, para editar o código, os blocos são úteis, as palavras são úteis, mas as WORDs são praticamente inúteis, porque geralmente incluem alguns colchetes de abertura ou fechamento, seja () , {} ou [] .

Então, gostaria que as WORDs correspondessem

  • apenas caracteres dentro do bloco atual, mas fora isso
  • conclua WORDs (vários, se necessário) e
  • blocos completos (portanto, sem colchetes não balanceados).

Por exemplo, considere esta linha de código:

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

com o cursor no 4 . Então deve corresponder a array42[idx + offset] . O WORD corresponderia naturalmente a (array42[idx , o que não é útil.

    
por bodo 05.11.2015 / 09:42

1 resposta

0

Eu criei uma função que visualmente seleciona a correspondência através da combinação de teclas viW no modo normal.

Por favor, fique à vontade para apontar os casos que eu perdi. Também há provavelmente outro espaço para melhorias, já que eu não sei muito sobre o 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>

Outros comandos podem ser criados com base nisso:

nmap ciW viWc
nmap diW viWd
nmap yiW mwviWy'w

Pitty, vimscript não é suportado pelo marcador de sintaxe.

    
por 05.11.2015 / 19:13