質問: 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等では 利用することができません.