1) Con los comandos {y} en vim puedo saltar a la línea anterior o siguiente completamente en blanco (o al principio o al final del archivo). ¿Cómo modifico estos comandos para saltar a la línea anterior o siguiente que esté completamente en blanco o que contenga solo espacios en blanco (o el principio o el final del archivo)?
2) ¿Cómo creo comandos para saltar al principio o al final del bloque de código actual, definido por la sangría actual? Por ejemplo, quiero pasar fácilmente de la línea F a la línea D o G (o a la línea C o H):
A
B
C
D
E
F
G
H
I
Respuesta1
La pregunta 1 parece relativamente fácil (y mi respuesta probablemente sea un poco ingenua):
nnoremap } /^\s*$<CR>
nnoremap { ?^\s*$<CR>
Pero creo que deberías encontrar otro atajo.
También ya tienes gg
que saltar a la primera línea del buffer y G
saltar a su última línea. ¿No es eso suficiente?
No sé cómo responder a la pregunta 2 de forma sencilla. Has probadoobjeto-sangría-vim?
Respuesta2
Combinando los excelentes consejos de romainl y garyjohn obtuve la funcionalidad exacta que estaba buscando para la parte n.° 1:
nnoremap <silent> { :call MyPrevParagraph()<CR>
nnoremap <silent> } :call MyNextParagraph()<CR>
function MyNextParagraph()
let myline = search('^\s*$', 'W')
if myline <= 0
execute 'normal! G$'
else
execute 'normal! '.myline.'G0'
endif
endfunction
function MyPrevParagraph()
let myline = search('^\s*$', 'bW')
if myline <= 0
execute 'normal! gg0'
else
execute 'normal! '.myline.'G0'
endif
endfunction