2009-12-05 20 views
16

Cuando navega por párrafo en vim usando {y} omite las líneas que no contienen nada más que espacios en blanco, aunque de lo contrario están 'en blanco'.Hacer {e} ignorar líneas que contienen solo espacios en blanco

¿Cómo puedo convencer a vim de que trate las líneas "solo en blanco" como separaciones de párrafos, así que {y} saltará a ellas?

Respuesta

1

Los {y} comandos de movimiento por "párrafo", y la documentación de vim (ver :help paragraph) dice:

Tenga en cuenta que una línea en blanco (sólo que contiene espacios en blanco) no es un límite párrafo.

Por lo tanto, la única forma de hacerlo es reasignar {y}. Algo así como:

nmap { ?^\\s*$<CR> 
nmap } /^\\s*$<CR> 

podría funcionar, pero es posible que desee ajustar esto por lo que no altera su historial de búsquedas.

+0

Este es un comienzo decente, pero tiene algunos problemas ... Los que vienen inmediatamente a la mente: modo visual, historial de búsqueda de tramposos, correctamente desarmar/restablecer 'hlsearch', el ligero parpadeo del cursor mientras se mueve hacia la barra de comandos (menor, sí, pero sigue siendo molesto). –

+0

De todos modos, creo que es una buena solución ... Y, si no aparece nada más, puede ser la única solución (en cuyo caso, un poco de scripting Vim podría hacer que los problemas sean menos dolorosos). –

0

nunca tienen una necesidad legítima de los espacios en blanco sólo las líneas de modo que resolví este "problema" añadiendo lo siguiente a mi .vimrc:

" Highlight spaces at the end of lines. 
highlight link localWhitespaceError Error 
au Syntax * syn match localWhitespaceError /\(\zs\%#\|\s\)\+$/ display 

" Remove end of line white space. 
noremap <Leader>r ma:%s/\s\+$//e<CR>`a 

Así entonces, si { y } producen saltos de espacio en blanco sólo las líneas Uso mi mapeo para eliminarlo e intento de nuevo.

2

Esto es algo que me ha molestado por mucho tiempo. Probablemente la solución "correcta" sería enviar un parche a vim que le permita personalizar los límites de los párrafos con una expresión regular (como: establecer párrafos, pero realmente útil).

Mientras tanto, he hecho una función y un par de asignaciones que casi hace lo correcto:

function! ParagraphMove(delta, visual) 
    normal m' 
    normal | 
    if a:visual 
     normal gv 
    endif 

    if a:delta > 0 
     " first whitespace-only line following a non-whitespace character 
     let pos1 = search("\\S", "W") 
     let pos2 = search("^\\s*$", "W") 
     if pos1 == 0 || pos2 == 0 
      let pos = search("\\%$", "W") 
     endif 
    elseif a:delta < 0 
     " first whitespace-only line preceding a non-whitespace character 
     let pos1 = search("\\S", "bW") 
     let pos2 = search("^\\s*$", "bW") 
     if pos1 == 0 || pos2 == 0 
      let pos = search("\\%^", "bW") 
     endif 
    endif 
    normal | 
endfunction 

nnoremap <silent> } :call ParagraphMove(1, 0)<CR> 
onoremap <silent> } :call ParagraphMove(1, 0)<CR> 
" vnoremap <silent> } :call ParagraphMove(1, 1)<CR> 
nnoremap <silent> { :call ParagraphMove(-1, 0)<CR> 
onoremap <silent> { :call ParagraphMove(-1, 0)<CR> 
" vnoremap <silent> { :call ParagraphMove(-1, 1)<CR> 

Esto no controla correctamente los recuentos como '4}' modo visual o correctamente (elimine el comentario de las líneas de vnoremap bajo su propio riesgo), pero parece estar bien para cosas como no estropear el patrón de búsqueda actual y no parpadear. Además, 'd}', 'y}', etc. parecen funcionar bien. Si alguien tiene ideas para hacer que los recuentos funcionen o arreglen el modo visual, házmelo saber.

+0

La idea del parche es la mejor solución que he escuchado/leído. – rossipedia

6

Aquí es una versión modificada que se encarga de los recuentos correctamente:

function! ParagraphMove(delta, visual, count) 
    normal m' 
    normal | 
    if a:visual 
     normal gv 
    endif 

    if a:count == 0 
     let limit = 1 
    else 
     let limit = a:count 
    endif 

    let i = 0 
    while i < limit 
     if a:delta > 0 
      " first whitespace-only line following a non-whitespace character   
      let pos1 = search("\\S", "W") 
      let pos2 = search("^\\s*$", "W") 
      if pos1 == 0 || pos2 == 0 
       let pos = search("\\%$", "W") 
      endif 
     elseif a:delta < 0 
      " first whitespace-only line preceding a non-whitespace character   
      let pos1 = search("\\S", "bW") 
      let pos2 = search("^\\s*$", "bW") 
      if pos1 == 0 || pos2 == 0 
       let pos = search("\\%^", "bW") 
      endif 
     endif 
     let i += 1 
    endwhile 
    normal | 
endfunction 

nnoremap <silent> } :<C-U>call ParagraphMove(1, 0, v:count)<CR> 
onoremap <silent> } :<C-U>call ParagraphMove(1, 0, v:count)<CR> 
" vnoremap <silent> } :<C-U>call ParagraphMove(1, 1)<CR> 
nnoremap <silent> { :<C-U>call ParagraphMove(-1, 0, v:count)<CR> 
onoremap <silent> { :<C-U>call ParagraphMove(-1, 0, v:count)<CR> 
" vnoremap <silent> { :<C-U>call ParagraphMove(-1, 1)<CR> 
+0

no funciona en modo visual con esas líneas descomentadas :( –

2

Como se ha dicho antes, si ejecuta :help paragraph verá que las líneas con espacios en blanco no son tratados como límite.

Por el momento hay dos proyectos de plugin que podría ayudar:


Si utiliza patógenos, sólo tiene que descargar desde uno de los sitios mencionados anteriormente.

Si utiliza Vundle, poner uno de los siguientes en su .vimrc:

  • mejorada movimiento párrafo:

    Bundle 'vim-scripts/Improved-paragraph-motion' 
    
  • Párrafo Vim movimiento:

    Bundle 'dbakker/vim-paragraph-motion' 
    

Ejecute :BundleInstall después de reiniciar y los movimientos {} deben detenerse en líneas que contengan caracteres en espacios en blanco.

Cuestiones relacionadas