次のelispスニペットで実行できます。重要な詳細は次のとおりです。
- 文字列は構文の強調表示によって処理され、パターンマッチング(つまり、キーワードの強調表示)では処理されません。これは非常に優先度が高いです。したがって
t
、MATCHERフラグOVERRIDEの値で明示的にオーバーライドする必要があります(のドキュメントを参照font-lock-keywords
)。
- 文字列内のSQLキーワードのみをチェックする必要があるため、正規表現をキーワードMATCHERとして使用することはできません。以下のコードは
php-sql-keyword-matcher
、その目的のために提供されています。文字列のテストは経由で行われますsyntax-ppss
(この関数についてはドキュメントを参照してください)。
クラスの表示しか持っていないことに注意してくださいcolor
。他のクラスはテストできませんでした。例では文字列が斜体で表示されているため、他の表示クラスがあると思います。期待どおりの結果が得られない場合は、顔をカスタマイズしてください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)
注:問題の再現に必要なテキストの画像だけを挿入しないでください。アスキーテキストは、問題の再構築の潜在的なヘルパーを緩和できます。他の誰かがより良い解決策を持っている場合のために、私はテキストのASCIIバージョンをここに挿入します:
$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';
そして、ここに私がPHPモードでemacsにそれをロードしたときのように見えるテキストの写真:
表示クラスでは、color
文字列は斜体ではありませんが、色が異なります。したがって、私は文字列内のSQLキーワードにイタリック体を選択しました。
コメントは、この回答のいくつかの困難を示しています。デフォルトのフォントがに設定されていると、ソリューションが機能しないことが示されていますConsolas
。私はそれをテストしましたが、私のシステムではデフォルトでConsolaフォントでも動作します:
ヘルプfont-lock-add-keywords
の次のテキストを見つけました:
例えば:
(font-lock-add-keywords 'c-mode
'(("\\<\\(FIXME\\):" 1 'font-lock-warning-face prepend)
("\\<\\(and\\|or\\|not\\)\\>" . 'font-lock-keyword-face)))
Cモードの2つのフォント化パターンを追加して、「FIXME:」の単語をコメント化し、フォント化しand
、単語をキーワードとしてフォント化or
しnot
ます。
最初のケース「FIXME
」は興味深いものです。ここではprepend
、オーバーライドフラグとして使用します。