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