2014-06-24 46 views
4

我應該如何在Emacs中使用SQL查詢開發PHP文件?在Emacs中使用SQL查詢編寫PHP

當縮進緩衝的代碼應該是這樣的:

<?php 
$query = " 
    SELECT 
     id, 
     name 
    FROM 
     products 
    WHERE 
     id > 12" 
?> 

在網絡模式與PHP模式,它看起來像這樣:

<?php 
$query = " 
SELECT 
id, 
name 
FROM 
products 
WHERE 
id > 12" 
?> 

如果不是可能的,一種替代方法是讓它啓用手動縮進(使用TABShiftTAB,就像在Sublime和其他編輯器中)在PHP代碼中的多行字符串時。我會怎麼做?

+0

請參閱[在Emacs的另一個主要模式中縮進SQL](http://stackoverflow.com/questions/19748345/indenting-sql-in-another-major-mode-in-emacs)。 – phils

+0

@phils嗯,它幾乎可以工作。縮進是有點關閉。它不考慮PHP代碼的縮進級別,但它會縮進SQL代碼。 –

回答

2

的網絡模式(github可用)的最後一個版本(9.0.84)提供塊串本地SQL縮進。

+0

我無法讓它與代碼一起工作(第二部分)我在這個問題。我應該能夠成爲第三排,按'TAB'並有它只是 後「縮進? –

+0

SELECT應該而且你確定你有最新版本? – fxbois

+0

太好了!它適用於這個例子,但是即使'SELECT'在新行上,我可以使它縮進嗎?另外,在'JOIN'裏面有'SELECT'似乎有一個bug。 'INSERT'查詢也不縮進。這是一個很好的開始,但似乎需要更多的工作。 –

1

Emacs不能很好地處理PHP的SQL。有一個擴展,你可以得到here,它只能幫助SQL,所以我不確定它是否會按照你希望的方式來使用PHP代碼。除了使用Emacs還有其他的選擇,我強烈建議使用它。

7

緩衝區縮進時自動執行此操作將非常困難,您可以嘗試多種主要模式,但這並不理想。

一種解決方案將是寫將格式化SQL光標下方的功能,則可以手動當你寫完您的查詢字符串運行此命令。

本示例需要兩個包:expand-regionsql-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縮進將其格式化,然後回到原來的緩衝區,並用新的替換舊的字符串。它是功能性的,但不漂亮。

enter image description here

+0

(感謝Jordon Biondo!不過,我想從[SQLup](https://github.com/Trevoke/sqlup-mode.el)添加調用函數'sqlup-capitalize-keywords-in-region'。我在函數內部添加'sqlup-capitalize-keywords-in-region',並從sql字符串中調用它,我得到一個空的結果。任何提示? – ReneFroger