Các đoạn elisp sau đây nên làm. Các chi tiết quan trọng là:
- Các chuỗi được xử lý bằng cách tô sáng cú pháp chứ không phải bằng cách khớp mẫu (nghĩa là tô sáng từ khóa). Điều này có ưu tiên rất cao. Vì vậy, người ta cần ghi đè nó một cách rõ ràng bằng giá trị
t
cho cờ MATCHER QUÁ HẠN (xem tài liệu của font-lock-keywords
).
- Người ta không thể sử dụng biểu thức chính quy dưới dạng MATCHER vì người ta chỉ phải kiểm tra các từ khóa SQL trong chuỗi. Mã dưới đây cung cấp
php-sql-keyword-matcher
cho mục đích đó. Việc kiểm tra các chuỗi được thực hiện thông qua syntax-ppss
(xem tài liệu cho hàm này).
Lưu ý rằng tôi chỉ có một màn hình hiển thị của lớp color
. Vì vậy, tôi không thể kiểm tra các lớp khác. Tôi giả sử rằng bạn có một lớp hiển thị khác vì các chuỗi được hiển thị ở mặt in nghiêng trong ví dụ của bạn. Nếu bạn không nhận được kết quả như mong đợi, hãy tùy chỉnh khuôn mặt 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)
Lưu ý: Vui lòng không chỉ chèn hình ảnh của các văn bản cần thiết cho việc xây dựng lại vấn đề. Văn bản ascii có thể giúp giảm bớt sự giúp đỡ tiềm năng trong việc tái cấu trúc vấn đề. Đối với trường hợp người khác có giải pháp tốt hơn, tôi chèn phiên bản ASCII của văn bản vào đây:
$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';
Và đây là hình ảnh của văn bản giống như khi tôi tải nó vào emacs với chế độ PHP:
Với color
chuỗi lớp hiển thị không phải là chữ nghiêng nhưng có màu khác. Do đó, tôi đã chọn mặt chữ in nghiêng cho các từ khóa SQL trong chuỗi.
Các ý kiến chỉ ra một số khó khăn với câu trả lời này. Nó đã được chỉ ra rằng giải pháp sẽ không hoạt động với phông chữ mặc định được đặt thành Consolas
. Tôi vừa mới thử nghiệm và trên hệ thống của tôi, nó cũng hoạt động với phông chữ Consola như mặc định:
Trong phần trợ giúp font-lock-add-keywords
tôi đã tìm thấy đoạn văn sau:
Ví dụ:
(font-lock-add-keywords 'c-mode
'(("\\<\\(FIXME\\):" 1 'font-lock-warning-face prepend)
("\\<\\(and\\|or\\|not\\)\\>" . 'font-lock-keyword-face)))
thêm hai mẫu phông chữ cho chế độ C, để phông chữ các từ 'FIXME:', ngay cả trong các bình luận, và để phông chữ and
, or
và các not
từ làm từ khóa.
Trường hợp đầu tiên " FIXME
" là trường hợp thú vị. Ở đây họ sử dụng prepend
như cờ ghi đè.