vim: Combine WORD no bloco atual com colchetes balanceados

vim: Combine WORD no bloco atual com colchetes balanceados

Ao combinar no vim existem palavras, PALAVRAS e blocos, entre outras coisas. Agora, para editar código, os blocos são úteis, as palavras são um tanto úteis, mas as WORDs são em sua maioria inúteis, porque geralmente incluem alguns colchetes de abertura ou fechamento, seja (), {}ou [].

Então, eu gostaria que as PALAVRAS correspondessem

  • apenas caracteres dentro do bloco atual, mas fora isso
  • completar PALAVRAS (múltiplas se necessário) e
  • blocos completos (portanto, sem colchetes desequilibrados).

Por exemplo, considere esta linha de código:

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

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

Responder1

Criei uma função que seleciona visualmente a correspondência através da combinação de teclas viWno modo normal.

Fique à vontade para apontar casos que perdi. Provavelmente também há outro espaço para melhorias, já que não sei muito 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>

Outros comandos podem ser baseados nisso:

nmap ciW viWc
nmap diW viWd
nmap yiW mwviWy`w

Pitty, o vimscript não é compatível com o realçador de sintaxe.

informação relacionada