LoginSignup
10
8

More than 5 years have passed since last update.

EmacsでSQL文を整形する

Last updated at Posted at 2016-10-09

はじめに

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 

のようになります。

リージョン指定している場合は、その範囲だけが整形されます。

10
8
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
8