2012-08-08 9 views
8

Soy un nuevo usuario de vim (gvim en Windows) y he encontrado que las abreviaturas son un buen ahorro de tiempo; sin embargo, serían aún mejores si pudiera detener los espacios en blanco.prevención de espacios en blanco al usar las abreviaturas vim

tengo algunos directorios que yo uso mucho, y por lo que he añadido algunos pares abreviatura/path a mi _vimrc:

:ab diR1 C:/dirA/dira/dir1/ 
:ab diR2 C:/dirA/dirb/dir2/ 

etc ...

Ahora, cuando el tipo i diR1 <space> me sale C:/dirA/dira/dir1/[]| donde el espacio en blanco está representado por [] y el cursor es el carácter |. Me gustaría deshacerme del [] == espacio en blanco.

Esta es una queja menor: sin embargo, parece que usted puede personalizar todo lo demás en Vim, así que pensé que podría preguntar: ¿es posible evitar los espacios en blanco al utilizar abreviaturas en vim?

Una herramienta alternativa utilizada en Vim es una buena respuesta. Mi objetivo es guardar las estructuras de directorios utilizadas con frecuencia, pero tener el cursor a mano ya que casi siempre agregaría algo al final, como myFile.txt.

El espacio en blanco trasero (sin duda debido al hecho de que el space desencadenó la abreviatura), que i RETROCESO más antes de añadir myFile.txt al final es menos molesto que escribir todo el asunto una y otra vez, pero sería ideal si i podría evitar hacerlo ...

Respuesta

13

pb2q respuesta es exactamente lo que quiere en su escenario actual, pero no responde completamente la pregunta presentada en el título. Este problema exacto se aborda en el archivo de ayuda vim. Ver :helpgrep Eatchar.El ejemplo que da es la siguiente:

You can even do more complicated things. For example, to consume the space 
typed after an abbreviation: > 
    func Eatchar(pat) 
     let c = nr2char(getchar(0)) 
     return (c =~ a:pat) ? '' : c 
    endfunc 
    iabbr <silent> if if()<Left><C-R>=Eatchar('\s')<CR> 

Se podría poner la función Eatchar en su archivo ~/.vimrc y luego usar como tal en sus siglas

iabbr <silent> diR1 C:/dirA/dira/dir1/<c-r>=Eatchar('\m\s\<bar>/')<cr> 

Esto sería "comer" cualquier arrastrando carácter de espacio en blanco o una barra. Tenga en cuenta que usé iabbr en lugar de solo abbr, porque es raro que realmente desee que las abreviaciones se expandan en el modo de línea de comandos. Debe ser careful with abbreviations in command line mode, ya que se expandirán en lugares inesperados, como las búsquedas y los comandos de entrada().

Para más información ver:

:h abbreviations 
:helpgrep Eatchar 
:h :helpgrep 
+0

+1. gracias eso es útil. Lo entiendo (creo) hasta el bit '('\ m \ s \ | \ /')'. No estoy seguro con vim regex por el momento. ¿Puede usted explicar por favor? – ricardo

+0

Las expresiones regulares de Vim tienen diferentes niveles de "magia". '\ m' usará' magic' para la expresión regular actual. '\ |' permite que la expresión regular se bifurque, de modo que sea un espacio en blanco ('\ s') o una barra inclinada ('/'). Vim es divertido porque muchos componentes de expresiones regulares deben escaparse con una barra diagonal inversa. Si querías una expresión regular de Perl, puedes usar '\ v \ s | /'. El '\ v' significa mucha magia y menos cosas deben escaparse. Tenga en cuenta que tuve un error en expresiones regulares en la publicación anterior. Debería ser '\ m \ s \ | /'. Además, el carácter '|' se interpretará incorrectamente para esta asignación y debe cambiarse a ''. He corregido mi publicación. –

+0

en este momento, cuando lo introduzco con el '= Eatchar ('\ m \ s | \ /') ' recibo el siguiente error: 'Se detectó un error al marcar C: \ vim \ abrevs.txt: línea 3: E35: No hay expresión regular previa' (yo fuente mi archivo abreviado en mi _vimrc). por prueba y error encontré que eliminar todo siguiendo los trabajos '' - por lo tanto, en este punto tengo ': iabbr diR1 C:/dirA/dira/dir1/', y no obtengo el espacio en blanco en el fin. – ricardo

6

Esto es posible, sin más personalización que solo abbrev.

La abreviatura es activada por el carácter de espacio, como usted sabe. El espacio es un carácter no de palabra clave, y permanece después de que se expande la abreviatura.

Pero hay otras formas de desencadenar la expansión, como otros caracteres que no son palabras clave, como /. Así que si en lugar de definir sus abreviaturas como esto:

:ab diR1 C:/dirA/dira/dir1 

Es decir, sin el separador de ruta de arrastre, entonces se puede escribir diR1/, tiene la abreviatura ampliar para usted debido a la barra /, y continuar escribiendo, anexando a su camino con un nombre de archivo.

Alternativamente, puede forzar la expansión de abreviaturas usando Ctrl-]. Es decir, escriba la abreviatura: diR1, sin espacio de seguimiento u otro carácter no de palabra clave, y luego escriba Ctrl-]. La abreviatura se expandirá y permanecerá en el modo de inserción, y puede agregar su nombre de archivo a la ruta expandida.

Salida :help abbreviations, puede haber algo más útil para usted allí, incluyendo construcciones más complicadas para siempre consumir por ejemplo, el carácter de espacio que activó la abreviación.

+0

maravilloso. Ajusté mi abreviatura y ahora la activé con '/'. Estoy seguro de que también usaré el método 'Ctrl-]' a veces también para otras abreviaturas. Debo haber perdido estos pedacitos de los documentos. Muchas gracias. – ricardo

0

En lugar de abreviaturas, se puede usar asignaciones. Están expandieron tan pronto como se haya introducido el último carácter de la asignación, por lo que no será un espacio final:

:inoremap diR1 c:/dirA/dira/dir1 

La desventaja de este enfoque es que las letras que escriba mientras que un mapeo podrían ser expandido no se muestra hasta que finaliza la asignación. Esto requiere un poco de uso antes.

Cuestiones relacionadas