Intente lo siguiente. Primero defina una función para guardar sus expresiones regulares en una lista (: Lista de ayuda).
:fun Add(list, item)
: call add(a:list, a:item)
: return a:item
:endfun
Tenga en cuenta que también devuelve el elemento añadido. Esto no es necesario, , pero lo que devuelve aquí se convierte en el texto de reemplazo en el : sustituir a continuación.
A continuación, cree una lista vacía.
:let list=[]
Luego ejecute su expresión regular.
:%s/^\S\+/\=Add(list, submatch(0))/
Tenga en cuenta que la sustitución comienza con \ = (véase: ayudar sub-reemplazar-especial). El resultado es que reemplazamos la expresión de coincidencia consigo mismo, pero al mismo tiempo capturamos el resultado en la lista.
La función submatch() devuelve las partes coincidentes del: comando substituir . submatch (0) devuelve la coincidencia completa.
Tenga en cuenta que, como efecto secundario, el búfer se marca como cambiado. Si guardó el búfer antes de ejecutar la sustitución, entonces puede solucionarlo simplemente presionando u para deshacer o anexando '| a su comando . (Si se va a deshacer la operación, entonces no importa lo que volvamos de nuestra función Add.)
puede ver sus partidos con
:echo list
o se puede añadir a su búfer con
:$put=list
Espero que esto ayude.Es sencillo una vez que sabes cómo, pero hay un bastante para digerir allí.
¡Oh, casi me olvido! Usted puede agregar sus partidos en el portapapeles con
:let @+ = join(list, '^@')
A continuación, sus partidos serán en el portapapeles, cada uno en una línea separada.
^@ representa un carácter NUL, y se genera con < C-V > < C-J >, lo que significa prensa de control-V, seguido por el control-J. (¿Por qué usted tiene que utilizar^@ aquí es un tema entero en sí mismo.)
esto La respuesta directa copia líneas enteras donde está contenida la expresión regular. Pero en el enlace anterior, hay un script llamado CopyMatches que copia solo las partes coincidentes. – squid