Wie kann ich alle Vorkommen eines Wortes in einem Emacs-Puffer hervorheben?

83

Notepad ++ bietet eine praktische Funktion: Wenn Sie ein Wort in Ihrem Text auswählen (nicht unbedingt ein Schlüsselwort), wird das Wort im gesamten Text hervorgehoben. Kann das auch in Emacs gemacht werden? Und wenn ja, wie?

Es muss nicht unbedingt genau wie Notepad ++ funktionieren (dh über Auswahl); Im Idealfall möchte ich eine Tastenkombination einrichten, mit der alle Vorkommen des Wortes unter dem Cursor hervorgehoben werden.

Es wäre toll , wenn die Höhepunkte permanent waren, dh Punkt bewegt von einem markierten Wort weg sollte nicht das Highlight verursacht entfernt werden.

Es wäre auch nützlich, wenn es eine Lösung gäbe, die es ermöglicht, zwischen Markierungen zu navigieren (mithilfe benutzerdefinierter Tastenkombinationen).

Kopfkrabbe
quelle

Antworten:

41

Vielleicht ist Highlight-Symbol.el unter http://nschum.de/src/emacs/highlight-symbol/ genau das, wonach Sie suchen:

Alt-Text

mehrsprachig
quelle
1
Ich habe es versucht, konnte es aber nicht zum Laufen bringen - Emacs beschwerte sich über "Der Wert des Symbols als Variable ist ungültig: Highlight-Symbol-Leerlaufverzögerung".
Headcrab
1
Ich hatte dieses spezielle Problem. Am Ende habe ich den gesamten Teil (defcustom Highlight-Symbol-Leerlaufverzögerung ...) auskommentiert und mich vor (defun Highlight-Symbol-Leerlaufverzögerung ...) verschoben (defun Highlight-Symbol-Update-Timer ...). ), wodurch der Fehler vermieden wird.
Polyglot
1
Ja, endlich habe ich genau das Gleiche getan.
Headcrab
1
Entschuldigung, aber ich sehe keine Notwendigkeit, ein externes Paket für diese Aufgabe hinzuzufügen! Siehe Jrockways Beitrag.
MefiX
4
@mefiX: Die eingebaute Funktion ist gut für den einmaligen Gebrauch. Das externe Paket bietet (unter anderem) die Möglichkeit, das Wort unter dem Cursor mit nur einem Tastendruck hervorzuheben und die Hervorhebungsfarbe für verschiedene Wörter automatisch zu ändern. Ja, Sie können dies mit der integrierten Funktion tun, aber warum sollten Sie Minuten und Hunderte von Tastenanschlägen anstelle von nur wenigen Sekunden und Tastenanschlägen verschwenden, wenn Sie dies häufig tun? Wer auch immer abstimmt, scheint engsichtig zu sein: Jemand könnte dieses Paket nützlich finden, auch wenn Sie es nicht tun.
Polyglot
84

Die hi-lockVorschläge sind gut. Ich denke, es ist einfacher, die M-xVersionen zu verwenden :

M-x highlight-regexp RET <REGEXP>

M-x highlight-phrase RET <REGEXP>

highlight-phraseist nur ein bisschen Zucker highlight-regexp, der Groß- und Kleinschreibung ignoriert und ein Leerzeichen in der Regex übersetzt, um mit beliebigen Leerzeichen übereinzustimmen. Praktisch.

Jrockway
quelle
23
Verwenden Sie zum Löschen der Hervorhebungen Folgendes: M-x unhighligh-regexTastenakkord: C-x w r... Bei Hervorhebungsphrasen wird die Groß- und Kleinschreibung nicht vollständig berücksichtigt. Nur anfängliche Kleinbuchstaben (von Wörtern) haben die Groß- und Kleinschreibung nicht berücksichtigt. (Ich nehme an, es war beabsichtigt, sich mit fredvs zu befassen Fred) .. zB erzeugt es einen [Cc]at[ ]+[Dd]og
regulären Ausdruck
Vielen Dank, ich finde Ihren Kommentar zum Unterschied klarer als die eingebaute Hilfe.
Joshua Goldberg
1
Hinweis: Tippfehler: Es sollte unhighlight-regexpanstelle von unhighligh-regex(fehlt tund p) sein.
Zelphir Kaltstahl
36

Geben Sie ein C-sund geben Sie dann das aktuelle Wort oder den aktuellen Typ ein C-w. Als Bonus können Sie jetzt C-serneut drücken, um nach dem Wort zu suchen.

