Necesito hacer un montón de reemplazos de palabras en un archivo y quiero hacerlo con un comando vi, no con un comando EX como :%s///g
. Sé que esta es la forma típica en que se reemplaza la palabra en la posición actual del cursor: cw<text><esc>
pero ¿hay alguna manera de hacer esto con el contenido del registro sin nombre como texto de reemplazo y sin sobrescribir el registro?
110
12yl
tirar de 12 caracteres y"_cw^r0
reemplazar una palabra. Luego pude usar el.
comando para repetir el reemplazo en todo el archivo.Respuestas:
Estoy pensando que por "pegar" te refieres al registro sin nombre (tirar / poner / cambiar / eliminar / sustituir), ¿verdad? (Dado que ese es el que se sobrescribirá con el comando de cambio).
Los registros generalmente se especifican escribiendo
"
luego el nombre (carácter único) del registro, como"ay
luego"ap
tirar en el registroa
, luego poner el contenido del registroa
. Lo mismo ocurre con un comando de cambio. En este caso, si no desea que el texto que elimina con el comando de cambio vaya a ninguna parte, puede usar el registro de agujero negro"_
:"_cw
. Luego, una vez en el modo de inserción, puede presionar ctrl-R seguido del registro que desea (probablemente"
) poner en el contenido de ese registro."*
- registro de selección (pegar botón central)"+
- registro del portapapeles (probablemente también accesible con ctrl-shift-v a través de la terminal)""
- Registro de yank / put / change / delete / substitute predeterminado de vim (sin nombre).Respuesta corta:
"_cw^R"
Editar: como sugieren otros, por supuesto, puede usar un registro diferente para el tirón (o lo que sea) que llevó su texto al registro predeterminado. Sin embargo, no siempre piensas en eso primero, por lo que es bueno hacer un solo comando de cambio sin desperdiciarlo. Aunque no está totalmente impresionado. Están los registros numerados a
"0
través de"9
:fuente
:help registers
.Usando la información de esta publicación, he creado este útil mapeo. Elegí "cp" porque significa "cambiar pegar"
nmap <silent> cp "_cw<C-R>"<Esc>
EDITAR:
También di un paso más allá y apoyé cualquier moción.
Para obtener el equivalente del comando anterior, sería
cpw
para "cambiar palabra de pegar"fuente
nmap <silent> cp :let g:currentRegister=v:register<cr>:set opfunc=ChangePaste<CR>g@ function! ChangePaste(type, ...) silent exe "normal! `[v`]\"_c".getreg(g:currentRegister) endfunction
Puede usar el modo visual de vim para esto. por ejemplo, copiar una palabra:
ye
y luego sobrescribir otra con la palabra copiada:vep
fuente
Si su cursor está en la palabra que desea reemplazar con el contenido del registro sin nombre, puede usar
viwp
.v
cambia al modo visual,iw
selecciona la palabra interna yp
coloca el contenido del registro en su lugar.En la práctica, cuando necesito reemplazar una palabra (nombre de la función, etc.) por otra, pasaré a la que usaré como reemplazo,
yiw
para tirar de la palabra interna al registro sin nombre, luego pasaré a la palabra I ' m reemplazando, yviwp
reemplazarlo. Una forma bastante rápida de sustituir una palabra por otra. Si buscó (/
) la palabra que está reemplazando para acceder a ella, puede presionarn
para ir a la siguiente aparición que necesita reemplazar. Obviamente, no sustituye al uso:%s/find/replace/g
, pero para un par de sustituciones rápidas puede ser útil, especialmente si ya tiene la nueva palabra en un registro.fuente
Si hace uso de un registro con nombre (es decir, use
"ay
o"ad
, etc., para llenar su registro de pegado), puede hacer algo comocw<CTRL-R>a<esc>
Que sustituirá la palabra por el contenido del registro
a
. Por lo que puedo decir, no puede usar el registro predeterminado porque cuando lo hagacw
se completará con la palabra que fue cortada por ese comando.fuente
¿Te refieres al búfer de pegado del sistema o al registro vi?
Si desea utilizar el búfer de pegado del sistema, está bien y podría hacerlo
dw"+P
:"
elija un registro y"+
es el búfer de pegado del sistema.De lo contrario, copie en el registro no predeterminado con decir
"ay
para copiar en el registroa
y luego para reemplazar algo hacerdw"aP
fuente
dw
elimina los espacios en blanco finales después de lo que consideraría la "palabra", mientras quecw
solo cambia la palabra. Por esa razón,dw
no funcionará para mí.de
debería funcionar para usted: se eliminará hasta el final de esta palabra, mientras quedw
se eliminará al principio de la siguiente.Puede usar
yw
para tirar de la palabra, luego puede cambiar la palabra con la palabra tirada porvipw
para tirar de la palabra y pegar la palabra previamente tirada.fuente
Puedes usar registros para eso:
primer lugar texto de reemplazo en el registro
<mark some text>"ay
dónde
a
esta el nombre del registroentonces puedes usar ese registro en reemplazo
ve"ap
fuente
.
, que es otra cosa que quería hacer. Pero gracias. Muy apreciado.O puede hacer Shift+ v- p(seleccione la línea completa y pegue en su lugar)
fuente