Angenommen, ich habe eine kurze Zeichenfolge in C ++ und lösche versehentlich das doppelte Anführungszeichen, das diese beendet. Was Emacs tut, ist, den Rest des Codes als eine einzelne sehr lange Zeichenfolge hervorzuheben, die die gesamte Formatierung durcheinander bringt, bis ich das doppelte Anführungszeichen wieder einfüge. Es fühlt sich auch etwas langsam an, wenn der gesamte Puffer neu konfiguriert wird. P. >
Ich habe cc-mode.el
durchgesehen, aber ich konnte die Einstellung dafür oder den Ort, an dem die Zeichensetzung von Zeichenfolgen erfolgt, nicht finden.
Gibt es eine Möglichkeit dazu Sagen Sie dem c ++ – Modus (oder vielleicht der Schriftsperre?), dass meine Zeichenfolgen niemals Zeilenumbrüche enthalten und dass sie niemals über die erste Zeilenumbruch hinausgehen sollten, wenn ein nicht abgeschlossenes Zeichenfolgenliteral gefunden wird?
Kommentare
- Verwenden Sie Syntaxprüfer? wie Flycheck oder Flymake? Sie zeigen Ihnen die fehlerhafte Zeile an, sodass sie leicht zu korrigieren ist.
- @Ian Auch wenn ich weiß, wo das doppelte Anführungszeichen fehlt, wird der gesamte Puffer nach einer langen Länge angezeigt Zeichenfolge. Das versuche ich ' zu vermeiden.
- Sind Sie sicher, dass Sie dies ändern möchten? Das System funktioniert wie vorgesehen und gibt Ihnen das Feedback, dass Ihr Code nicht ' nicht korrekt ist.
- @TrippLilley Ja: Entfontifizierung und anschließende erneute Kontifizierung des gesamten Puffers nach der Zeichenfolge sieht hässlich aus und es gibt auch eine merkliche Verzögerung der Benutzeroberfläche. Flycheck und lsp werden mich sowieso immer über Syntaxfehler informieren. Xcode hebt beispielsweise Zeichenfolgen mit einem fehlenden endgültigen Anführungszeichen nur bis zur nächsten neuen Zeile hervor, und auf diese Weise sieht es für mich viel besser aus.
- I ' m Angenommen, dies beinhaltet das Ändern von Syntaxtabellen, da dieser Modus möglicherweise nicht die Schriftsperre selbst ausführt.
Antwort
Die Funktion c-literal-limits
, definiert in progmodes/cc-engine.el
bestimmt, wie Zeichenfolgen und Kommentare in allen c-mode
-Varianten identifiziert werden. Dazu werden diese beiden Definitionen verwendet:
;; String syntax chars, suitable for skip-syntax-(forward|backward). (defconst c-string-syntax (if (memq "gen-string-delim c-emacs-features) "\"|" "\"")) ;; Regexp matching string limit syntax. (defconst c-string-limit-regexp (if (memq "gen-string-delim c-emacs-features) "\\s\"\\|\\s|" "\\s\""))
Leider, da dies der Fall ist Da es sich nicht um eine konfigurierbare Variable handelt, können Sie sie nicht einfach neu zuweisen und c-mode
tun lassen, was Sie möchten. Grundsätzlich müssten Sie „Ratschläge“ (siehe: defadvice
) für die Funktion c-literal-limits
implementieren, die stattdessen Ihre Konstanten verwendet. Diese Konstanten würden eine EOL hinzufügen (dh "\\s$"
), um den Zeichenfolgenausdruck zu beenden.
Dies ist natürlich nicht das C / C ++ Die Sprache funktioniert jedoch, daher empfehle ich dringend, dies nicht zu tun, aber Sie haben die Wahl, und wie Sie sehen, ist dies kein einfacher Weg.
Kommentare
- Es war nicht ' t bis C ++ 0x, dass C ++ mehrzeilige Zeichenfolgenliterale hatte. C nicht ' habe sie überhaupt nicht AFAIK.
- Sie haben Recht. Ich denke, es wäre besser, wenn Emacs sie als Fehler in Nicht-C ++ – Dateien kennzeichnet.
- Multi -Linien-String-Literale in C ++ haben eine spezielle Syntax, die in C ++ 11 eingeführt wurde. Sie würden ' nicht unbedingt wie normale Strings für Emacs erscheinen (z. B.
R""(string-contents)""
. - Dies funktioniert, aber ich ' möchte " " diese Antwort, weil es einfach so kompliziert zu sein scheint, Ratschläge geben zu müssen / Bearbeiten Sie cc-engine.el, um diese Funktion zu erhalten. Wenn ich es richtig verstanden habe, funktioniert dies nur im c-Modus, was mich überraschte, weil ich ' dachte, dass das Identifizieren von String-Literalen etwas ist, das von emacs selbst gemacht und dann durch Funktionen wie
syntax-ppss
. - @Kirill " Dies funktioniert, aber ich ' Ich möchte " " diese Antwort nicht akzeptieren, weil es einfach so kompliziert erscheint, cc-engine.el nur beraten / bearbeiten zu müssen, um sie zu erhalten Diese Funktion " Ich höre dich. Die Syntax-Engine in
c-mode
ist nicht immer flexibel, da sie leider viele Funktionen unterstützt …