Evidenziazione del testo in buffer / finestre aperti (visualizzati): ricerca di testo da un buffer in un altro


8

In questo momento, ho il mio frame Emacs diviso verticalmente e sto guardando due diversi buffer nelle due finestre.

Vorrei andare a una parola in un buffer, premere alcuni tasti e far evidenziare le occorrenze di quella parola (se presente) nell'altro buffer, scorrendo fino ad essa se necessario.

C'è un modo per farlo?

Screenshot per spiegare

Nello screenshot sopra, con il mio cursore appena prima di "bar" nel buffer di sinistra, mi piacerebbe poter <fare qualcosa> e vedere rapidamente dove si trova "bar" nel buffer di destra.


Nota: ciò è correlato a Come trovo il testo su più buffer aperti? nel senso che, se potessi fare una ricerca attraverso il "altro" buffer, farebbe quello che voglio. Ma nessuna delle risposte ci sono esattamente quello che voglio:

  • Le occursoluzioni basate aprono una nuova finestra che mostra le linee corrispondenti, mentre mi piacerebbe mantenere ancora visualizzate le mie due finestre - In realtà cercherò nell'altro buffer il contesto attorno alla corrispondenza, quindi mostrerò solo la linea corrispondente non è molto utile.
  • multi-isearch-buffersmi richiede di specificare l'elenco dei buffer ogni volta che voglio fare questa ricerca (molte volte), invece di raccoglierlo automaticamente come i due buffer visualizzati. Ancora più importante, quando parto da una finestra ed eseguo l'isearch, quando trova la corrispondenza nell'altro buffer, mostra quel buffer in questa finestra, in modo che entrambe le finestre visualizzino lo stesso (altro) buffer. Quindi Cg rimette tutto a posto e non riesco più a vedere la parola evidenziata nell'altro buffer.
  • icicle-search ha così tante caratteristiche che una di queste potrebbe essere in grado di farlo, ma non sono riuscito a trovare nulla dopo una rapida occhiata alla documentazione.

In questo momento, quello che faccio è Cs Cw Cs (per fare la ricerca in questo buffer), passare all'altro buffer, fare Cs Cs (per ripetere la stessa ricerca lì), quindi tornare indietro. Sono sette sequenze di tasti, che potrei registrare come macro immagino. Lascia che lo faccia. Tuttavia, sono interessato a sapere se ci sono altre soluzioni.
ShreevatsaR,

FWIW: C-s C-w C-x o C-s C-snon suona così male per me. (Non avete bisogno di una C-ssubito dopo la C-w.)
Drew

@Drew: Grazie, l'idea di utilizzare una macro è nata solo dopo aver pubblicato la domanda; ora una macro che C-s C-w C-x o C-s C-s C-x osembra davvero a posto.
ShreevatsaR,

Risposte:


5

Puoi usare un pacchetto chiamato highlight-globaldisponibile da github ma non su Melpa (al momento della stesura di questo).

La highlight-frame-togglefunzione definita in questo pacakge evidenzierà la parola nel punto o la regione selezionata ovunque nel riquadro (in tutti i buffer). Questo, tuttavia, non farebbe lo scorrimento automatico della parola evidenziata di cui hai bisogno. Sceglie un colore di evidenziazione diverso quando si evidenziano più parole senza cancellare le alte luci precedenti.

Ecco uno screenshot di come appare:

inserisci qui la descrizione dell'immagine Fai clic per una migliore visualizzazione dello screenshot


0

helm ha interfacce che possono raggiungere questo obiettivo, ho registrato un Gifcast per dimostrare il pacchetto helm -swoop :

Dopo aver avviato la helm-swoopricerca posso o restringere a meno candidati inserendo ulteriori token separati da spazi o hit C-pe C-nper passare alla successiva e scorrimento nel buffer di destinazione allo stesso tempo.


Come ho detto nella domanda, le soluzioni basate sul verificarsi non sono ciò che voglio, perché elencano le linee corrispondenti (e devo andare ulteriormente lì e interagire con l'elenco) invece di mantenere intatto l'altro buffer ed evidenziare il testo in esso .
ShreevatsaR,

Hmm, l'altro buffer è mantenuto intatto e può mostrarti il ​​contesto, ma se i punti salienti sono ciò che stai cercando, helm-swoop potrebbe essere più la tua passione.
Wasamasa,

OK, modificato per dimostrare helm-swoop.
Wasamasa,

Vorrei potermi chiarire. Durante l'intero processo, non voglio che l'altra finestra mostri mai nulla di diverso da ciò che è attualmente visualizzato. Tutto quello che voglio è premere un tasto e vedere nell'altra finestra, così com'è, la (prima, diciamo) occorrenza della parola corrente nell'altro buffer. (Nel mio screenshot, quando il mio cursore si trova sulla "barra" nel buffer di sinistra, voglio premere un tasto ed essere in grado di vedere dove si trova la "barra" nel buffer di destra, con la destra ancora visualizzata uguale.) Equivalente a colpire C-s C-w C-x o C-s C-s C-x o(che è quello che sto usando ora, e in realtà sembra a posto).
ShreevatsaR,

Se helm potesse evidenziare tutte le occorrenze nell'altro buffer (mentre scorre ancora in modo che il primo sia visibile sullo schermo), ciò renderebbe migliore la macro associata alla sequenza di quegli 8 tasti. :-)
ShreevatsaR

0

Che ne dici di usare highlight-regexpper evidenziare il simbolo corrente (o parola, regione, ecc.) Nell'altra finestra?

Ecco un paio di funzioni che potrebbero funzionare. Il primo troverà il simbolo nel punto, quindi salterà all'altra finestra e lo evidenzierà. Il secondo passa all'altra finestra e rimuove le luci.

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

In entrambi i casi questo salta indietro in modo che la finestra corrente rimanga attiva alla fine. Non sono sicuro se è quello che vuoi, altrimenti lascia la other-windowchiamata finale .

Queste funzioni potrebbero anche essere migliorate controllando e abbinando la regione attiva; affrontare il caso in cui non è visibile altra finestra; eccetera.


Il highlight-frame-togglecomando menzionato in un'altra risposta sembra essere una versione più raffinata di questo, quindi immagino che non sia necessario eseguire il rollback.
Glucas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.