2016-06-10 13 views
3

In einem Text-Puffer möchte ich überprüfen, ob eine Datei mit der Zeichenfolge "abc" gefolgt nur von null bis zwei Zeilenumbrüche (und dann löschen diese Endzeichen) .In Emacs, wie eine Regexp am Ende des Puffers zutreffen

So brauche ich so etwas wie looking-at-backwards oder ich möchte am Ende der Datei (nicht am Ende der Zeile) übereinstimmen. Was ist ein einfacher Weg, dies zu erreichen?

+4

Kann der Link zu Xah Lees Artikel über '\ '' helfen? http://ergoemacs.org/emacs/emacs_regex_begin_end_line_string.html – lawlist

+0

@lawlist Guten Tipp zu verwenden '\ ''! Ich war mir dessen nicht bewusst. – halloleo

Antwort

4

looking-back ist die Funktion, die Sie suchen, passen rückwärts

Verwenden der allgemeinen Postifx Operator \{m,n\} für bis zu 2 Zeilenumbrüche:

(save-excursion 
    (goto-char (point-max)) 
    (when (looking-back "^abc\n\\{,2\\}") 
    (delete-region (match-beginning 0) (match-end 0)))) 
+1

Die doc-Zeichenkette für 'end-of-buffer' gibt (teilweise) an:" * Diese Funktion dient nur zur interaktiven Verwendung, im Lisp-Code dagegen '' (goto-char (point-max)) '' , die doc-Zeichenkette für 'Pufferanfang' gibt (teilweise) an: "* Diese Funktion dient nur zur interaktiven Verwendung; im Lisp-Code dagegen '(goto-char (point-min))'. '" Insofern Wenn Menschen, die diese Antwort in der Zukunft lesen, dazu neigen, die Verwendung von "end-of-buffer" programmatisch zu kopieren und zu verewigen, ziehen Sie in Betracht, Ihre Antwort entsprechend zu modifizieren. – lawlist

+0

Guter Fang. Ich habe den Code angepasst. –

0

Was Sie beschreiben, fordert nicht, was normalerweise eine Regexp Suche in Emacs genannt wird. Es fordert die Übereinstimmung eines Regexp am Ende des Puffers (eob). Ich habe den Titel und den Text Ihrer Frage entsprechend bearbeitet.

Dafür müssen Sie nur vorübergehend zum Ende des Puffers wechseln und looking-back verwenden, um nach einem regulären Ausdruck zu suchen.

(defun delete-abc-SPC-<-3-newlines() 
    "Delete `abc ' followed by up to 2 newlines at eob." 
    (interactive) 
    (let ((ends-w-<-3-newlines nil)) 
    (save-excursion 
     (goto-char (point-max)) 
     (setq ends-w-<-3-newlines (looking-back "abc \n?\n?\n?"))) 
    (when ends-w-<-3-newlines 
     (delete-region (match-beginning 0) (match-end 0))))) 

Wenn Sie den Puffer nicht neu dann diese verwenden geändert berücksichtigt werden:

(defun delete-abc-SPC-<-3-newlines() 
    "Delete `abc ' followed by up to 2 newlines at eob." 
    (interactive) 
    (let ((ends-w-<-3-newlines nil) 
     (mod-buf    (buffer-modified-p))) 
    (save-excursion 
     (goto-char (point-max)) 
     (setq ends-w-<-3-newlines (looking-back "abc \n?\n?\n?"))) 
    (when ends-w-<-3-newlines 
     (delete-region (match-beginning 0) (match-end 0))) 
    (set-buffer-modified-p mod-buf))) 
+0

Art von dem, was ich gefragt habe, aber ich denke, dass @ Hoelzel's Antwort ist ein wenig prägnanter. – halloleo

+0

(1) Es ist prägnanter, weil es keine Mühe macht, einen Befehl zu definieren (und auch wegen der anderen hier erwähnten Dinge). (2) Es enthält nicht "SPC" nach "abc", was nicht das ist, wonach Sie gefragt haben. (3) Es verwendet irrtümlicherweise das 'end-of-buffer' (siehe' Ch f' dafür: "** Benutze diesen Befehl nicht in Lisp-Programmen!' (Goto-char (point-max)) 'ist schneller. ** "). (4) Es verwendet irrtümlich 'save-restriction' anstelle von' save-excursion' (und es besteht keine Notwendigkeit für "save-restriction" hier). (5) Es stellt den Puffermodifikationszustand nicht wieder her. (6) Es befasst sich nicht mit Ihrer Verwirrung über die Übereinstimmung zwischen Suche und Regexp. – Drew

+0

Einige Ihrer Punkte sind sehr gültig und danke, dass Sie auf die Probleme mit dem anderen Code hingewiesen haben. @hoetzel hat sie angesprochen. Insgesamt bevorzuge ich die weniger detaillierte Antwort. - Wenn Sie das weiter diskutieren wollen, sollten wir zu den Diskussionskanälen übergehen, denke ich. – halloleo