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


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

[code]

    foo "foo" foo Foo
    => bar "foo" bar Foo
    
[/code]

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




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

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

[code]

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

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




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

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

[code]

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

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

