0

これは前回の投稿の続きです ( Emacs で isearch-forward の前に入力文字列を前処理することは可能ですか)。jpkotta変数を使用しての回答を実装しようとしていますisearch-search-fun-function。独自の関数を記述する代わりに、「abc」と入力するたびに isearch が regexp を強調表示して検索するようisearch-search-fun-defaultに、独自の関数 (isearch-str-forwardおよび、デモの目的で) を含めることをお勧めします。isearch-str-backwarda[ ]*b[ ]*c[ ]*

問題は、関数にアドバイスしてから「abc」のisearchを実行すると、エラーが発生したことですI-search: abc [(void-function nil)]。しかし、コードをdefadvise元のisearch-search-fun-default関数に入れると、うまくいきます! だから私は混乱します。Elisp のマニュアルad-do-itでは、元の関数コードのプレースホルダーに過ぎないと述べているため、これらの 2 つのアプローチ (関数にアドバイスするか、元の関数を変更する) は、最終的に同じコードを生成するはずです。アドバイスするとエラーになるのはなぜですか?

(defun isearch-mangle-str (str)
  "For input STR \"abc\", it will return \"a[ ]*b[ ]*c[ ]*\"."
  (let ((i 0) (out ""))
    (dotimes (i (length str))
      (setq out (concat out (substring str i (1+ i)) "[ ]" "*")))
    out))

(defun isearch-str-forward (str &optional bound noerror)
  "Search forward for STR."
  (let ((string (isearch-mangle-str str)))
    (re-search-forward string bound noerror)))

(defun isearch-str-backward (str &optional bound noerror)
  "Search backward for STR."
  (let ((string (isearch-mangle-str str)))
    (re-search-backward string bound noerror)))

(defvar my-search-p t)
(defadvice isearch-search-fun-default (around my-isearch-search-fun activate)
  (if my-search-p
      (if isearch-forward 'isearch-str-forward
        'isearch-str-backward)
    ad-do-it))
4

1 に答える 1

1

これらのエラーが発生する理由は完全にはわかりません (おそらく を使用する必要があると思いますad-return-value) が、なぜアドバイスを使用するのでしょうか? 通常、これは最後の手段である必要があり、この場合、助言を避けるのは非常に簡単です。

また、関数名の前に「isearch」を付けないでください。emacs には名前空間が 1 つしかないため (Lisp1 と Lisp2 について話しているわけではありません)、変数と関数に一意の名前を付けるのは良い習慣です。個人的には「jpk/」という接頭辞を使っていますが、ここでは「my-」を使っています。

(defun my-isearch-mangle-str (str)
  "For input STR \"abc\", it will return \"a[ ]*b[ ]*c[ ]*\"."
  (let ((i 0) (out ""))
    (dotimes (i (length str))
      (setq out (concat out (substring str i (1+ i)) "[ ]" "*")))
    out))

(defun my-isearch-str-forward (str &optional bound noerror)
  "Search forward for STR."
  (let ((string (my-isearch-mangle-str str)))
    (re-search-forward string bound noerror)))

(defun my-isearch-str-backward (str &optional bound noerror)
  "Search backward for STR."
  (let ((string (my-isearch-mangle-str str)))
    (re-search-backward string bound noerror)))

(defvar my-isearch-p t)

(defun my-isearch-search-fun ()
  (if my-isearch-p
      (if isearch-forward 'my-isearch-str-forward 'my-isearch-str-backward)
    (isearch-search-fun-default)))

(setq isearch-search-fun-function 'my-isearch-search-fun)

また、あなたが何を望んでいるのか正確にはわかりませんが、私のパッケージflex-isearchに似ているようです。

于 2013-05-02T23:51:28.553 に答える