本を読む

読書やコンピュータなどに関するメモ

Emacsでマッチ箇所が重なる置換

 わかる方、教えてください。

 Emacs では、確認つき置換にquery-replace(M-%)を使います。

 たとえば、「xとxの間にあるスペースを削除する」ために“x x”を“xx”に置換したいとします。このとき、現在のバッファのテキストが以下の内容だとします。

x x x x

 期待する結果は、バッファのテキストが次のようになることです。

xxxx

 これに対して、“M-% x x RET xx RET !”とすると、バッファのテキストは以下のようになります。

xx xx

 これは、最初に“x x”にマッチした直後、ポイント(カーソル位置)がマッチ範囲の後に移動するからです。“x x x”とあるとき、最初に先頭の“x x”にマッチすると、ポイントが2つめのスペース(の前)に移動する、つまりそのスペースは“x x”にマッチしない(パターンの頭の“x”がない)、というわけです。

 もしEmacsの正規表現に先読み(lookahead)があれば、“C-M-% x \(?=x\) RET xx RET !”みたいにしていけるんですが。

 思いつく回避方法のその1は、置換を2回実行すること。面倒ですが。

 思いつく回避方法のその2は、先読み相当の処理をEmacs Lispで書くこと。たとえば、こんな感じのEmacs Lispのコマンドを作ればできます。とはいえ、汎用的にするのは面倒そうです。

(defun foo ()
  (interactive)
  (let ((replace-search-function
         (lambda (str &optional bound noerror count)
           (let (r)
             (while (and
                     (setq r (search-forward str bound noerror count))
                     (/= (following-char) ?x) ))
             r ))))
    (perform-replace "x " "x" t nil nil) ))

 なんかうまい手はないでしょうか、識者の方。

 ちなみに、最終的にやりたいことは、和欧間スペースの確認つき削除を1コマンドでやることです。今のところ、上のEmacs Lispみたいなことをやってますが。

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://emasaka.blog65.fc2.com/tb.php/1262-af38c73d

 | HOME | 

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

フリーター。
連絡先はこのへん

Monthly


FC2Ad