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 viW
no 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.