El siguiente fragmento de código elisp debería hacer. Los detalles importantes son:
- Las cadenas se manejan mediante el resaltado de sintaxis y no mediante la coincidencia de patrones (es decir, el resaltado de palabras clave). Esto tiene una prioridad muy alta. Por lo tanto, es necesario anularlo explícitamente por el valor
t
de la anulación del indicador MATCHER (ver documento de font-lock-keywords
).
- No se puede usar una expresión regular como palabra clave MATCHER ya que solo se deben verificar las palabras clave SQL dentro de las cadenas. El código siguiente proporciona
php-sql-keyword-matcher
para ese propósito. La prueba de cadenas se realiza a través de syntax-ppss
(consulte el documento para esta función).
Tenga en cuenta que solo tengo una pantalla de clase color
. Entonces no pude probar las otras clases. Supongo que tiene otra clase de visualización ya que las cadenas se muestran en cursiva en su ejemplo. Si no obtiene el resultado esperado, personalice la cara 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)
Nota: No inserte solo imágenes de textos necesarios para la reconstrucción del problema. El texto ASCII puede facilitar a los posibles ayudantes la reconstrucción del problema. Para el caso de que otra persona tenga una mejor solución, inserto la versión ASCII del texto aquí:
$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';
Y aquí una imagen del texto como se ve cuando lo cargo en emacs con modo PHP:
Con la clase de visualización, las color
cadenas no están en cursiva pero tienen un color diferente. Por lo tanto, he elegido la fuente en cursiva para las palabras clave SQL dentro de las cadenas.
Los comentarios indican algunas dificultades con esta respuesta. Se ha indicado que la solución no funcionaría con la fuente predeterminada establecida en Consolas
. Lo acabo de probar y en mi sistema también funciona con la fuente Consola por defecto:
En la ayuda para font-lock-add-keywords
encontré el siguiente texto:
Por ejemplo:
(font-lock-add-keywords 'c-mode
'(("\\<\\(FIXME\\):" 1 'font-lock-warning-face prepend)
("\\<\\(and\\|or\\|not\\)\\>" . 'font-lock-keyword-face)))
agrega dos patrones de fuente para el modo C, para fontify 'FIXME:' palabras, incluso en los comentarios, y para fontify and
, or
y not
palabras como palabras clave.
El primer caso " FIXME
" es el interesante. Aquí se usan prepend
como bandera de anulación.