Wie kann ich binden Sie einen regulären Ausdruck, um eine Tastenkombination in emacs?

StackOverflow https://stackoverflow.com/questions/10149

  •  08-06-2019
  •  | 
  •  

Frage

Für Kontext, ich bin so etwas wie ein emacs-Neuling.Ich habe nicht verwendet es für eine sehr lange, aber mit mehr und mehr (mag ich sehr).Auch ich bin wohl mit lisp, aber nicht super vertraut mit elisp.

Was ich tun muss, ist, binden Sie einen regulären Ausdruck, um eine Tastatur-Kombination, weil ich diese Besondere regex so oft.

Was ich getan habe:

M-C-s ^.*Table\(\(.*\n\)*?GO\)

Beachten Sie, ich verwendet, newline oben, aber ich habe herausgefunden, dass isearch-forward-regexp, Sie wirklich brauchen, um zu ersetzen, die \n in den regulären Ausdruck ein, mit dem Ergebnis, C-q-j.Dies fügt eine literal newline (ohne Sie zu beenden, das Kommando), die es ermöglicht mir ein Zeilenumbruch in die Ausdruck und Spiel entlang der Linien.

Wie kann ich binden diese um eine Tastenkombination?

Ich vage zu verstehen, dass ich brauche, um erstellen Sie eine elisp-Funktion, die ausgeführt wird isearch-forward-regexp mit dem Ausdruck, aber ich bin fuzzy-auf die details.Ich habe google gesucht und gefunden, die meisten Dokumentation ein bisschen verwirrend.

Wie kann ich binden Sie einen regulären Ausdruck, um eine Tastenkombination in emacs?


Mike Stone hatten die beste Antwort bisher-nicht genau was ich suchte, aber es funktionierte für das, was ich brauchte

