xyzzyの正規表現で全角文字だけをヒットさせる

半角文字と全角文字の間に半角スペースを入れる人がいるのだが、そのような半角スペースを一括削除したいという話。


たとえばこんな感じ。

MS-DOS の dir コマンドに相当する Linux のコマンドは ls である。



これを、「MS-DOSのdirコマンドに相当するLinuxのコマンドはlsである。」としたいわけだ。

正規表現で全角/半角文字にマッチする文字クラスがあればよいのだが、xyzzyの正規表現にはない。

しょうがないので、半角文字を[!-~]、全角文字を[^!-~]で代用して次のような関数を作ってみた。
; 全角-半角間のスペース除去

(defun regularize-spacing ()
  (interactive)
  (goto-char (point-min))
  (replace-regexp “\\([^!-~]\\) \\([!-~]\\)” “\\1\\2” t)
  (goto-char (point-min))
  (replace-regexp “\\([!-~]\\) \\([^!-~]\\)” “\\1\\2” t)
  (goto-char (point-min))
  (replace-regexp “\\([^!-~]\\) \\([^!-~]\\)” “\\1\\2” t)
  (goto-char (point-min))) ファイルに書く場合、””内の\はクォートしなければならないのに一瞬はまったけど、とりあえずこれでそこそこ動く。