Как создать «по-настоящему» интерактивную команду в emacs?

Как создать «по-настоящему» интерактивную команду в emacs?

Как бы я реализовалголые костифункция, которая «переоценивает» при каждом нажатии клавиши? Я имею в виду нажатие клавиши в широком смысле; я пытаюсь эмулировать поведение 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, чтобы увидеть, как это делается.

Связанный контент