region-bindings-modeの紹介

表題の通り,本記事ではregion-bindings-modeを紹介しようと思う.
コードは以下のページから.
https://github.com/fgallina/region-bindings-mode

MELPAからもインストール可能である.

特徴・利点

リージョン(最後にマークした箇所から現在のカーソル位置の間で囲まれた領域)を有効にした状態でのみ,region-bindings-modeというマイナーモードが発動する.このマイナーモード下でのみ有効なキーバインドを設定することが可能なため,既存のキーバインドの設定が侵食されにくい,という利点がある.

動作環境

作者によるとEmacs24でのみ動作テストを行なっているらしい.筆者もEmacs24をDebian GNU/Linux上で使用しているが,動作に問題はなかった.

インストール

作者ページより,

(add-to-list 'load-path "/folder/containing/file")
(require 'region-bindings-mode)
(region-bindings-mode-enable)

とすれば使用可能である.パスは各自が設定されたい.

カスタマイズ

とりあえずregion-bindings-mode-disabled-modesという変数が存在する.このマイナーモードを発動させたくないメジャーモード名を格納するリストであり,例えば以下のように設定すればfoo-modeとbar-modeでは発動しない.

(setq region-bindings-mode-disabled-modes '(foo-mode bar-mode))

使用例

multiple-cursors

作者はmultiple-cursorsを利用した以下の例を紹介している.

(define-key region-bindings-mode-map "a" 'mc/mark-all-like-this)
(define-key region-bindings-mode-map "p" 'mc/mark-previous-like-this)
(define-key region-bindings-mode-map "n" 'mc/mark-next-like-this)
(define-key region-bindings-mode-map "m" 'mc/mark-more-like-this-extended)

multiple-cursorについては
multiple-cursors.elのキーバインドを少しだけ改善 - 備忘録
キーバインドの例について記事を書いたが,region-bindings-modeを用いることで,この問題は綺麗に解決できた.

検索

リージョンにおける文字列を検索対象にインクリメンタルサーチを走らせることができる.ここではphi-searchを用いることにする.このphi-searchはmultiple-cursor向けに設計してあるため,その相性は大変良い.

(define-key region-bindings-mode-map "s" 'phi-search)
(define-key region-bindings-mode-map "r" 'phi-search-backward)

とすれば,リージョンを程よく選択した後,sやrを押すことで,選択された文字列を対象に即座にインクリメンタルサーチが発動する.続けてジャンプしたい場合はC-sやC-rを続けて押す.
上記でC-sやC-rをはじめからバインドしなかった理由は,リージョンをisearchで広げることがしばしばあるためである.

置換

リージョンの文字列を取得することさえできれば,それをクエリにして置換のコマンドを発動させることも可能である.
まず@rubikitch氏が作成したreplace-from-region.elをダウンロードしてロードパスの通ったところに置き,以下を設定ファイルに追記しておく.

(require 'replace-from-region)

そして

(define-key region-bindings-mode-map "q" 'query-replace-from-region)
(define-key region-bindings-mode-map "C-q" 'query-replace-regexp-from-region)

とすればリージョンをクエリとした置換が可能となる.これ以外にも

(define-key region-bindings-mode-map "Q" 'query-replace)

としてリージョン内の文字列全体を対象に通常の置換コマンドを発動させても十分便利である.

補足

リージョン操作には,expand-regionを使うと便利である.

おわりに

とりあえず便利に使えており,作者には大変感謝している.まだまだカスタマイズができそうで,可能性を探っていきたいものである.