2011-12-13 12 views

Respuesta

4

un vistazo aquí http://vim.wikia.com/wiki/Copy_the_search_results_into_clipboard, la sección 'Copia de líneas que contienen resultados de búsqueda'.

Esto funcionó para mí (registro claro a, un tirón pattern resultados en ella, copiar al portapapeles):

qaq 
:g/pattern/y A 
:let @+ = @a 

Cuando traté :g/pattern/y+ sólo copiar la primera línea.

Esa sección en el enlace también da una función que puede escribir para copiar todas las líneas, pero todavía parece un proceso de 2 pasos (haga /pattern y luego llame a la función): pero probablemente podría escribir su propia macro/atajo para hacer ambas cosas en secuencia.

+0

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

1

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.)

+0

Buena respuesta. Creo que puede prescindir de la lista añadiendo directamente a @. Sospecho que su respuesta tendrá un mejor rendimiento en el caso general, aunque – sehe

+0

Sí, eso también funcionaría, gracias.El OP podría preferir eso, aunque almacenar las palabras en una lista también le da opciones. – 1983

+0

también puede almacenar el portapapeles en una lista después: 'let list = [] // let list = split (@ +, '\ n')' – Reman

2

Tal vez pueda encontrar algo de inspiración en lo siguiente:

:saveas %.tmp 

para empezar a trabajar en una copia

:v//d 
:exec '%s/^.\{-\}\(' . @/ . '\).*$/\1/g' 

Así, por ejemplo, haciendo una búsqueda /word\d en el texto siguiente:

tincidunt. Proin sagittis2. Curabitur auctor metus non mauris. Nunc condimentum nisl non augue. Donec leo urna, dignissim vitae, porttitor ut, iaculis sit amet, sem.

Aptent Clase taciti sociosqu3 anuncio Litora torquent por conubia nostra, por inceptos himenaeos. Suspendisse potenti. Quisque augue metus, hendrerit sit amet, commodo vel, scelerisque ut, ante. Praesent euismod euismod risus. Mauris ut metus sit amet mi cursus commodo. Morbi congue mauris ac sapien. Donec justo. Sed congue nunc vel mauris0. Pellentesque vehicula orci id libero. En hac habitasse platea dictumst. Nulla sollicitudin, purus1 id elementum dictum, dolor augue hendrerit ante, vel semper metus enim et dolor. Pellentesque molestie9.

resaltará las palabras como se muestra. Haciendo

:v//d|exec '%s/^.\{-\}\(' . @/ . '\).*$/\1/g' 

resultados en el siguiente tampón:

sagittis2 
sociosqu3 
mauris0 
purus1 
molestie9 
+0

El OP debe tener en cuenta que solo obtiene un partido por línea con esta. Si quieres múltiples coincidencias por línea, intenta ':% s/MYREGEXP/\ r & \ r/g | v // d'. – 1983

1

Anexar todos los resultados de búsqueda a reg X (mayúsculas) separados por salto de línea:

:g/^/call setreg('X', matchstr(getline('.'), '^\S\+') . "\n") 

para borrar reg x:

qxq 
Cuestiones relacionadas