[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:矩形を貼り付ける前にその領域の行数分、空行を入れる方法ないかな。