2013-11-03 1 views
4

Зачастую я пишу некоторый скрипт, чтобы делать некоторые вещи, часто включающие SQL, в другом крупном режиме. Может быть, это выглядит следующим образом:Отступы SQL в другом главном режиме в Emacs

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

Я хотел бы иметь возможность отступа SQL propertly, так что это выглядит примерно так:

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

Я не требователен об алгоритме SQL отступа используется , но я не могу заставить ничего работать. Я не большой поклонник sql-indent.el, но я не могу даже заставить его работать с ним в новом буфере (функция sql-indent-buffer ничего не меняет из моего первого описания, и я определенно хочу, чтобы SELECT, FROM и WHERE пункты должны быть на отдельных строках, которые я считаю довольно стандартными).

В идеале, я хотел бы подчеркнуть область, которая содержит SQL и не сделать что-то вроде M-хsql-indent-regionRET - нет необходимости что-то, что отступы, на символ новой строки.

+0

Вы должны оформить mumamo, который позволяет множественным основные режимы. Поскольку я не использую, я не могу дать вам больше рекомендаций – PuercoPop

ответ

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)))) 

Если я отмечаю следующий SQL-запрос (от "ВЫБОР" через "f2.PLAYERID"), встроенный в строку Elisp и сделать Mxmy-sql-indent-regionRET:

(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; 
") 
Смежные вопросы