Quiero insertar texto como este:
similar text wordA similar text ...
similar text wordB similar text ...
similar text wordC similar text ...
Sé que puedo pegar el texto muchas veces y luego usar la sustitución para cambiar una sola palabra para cada línea, sin embargo, todavía encuentro este método muy inconveniente.
¿Hay alguna manera de guardar una palabra o una lista de palabras en una "variable" y luego usar esta variable para generar texto similar?
EDITAR Hice algo poco claro en la pregunta original, de hecho, estoy tratando de hacer algunas definiciones de funciones muy similares, por lo que wordA
wordB
... puede aparecer muchas veces en cada clon de texto y el texto puede contener muchas líneas. El patrón es exactamente así:
similar_text1 wordA similar_text2 wordA similar_text3 ...
similar_text1 wordB similar_text2 wordB similar_text3 ...
similar_text1 wordC similar_text2 wordC similar_text3 ...
(el texto puede contener nuevas líneas, y la palabra A, la palabra B ... pueden existir muchas veces)
2nd EDIT Las partes "similar_text" pueden ser diferentes cada vez que hago ese trabajo, por lo que la solución para este trabajo es mejor ser reutilizable. Porque estoy tratando de hacer definiciones de funciones muy parecidas, o una tabla de mapeo de cadena a función.
Después de leer las respuestas y un poco de práctica, considero que es más conveniente considerar este trabajo como una especie de sustitución, porque "parte1", "parte2" ... "parteN" separadas que pueden contener líneas nuevas es difícil de escribir, así que escriba primero una plantilla:
similar_text1 $WORD similar_text2 $WORD similar_text3 ...
(text may contain <ENTER>, make sure $WORD not exist in "similar_text" parts )
Luego, tratar de poner clones del texto pero reemplazar $ WORD con una lista de palabras es un pensamiento más directo.
Entonces, parece que mi problema cambió para ser "¿Cómo clonar un bloque de texto muchas veces, pero cada vez sustituyendo una palabra clave con una palabra de una lista?"
fuente
Respuestas:
Puede usar la siguiente función:
En las variables
firstpart
ysecondpart
poner el texto para repetir antes y después de las palabras y en la listawords
poner las palabras que deben cambiar.Luego, el bucle creará el contenido de la línea para cada palabra de la lista, inserte la línea en el búfer y vaya a esta nueva línea.
A continuación, puede simplemente llamar a la función:
call GenerateLines()
.Editar Para facilitar la manipulación, también puede pasar las diferentes partes como argumentos, la función debería verse así:
Y puedes llamarlo así:
fuente
call map(a:words, 'a:firstpart . v:val . a:secondpart')
ycall append(line('.'), a:words)
.Mi estrategia en tales casos variará, pero a menudo sigue los siguientes pasos:
Escriba las palabras únicas, p. Ej.
Ya sea
a) hacer una búsqueda y reemplazar, por ejemplo
b) o use el modo de bloqueo visual, vea
:h blockwise-visual
. En particular, seleccionaré las palabras y las usaréI
para insertar texto similar al frente, oA
para agregar texto similar después.Yo diría que esta estrategia tiene sentido cuando haces este tipo de tarea de edición relativamente raramente. Sin embargo, si encuentra que necesita hacer esto con frecuencia, entonces debe seguir la sugerencia de @ statox con una función que expande la lista de palabras.
fuente
:read
seguido por su sustitución tiene mucho sentido.Argumentaré que este es un trabajo para el bloque visual ( Ctrl+ v). Primero escribiría todas las palabras distintas:
Comenzando con el cursor en el primero
w
, realizaría:Puedo controlar cuántas columnas necesito presionando
A <esc>p
cuantas veces quiera. Supongamos que necesitaba tres columnas, tal como se muestra en el comando anterior. Ahora tenemos esto:Y el cursor está al principio del 3er
wordA
en la primera línea. A continuación, bloquearía seleccionar la columna de espacio en blanco entre las columnas que van hacia atrás y agregan el texto en el medio. Desde la ubicación actual del cursor:Esto da como resultado (el% marca la posición del cursor):
Repita para la siguiente columna:
Y la última / primera columna (la del lado izquierdo):
Finalmente resultando en:
Actualización: agregado un screencast
Esto parece ser una gran cantidad de tipeo, pero en realidad es muy fácil acostumbrarse. Le brinda la libertad de cambiar la cantidad de palabras, la cantidad de columnas e incluso el espacio entre las columnas.
El inconveniente es que necesita saber la cantidad de palabras distintas que está usando. Tengo un
5
código fijo en todos los comandos anteriores porque es el número de filas en las que operan los comandos.Nota de depuración: todos los comandos comienzan y terminan en modo normal, si te encuentras en modo visual o de inserción al final de un comando estás haciendo algo mal.
fuente