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を入れた記憶はないけど、同じ機能が使えてる・・・?最近のバージョンでは取り込まれたのかな・・・???