4

emacs の関数を定義する最初の経験として、argv[some number] のすべての出現を取り、それらを順番に再番号付けする関数を作成したいと思います。

これは、検索/置換文字列として入力して、replace-regexp を使用して emacs 内で行われます。

argv\[\([0-9]+\)\]
argv[\,(+ 1 \#)]

今、これを .emacs に書きたいので、Lisp の特殊文字もエスケープする必要があることを理解しています。だから私の意見では、それは書くべきです

(defun argv-order () 
  (interactive)
  (goto-char 1)
  (replace-regexp "argv\\[[0-9]+\\]" "argv[\\,\(+ 1 \\#\)]")
)

検索文字列は正常に機能しますが、置換文字列で「置換テキストでの \ の使用が無効です。\ を追加または削除しようとしましたが、成功しませんでした。

何か案が ?

4

1 に答える 1

6

からのヘルプの引用replace-regexp(太字は私のものです):

インタラクティブな呼び出しでは、置換テキストに `\,' が含まれる場合があります。

defunでインタラクティブに使用していないため、エラーメッセージが表示されます。問題の解決に役立つ同じヘルプからの別の引用:

This function is usually the wrong thing to use in a Lisp program.
What you probably want is a loop like this:
  (while (re-search-forward REGEXP nil t)
    (replace-match TO-STRING nil nil))
which will run faster and will not set the mark or print anything.

そしてそれに基づく解決策:

(defun argv-order ()
  (interactive)
  (let ((count 0))
    (while (re-search-forward "argv\\[[0-9]+\\]" nil t)
      (replace-match (format "argv[%d]" count) nil nil)
      (setq count (1+ count)))))
于 2013-10-31T15:49:14.820 に答える