Dies wird als inkrementelle Suche bezeichnet .

ShreevatsaR
quelle
11
Für das, was es wert ist, erkenne ich jetzt die Absicht der Frage: Sie möchten, dass die Vorkommen "dauerhaft" hervorgehoben werden (bis Sie sie ausschalten), auch wenn Sie andere Arbeiten wie Bewegen, Tippen usw. ausführen. Dazu Cs (inkrementelle Suche) ) funktioniert nicht (die Hervorhebung ist "vorübergehend"; Sie können sich im Puffer bewegen, aber es ist schwierig, neue Bearbeitungsarbeiten durchzuführen). Ich benutze (und habe) die M-x highlight-regexpLösung (und habe sie an eine Verknüpfung gebunden).
ShreevatsaR
15

Was ich benutze, ist Leerlauf-Highlight

http://www.emacswiki.org/emacs/IdleHighlight

Mx Idle-Highlight legt einen Leerlauf-Timer fest, der alle Vorkommen im Puffer des Wortes unter dem Punkt hervorhebt.

So aktivieren Sie es für alle Programmiermodi ~/.emacs.d/init.el:

;; highlight words
(add-hook 'prog-mode-hook (lambda () (idle-highlight-mode t)))
Johnny
quelle
Ich hatte einige Unstimmigkeiten mit Lambdas Innenhaken. Vielleicht erwägen Sie, einen Defun zu nennen.
Darryl Hebbes
10

Das Lichtsymbol hebt jeden Symbolpunkt hervor, der vorbei ist.

Alternativ können Sie auftreten verwenden , um alle Zeilen aufzulisten, die einem regulären Ausdruck entsprechen. Es ist nützlich, schnell alle Funktionen in einer Klasse zu sehen.

dh
quelle
Das scheint sehr schön zu sein, aber woher weiß es, ob es dasselbe Symbol oder ein anderes Symbol mit demselben Namen gefunden hat?
HelloGoodbye
6

Versuchen Sie es mit http://www.emacswiki.org/emacs/msearch.el. Alle Vorkommen des mit dem Cursor ausgewählten Texts werden hervorgehoben. Sie müssen über die Zeichenfolge ziehen, die Sie hervorheben möchten. Auf diese Weise können Sie die Auswahl einfach ändern, ohne die Hervorhebung zu ändern.

Wenn Sie die Hervorhebung einer Zeichenfolge beibehalten möchten, können Sie sie einfrieren.

Sie können einen Puffer in einen anderen Puffer versklaven. Im Master-Puffer ausgewählter Text wird auch im Slave-Puffer hervorgehoben. Dies ist nützlich, um Puffer zu vergleichen. Es ist auch nützlich, um Notizen in einem Puffer zu machen, während Sie den Text in einem anderen untersuchen. Sie können eine Sammlung von Schlüsselwörtern im Notizenpuffer haben. Ziehen Sie über ein solches Schlüsselwort, und seine Vorkommen im untersuchten Text werden hervorgehoben.

Ich benutze dieses Zeug seit Jahren. Ich habe das Einfrieren vor kurzem hinzugefügt. Vielleicht ist etwas kaputt. Wenn dies der Fall ist, hinterlassen Sie mir eine Nachricht auf http://www.emacswiki.org/emacs/msearch oder hier.

Tobias
quelle
5

Das ist vielleicht nicht so schön wie das, was Sie sich erhofft hatten, aber wenn Sie es sagen

(global-hi-lock-mode 1)

In Ihre .emacsDatei können Sie dann C-x w h REGEX <RET> <RET>eingeben, um alle Vorkommen von hervorzuheben REGEXund C-x w r REGEX <RET>sie wieder aufzuheben. Wieder nicht so elegant, wie Sie wahrscheinlich möchten, aber es wird funktionieren.

Dancavallaro
quelle
5

Überprüfen Sie die interaktive Hervorhebung

Sollte sein:

C- x w hWort<RET> <RET>

Christian C. Salvadó
quelle
1
Erstens sollte der Hi-Lock-Modus durch den Mx-Hi-Lock-Modus aktiviert werden. Dann funktioniert es. Übrigens ist der Link zur interaktiven Hervorhebung tot. Es ist jetzt hier: gnu.org/software/emacs/manual/html_node/emacs/...
Aspirin
5

Niemand erwähnte den symbol-overlayModus . Es ist im Grunde eine bessere Umschreibung von highlight-symbol-mode. "Besser" wie in, es fehlen Fehler des ursprünglichen Hervorhebungssymbols (z. B. temporäres Hervorheben bleibt hängen oder das temporäre Hervorheben verschwindet, um sich innerhalb des hervorgehobenen Wortes zu bewegen, oder es können Symbole wie nicht hervorgehoben werden *) , besser integriert und beibehalten. Siehe Abschnitt "Vorteile" in der README-Datei.

Sie können es wie gewohnt mit installieren M-xpackage-install (stellen Sie sicher, dass Sie die Paketliste vorher mit aktualisieren package-list-packages) . Als Referenz habe ich unten Code angehängt, mit dem ich den Modus aktiviere und einige der erweiterten Funktionen deaktiviere, die Sie möglicherweise möchten oder nicht.

Notepad ++ bietet eine praktische Funktion: Wenn Sie ein Wort in Ihrem Text auswählen (nicht unbedingt ein Schlüsselwort), wird das Wort im gesamten Text hervorgehoben. Kann das auch in Emacs gemacht werden? Und wenn ja, wie?

Nach dem Aktivieren overlay-symbolwerden Vorkommen auf dem Bildschirm für jedes Wort angezeigt, auf das Sie nach einer Zeitüberschreitung den Cursor setzen (die Zeitüberschreitung beträgt standardmäßig 0,5 Sekunden und kann mit einer symbol-overlay-idle-timeVariablen konfiguriert werden) . Wenn ein Wort nicht hervorgehoben wird, bedeutet dies, dass nur eine Übereinstimmung auf dem Bildschirm angezeigt wird (die, auf die Sie den Cursor setzen) , sodass Sie es nicht hervorheben müssen.

Es wäre großartig, wenn die Hervorhebungen dauerhaft wären, dh wenn Sie den Punkt von einem hervorgehobenen Wort wegbewegen, sollte die Hervorhebung nicht entfernt werden.

Um das Wort unter dem Cursor dauerhaft hervorzuheben, gibt es eine Funktion symbol-overlay-put. Zum Hervorheben rufen Sie es noch einmal auf.

In meinem Konfigurationsbeispiel ist es an die Taste Logo+ gebunden `.


(require 'symbol-overlay)
(defun enable-symbol-overlay-mode ()
  (unless (or (minibufferp)
              (derived-mode-p 'magit-mode)
              (derived-mode-p 'xref--xref-buffer-mode))
    (symbol-overlay-mode t)))
(define-global-minor-mode global-symbol-overlay-mode ;; name of the new global mode
  symbol-overlay-mode                                ;; name of the minor mode
  enable-symbol-overlay-mode)
(global-symbol-overlay-mode)                         ;; enable it
(global-set-key (kbd "s-`") 'symbol-overlay-put)
(setq symbol-overlay-ignore-functions nil)           ;; don't ignore keywords in various languages
(setq symbol-overlay-map (make-sparse-keymap))       ;; disable special cmds on overlays
Hallo Engel
quelle
symbol-overlay-modewar genau das, wonach ich gesucht habe. Das Binden symbol-overlay-putan eine F-Taste ist praktisch, um die Hervorhebung eines bestimmten Wortes in der Datei umzuschalten.
Matt Kneiser
2

Mit Befehlen in der Bibliothek können highlight.el Sie Text, der einem regulären Ausdruck (in diesem Fall einem Symbol) entspricht, mithilfe von Überlagerungen oder Texteigenschaften (un) hervorheben. Sie können zwischen den Ereignissen wechseln. Das Hervorheben kann vorübergehend oder dauerhaft sein. (mehr Infos) .

Drew
quelle
2

Versuchen Sie es mit iedit . Es hebt das Wort an einer bestimmten Stelle hervor und ermöglicht es Ihnen, alle Vorkommen einfach zu bearbeiten. Mit einem zusätzlichen Tastendruck (C- ') werden alle Zeilen ohne dieses Wort ausgeblendet. Sehr praktisch!

Phob
quelle
0

Dies wird möglicherweise nicht hervorgehoben, sondern sucht nach einem Wort, ohne dass Sie es eingeben müssen ...

Wenn Sie das Wort erreicht haben, nach dem Sie suchen möchten, CS, dann lesen Sie das vollständige Wort mit CW, dann können Sie CS und es wird danach suchen. In meinem Emacs werden auch alle Instanzen im Dokument hervorgehoben.

George
quelle