Como posso ter um comando 'verdadeiramente' interativo no emacs?

Como posso ter um comando 'verdadeiramente' interativo no emacs?

Como eu implementaria umossos nusfunção que 'reavalia' a cada pressionamento de tecla? Quero dizer, pressionar a tecla livremente; Estou procurando imitar o comportamento de isearchamigos.

Eu usaria isso para testar interativamente expressões XPath em um buffer de modo nxml aberto usando algo parecido com estreitamento de buffer. Porém, para os propósitos desta questão, apenas uma função que chama messagetudo o que está no minibuffer seria absolutamente grandiosa.

Responder1

Dependendo do que você quiser, você pode trapacear e usar isearch-mode: seu terceiro argumento ( OP-FUN) é uma função chamada após cada entrada ser processada, e seu 5º argumento ( WORD) pode ser qualquer função que transforme a string digitada em isearch em uma regexp para procurar para no buffer.

Por exemplo:

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

se você digitar "foo" ele irá procurar por uma palavra começando com "foo", se você digitar "foo:bar" ele irá procurar pela palavra "foo" seguida por algum outro caractere e então "bar" como o início de uma palavra .

Pode ser necessário algum domínio de regexp para fazer isso funcionar para você.

Você também pode simplesmente olhar a fonte do isearch para ver como isso é feito.

informação relacionada