Wie kann ich bestimmte Schlüsselwörter in Zeichenfolgen / Anführungszeichen hervorheben?


7

Ich habe eine andere Syntax, die für SQL-Schlüsselwörter in Zeichenfolgen (in Anführungszeichen) in VIM hervorgehoben wird. Es sieht aus wie das:

Geben Sie hier die Bildbeschreibung ein

In Emacs mit PHP-Modus wird dann alles zwischen Anführungszeichen ( ') von der Schriftsperre als Zeichenfolge betrachtet:

Geben Sie hier die Bildbeschreibung ein

Wie Sie sehen können, ist das erste Beispiel mit anderen Eigenschaften der Schriftart (keine kursiven Schlüsselwörter) klarer. Die Schlüsselwörter sind viel einfacher zu unterscheiden.

Wenn ich in meine font faceEigenschaften schaue :

 (font-lock-string-face ((t (:foreground "#536991" :slant italic)))) 

Dann frage ich mich, wie ich feststellen könnte, dass ein anderes Gesicht in einem font-lock-string-faceangewendet werden sollte, wenn es mit den spezifischen Schlüsselwörtern übereinstimmt.

Jeder Vorschlag wäre dankbar.


Wieder PHP-Modus wie in emacs.stackexchange.com/questions/19002/… ? Und hast du den Hack von dieser Antwort? Sie sollten der Frage einen Hinweis zum aktuellen Hauptmodus hinzufügen.
Tobias

@Tobias der StackExchange hat mich nicht benachrichtigt, dass ich eine Antwort von Ihnen bekommen habe! Es tut mir sehr leid für meine verspätete Antwort, siehe den Link für meine Antwort. Und du hast recht, ich habe den PHP-Modus hinzugefügt. Ich glaube jedoch, dass die Lösung möglicherweise nicht mit dem Hauptmodus zusammenhängt, da sie nur auf Schriftarten ausgerichtet ist.
ReneFroger

Antworten:


11

Das folgende Elisp-Snippet sollte ausreichen. Die wichtigen Details sind:

  • Zeichenfolgen werden durch Syntaxhervorhebung und nicht durch Mustervergleich (dh Schlüsselworthervorhebung) behandelt. Dies hat eine sehr hohe Priorität. Man muss es also explizit durch den Wert tfür das MATCHER-Flag OVERRIDE überschreiben (siehe Dokument von font-lock-keywords).
  • Ein regulärer Ausdruck kann nicht als Schlüsselwort MATCHER verwendet werden, da nur SQL-Schlüsselwörter in Zeichenfolgen überprüft werden müssen. Der folgende Code sieht dies vor php-sql-keyword-matcher. Der Test für Zeichenfolgen erfolgt über syntax-ppss(siehe Dokument für diese Funktion).

Beachten Sie, dass ich nur eine Anzeige der Klasse habe color. Also konnte ich die anderen Klassen nicht testen. Ich gehe davon aus, dass Sie eine andere Anzeigeklasse haben, da Zeichenfolgen in Ihrem Beispiel kursiv dargestellt werden. Wenn Sie nicht das erwartete Ergebnis erhalten, passen Sie das Gesicht an php-sql-keyword-face.

(require 'sql) ;; for sql-keywords
(require 'php-mode) ;; for php-mode-hook

(defvar php-sql-keywords (concat "\\<" (mapconcat 'car sql-mode-ansi-font-lock-keywords "\\|") "\\>")
  "SQL keywords for php-mode stolen from `sql-mode-ansi-font-lock-keywords'.")

(defun php-sql-keyword-matcher (end)
  "Search for SQl keywords within PHP strings."
  (let (pos (case-fold-search t))
    (while (and (setq pos (re-search-forward php-sql-keywords end t))
                (null (nth 3 (syntax-ppss pos)))))
    (when pos (message "Found keyword at %s" pos))
    pos))

(defface php-sql-keyword-face
  '((((class grayscale))  :slant nil :inherit font-lock-string-face)
    (((class color)) :slant italic :inherit font-lock-string-face)
    (t :slant nil :inherit font-lock-string-face))
  "Face to highlight SQL keywords within PHP strings."
  :group 'php-sql)

(defcustom php-sql-keyword-face 'php-sql-keyword-face
  "Face to highlight SQL keywords within PHP strings."
  :type 'face
  :group 'php-sql)

(defun php-add-sql-keyword-matcher ()
  "Hook to add fontification of sql-keywords in strings."
  (font-lock-add-keywords
   nil
   '((php-sql-keyword-matcher 0 php-sql-keyword-face t))
   'append))

(add-hook 'php-mode-hook 'php-add-sql-keyword-matcher)

Hinweis: Bitte fügen Sie nicht nur Bilder von Texten ein, die für die Rekonstruktion des Problems benötigt werden. Der ASCII-Text kann potenziellen Helfern die Rekonstruktion des Problems erleichtern. Für den Fall, dass jemand anderes eine bessere Lösung hat, füge ich hier die ASCII-Version des Textes ein:

$sSql = 'SELECT T05.foo
             T07.bar

         FROM db_pgm_intranet.inttbl_keyuser_proces_keyuser T05

             INNER JOIN db_pgm_intranet.inttbl_keyuser_keyuser T07
             ON    T07.nKkuID = T01.nKpkKeyuserID

             LEFT JOIN db_pgm_intranet.inttbl_keyuser_applicate T07
             ON   T06.nKpaProcesID = T07.nKapID';

Und hier ein Bild des Textes, wie er aussieht, wenn ich ihn im PHP-Modus in Emacs lade:

Bild der PHP-Datei mit kursiven Schlüsselwörtern in SQL-Strings

Bei der colorAnzeigeklasse sind Zeichenfolgen nicht kursiv, sondern haben eine andere Farbe. Aus diesem Grund habe ich für SQL-Schlüsselwörter in Zeichenfolgen eine kursive Schrift ausgewählt .

Die Kommentare weisen auf einige Schwierigkeiten mit dieser Antwort hin. Es wurde angegeben, dass die Lösung nicht mit der Standardschriftart funktioniert Consolas. Ich habe es gerade getestet und auf meinem System funktioniert es standardmäßig auch mit Consola-Schriftart:

Hervorheben von SQL-Schlüsselwörtern in PHP-Zeichenfolgen mit Consolas-Schriftarten als Standard.

In der Hilfe für habe font-lock-add-keywordsich folgenden Text gefunden:

Zum Beispiel:

(font-lock-add-keywords 'c-mode
  '(("\\<\\(FIXME\\):" 1 'font-lock-warning-face prepend)
    ("\\<\\(and\\|or\\|not\\)\\>" . 'font-lock-keyword-face)))

fügt zwei fontification Muster für den C - Modus fontify ‚FIXME:‘ Worten, auch in den Kommentaren und auf fontify and, orund notWörter als Schlüsselwörter.

Der erste Fall FIXMEist der interessante. Hier verwenden sie prependals Override-Flag.


1
Tobias, du hast wieder versucht mir zu helfen. Ich kann dir nicht genug danken. Ich habe die Dokumentation variabler Font-Lock-Schlüsselwörter untersucht (22.6.2 suchbasierte Fontifizierung). Es scheint, dass ich das subexp-highlighterOverride-Flag auf true setzen muss. Aber ich sehe, du hast es schon getan (php-sql-keyword-matcher 0 php-sql-keyword-face t). Also habe ich Ihren Code in einer leeren Emacs-Konfiguration mit nur integriertem PHP-Modus kopiert, den Puffer ausgewertet und dann einen neuen Puffer mit dem ASCII-Text erstellt, den Sie sogar rekonstruiert haben! Trotz Ihrer ausführlichen, ausgezeichneten Erklärung sehe ich leider keinen kursiven oder anderen Text.
ReneFroger

Wenn ich den Cursor in die Zeichenfolge setze und aufrufe php-sql-keyword-matcher(ich habe sie hinzugefügt (interactive)), wird außerdem eine Fehlermeldung angezeigt, sodass ich davon ausgehe, dass dies nicht für interaktive Anrufe vorgesehen ist. Nachdem ich Ihren Code ausgewertet und den ASCII-Text mit aktiviertem PHP-Modus in den Scratch-Puffer eingefügt habe, sehe ich keinen Unterschied zwischen SQL-Schlüsselwörtern und den restlichen Zeichenfolgen. Wenn Sie einen Screenshot mit Debugging-Informationen benötigen, würde ich gerne weitere Informationen hinzufügen, da mein Elisp-Wissen noch nicht ausreicht. Ich habe Ihre Hilfe in meinen Fällen sehr geschätzt und übrigens die besten Wünsche für 2016.
ReneFroger

1
Der wahrscheinlichste Grund für das Problem ist, dass jit-ockein Fehler aufgegeben wird. jit-locklöst keine Fehler aus, sondern deaktiviert den Handler, der den Fehler verursacht, und fährt mit seiner Arbeit fort. Trotzdem hinterlässt es eine Fehlermeldung im Nachrichtenpuffer. Starten Sie also einen neuen Emacs, probieren Sie Ihre Sachen aus und beobachten Sie den Nachrichtenpuffer sehr genau. AFAIK Sie können diese Art von Fehlern nicht über den Debugger abfangen. Das Anhalten jit-lockbei einem Fehler kann verdrahtete Konsequenzen haben, wie z. B. Dead Lock. Ich gehe davon aus, dass es wieder eine fehlende Funktion gibt. Ich werde es noch einmal versuchen mit -Q. Übrigens auch die besten Wünsche an Sie.
Tobias

1
Ich kann bestätigen, dass das Code-Snippet emacs -Qhier bei mir mit X11-Schnittstelle einwandfrei funktioniert. Ich werde es im Konsolenmodus erneut versuchen ...
Tobias

Welche Version von Emacs verwenden Sie dann? Ich benutze Emacs 25.50 unter Ubuntu und es gibt keinen PHP-Modus mit M-x php-modein der leeren Emacs-Konfiguration. Deshalb bin ich mit einer leeren Konfiguration weiter in den PHP-Modus eingestiegen.
ReneFroger
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.