2011-09-08 19 views
6

1) Nel mio processo di regolazione dal mio editor GUI a EMACS mi sembra di avere difficoltà a trovare un modo chiaro per fare un compito relativamente semplice per la maggior parte degli editori: Trova e Sostituisci intere parole (non sottostringhe) all'interno di un testo e trova corrispondenze esatte. M-x replace-string trova sottostringhe e parole intere. C'è una regexp che fa questo?Trova e sostituisci intere parole (non sottostringhe) in Emacs

2) Inoltre, c'è un modo per far corrispondere le stringhe esatte? Ad esempio, se volessi sostituire myClaSs con il caso esatto di ciascuna lettera, cosa dovrei fare? In questo momento la stringa di sostituzione corrisponde a myclass con myCLasS. Mentre scrivo solo le prime lettere del caso sono abbinate. Sto assumendo che alcune regexp si occupino anche di questo.

3) Esiste un'opzione per eseguire una ricerca circolare? O dovrò sempre decidere se faccio C-s (avanti) o C-r (indietro)

risposta

7

Usa ancoraggi limite di parola: \bfoo\b corrisponde solo a foo, non foobar.

Quindi, le espressioni regolari di solito sono case-sensitive. Nella maggior parte dei casi, è possibile renderli esplicitamente case-sensitive prepagando (?I) o (?-i) alla propria espressione regolare. Ma non sono sicuro che Emacs regex possa farlo.

Non ho idea della tua terza domanda. Scusate.

+0

'M- <' esegue 'inizio-di-buffer' – ceving

+1

Inoltre, 'inizio-di-buffer' spinge il punto verso l'anello del segno locale, e così fanno i comandi di ricerca/sostituzione.Pertanto, dopo aver terminato la sostituzione, è possibile utilizzare 'C-u SPC' (che fa apparire l'anello del segno locale) due volte per tornare al punto di partenza. – phils

1

In primo luogo, è possibile inserire più domande in domande separate in futuro? Rende più semplice per gli altri aiutare te e altri utenti che hanno in futuro alcune delle stesse domande per ottenere aiuto dalle risposte precedenti.

risposta
  1. vedere @ Tim

  2. Vedi C-h k M-% e leggere la sezione sul caso di corrispondenza

  3. Facendo C-s dopo l'ultima partita vi verrà chiesto che sei alla fine, colpendo C-sdi nuovo si concluderà dall'inizio. Leggi i documenti colpendo C-h i quindi fai clic su * Emacs quindi premi g Repeat Isearch RET, penultimo paragrafo.

+0

M-% funziona bene insieme al "!" modificatore per non fermarsi ad ogni partita. Sto ancora imparando la sintassi di emacs e vorrei sapere come posso richiedere il prefisso/argomenti opzionali per i comandi. in questo caso l'argomento DELIMITED di M-%. (Il terzo argomento DELIMITED (prefisso arg se interattivo), se non-nil, significa sostituisce solo corrispondenze circondate da limiti di parole.) – octi

+0

Sembra un'altra domanda. :-) Non so cosa stai chiedendo qui. Apri un'altra domanda ed elaborala lì. –

+0

Bene, la domanda era come impostare DELIMITED su non-nil quando si chiama M-%. Ho fatto aprire un'altra domanda però. Grazie per l'aiuto! – octi

1

per la domanda 2, se la stringa di ricerca è tutto minuscolo, emacs fa una ricerca case-insensitive per impostazione predefinita. Puoi forzarlo a fare una ricerca case-sensitive impostando case-fold-search su zero. Puoi inserire questo nel tuo file .emacs: (setq case-fold-search nil).

6

Tutte le altre risposte forniscono informazioni che è possibile utilizzare per ottenere Emacs per fare ciò che si desidera. Ma si può anche ruotare la propria ricerca/sostituire la funzione per fare ciò che si vuole in questo modo:

(defun search-replace-ala-octi (tosearch toreplace) 
    (interactive "sSearch for word: \nsReplace with: ") 
    (save-excursion 
    (goto-char (point-min)) 
    (let ((case-fold-search nil) 
      (count 0)) 
     (while (re-search-forward (concat "\\b" tosearch "\\b") nil t) 
     (setq count (1+ count)) 
     (replace-match toreplace 'fixedcase 'literal)) 
     (message "Replaced %s match(es)" count)))) 

e associarlo a qualsiasi tasto che si desidera ...

+2

Più voglio imparare EMACS più mi rendo conto che devo imparare LISP. – octi

+0

@octi La maggior parte di Emacs per fare ciò che vuoi è solo imparare Emacs, il che è chiaro. Il 95% di ciò che la gente vuole è semplicemente la personalizzazione degli hook/variabili che sono già presenti. L'altro 5% può essere trovato chiedendo qui. –

1

Su domanda 1 (intera ricerca di parole) \b nella risposta di @Tim non può funzionare quando si incontra il carattere _. Sembra che foo\b possa corrispondere a foo_bar in Emacs (ovviamente non può corrispondere in Perl).

+1

Dipende tutto dalla tabella di sintassi del buffer (che è impostata dalla modalità principale nella maggior parte dei casi). Se '_' non è un carattere costituente di una parola nella tabella di sintassi, quindi' \ b' potrebbe corrispondere a entrambi i lati, come nell'esempio. Si noti che in Emacs regexps, è possibile abbinare l'inizio o la fine di un * simbolo * con '\ _ <' and '\_>' rispettivamente ('_' è quasi certamente un costituente del simbolo in modalità perl). – phils