Wie viele Backslashes werden benötigt, um reguläre Ausdrücke im Modus "Anpassen" von Emacs zu umgehen?

9

Ich versuche, die customize-group -Pakete von emacs zu verwenden, um einige Teile meines Setups zu optimieren, und ich bin behindert. Ich sehe solche Dinge in meiner .emacs-Datei, nachdem ich mit customize Änderungen vorgenommen habe:

%Vor%

Dies war das Ergebnis der folgenden Eingabe in das Textfeld "Anpassen":

%Vor%

Dies ist ein repräsentatives Beispiel: Ich versuche tatsächlich, mehrere Dinge zu ändern, die eine Regexp haben wollen, und sie alle zeigen dasselbe Problem. Wie viele Zitatebenen gibt es wirklich? Ich kann nicht die magische Anzahl von Backslashes finden, um das Gosh-Dang-Ding dazu zu bringen, das zu tun, wonach ich es frage, selbst für die einfachsten regulären Ausdrücke wie .* . Im Moment produziert die gegebene Anpassung - nichts. Es ändert nichts an dem Standardverhalten von Emacs.

Besser noch, wo auf der Welt ist das dokumentiert? Es ist ein bisschen schwierig für Google, aber ich habe dort einiges versucht, genauso wie in der offiziellen Dokumentation und im Emacs-Wiki. Wo ist eine autoritative Quelle dafür, wie viele dang Backslashes man braucht, um einen regulären Ausdruck im customize-mode tatsächlich funktionieren zu lassen - oder zumindest mit einer Art Warnung zu versagen, anstatt stillschweigend zu versagen?

BEARBEITEN: Wie so oft bei Fragen, die in Wut gestellt werden, habe ich die falsche Frage gestellt. Zum Glück führten die Antworten unten zu der Antwort auf die Frage, die ich brauchte, nämlich über das Zitieren von Regeln. Ich werde versuchen, das, was ich hier gelernt habe, aufzuschreiben, weil ich die Dokumentation und die Ressourcen von Google-fähige Ressourcen für verblüffend undurchschaubar halte. Also hier sind die Zitatregeln, die ich durch Versuch und Irrtum gefunden habe, und ich hoffe, dass sie jemand anderem helfen, zur Korrektur anregen, oder beides.

Wenn ein emacs customize-mode buffer Sie nach einem "Regexp Matching Filename" fragt, ist er, wie Emacs häufig, sowohl knappe als auch idiosynkratische (wie oft die Persönlichkeit des Schöpfers wird der Schöpfung vermittelt!). Es bedeutet zum einen eine Regexp, die mit dem ganzen Pfad der Datei auf der Suche nach einer Übereinstimmung verglichen wird, nicht nur mit dem Namen der Datei selbst, wie Sie aus dem Begriff " Dateiname". Dies ist der gleiche Sinn für "Dateiname", der zum Beispiel in der Funktion buffer-file-name von Emacs verwendet wird.

Außerdem, wenn Sie foo in das Feld setzen, sehen Sie "foo" (mit doppelten Anführungszeichen) in die eigentliche Datei geschrieben, das ist nicht genug Zitat und nicht das richtige Zitat. Sie müssen Ihre Regexp mit dem Zitat-Stil zitieren, der, soweit ich sagen kann, nur Emacs verwendet: das '' backtick-foo-single-quote''scheme. Und dann müssen Sie entkommen, machen es \'backslash-backtick-foo-backslash-single-quote\' (und wenn Sie denken, dass es Kopfschmerzen bereitet, in Markdown zu schreiben, ist es in Emacs mehr).

Darüber hinaus scheint Emacs eine Regel zu haben, dass das Sonderzeichen . regexp nicht mit / am Anfang von Dateinamen übereinstimmt, also, wie es mir oben passiert ist, das klassische Muster .* Es scheint, als würde nichts passen: Um "alle Dateien" zu finden, brauchen Sie eigentlich die regexp /.* , die Sie dann in das Zitatformat von customize-mode stopfen, um \'/.*\' zu erzeugen, danach passe ein anderes Ebene der Flucht auf es und schreibt es in die Anpassungsdatei.

