5

多くの場合、SQL を含むいくつかの処理を別のメジャー モードで実行するためのスクリプトを作成しています。たぶん、次のようになります。

sql = """
SELECT * FROM table WHERE row_awesomeness > 1000
"""

SQLを適切にインデントできるようにしたいので、次のようになります。

sql = """
SELECT *
  FROM table
 WHERE row_awesomeness > 1000
"""

私は使用されている SQL インデント アルゴリズムについてうるさいわけではありませんが、まったく機能しません。私は の大ファンではありsql-indent.elませんが、新しいバッファでそれを使用してそれを機能させることさえできません (関数は最初の説明から何も変更しません。また、 , 句と句を別々にしsql-indent-bufferたいのは間違いありません。かなり標準的だと思います)。SELECTFROMWHERE

理想的には、SQL を含む領域を強調表示して、次のようなことを行いM-x sql-indent-region RETます。改行にインデントする必要はありません。

4

2 に答える 2

2

これはそれを行う1つの方法です(あなたが言及したインデント関数を使用して軽くテストしました-私はSQLを使用しませんが、バッファ全体で動作する限り、その場所に任意の関数をプラグインできるはずです):

(defun my-sql-indent-region (beg end)
  "Indent the SQL statement in the region."
  (interactive "*r")
  (save-excursion
    (save-restriction
      (narrow-to-region beg end)
      ;; http://www.emacswiki.org/emacs/download/sql-indent.el
      (sql-indent-buffer))))

次の sql クエリ ("SELECT" から "f2.PLAYERID" まで) をマークし、elisp 文字列に埋め込んで実行すると、次のようになりますM-x my-sql-indent-region RET

(defvar my-sql-query "
SELECT p1.PLAYERID, 
f1.PLAYERNAME, 
  p2.PLAYERID, 
f2.PLAYERNAME 
FROM PLAYER f1, 
                   PLAYER f2, 
    PLAYS p1 
    FULL OUTER JOIN PLAYS p2 
        ON p1.PLAYERID < p2.PLAYERID 
    AND p1.TEAMID = p2.TEAMID 
GROUP BY p1.PLAYERID, 
    f1.PLAYERID, 
   p2.PLAYERID, 
    f2.PLAYERID 
HAVING Count(p1.PLAYERID) = Count(*) 
  AND Count(p2.PLAYERID) = Count(*) 
    AND p1.PLAYERID = f1.PLAYERID 
AND p2.PLAYERID = f2.PLAYERID;
")

私は最終的に:

(defvar my-sql-query "
SELECT p1.PLAYERID, 
    f1.PLAYERNAME, 
    p2.PLAYERID, 
    f2.PLAYERNAME 
FROM PLAYER f1, 
    PLAYER f2, 
    PLAYS p1 
    FULL OUTER JOIN PLAYS p2 
    ON p1.PLAYERID < p2.PLAYERID 
    AND p1.TEAMID = p2.TEAMID 
GROUP BY p1.PLAYERID, 
    f1.PLAYERID, 
    p2.PLAYERID, 
    f2.PLAYERID 
HAVING Count(p1.PLAYERID) = Count(*) 
    AND Count(p2.PLAYERID) = Count(*) 
    AND p1.PLAYERID = f1.PLAYERID 
    AND p2.PLAYERID = f2.PLAYERID;
")
于 2014-04-29T18:03:38.403 に答える