Bearbeiten - diese Art gearbeitet, aber nach dem speichern das makro, wenn ich ging zurück, um es später zu verwenden, konnte ich es nicht benutzen, die mit C-x e.(also, wenn ich einen Neustart von emacs und geben Sie dann M-x makro-name, und dann C-x e, Erhalte ich eine Fehlermeldung im minibuffer wie "kein last-kbd-macro' oder etwas ähnliches)


@Mike Stein - vielen Dank für die Informationen.Ich habe versucht, erstellen Sie ein makro wie folgt:

C-x( M-C-s ^.*Table\(\(.*C-q C-J\)*?GO\) C-x)

So entstand mein makro, aber wenn ich ausgeführt, mein makro habe ich nicht bekommen, die gleiche Hervorhebung, die ich normalerweise bekomme, wenn ich verwenden isearch-forward-regexp.Stattdessen ist es nur sprang zum Ende der nächsten übereinstimmung des Ausdrucks.Also, das funktioniert nicht wirklich, was ich brauche.Irgendwelche Ideen?

Edit:Es sieht aus wie ich können verwenden Sie Makros, um zu tun, was ich will, ich muss nur über den Tellerrand isearch-forward-regexp.Ich werde versuchen, was Sie sagten.

War es hilfreich?

Lösung

Sie können Makros verwenden, tun Sie einfach C-x ( dann tun Sie alles für die makro -, dann C-x ) das makro beenden, dann C-x e führt die zuletzt definierten Makros.Dann können Sie benennen Sie es mit M-x name-last-kbd-macro Sie können einen Namen zuweisen, die Sie dann aufrufen, mit M-x TESTIT, dann speichern Sie die definition mit M-x insert-kbd-macro die werden das makro in Ihrem aktuellen Puffer, und dann können Sie speichern Sie es in Ihrem .emacs Datei.

Beispiel:

C-x( abc *return* C-x)

Definieren Sie ein makro, geben Sie "abc" und drücken Sie die EINGABETASTE.

C-xeee

Führt die oben genannten makro sofort, 3 mal (erste e führt, dann folgt 2 e s wird ausgeführt, es zweimal mehr).

M-x name-last-kbd-macro testit

Namen, die das makro "testit"

M-x testit

Führt die eben genannten makro ("drucken "abc" und anschließend auf zurück).

M-x insert-kbd-macro

Legt der folgenden, die in Ihrer aktuellen Puffer:

(fset 'testit
   [?a ?b ?c return])

Die können dann gespeichert werden in Ihre .emacs Datei zur Verwendung des namens makro immer und immer wieder nach einem Neustart von emacs.

Andere Tipps

Ich habe angefangen mit der Lösung Ihres Problems wörtlich,

(defun search-maker (s)
  `(lambda ()
     (interactive)
     (let ((regexp-search-ring (cons ,s regexp-search-ring)) ;add regexp to history
           (isearch-mode-map (copy-keymap isearch-mode-map)))
       (define-key isearch-mode-map (vector last-command-event) 'isearch-repeat-forward) ;make last key repeat
       (isearch-forward-regexp)))) ;`

(global-set-key (kbd "C-. t") (search-maker "^.*Table\\(\\(.*\\n\\)*?GO\\)"))
(global-set-key (kbd "<f6>") (search-maker "HELLO WORLD"))

Die Tastatur-Sequenz aus (kbd ...) startet eine neue, leere Suche.Tatsächlich suchen die Zeichenfolge, drücken Sie Letzte Schlüssel wieder, wie viele mal wie Sie benötigen.So C-. t t t oder <f6> <f6> <f6>.Die Lösung ist im Grunde ein hack, aber ich lasse es hier, wenn Sie möchten, zu Experimentieren mit es.

Das folgende ist wahrscheinlich dem am nächsten, was Sie brauchen,

(defmacro define-isearch-yank (key string)
  `(define-key isearch-mode-map ,key 
     (lambda ()
       (interactive) 
       (isearch-yank-string ,string)))) ;`

(define-isearch-yank (kbd "C-. t") "^.*Table\\(\\(.*\\n\\)*?GO\\)")
(define-isearch-yank (kbd "<f6>") "HELLO WORLD")

Die key-combos, die jetzt nur in isearch-Modus.Starten Sie die Suche in der Regel, und dann drücken Sie die Tastenkombinationen zum einfügen von vordefinierten Zeichenfolge.

@Justin:

Beim ausführen eines Makros, ist es ein bisschen anders...inkrementelle Suche wird nur einmal geschehen, und Sie haben, um das makro auszuführen wieder, wenn Sie wollen, um erneut zu suchen.Sie können mehr tun, leistungsfähige und komplexe Dinge, obwohl, wie eine Stichwortsuche, springen Sie an den Anfang der Zeile, Zeichen, gehen Sie zum Ende der Zeile, M-w (kopieren), dann springen Sie zu einem anderen Puffer, dann C-y (paste), dann springen Sie zurück zu den anderen Puffer-und am Ende das makro ein.Dann, jedes mal, wenn Sie das makro auszuführen, werden Sie beim kopieren einer Zeile zur nächsten Puffer.

Die wirklich Coole Sache über emacs-Makros ist, es wird aufhören, wenn es sieht, die Glocke...was passiert, wenn Sie nicht übereinstimmen, wird eine inkrementelle Suche (unter anderem).So die oben genannten Makros, die Sie tun können, C-u 1000 C-x e, die das makro auszuführen 1000 mal...aber da hat man noch eine Suche, es wird nur kopieren 1000 Linien, ODER BIS DIE SUCHE SCHEITERT!Das bedeutet, wenn es sind 100 Spiele, es werden nur ausgeführt, das makro 100 mal.

EDIT:Check-out-C-hf-highlight-lines-matching-regexp, die wird zeigen Sie die Hilfe für einen Befehl, highlights alles matching a regex...Ich weiß nicht, wie rückgängig machen, die Hervorhebung obwohl...sowieso, Sie könnte verwenden eine gespeicherte makro markieren Sie alle passenden regex, und dann ein anderes makro auf die nächste...?

WEITER BEARBEITEN:M-x unhighlight ist-regexp wird rückgängig gemacht, die Hervorhebung, müssen Sie die letzten regex, aber (aber es standardmäßig der regex, die Sie verwendet, um zu markieren)

Im Allgemeinen definieren Sie einen benutzerdefinierten Tastenbelegung in Emacs, Sie würde schreiben

(define-key global-map (kbd "C-c C-f") 'function-name)

define-key ist, wenig überraschend, die Funktion zu definieren, einen neuen Schlüssel. global-map ist der globalen keymap, im Gegensatz zu einzelnen Karten für jeden Modus. (kbd "C-c C-f") gibt eine Zeichenfolge zurück, die die wichtigsten Sequenz C-c C-f.Es gibt andere Möglichkeiten, dies zu tun, einschließlich der Eingabe der Zeichenfolge direkt, aber das ist meistens die einfachste, da es die normalen SCHRIFTLICHEN Darstellung. 'function-name ist ein symbol, das ist der name der Funktion.

Nun, es sei denn, Ihre Funktion ist bereits definiert, Sie ' ll wollen, Sie zu definieren, bevor Sie diesen verwenden.Um das zu tun, schreiben

(defun function-name (args)
  (interactive)
  stuff
  ...)

defun definiert eine Funktion - Verwendung C-h f defun für mehr spezifische Informationen.Die (interactive) es ist nicht wirklich eine Funktion aufrufen;es sagt dem compiler, dass es ist okay für die Funktion, die aufgerufen werden, indem der Benutzer mit M-x function-name und über Tastenkürzel.

Nun, für die interaktive Suche in allem, dies ist schwierig;die isearch Modul scheint nicht wirklich eingerichtet werden, für das, was Sie zu tun versuchen.Aber Sie können dies verwenden, um etwas ähnliches tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top