add lisp packages

This commit is contained in:
2020-12-05 21:29:49 +01:00
parent 85e20365ae
commit a6e2395755
7272 changed files with 1363243 additions and 0 deletions

View File

@@ -0,0 +1,351 @@
;;; sql-indent-left.el --- configuration options to indent sql -*- lexical-binding: t -*-
;; Copyright (C) 2017 Free Software Foundation, Inc
;; Filename: sql-indent-left.el
;; Description:
;; Author: pierre.techoueyres@free.fr
;; Maintainer: pierre.techoueyres@free.fr
;; Created:
;; Version: pierre.techoueyres@free.fr
;; Last-Updated:
;; By:
;; Update #: 0
;; URL:
;; Keywords: language sql indentation
;; Compatibility:
;;
;; Features that might be required by this library:
;;
;; None
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 3 of the License, or
;; (at your option) any later version.
;;
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;;
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;; Commentary:
;;
;; Set configuration options to indent sql my way.
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;; Change log:
;;
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; This program is free software; you can redistribute it and/or
;; modify it under the terms of the GNU General Public License as
;; published by the Free Software Foundation; either version 3, or
;; (at your option) any later version.
;;
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
;; General Public License for more details.
;;
;; You should have received a copy of the GNU General Public License
;; along with this program; see the file COPYING. If not, write to
;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth
;; Floor, Boston, MA 02110-1301, USA.
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;; Code:
(require 'sql-indent)
(defun indent-case-statement-items (syntax base-indentation)
"Look for a SYNTAX of ((block-start when) (in-block case \"\") ...)
or ((block-start else) (in-block case \"\") ...)."
(let ((outer (sqlind-outer-context syntax)))
(if (and (eq 'in-block (sqlind-syntax-symbol outer))
(eq 'case (sqlind-syntax-keyword outer))
(eq 'block-start (sqlind-syntax-symbol syntax))
(memq (sqlind-syntax-keyword syntax) '(when else)))
(+ base-indentation sqlind-basic-offset)
base-indentation)))
(defvar sqlind-indentation-right-offsets-alist
`((select-column-continuation sqlind-indent-select-column
sqlind-adjust-operator
sqlind-lone-semicolon)
(in-select-clause sqlind-lineup-to-clause-end
sqlind-adjust-operator
sqlind-right-justify-logical-operator
sqlind-lone-semicolon)
(in-delete-clause sqlind-lineup-to-clause-end
sqlind-adjust-operator
sqlind-right-justify-logical-operator
sqlind-lone-semicolon)
(in-insert-clause sqlind-lineup-to-clause-end
sqlind-adjust-operator
sqlind-right-justify-logical-operator
sqlind-lone-semicolon)
(in-update-clause sqlind-lineup-to-clause-end
sqlind-adjust-operator
sqlind-right-justify-logical-operator
sqlind-lone-semicolon)
;; mandatory
(select-table-continuation sqlind-indent-select-table +
sqlind-lone-semicolon)
;; rest picked up from the original indentation offsets
,@sqlind-default-indentation-offsets-alist)
"Align sql code like this :
clear columns
set linesize 2500
set trimout on trimspool on
select atc.column_name,
atc.data_type,
data_length,
data_precision,
nullable,
data_scale,
nvl(substr(comments, 1, 100), atc.column_name) comments
from all_tab_columns atc,
all_col_comments acc
where atc.owner = acc.owner
and atc.table_name = acc.table_name
and atc.column_name = acc.column_name
and atc.owner = user
and atc.table_name = 'MY_TABLE'
and atc.column_name = p_column_name
and not exists (select 1
from all_tab_columns atc1,
all_col_comments acc1
where atc1.owner = acc1.owner
and atc1.table_name = acc1.table_name
and atc1.column_name = acc1.column_name
and atc1.owner = atc.owner
and atc1.table_name = atc.table_name
and acc1.column_name = acc.column_name)
;
delete from my_table mt
where col_1 = v_col1
and ( col_2 = v_col2
or col_3 = v_col3)
and col_42 = '42'
;
update my_table
set col1_has_a_long_name = value1,
col2_is_short = value2
where cond1 is not null
and ( col_2 = v_col2
or col_3 = v_col3)
and col_42 = '42'
;
insert into xyzxx
( aaa, xxx, bbb, ccc,
ddd, eee, fff, ggg,
hhh )
select aaa,
xxx,
max (m.b1) as bbb,
min (m.b1) as ccc,
coalesce (max (n.c2), 0) as ddd,
coalesce (min (n.c2), 0) as eee,
max (m.b1) over ( partition by c2
order by aaa desc ) as fff,
min (m.b1) over ( partition by c2
order by aaa desc ) as ggg,
avg (n.c2)as hhh
from (select * from (select aaa,
jjj + kkk as b1,
row_number () over ( partition by qqq
order by rrr,
sss ) as rn
from mno)
where rn = 1) m
inner join (select aaa,
nnn + ooo as c2
from pqr) n
using (aaa),
group by aaa,
xxx
order by xxx desc,
aaa asc
;")
(defvar sqlind-indentation-left-offsets-alist
`((select-clause 0)
(insert-clause 0)
(delete-clause 0)
(update-clause 0)
(case-clause-item-cont 0)
(block-start indent-case-statement-items)
(begin-block 0)
(case-clause +)
(package +)
(package-body +)
(statement-continuation + sqlind-adjust-operator)
(nested-statement-open 1)
(nested-statement-continuation 1)
(nested-statement-close sqlind-use-anchor-indentation)
(string-continuation 0) ;; or should it be a beginning of line or aligned with the previous block ?
;; Anyway. It's really *BAD* to continue a string across lines.
(select-column sqlind-indent-select-column-alt
sqlind-adjust-operator
sqlind-lone-semicolon)
(select-column-continuation sqlind-indent-select-column-alt
sqlind-adjust-operator
sqlind-lone-semicolon)
(in-select-clause sqlind-lineup-to-clause-end
sqlind-adjust-operator
sqlind-left-justify-logical-operator
sqlind-lone-semicolon)
(in-delete-clause sqlind-lineup-to-clause-end
sqlind-adjust-operator
sqlind-left-justify-logical-operator
sqlind-lone-semicolon)
(in-insert-clause +
sqlind-adjust-operator
sqlind-left-justify-logical-operator
sqlind-lone-semicolon)
(in-update-clause sqlind-lineup-to-clause-end
sqlind-adjust-operator
sqlind-left-justify-logical-operator
sqlind-lone-semicolon)
(select-table-continuation + sqlind-lone-semicolon)
;; rest picked up from the original indentation offsets
,@sqlind-default-indentation-offsets-alist)
"Align sql code like this :
clear columns
set linesize 2500
set trimout on trimspool on
select DISTINCT
atc.column_name,
atc.data_type,
data_length,
data_precision,
nullable,
data_scale,
nvl(substr(comments, 1, 100), atc.column_name) comments
from all_tab_columns atc,
all_col_comments acc
where atc.owner = acc.owner
and atc.table_name = acc.table_name
and atc.column_name = acc.column_name
and atc.owner = user
and atc.table_name = 'MY_TABLE'
and atc.column_name = p_column_name
and not exists (select 1
from all_tab_columns atc1,
all_col_comments acc1
where atc1.owner = acc1.owner
and atc1.table_name = acc1.table_name
and atc1.column_name = acc1.column_name
and atc1.owner = atc.owner
and atc1.table_name = atc.table_name
and acc1.column_name = acc.column_name)
;
delete from my_table mt
where col_1 = v_col1
and ( col_2 = v_col2
or col_3 = v_col3)
and col_42 = '42'
;
update my_table
set col1_has_a_long_name = value1,
col2_is_short = value2
where cond1 is not null
and ( col_2 = v_col2
or col_3 = v_col3)
and col_42 = '42'
;
insert into xyzxx
( aaa, xxx, bbb, ccc,
ddd, eee, fff, ggg,
hhh )
select aaa,
xxx,
max (m.b1) as bbb,
min (m.b1) as ccc,
coalesce (max (n.c2), 0) as ddd,
coalesce (min (n.c2), 0) as eee,
max (m.b1) over ( partition by c2
order by aaa desc ) as fff,
min (m.b1) over ( partition by c2
order by aaa desc ) as ggg,
avg (n.c2)as hhh
from (select * from (select aaa,
jjj + kkk as b1,
row_number () over ( partition by qqq
order by rrr,
sss ) as rn
from mno)
where rn = 1) m
inner join (select aaa,
nnn + ooo as c2
from pqr) n
using (aaa),
group by aaa,
xxx
order by xxx desc,
aaa asc
;")
(defun sqlind-indent-select-column-alt (syntax base-indentation)
"Return the indentation for a column after a SELECT DISTINCT clause.
SYNTAX is the syntax of the current line, BASE-INDENTATION is the
current indentation, which we need to update.
Like `sqlind-indent-select-column' but we try to align to the KEYWORD,
but if we are the first column after the SELECT clause we simply
add `sqlind-basic-offset'."
(save-excursion
(goto-char (sqlind-anchor-point syntax))
(when (looking-at "select\\s *\\(top\\s +[0-9]+\\|distinct\\|unique\\)?")
(if (match-beginning 1)
(goto-char (match-beginning 1))
(goto-char (match-end 0))))
(skip-syntax-forward " ")
(if (or (looking-at sqlind-comment-start-skip)
(looking-at "$"))
(+ base-indentation sqlind-basic-offset)
(current-column))))
;;;###autoload
(defun sqlind-setup-style-left ()
"Define an sql-indentation style where keywords are left aligned."
(interactive)
(setq sqlind-indentation-offsets-alist sqlind-indentation-left-offsets-alist))
;;;###autoload
(defun sqlind-setup-style-right ()
"Define an sql-indentation style where keywords are right aligned."
(interactive)
(setq sqlind-indentation-offsets-alist sqlind-indentation-right-offsets-alist))
;;;###autoload
(defun sqlind-setup-style-default ()
"Define an sql-indentation style where keywords are right aligned."
(interactive)
(setq sqlind-indentation-offsets-alist sqlind-default-indentation-offsets-alist))
(provide 'sql-indent-left)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; sql-indent-left.el ends here