Das Endergebnis für eine meiner Bemühungen - eine Einstellung, bei der # Autosave # -Dateien das Verzeichnis, in dem Sie arbeiten, nicht verschmutzen, sondern alle an einem Ort leben:

%Vor%

Backslashes in elisp sind eine weitaus größere Bedrohung für Ihre Gesundheit als Klammern.

EDIT 2 : Zeit für mich wieder falsch zu liegen. Ich fand schließlich die relevante Dokumentation (durch das Lesen einer weiteren Stapelüberlauf-Frage , natürlich!): Regexp-Backslash-Konstrukte . Der entscheidende Punkt der Verwirrung für mich: Der Backtick und das einfache Zitat werden in diesem Kontext nicht zitiert: Sie entsprechen den Perl's ^ und $ Sonderzeichen. Das Backslash-Backtick-Konstrukt entspricht einem leeren String, der am Anfang des zu prüfenden Strings verankert ist, und das umgekehrte Schrägstrich-Konstrukt mit einem einfachen Anführungszeichen entspricht dem leeren String am Ende des betrachteten Zeichens. Und mit "String in Betracht gezogen", meine ich "Puffer, der in diesem Fall nur einen Dateipfad enthält, aber Sie müssen die ganze Dang-Sache anpassen, wenn Sie überhaupt eine Übereinstimmung wollen, da dies das globale Regexp-Verhalten von elisp ist . "

Schwöre Gott, es ist wie mit einer fremden Zivilisation.

EDIT 3 : Um zukünftige Leser nicht zu verwirren -

  • \' ist die Emacs-Regex für "den Anfang des Puffers". (Siehe Perls \A )
  • \' ist die Emacs Regex für "das Ende des Puffers."(siehe Perls \Z )
  • ^ ist die Common-Idiom Regex für "den Anfang der Zeile." Es kann in Emacs verwendet werden.
  • $ ist die Common-Idiom Regex für "das Ende der Zeile." Es kann in Emacs verwendet werden.

Da Regex-Suchen über mehrzeilige Textkörper in Emacs häufiger vorkommen als anderswo (zB M-x occur ), werden in Emacs die Backtick- und Single-Quote-Sonderzeichen verwendet, und soweit ich das beurteilen kann, Wird im Kontext von customize-mode verwendet, da Sie, wenn Sie eine unbekannte Eingabe in ein Feld im Customizing-Modus erwägen, Zeilenumbrüche enthalten können und deshalb die Sonderzeichen Anfangsbeginn und Ende des Puffers verwenden möchten Der Anfang und das Ende des -Eintrags sind nicht garantiert der Anfang und das Ende einer -Zeile.

Ich bin mir nicht sicher, ob ich es bereuen sollte, meine eigene Stack Overflow-Frage zu entführen und sie im Wesentlichen in einen Blogpost umzuwandeln.

    
Brighid McDonnell 12.11.2011, 07:24
quelle

1 Antwort

3

Im Feld "Anpassen" geben Sie die Regexp gemäß der Syntax ein, die hier beschrieben wird . Wenn customize den regexp in eine Zeichenfolge schreibt, werden alle umgekehrten Schrägstriche oder doppelten Anführungszeichen in der Regexp mit Escapezeichen versehen, wie in regulären String-Escaping-Konventionen.

Kurz gesagt, geben Sie einfach umgekehrte Schrägstriche in das Feld regexp ein, und sie werden in der resultierenden custom-set-variables -Klausel, die in Ihr .emacs geschrieben wurde, korrekt verdoppelt.

Außerdem: Da die reguläre Zeichenfolge für übereinstimmende Dateinamen ist, können Sie versuchen, ein Verzeichnis zu öffnen, das Dateien enthält, die Sie abgleichen möchten, und dann M-x re-builder RET ausführen. Sie können dann die Regexp im Format String-Escatter eingeben, um zu bestätigen, dass sie mit diesen Dateien übereinstimmt. Wenn Sie % m in einen dired-Puffer eingeben, können Sie eine Regexp-Datei in einem nicht-gescannten Format eingeben (dh genau wie im Feld "Anpassen"), und dired markiert übereinstimmende Dateinamen.

    
sanityinc 12.11.2011, 09:58
quelle

Tags und Links