Nano Hash - криптовалюты, майнинг, программирование

ошибка defadvice для isearch-search-fun-default

Это продолжение моего предыдущего поста (можно ли предварительно обработать входную строку перед поиском вперед в Emacs). Я пытаюсь реализовать ответ jpkotta, используя переменную isearch-search-fun-function. Вместо того, чтобы писать свою собственную функцию, я просто советую isearch-search-fun-default включить мои собственные функции (isearch-str-forward и isearch-str-backward, просто для демонстрации), чтобы каждый раз, когда я набираю "abc", isearch выделял и искал регулярное выражение a[ ]*b[ ]*c[ ]*.

Проблема в том, что когда я посоветовал функцию, а затем выполнить поиск «abc», она выдала мне ошибку I-search: abc [(void-function nil)]. Но если я вставлю код внутри моего defadvise в исходную функцию isearch-search-fun-default, он сработает! Так что я путаюсь. В руководстве к Elisp сказано, что ad-do-it — это просто заполнитель для исходного кода функции, поэтому эти два подхода, совет функции или изменение исходной функции, должны, наконец, генерировать один и тот же код. Почему ошибка, когда я советую это?

(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))

Ответы:


1

Я не совсем понимаю, почему вы получаете эти ошибки (я предполагаю, что вам, вероятно, нужно использовать ad-return-value), но зачем использовать совет? Обычно это должно быть последним средством, и в этом случае очень легко избежать совета.

Кроме того, не добавляйте к именам функций префикс «isearch». Так как emacs имеет только одно пространство имен (я не говорю о 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.

02.05.2013
  • Это лучше, чем совет. Большое спасибо. Посмотрел flex-isearch — круто. Я попробую. 03.05.2013
  • Кстати, в транке Emacs у нас есть add-function (поверх которого был перереализован механизм советов) для этого: (add-function :around isearch-search-fun-function (lambda (default) (if my-isearch-p (if isearch-forward #'my-isearch-str-forward #'my-isearch-str-backward) (funcall default)))). 05.05.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..