isearch で指定した領域をコピーor切り取り

近況

ここ7日間ずっとelispの勉強ばっかしてました。そのおかげで、emacsが今まで以上にとても使いやすくなりました。
とはいえ、肝心の研究はまったく手をつけてなくて、明日のミーティングをどうしようかという状態\(^o^)/
だが、素晴らしい機能満載のemacs環境を整備したことと、elispの知識を身につけたことで、エディタ調整のスキル&今後の開発効率はめちゃめちゃ上がったはず!…ということにしておこう。。

isearch で指定した領域をコピーor切り取り

というわけで、個人的に気になった諸動作をカスタマイズ。emacsのisearchは、 C-s 中に C-wキーバインドを知っていると単語を選択するのに便利だけど、isearchで選択されているリージョンは copy & killできない。例によってあまり情報がなかったので、これの拡張関数を考案してみました。

;;isearchで選択範囲を指定してcopy or kill
(defun copy-isearch-region ()
  (interactive)
  (kill-new isearch-string)
  (isearch-exit))
(defun kill-isearch-region ()
  (interactive)
  (kill-region isearch-other-end (point))
  (isearch-exit))
(define-key isearch-mode-map (kbd "M-w") 'copy-isearch-region)
(define-key isearch-mode-map (kbd "M-d") 'kill-isearch-region)

…なんか調べた時間に比例しないコード量。これを.emacsに追加すれば、isearch中に対応するキーで領域のコピーor切り取りができるはず。

キーマップ

あと、query-replaceも含めて、以下のキーマップは覚えておくと便利だろうなぁ。

  • isearch
    • C-w
    • C-y
    • M-e
    • M-C-y
    • M-C-w
    • M-y
    • M-p
    • M-n
    • M-%
    • M-s-h-r
    • (M-s-o)
  • query-replace
    • ,  :置き換えて進まない
    • .  :置き換えて終了
    • ^  :前に戻る
    • e  :置換文字の編集
    • C-w
    • C-l

query-replaceの[,.^e]あたりは全然知りませんでした。覚えておくべきですね。あと、isearchのいくつかのキーマップは分かりにくいので、自分はこんな感じに定義し直してます。

;;regionを拡大/縮小
(define-key isearch-mode-map (kbd "C-f") 'isearch-yank-char)
(define-key isearch-mode-map (kbd "C-b") 'isearch-del-char)
;;C-hをBackspaceと同じ効果に
(define-key isearch-mode-map (kbd "C-h") 'isearch-delete-char)

これでかなり直感的。。

追記:使ってて気づいたけどC-f/bは結構使う。isearch-yank/del-charに関してはデフォルトの方がやっぱりいいわ…

さらに追記:isearch-regexpで空白文字を疑似ANDに

isearch中にスペースでAND検索ができないかという試み。結論としては、isearch-regexpを利用しましょう、ということ。次のような感じにすれば、スペースが改行以外の任意の文字に当てはまるので、1行ごとのAND検索のようなふるまいになる。

;isearch-regexp において,スペースの正規表現
(custom-set-variables '(search-whitespace-regexp "[^\r\n]+")) 

疑似というのは、順序の情報を含んでいるので、完全なAND検索ではないということ。ちなみに、通常のスペースは C-q [SPC]で入力する。似たような感じでOR検索もできるかなと思って試してみたけど、そのまま応用できるわけではなさそう。まぁORとかあまり使わないだろうし必要な時は直打ちでいいでしょう。
また暇ができたらminibuf-isearchにも適用できるか試してみたい。

というか、minibuf-isearchを入れた記憶はないけど、同じ機能が使えてる・・・?最近のバージョンでは取り込まれたのかな・・・???