Wie kann ich in Emacs einen „wirklich“ interaktiven Befehl haben?

Wie kann ich in Emacs einen „wirklich“ interaktiven Befehl haben?

Wie würde ich eineblanke KnochenFunktion, die bei jedem Tastendruck „neu ausgewertet“ wird? Ich meine Tastendruck im weitesten Sinne; ich möchte das Verhalten von isearchund Freunden emulieren.

Ich würde dies verwenden, um XPath-Ausdrücke interaktiv gegen einen offenen Puffer im NXML-Modus zu testen, indem ich etwas in der Art der Pufferverengung verwende. Für die Zwecke dieser Frage messagewäre jedoch einfach eine Funktion, die aufruft, was sich im Minipuffer befindet, absolut großartig.

Antwort1

Je nachdem, was Sie möchten, können Sie schummeln und verwenden isearch-mode: Das dritte Argument ( OP-FUN) ist eine Funktion, die nach der Verarbeitung jeder Eingabe aufgerufen wird, und das fünfte Argument ( WORD) kann eine beliebige Funktion sein, die die in isearch eingegebene Zeichenfolge in einen regulären Ausdruck umwandelt, nach dem im Puffer gesucht werden soll.

Zum Beispiel:

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

Wenn Sie „foo“ eingeben, wird nach einem Wort gesucht, das mit „foo“ beginnt. Wenn Sie „foo:bar“ eingeben, wird nach dem Wort „foo“ gesucht, gefolgt von einem anderen Zeichen als „bar“ am Wortanfang.

Damit dies für Sie funktioniert, sind möglicherweise einige Kenntnisse über reguläre Ausdrücke erforderlich.

Sie können sich auch einfach den Quellcode von isearch ansehen, um zu sehen, wie es gemacht wird.

verwandte Informationen