はじめに
SQL文を整形するという記事を書きました。
なぜこんなことがしたいかというと、Emacs上でSQL文を整形したいからです。
Emacsにはshell-command-on-region
という関数があります。
これは、リージョン内のテキストを標準入力に渡して外部プログラムを実行します。
そして、その結果でバッファを書き換えることができます。
これを利用してSQL文の整形をEmacs上で行うことができます。
前準備
SQLを整形する外部プログラムを用意します。
標準入出力が使えればなんでもいいのですが、ここでは前述の記事で作成した拙作(といってもライブラリを呼び出すだけ)のsql-formatterを使用します。Java(JRE)が必要です。
https://github.com/sambatriste/sql-formatter/tree/master/binary からjarをダウンロードします。
~/.emacs.dに置いてまとめてバージョン管理しておくのが良いと思います。
設定
init.elに以下のように記述します。
;;; SQL文の整形をする設定
;; 実行する外部コマンド
(setq sql-format-external-command
(concat "java -jar " (expand-file-name "~/.emacs.d/lib/sql-formatter-1.0.0-jar-with-dependencies.jar")))
;; SQL文をフォーマットする関数
(defun my-format-sql ()
"バッファまたはリージョン内のSQL文を整形する。"
(interactive)
(let (begin end)
(cond (mark-active
(setq begin (region-beginning))
(setq end (region-end)))
(t
(setq begin (point-min))
(setq end (point-max))))
(save-excursion
(shell-command-on-region
begin
end
sql-format-external-command
nil
t ; replace buffer
))))
;; キーバインド設定
(with-eval-after-load "sql"
(define-key sql-mode-map (kbd "C-S-f") 'my-format-sql))
shell-command-on-region
関数の第3引数を変更すれば、他の外部プログラムでも同じことができます。
実行
以下のようなバッファがあるとします。
SELECT * FROM HOGE WHERE HOGE.FUGA = :fuga
こののバッファ(sql-mode)でC-S-f
またはM-x my-format-sql
とします。
そうすると、バッファの中身が、
SELECT
*
FROM
HOGE
WHERE
HOGE.FUGA = :fuga
のようになります。
リージョン指定している場合は、その範囲だけが整形されます。