Hut*_*ut8 5 sql emacs elisp indentation
我经常写一些脚本来做一些事情,通常涉及 SQL,在不同的主要模式下。也许它看起来像这样:
sql = """
SELECT * FROM table WHERE row_awesomeness > 1000
"""
Run Code Online (Sandbox Code Playgroud)
我希望能够适当地缩进 SQL,所以它看起来像:
sql = """
SELECT *
FROM table
WHERE row_awesomeness > 1000
"""
Run Code Online (Sandbox Code Playgroud)
我对所使用的 SQL 缩进算法并不挑剔,但我根本无法使用任何东西。我不是一个巨大的风扇sql-indent.el,但在新的缓冲区中使用它(功能我甚至不能得到这工作sql-indent-buffer没有任何东西从我的第一个描述改变,我肯定要的SELECT,FROM和WHERE条款是分开的上我认为非常标准的线条)。
理想情况下,我会突出显示包含 SQL 的区域并执行类似的操作M-x sql-indent-region RET- 不需要在换行符上缩进的内容。
小智 2
这是一种实现方法(经过轻微测试,使用您提到的缩进函数——我不使用 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))))
Run Code Online (Sandbox Code Playgroud)
如果我标记以下 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;
")
Run Code Online (Sandbox Code Playgroud)
我最终得到:
(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;
")
Run Code Online (Sandbox Code Playgroud)