緩衝區縮進時自動執行此操作將非常困難,您可以嘗試多種主要模式,但這並不理想。
一種解決方案將是寫將格式化SQL光標下方的功能,則可以手動當你寫完您的查詢字符串運行此命令。
本示例需要兩個包:expand-region
和sql-indent
,兩者均可在MELPA上下載。
如果您安裝了此功能會格式化在點SQL包,這也處理根據它周圍的代碼不像在評論該解決方案的深度縮進整個SQL字符串。
(defun sql-indent-string()
"Indents the string under the cursor as SQL."
(interactive)
(save-excursion
(er/mark-inside-quotes)
(let* ((text (buffer-substring-no-properties (region-beginning) (region-end)))
(pos (region-beginning))
(column (progn (goto-char pos) (current-column)))
(formatted-text (with-temp-buffer
(insert text)
(delete-trailing-whitespace)
(sql-indent-buffer)
(replace-string "\n" (concat "\n" (make-string column (string-to-char " "))) nil (point-min) (point-max))
(buffer-string))))
(delete-region (region-beginning) (region-end))
(goto-char pos)
(insert formatted-text))))
功能的工作原理是你的光標下複製的字符串,並將其移動到一個臨時緩衝區,其中SQL縮進將其格式化,然後回到原來的緩衝區,並用新的替換舊的字符串。它是功能性的,但不漂亮。
請參閱[在Emacs的另一個主要模式中縮進SQL](http://stackoverflow.com/questions/19748345/indenting-sql-in-another-major-mode-in-emacs)。 – phils
@phils嗯,它幾乎可以工作。縮進是有點關閉。它不考慮PHP代碼的縮進級別,但它會縮進SQL代碼。 –