文字列中のアイテムを置換したくない場合の定石は?

投稿者: Anonymous

emacs(lisp)で、リージョン中の内容をre-search-forwardとreplace-matchなどの組み合わせで置換していくときに、構文のfooは置換したいけれど、文字列中のfooは置換したくない、という場合は、どうするのが定石なのでしょうか。

foo "foo" foo Foo
=> bar "foo" bar Foo

という風に置換したい場合の定石があれば教えて下さい。

解決

二重引用符に囲まれているものが syntax的に文字列として認識されているので
あれば syntax-tableの情報を使うという手があります. 文字列内にいるか
どうかは syntax-ppssの 4番目(index的には 3)が non-nilの場合,
現在文字列内にいるということになります.

これを使うと以下のようにすることで文字列中以外のところに fooだけ
barに置換することができます.

(while (re-search-forward "foo" nil t)
  (unless (nth 3 (syntax-ppss))
    (replace-match "bar")))

上述のとおり syntax-tableの情報を使うので, fundamental-mode等では
利用することができません.

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *