質問
Emacs Lisp には replace-string
がありません replace-char
. 。「活版印刷の」中引用符 (この文字の Emacs コードは 16 進数の 53979) を通常の ASCII 引用符に置き換えたいのですが、次のように実行できます。
(replace-string (make-string 1 ?\x53979) "'")
あった方が良いと思います replace-char
.
これを行うための最良の方法は何ですか?
解決
なぜ単に使用しないのですか
(replace-string "\x53979" "'")
または
(while (search-forward "\x53979" nil t)
(replace-match "'" nil t))
replace-string のドキュメントで推奨されているように?
他のヒント
これは、elisp で文字を置換する方法です。
(subst-char-in-string ?' ?’ "John's")
与える:
"John’s"
この関数は文字を文字列として受け入れないことに注意してください。最初と 2 番目の引数はリテラル文字でなければなりません (どちらかを使用します)。 ?
表記とか string-to-char
).
また、オプションの場合、この関数は破壊的になる可能性があることにも注意してください。 inplace
引数が非 nil です。
これはreplace-charを使用した方が確実に優れています。コードを改善する方法はありますか?
実際、問題になるほど遅いのでしょうか?私の elisp は通常、とんでもなく非効率的ですが、私はまったく気づきません。(ただし、私はエディタ ツールとしてのみ使用します。次の MS ライブ検索を構築する場合は YMMV を使用します。)
また、ドキュメントを読むと、次のようになります。
This function is usually the wrong thing to use in a Lisp program.
What you probably want is a loop like this:
(while (search-forward "’" nil t)
(replace-match "'" nil t))
この回答はおそらく現在 GPL ライセンスされています。
これはどうですか
(defun my-replace-smart-quotes (beg end)
"replaces ’ (the curly typographical quote, unicode hexa 2019) to ' (ordinary ascii quote)."
(interactive "r")
(save-excursion
(format-replace-strings '(("\x2019" . "'")) nil beg end)))
これを dotemacs に保存したら、elisp サンプル コード (ブログなどから) をスクラッチ バッファーに貼り付け、すぐに C-M-\ (適切にインデントするため) を押してから、M-x my-replace-smart-quotes (修正するため) を押すことができます。スマート引用符)、最後に C-x C-e (実行するため)。
中引用符は常に hexa 2019 であることがわかりましたが、あなたの場合は 53979 で間違いありませんか?C-u C-x = でバッファ内の文字を確認できます。
my-replace-smart-quotesの定義の「\x2019」の代わりに「’」を書いても大丈夫だと思います。それはただ安全を期するためです。