Resaltar texto en búferes / ventanas abiertos (mostrados): búsqueda de texto de un búfer en otro

8

En este momento, tengo mi marco Emacs dividido verticalmente, y estoy mirando dos buffers diferentes en las dos ventanas.

Me gustaría ir a una palabra en un búfer, presionar algunas teclas y tener las ocurrencias de esa palabra (si las hay) resaltadas en el otro búfer, desplazándome hacia ella si es necesario.

¿Hay una manera de hacerlo?

Captura de pantalla para explicar

En la captura de pantalla anterior, con mi cursor justo antes de "bar" en el búfer izquierdo, me gustaría poder <hacer algo> y ver rápidamente dónde está "bar" en el búfer derecho.


Nota: Esto está relacionado con ¿Cómo encuentro texto en múltiples buffers abiertos? en el sentido de que, si pudiera hacer una búsqueda en el "otro" búfer, haría lo que quisiera. Pero ninguna de las respuestas allí es exactamente lo que quiero:

  • Las occursoluciones basadas abren una nueva ventana que muestra líneas coincidentes, mientras que me gustaría mantener mis dos ventanas aún mostradas; en realidad, voy a buscar en el otro búfer el contexto alrededor de la coincidencia, por lo que solo mostraré la línea coincidente No es de mucha ayuda.
  • multi-isearch-buffersrequiere que especifique la lista de buffers cada vez que deseo hacer esta búsqueda (muchas veces), en lugar de seleccionarla automáticamente como los dos buffers mostrados. Más importante aún, cuando comienzo desde una ventana y realizo la búsqueda, cuando encuentra la coincidencia en el otro búfer, muestra ese búfer en esta ventana, de modo que ambas ventanas muestran el mismo (otro) búfer. Entonces Cg vuelve a poner todo, y ya no puedo ver la palabra resaltada en el otro búfer.
  • icicle-search tiene tantas características que uno de ellos puede hacer esto, pero no pude encontrar nada después de un vistazo superficial a la documentación.
ShreevatsaR
fuente
En este momento, lo que hago es Cs Cw Cs (para hacer la búsqueda en este búfer), cambiar al otro búfer, hacer Cs Cs (para repetir la misma búsqueda allí), luego regresar. Son siete pulsaciones de teclas, que podría grabar como una macro, supongo. Dejame hacer eso. Aún así, estoy interesado en saber si hay otras soluciones.
ShreevatsaR
FWIW: C-s C-w C-x o C-s C-sno me suena tan mal. (No necesita un C-sderecho después del C-w.)
Drew
@Drew: Gracias, la idea de usar una macro solo ocurrió después de haber publicado la pregunta; ahora una macro que sí C-s C-w C-x o C-s C-s C-x oparece estar bien.
ShreevatsaR

Respuestas:

5

Puede usar un paquete llamado highlight-globalque está disponible en github pero no en Melpa (al momento de escribir esto).

La highlight-frame-togglefunción definida en este paquete resaltará la palabra en el punto o la región seleccionada en todas partes del marco (en todos los buffers). Sin embargo, esto no haría el desplazamiento automático a la palabra resaltada que necesita. Elige un color de resaltado diferente a medida que resalta más palabras sin borrar los reflejos anteriores.

Aquí hay una captura de pantalla de cómo se ve:

ingrese la descripción de la imagen aquí Haga clic para ver mejor la captura de pantalla

Kaushal Modi
fuente
0

helm tiene interfaces que pueden lograr este objetivo, grabé un Gifcast para demostrar el paquete helm-swoop :

Después de comenzar la helm-swoopbúsqueda, puedo reducir a menos candidatos ingresando más tokens separados por espacios o presionar C-py C-ncambiar al siguiente y desplazarme en el búfer objetivo al mismo tiempo.

wasamasa
fuente
Como dije en la pregunta, las soluciones basadas en la ocurrencia no son lo que quiero, porque enumeran líneas coincidentes (y tengo que ir más allá e interactuar con la lista) en lugar de mantener el otro búfer intacto y resaltar el texto. .
ShreevatsaR
Hmm, el otro búfer se mantiene intacto y puede mostrarte el contexto, pero si lo más destacado es lo que buscas, helm-swoop podría ser más lo tuyo.
wasamasa
OK, lo edité para demostrarlo helm-swoop.
wasamasa
Desearía poder aclararme. Durante todo el proceso, no quiero la otra ventana para siempre pantalla otra cosa lo que se está mostrando actualmente. Todo lo que quiero es presionar una tecla y ver en la otra ventana, como es, la aparición (primero, por ejemplo) de la palabra actual en el otro búfer. (En mi captura de pantalla, cuando mi cursor está en "barra" en el búfer izquierdo, quiero presionar una tecla y poder ver dónde aparece "barra" en el búfer derecho, con el derecho todavía se muestra igual.) Equivalente a golpear C-s C-w C-x o C-s C-s C-x o(que es lo que estoy usando ahora, y parece estar bien en realidad).
ShreevatsaR
Si helm pudiera resaltar todas las ocurrencias en el otro búfer (mientras todavía se desplaza para que el primero sea visible en la pantalla), entonces eso sería mejor que la macro vinculada a la secuencia de esas 8 pulsaciones de teclas. :-)
ShreevatsaR
0

¿Qué tal usar highlight-regexppara resaltar el símbolo actual (o palabra, región, etc.) en la otra ventana?

Aquí hay un par de funciones que podrían funcionar. El primero encontrará el símbolo en el punto, luego saltará a la otra ventana y lo resaltará. El segundo salta a la otra ventana y elimina los resaltados.

 (require 'thingatpt)

 (defun highlight-other-window ()
   (interactive)
   (let ((match (thing-at-point 'symbol t)))
     (when match
       (save-excursion
         (other-window 1)
         (highlight-regexp (regexp-quote match))
         (other-window 1)))))

 (defun unhighlight-other-window ()
   (interactive)
   (save-excursion
     (other-window 1)
     (unhighlight-regexp t) 
     (other-window 1)))

En ambos casos, esto salta hacia atrás, por lo que la ventana actual permanece activa al final. No estoy seguro de si eso es lo que desea, de lo contrario, deje la última other-windowllamada.

Estas funciones también podrían mejorarse comprobando y haciendo coincidir la región activa; lidiar con el caso donde no hay otra ventana visible; etc.

glucas
fuente
El highlight-frame-togglecomando mencionado en otra respuesta parece ser una versión más pulida de esto, por lo que supongo que no necesita rodar la suya.
glucas