Как я могу получить "действительно" интерактивную команду в emacs?
Как мне реализовать функцию " голых костей", которая "переоценивает" каждое нажатие клавиши? Я имею в виду нажатие клавиши свободно; Я хочу подражать поведению isearch
и друзья.
Я бы использовал это для интерактивного тестирования выражений XPath по отношению к открытому буферу в режиме nxml, используя что-то вроде сужения буфера. Для целей этого вопроса, однако, просто функция, которая вызывает message
на что бы то ни было в минибуфере было бы абсолютно грандиозно.
1 ответ
В зависимости от того, что вы хотите, вы можете обмануть и использовать isearch-mode
: его третий аргумент (OP-FUN
) - это функция, вызываемая после обработки каждого ввода и его 5-го аргумента (WORD
) может быть любой функцией, которая преобразует строку, набранную в isearch, в регулярное выражение для поиска в буфере.
Для exemble:
(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, чтобы увидеть, как это делается.