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
t
fü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:
Bei der color
Anzeigeklasse 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:
In der Hilfe für habe font-lock-add-keywords
ich 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
, or
und not
Wörter als Schlüsselwörter.
Der erste Fall FIXME
ist der interessante. Hier verwenden sie prepend
als Override-Flag.