2010-03-14 14 views
9

Estoy tratando de usar vim correctamente: para ayudarme, he asignado mis teclas de flecha a "", de modo que estoy obligado a usar {hjlk} para moverme.Comando para rodear a un personaje con espacios en vim

Esto me está causando un problema cuando quiero simplemente rodear un personaje con espacios, por ejemplo:

"2 + 3" es mejor formateado "2 + 3"

Anteriormente me habría puesto mi cursor sobre el + y escrito:

i [espacio] [flecha derecha] [espacio] [Esc]

Eso es 5 prensas.

Para hacer esto sin la flecha me parece que tenga que poner el cursor sobre el signo + e ir:

i [espacio] lli [Esc] [espacio] [Esc]

Eso es 8 prensas.

puedo convertir el "li" en una "a", que lo reduce a 7 prensas:

i [espacio] [Esc] la [espacio] [Esc]

Short de escribir esto en una macro, ¿hay una mejor manera de hacerlo? ¿Hay algún comando de vim mágico que me permita hacerlo en menos de 5 pulsaciones y una forma de generalizarlo para que pueda hacerlo con palabras o símbolos completos, por ejemplo, si quiero convertir 3 == 4 a 3? == 4?

+0

con curiosidad ¿cómo asignó las teclas de flecha a ""? – Casey

+0

Para seis pulsaciones de tecla, puede hacer 'i [espacio] [Esc] el. Pero aún hay maneras más rápidas que eso, por lo tanto, este es un comentario y no una respuesta :) –

+0

Casey: para asignar las teclas de flecha, en ~/.vimrc: mapa "" [salto de línea] mapa "" [salto de línea] mapa "" [salto de línea] mapa "" (lo sentimos - no puedo poner nuevas líneas en los comentarios !) –

Respuesta

15

Personalmente, creo que tiene más sentido destruir lo que quiere rodear, y luego volver a pasarlo.

c w "" ESC P 

Obviamente, puede reemplazar tanto el objeto como las comillas con lo que desee.Para cambiar sólo un carácter + para ser [espacio] + [espacio], que haría

s [space] [space] ESC P 

en el signo +

+2

Bueno, todavía me estoy acostumbrando al hecho de que borrar cosas las pone en el búfer de pegar. Y he estado usando vi durante 10 años ... ¡Esta es la razón por la que me obligo a aprenderlo correctamente finalmente! sed es el siguiente ... –

5

Lo primero que me viene a la mente después de leer solo el título es surround.vim que es una excelente secuencia de comandos para hacer todo tipo de cosas útiles en la línea de lo que has descrito.

para resolver su problema específico, probablemente posicionar el cursor en el signo + y:

s [espacio] + [espacio] [esc]

Para cambiar == 3 4 en 3 == 4, podría colocar el cursor en el primer =, y:

i [espacio] [esc] ww.

+0

Me gusta esa segunda solución suya porque parece funcionar en cualquier token. Además, el doble w es más fácil escribir esas dos claves diferentes. –

1

intente colocar el cursor sobre el signo '+' y escribiendo esto:

q1i [espacio] [flecha derecha] [espacio] [flecha izquierda] [esc] q

Esto registrará una macro rápida en la ranura 1 que se puede volver a utilizar siempre que lo desee, que la voluntad rodear el cha racter bajo el cursor con espacios. Puede volver a llamarlo al @1.

También existe la más versátil uno:

q1ea [espacio] [esc] bi [espacio] [flecha derecha] [esc] q

que rodeará la palabra bajo la cursor ("==" cuenta como una palabra) con espacios cuando toques @1.

+0

Como dije, sé que podría hacerlo con un macro, pero me preguntaba si había algún comando inteligente que no supiera. –

1

Se puede crear una macro con una de las acciones descritas y llamarlo cada vez que lo necesita (como amphetamachine propuso mientras estaba escribiendo) o puede simplemente buscar & reemplazar:

:%s/\(\d\)\(+\|-\)\(\d\)/\1 \2 \3/g 

Es probable que tenga a ejecuta este comando dos veces porque solo encontrará cada segunda ocurrencia de +/-.

EDIT:

Esto reemplazará todo sin la necesidad de ser llamado dos veces:

:%s/\d\@<=+\|-\d\@=/ \0 /g 
1

podría configurar en el mapeo (pulsar ENTER en el modo visual para envolver los espacios):

:vnoremap <CR> <ESC>`<i<SPACE><ESC>`>la<SPACE><ESC>h 
3

¡Hah! He estado tratando de descubrir cómo rodear un bloque en espacios durante bastante tiempo y finalmente encontré la combinación correcta.

Al usar surround.vim dices espacio de espacio de selector de sonido envolvente.

Así que para este caso específico usaría el modo visual (un buen truco para operar en caracteres individuales bajo el cursor BTW) así: "vs" < - ¡cuatro pulsaciones de teclas!

También tengo la costumbre de escribir cosas como listas de argumentos sin espacios. Con esta técnica, puede navegar hasta el segundo argumento usando w y decir "vws" para seleccionar visualmente una palabra y rodear con espacios.

Prefiero el modo de selección visual en general. También la sintaxis surround alternativa "ysw" excluye la palabra coma final capturada por "vw".

2

me he estado preguntando acerca de esto también. intenté con surround.vim, pero el enfoque ingenuo

S<space>

(después de hacer una selección visual) no funciona ya que el espacio ya se recoge como un modificador para añadir espacio para otros pares de caracteres de los alrededores. S<space><cr> agrega un^M en la salida. Ss casi funciona pero solo inserta un espacio antes.

después de pedir al tpope/surround.vim en github:

S<space><space>

en modo visual funciona. alternativamente, desde el modo normal, ysl<space><space> funciona para un solo carácter

0

Este método le permite usar. para repetir el comando en el próximo +.

Ponga el cursor sobre el signo + y el tipo:

s[SPACE][CTRL-R]"[SPACE][ESC] 
0

Sé que esto es viejo y el hilo, pero esto podría ser útil a alguien. Me he dado cuenta que el mapa (mapa que a cualquier otra cosa que usted quiera!)

noremap <leader>ss diwi<SPACE><C-R>"<SPACE><ESC>B 

funciona bien tanto para convertir 'a + b' en 'a + b' (cuando se utiliza el carbón '+') y para convertir 'a == b' en 'a == b' (cuando se usa sobre el primero o el segundo signo '=').

Espero que sea útil para alguien.

Cuestiones relacionadas