Как бы я реализовалголые костифункция, которая «переоценивает» при каждом нажатии клавиши? Я имею в виду нажатие клавиши в широком смысле; я пытаюсь эмулировать поведение isearch
и друзей.
Я бы использовал это для интерактивного тестирования выражений XPath в открытом буфере nxml-mode, используя что-то вроде сужения буфера. Однако для целей этого вопроса просто функция, которая вызывает message
то, что находится в минибуфере, была бы абсолютно великолепной.
решение1
В зависимости от того, что вам нужно, вы можете схитрить и использовать isearch-mode
: его третий аргумент ( OP-FUN
) — это функция, вызываемая после обработки каждого ввода, а его пятый аргумент ( WORD
) может быть любой функцией, которая преобразует строку, введенную в isearch, в регулярное выражение для поиска в буфере.
Например:
(defun my-op-fun (string &optional lax)
(let ((words (split-string string ":")))
(mapconcat '(lambda (word)
(concat "\\<" (regexp-quote word)))
words "\\>.*")))
(defun my-isearch-beggining-of-line ()
(interactive)
(isearch-mode t t nil t 'my-op-fun))
Если вы введете «foo», он будет искать слово, начинающееся с «foo», если вы введете «foo:bar», он будет искать слово «foo», за которым следует какой-либо другой символ, а затем «bar» в качестве начала слова.
Для того чтобы все это заработало, вам, возможно, понадобятся некоторые навыки работы с регулярными выражениями.
Вы также можете просто посмотреть на исходный код isearch, чтобы увидеть, как это делается.