[Emacs][php] リージョン内の行をハッシュのkey形式に変換する

テーブルのカラム名とか、何かのドキュメントに書かれてたりするものとか、
既にどこかで定義されたものをキーとした、何かのハッシュを作りたいということがよくあるので、少しだけ楽にできるようにしました。

(defun php-convert-to-hash-key-region (beg end)
  "Convert selected region as hash key syntax for PHP"
  (interactive "r")
  (save-excursion
    (save-restriction
      (narrow-to-region beg end)
      (goto-char beg)
      (while (re-search-forward "^\\s-*\\(.+?\\)\\s-*$" nil t)
        (replace-match "'\\1' => ," nil nil))))
  (indent-region beg end))

例として、MySQLのdbテーブルの各カラム名をキーにした配列を作りたいような時は、
M-x sql-mysql で、sql-interactive-modeで接続して

root@localhost[mysql]> desc db;
+-----------------------+---------------+------+-----+---------+-------+
| Field                 | Type          | Null | Key | Default | Extra |
+-----------------------+---------------+------+-----+---------+-------+
| Host                  | char(60)      | NO   | PRI |         |       |
| Db                    | char(64)      | NO   | PRI |         |       |
| User                  | char(16)      | NO   | PRI |         |       |
...略
| Alter_routine_priv    | enum('N','Y') | NO   |     | N       |       |
| Execute_priv          | enum('N','Y') | NO   |     | N       |       |
+-----------------------+---------------+------+-----+---------+-------+

FieldのところをC-x r r r (copy-rectangle-to-register)で矩形をレジスタに登録して、

<?php
$h = array(
    // 予め、充分空行をあけて置く
    // ...
);
?>

上記のようなコードのarray()の中でC-x r i r (insert-register)すると*1

<?php
$h = array(
Host
Db
User
Select_priv
Insert_priv
Update_priv
Delete_priv
Create_priv
Drop_priv
Grant_priv
References_priv
Index_priv
Alter_priv
Create_tmp_table_priv
Lock_tables_priv
Create_view_priv
Show_view_priv
Create_routine_priv
Alter_routine_priv
Execute_priv
);
?>

のようになり、上記だとHostのHの部分にカーソルがあります。
その後、M-x php-convert-to-hash-key-region とすると

<?php
$h = array(
    'Host' => ,
    'Db' => ,
    'User' => ,
    'Select_priv' => ,
    'Insert_priv' => ,
    'Update_priv' => ,
    'Delete_priv' => ,
    'Create_priv' => ,
    'Drop_priv' => ,
    'Grant_priv' => ,
    'References_priv' => ,
    'Index_priv' => ,
    'Alter_priv' => ,
    'Create_tmp_table_priv' => ,
    'Lock_tables_priv' => ,
    'Create_view_priv' => ,
    'Show_view_priv' => ,
    'Create_routine_priv' => ,
    'Alter_routine_priv' => ,
    'Execute_priv' => ,
);
?>

みたいになって、M-x align-current すると

<?php
$h = array(
    'Host'                  => ,
    'Db'                    => ,
    'User'                  => ,
    'Select_priv'           => ,
    'Insert_priv'           => ,
    'Update_priv'           => ,
    'Delete_priv'           => ,
    'Create_priv'           => ,
    'Drop_priv'             => ,
    'Grant_priv'            => ,
    'References_priv'       => ,
    'Index_priv'            => ,
    'Alter_priv'            => ,
    'Create_tmp_table_priv' => ,
    'Lock_tables_priv'      => ,
    'Create_view_priv'      => ,
    'Show_view_priv'        => ,
    'Create_routine_priv'   => ,
    'Alter_routine_priv'    => ,
    'Execute_priv'          => ,
);
?>

こんな感じになります。※要align設定
少し編集が楽になりました。

*1:矩形を貼り付ける前にその領域の行数分、空行を入れる方法ないかな。