$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

emacsでperlのuse文挿入を簡単に

 はてなグループの終了日を2020年1月31日(金)に決定しました - はてなの告知のように現在位置のperlモジュールのuseを自動で挿入してくれるものがあるのですが、自動で挿入するとuseを見やすいように整頓もしづらくなるので、ちょっと違うやり方を考えてみました。

 やったことは現在位置のモジュールのuse文を作って、現在のバッファをpopwin.elでpopupさせて、編集位置を現在位置から上にさかのぼって一番最初に出てくるuseの一行下に持っていくという物。実行サンプルは以下のとおり。


使い方

 動作させるにはpopwin.elが必要です。以下のelispを書いておくと実行できます。リージョン選択している場合はそれにしたがってuse文を、していない場合は現在の位置にあるmoduleのuse文を作ります。勝手にkillringに入れてくれるので、後はC-yでペーストして、C-gで元のwindowに戻れます。

(defun popup-editor-perl-use ()
  (interactive)
  (let* ((module-name nil))
    (cond ((use-region-p)
           (setq module-name (buffer-substring (region-beginning) (region-end)))
           (keyboard-escape-quit))
          (t
           (setq module-name (thing-at-point 'symbol))))
    (kill-new (concat "use " module-name ";"))
    (popwin:popup-buffer (current-buffer) :height 0.4)
    (re-search-backward "^use " nil t)
    (next-line)))

どうぞご利用ください。

今回学んだelisp tips

region選択されているかどうか調べる

(use-region-p)で可能。

region内の文字列を取得

(buffer-substring (region-beginning) (region-end)

region選択を解除する

(keyboard-escape-quit)を使う。いろいろ解除されてしまうことがあるので注意。

現在位置のmodule名を取得

symbolという単位でmodule名が取得できる。symbol=module名では無いので、誤爆する可能性もある。

(thing-at-point 'symbol)

killringに文字列を入れる

(kill-new "文字列")

現在のバッファをポップアップさせる

popwin.elとcurrent-bufferでできる。

(popwin:popup-buffer (current-buffer) :height 0.4)

現在バッファである文字列にマッチする場所に移動する

今回は現在位置からさかのぼりたかったのでre-search-backwardでいける。逆に現在位置から下に移動したければre-search-forward。正規表現による移動が可能。

(re-search-backward "^use " nil t)