Cerca e sostituisci attraverso un progetto multiplo in AUCTeX?


8

Sto per adottare Emacs come unico editore che utilizzo in tutto ciò che sto scrivendo, compresi i documenti LaTeX. Venivo dall'editore WYSIWYG che serviva a questo scopo abbastanza bene, vale a dire TexStudio o TXS in breve. Per il passaggio da TXS a Emacs mi manca ancora il modo in cui TXS gestisce l'esecuzione di ricerche di query regexp di grandi dimensioni e sostituisce con l'evidenziazione delle corrispondenze e delle restrizioni della ricerca solo a quei .texfile relativi al progetto . Adesso mi manca molto in Emacs. Vedi uno screenshot di TXS di seguito:

Query TeXStudio in un progetto LaTeX a più file inserisci qui la descrizione dell'immagine

Vorrei sottolineare i punti del flusso di lavoro da raggiungere in Emacs:

  1. Ricerca e sostituzione query RegExp solo nei .texfile relativi al progetto .
  2. Evidenziando le partite
  3. Una panoramica dei risultati evidenziati tutti insieme in un layout gestibile (simile alla visualizzazione del registro Magitin Emacs quando si preme lseguito da un altro lo semplicemente come C-x din modalità Dired
  4. Come sapere quante corrispondenze di sostituzione o ispezione sono state completate o rimanenti e un modo per riprendere la query nel caso in cui venga interrotta da una sequenza di tasti goffa che interrompe la query
  5. Un modo chiaro per uscire da questa query disordinata chiudendo e salvando tutti i file correlati e tornando allo stato prima di richiamare questa query

Ho letto questo post ma la mia intenzione è quella di essere più simile a CWchiunque possa condividere il suo miglior flusso di lavoro per fare questo lavoro comune. I miei approcci attuali come segue:

Primo flusso di lavoro

  1. La modalità Dired % gsegnerà tutti i file che contengono quella regexp. Contro: questo includerà anche i file non correlati al progetto inclusi i file non .tex.
  2. C-x 3 apre un nuovo buffer tenendo d'occhio il primo buffer come panoramica del mio orientamento su quali file contrassegnati devo interrogare individualmente nel nuovo buffer
  3. Esecuzione della query da C-c q. Ha interruttori molto belli come !sostituire tutto senza chiedere più evidenziando le partite all'interno del file aperto. Ma questo significa che devo eseguire la stessa query ogni volta e per ogni file contrassegnato.
  4. Dopo aver eseguito tutti i file contrassegnati, ho premuto C-x s !per salvare tutto in una sequenza di tasti. Accidenti!

inserisci qui la descrizione dell'immagine

Secondo flusso di lavoro: preferito

  • Contrassegnare tutti i .texfile utilizzando % min modalità Dired da regexp per contrassegnare solo i .texfile, quindi sostanzialmente in esecuzione \.texmi porterà lì.
  • C-x 3 come sopra per mantenere un buffer per la panoramica e l'altro per la query
  • L'esecuzione Qall'interno di Dired che è query sostituisce regexp solo nei file contrassegnati . In alternativa Aè solo la query di ricerca regexp. Verrà eseguita una query completa e verrà ?generosamente fornito un menu di aiuto
  • C-x s !salva e chiudi tutto il casino. Altrimenti ho dovuto chiudere i file aperti uno per uno, il che è noioso. Spero che ci sia un modo per chiudere solo quelli che abbiamo disturbato.

inserisci qui la descrizione dell'immagine

Come posso approssimare la ricerca regexp di TXS / sostituire la query in più file?

Nota

  • Emacs 24.4 su Windows 7

Questa domanda ha attualmente un voto "stretto" per essere troppo ampia, con la quale sono propenso a concordare. Potresti per favore restringere la domanda a una versione più discreta (forse sulla falsariga di "come posso approssimare la ricerca di regexp in TexStudio in più file")? "Qual è il tuo miglior flusso di lavoro?" è molto ampio e probabilmente fornirà risposte lunghe e basate sull'opinione.
Dan

Non posso scrivere una risposta completa in questo momento, ma dovresti esaminare wgrep.
Malabarba,

@Malabarba, considera di aggiornare il tuo commento a una risposta se ritieni che questo soddisfi i criteri indicati nel post.
dottorato il

Risposte:


3

Se ho capito bene, vuoi cercare modelli di testo nel tuo progetto, quindi potresti voler usare Proiettile insieme a Helm.

  • M-x helm-projectile-grep
  • Digitare pattern di testo o pattern regex.
  • Vedi i risultati aggiornati per ogni personaggio inserito.

Ecco una demo di helm-projectile-grep:

timone-proiettile-grep

Puoi salvare in un buffer separato per fare riferimento in seguito usando Save results in grep bufferaction` (passa al buffer di azioni usando TAB, di default).

Se non hai sentito parlare di Helm, puoi leggere il mio tutorial su Helm . Visita il mio tutorial su Helm Projectile per ulteriori demo e indicazioni su Helm Projectile.

In alternativa, puoi anche utilizzare rgrep, che è integrato:

  • M-x rgrep
  • Immettere il modello text / regex nel Search for:prompt, ad esempio "test"
  • Immettere il tipo di file in cui cercare Search for "test" in file:, ad es *.tex.
  • Inserisci la directory per cercare ricorsivamente (da qui il nome rgrep).
  • Premi RETe vedi i risultati.

Una rgrepdemo:

inserisci qui la descrizione dell'immagine

Per quanto riguarda i tuoi criteri:

  1. Ricerca e sostituzione query RegExp solo nei .texfile relativi al progetto .

Sia Helm che rgrepsupportano questa funzione.

  1. Evidenziando le partite

Come sopra.

  1. Una panoramica dei risultati evidenziati tutti insieme in un layout gestibile

Come sopra.

  1. Come sapere quante corrispondenze di sostituzione o ispezione sono state completate o rimanenti e un modo per riprendere la query nel caso in cui venga interrotta da una sequenza di tasti goffa che interrompe la query

Se si desidera sostituire le corrispondenze, è possibile utilizzare wgrep per eseguire la sostituzione in un *Grep*buffer. Una volta terminato e sincronizzato il *Grep*buffer, tutto verrà sostituito in base al testo che hai sostituito.

"Riprendi" eseguendo di nuovo la query se la interrompi accidentalmente. Ma usando Helm, hai un helm-resumecomando che ti riporta alla precedente operazione in corso se lo annulli accidentalmente.

  1. Un modo chiaro per uscire da questa query disordinata chiudendo e salvando tutti i file correlati e tornando allo stato prima di richiamare questa query

In realtà, non devi uccidere nessun buffer se usi strumenti come helm-mini . Gestire migliaia di buffer aperti è un gioco da ragazzi: puoi restringere i buffer dei desideri con un breve schema di testo. Puoi uccidere tutto in una volta se vuoi.

Ecco una demo di helm-mini:

timone-mini

Vedi la spiegazione dettagliata nella pagina Helm Github, nella sezione "Uso avanzato" .


Penso di dover provare a studiare il proiettile con il timone. Grazie per i tuoi tutorial ricchi di schermate!
dottorato il

quali pacchetti devo installare per ottenere queste funzioni decenti: projectile, helmed helm-projectileè ovvio, che altro? Inoltre ci sono due pacchi MELPA helm-pojectilee helm projectile-allqualche consiglio qui?
dottorato

È già abbastanza. Quindi, segui la configurazione nelle mie guide. Dovresti controllare la Installationsezione nelle mie guide Helm e Helm Projectile.
Tu Do

in quali sequenze di tasti usi rgrepper visitare le occorrenze delle partite (avanti o indietro) nel buffer superiore e inferiore?
dottorato il

1
è stata un'esperienza che ha cambiato Emacs incontrare il timone e il proiettile del timone, grazie! Ma la ricerca grep non funziona. Puoi dare un'occhiata a questo post: emacs.stackexchange.com/q/7178/2443
dottorato

5

Se ho capito cosa vuoi, RefTeX ' reftex-isearch-minor-modedovrebbe essere quello che stai cercando . Dalla sua descrizione nel manuale:

Attiva / disattiva una modalità secondaria che consente alla ricerca incrementale di funzionare a livello globale sull'intero documento multipile. I file verranno cercati nella sequenza in cui compaiono nel documento.

Come riportato da T. Verron, questo funziona anche con regexps.

Per abilitare questa modalità minore in tutto il buffer * TeX, aggiungi una delle seguenti righe al tuo file init

(add-hook 'TeX-mode-hook (lambda () (reftex-isearch-minor-mode))) ; for AUCTeX
(add-hook 'tex-mode-hook (lambda () (reftex-isearch-minor-mode))) ; for the Emacs' bultin TeX mode.

Buono a sapersi mentre uso reftex. Ma dal momento che nessuna regexp è supportata, dubito che questo approccio sarebbe migliore!
dottorato il

2
Apparentemente, premendo M-rnel buffer di ricerca si passa alla regexp della ricerca, proprio come fa per i normali isearch.
T. Verron,

1
E anche la solita scorciatoia per regexp isearch ( C-M-s) funziona.
T. Verron,

@ T.Verron grazie! In realtà non ho usato ampiamente questa funzione, l'ultima volta che l'ho provata la ricerca regexp non ha funzionato, chissà cosa ho provato allora;-)
giordano,

@ T.Verron dalla barra dei menu-> ref-> azioni globali-> cerca la versione e sostituisci la versione per l'intero documento fornisce una migliore regexp poiché puoi modificare la tua espressione mentre sei nel minibuffer ma non so quale sia la funzione e cosa sia il keybinding.
dottorato

3

Nel caso in cui non si è a conoscenza, è possibile aprire Dired solo su un determinato set di file (che si trova in qualsiasi directory, ovunque). IOW, puoi usare Dired come punto di ingresso per tutti i file di un progetto. Le solite funzioni di Dired funzionano in questo contesto: operare su file contrassegnati, ecc.

Se usi la libreria Segnalibro + , puoi avere i segnalibri Dired che usi per darti "visualizzazioni" diverse di diversi set di file, i loro segni, ecc

(Emacs Wiki non è attualmente disponibile per manutenzione e per alcuni giorni, quindi il collegamento è temporaneamente inaccessibile.)


È come il restringimento di Emacs C-x n n? puoi per favore arricchire la tua risposta con maggiori dettagli. Grazie.
dottorato

No; niente a che fare con C-x n n- solo una caratteristica Dired poco conosciuta. C-h f diredti dice che puoi passare come argomento un elenco di nomi (es. assoluti) di file (e directory) anziché un nome di directory. Questa è la chiave. Library Dired + semplifica l'utilizzo interattivo. (Ma ancora una volta, il wiki è temporaneamente inattivo, in modo che anche collegamento non è disponibile al momento.)
Drew
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.