Emacs の検索、置換における大文字小文字の区別の切り替え

Emacs にはいろんな検索、置換機能があります。 その際、大文字小文字を区別するしないを設定で変えることができます。 今回はその設定方法について紹介したいと思います。

検索

検索時に大文字小文字を区別しないようにする設定です。
~/.emacs.d/init.el に次のような記述をします。
 ;; 検索(全般)時には大文字小文字の区別をしない
 (setq case-fold-search t)
 
 ;; インクリメンタルサーチ時には大文字小文字の区別をしない
 (setq isearch-case-fold-search t)
case-fold-search が検索全般に対して使われる変数で、 isearch-case-fold-search がインクリメンタルサーチ(C-s)時の変数です。
nil で区別し、 t(nil 以外) で区別しなくなります。

M-x customize-variable などでカスタマイズの機能を使って設定することもできます。

バッファー、ファイル名補完

バッファーの切り替え(C-x b) などでバッファー名を指定する場合やファイルパスを指定する場合 [TAB] で補完できます。その際に大文字小文字を区別しない設定です。
 ;; バッファー名の問い合わせで大文字小文字の区別をしない
 (setq read-buffer-completion-ignore-case t)
 
 ;; ファイル名の問い合わせで大文字小文字の区別をしない
 (setq read-file-name-completion-ignore-case t)
ファイルパス指定(read-file-name-completion-ignore-case)は Windows の場合、 デフォルトで t です。
バッファー指定(read-buffer-completion-ignore-case)のデフォルトは nil で挙動が違うので、 t にしておいた方が使いやすいと思います。

置換 query-replace

置換時の大文字小文字の区別の切り替えは case-replace 変数を使います。
;;置換時に大文字、小文字をそのまま
(setq case-replace nil)
この変数が t または nil で変換後の大文字小文字が変わります。 query-replace (M-%) を使って、 foo を bar に置換した場合は次のようになります。
変換前 変換後 t 変換後 nil
foo bar bar
Foo Bar bar
FOO BAR bar
コーディングなどでは t にする方が便利です。 デフォルトの状態も t です。

dabbrev 補完

M-/ で呼び出される dabbrev-expand というコマンドがあります。 これは単語を途中まで書いているとき、 開いているバッファー内からマッチする単語を逐次補完してくれる機能です。

"FooBarClass" という単語があったとして、 コマンドを実行すると置換用の変数(case-replace) によって、補完結果が変わります。
  foob[M-/]  => foobarclass (  t  )
              => FooBarClass ( nil )
この場合は case-replace の値は nil の方がいいでしょう。
なお、これは case-fold-searcht の場合です。 nil の場合はそもそも "FooBarClass" が "foob" の候補になりません。

この dabbrev の時だけ動作を変える変数が用意されています。
  • dabbrev-case-fold-search
  • dabbrev-case-replace
これらは t, nil に対応する on, off に加えて、 case-fold-search(case-replace) の値に従う状態が選べます。
こちらは M-x customize-customize-group [RET] dabbrev などのカスタマイズで設定した方が簡単でしょう。


ちなみに dabbrev-expand は逐次補完ですが、 候補を表示する dabbrev-completion (M-C-/) もあります。

特定のモードだけ変更

特定のモードだけ大文字小文字の挙動を変更したい場合があります。
例えば、 先ほどの dabbrev-expand ではコーディング時は大文字小文字を保持(nil) した方が使いやすいですが、 メッセージファイルやテキストファイルなどで英語の文章を書いている場合は、 t の方が使いやすいと思います。

各モードの hook と変数をバッファーで固有にする機能(make-local-variable) を使えば、特定のモードだけ挙動を変えることができます。

以下はテキストモードだけ値を変える例です。
 ;; テキストモードでは dabbrev で大文字小文字を保持しない
 (add-hook 'text-mode-hook
          '(lambda ()
             (set (make-local-variable 'dabbrev-case-replace) t)))

特定のコマンドだけ変更

dabbrev では変数が用意されていましたが、 用意されていないコマンドなどのために特定のコマンドの時だけ変えることもできます。

以下は query-replace (M-%) による置換だけ case-replace を t にする設定です。
;; 置換時に大文字、小文字をそのままで
(setq case-replace nil)
;; でも query-replace の時は変化させる
(defadvice query-replace (around replace-ajust
                                 activate compile)
  "query-replace の大文字小文字検索の調整"
  (let ((case-replace t))
         ad-do-it))
なお、 TAGS ファイルを使った置換(M-x tags-query-replace) も内部で query-replace が呼ばれるため、 この設定で OK です。


関連記事
Prev.    Category    Next 

Facebook コメント


コメント

コメントの投稿

Font & Icon
非公開コメント

このページをシェア
アクセスカウンター
アクセスランキング
[ジャンルランキング]
コンピュータ
56位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
9位
アクセスランキングを見る>>
カレンダー(アーカイブ)
プルダウン 降順 昇順 年別

12月 | 2025年01月 | 02月
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -


はてな新着記事
はてな人気記事
ブロとも申請フォーム
プロフィール

yohshiy

Author:yohshiy
職業プログラマー。
仕事は主に C++ ですが、軽い言語マニアなので、色々使っています。

はてブ:yohshiy のブックマーク
Twitter:@yohshiy

サイト紹介
プログラミング好きのブログです。プログラミング関連の話題や公開ソフトの開発記などを雑多に書いてます。ただ、たまに英語やネット系の話になることも。