Jak wyróżnić wszystkie wystąpienia słowa w buforze Emacsa?

83

Notepad ++ ma wygodną funkcję: jeśli wybierzesz słowo w tekście (niekoniecznie słowo kluczowe), słowo zostanie podświetlone w całym tekście. Czy można to zrobić również w Emacsie? A jeśli tak, to w jaki sposób?

To niekoniecznie musi działać dokładnie tak, jak Notepad ++ (tj. Poprzez wybór); w idealnym przypadku chciałbym ustawić klawiszowe powiązanie, które spowoduje, że wszystkie wystąpienia słowa pod kursorem będą podświetlone.

Byłoby wspaniale, gdyby podświetlenia były trwałe, tj. Odsunięcie punktu od podświetlonego słowa nie powinno powodować usunięcia podświetlenia.

Przydałoby się również, gdyby istniało rozwiązanie, które umożliwiłoby nawigację między podświetleniami (przy użyciu niestandardowych skrótów klawiszowych).

Headcrab
źródło

Odpowiedzi:

41

Być może pod adresem http://nschum.de/src/emacs/highlight-symbol/ znajduje się nazwa highlight-symbol.el :

tekst alternatywny

poliglota
źródło
1
Próbowałem, ale nie udało mi się to uruchomić - emacs skarżył się, że „wartość symbolu jako zmiennej jest nieważna: podświetlenie-symbolu-bezczynności-opóźnienia”.
Headcrab
1
Miałem ten szczególny problem. Skończyło się na skomentowaniu całej części (defcustom highlight-symbol-idle-delay ...) i przeniesieniu (defvar highlight-symbol-idle-delay ...) przed (defun highlight-symbol-update-timer ... ), co pozwoli uniknąć błędu.
polyglot
1
Tak, w końcu zrobiłem dokładnie to samo.
Headcrab
1
Przepraszam, ale nie widzę potrzeby dodawania zewnętrznego pakietu do tego zadania! Zobacz post jrockway.
mefiX
4
@mefiX: funkcja wbudowana jest przydatna do pojedynczych zastosowań. Pakiet zewnętrzny dodaje wygodę (między innymi) podświetlania słowa pod kursorem za pomocą zaledwie 1 naciśnięcia klawisza, a także automatycznej zmiany koloru podświetlenia dla różnych słów. Tak, możesz to zrobić za pomocą wbudowanej funkcji, ale po co marnować minuty i setki naciśnięć klawiszy zamiast kilku sekund i naciśnięć klawiszy, jeśli to jest coś, co często robisz? Ktokolwiek przeciwstawia się głosowaniu, wydaje się być wąskoczarnym: ktoś może uznać ten pakiet za przydatny, nawet jeśli nie.
polyglot
85

Te hi-lockpropozycje są dobre. Myślę jednak, że łatwiej jest korzystać z M-xwersji:

M-x highlight-regexp RET <REGEXP>

M-x highlight-phrase RET <REGEXP>

highlight-phrasejest tylko odrobiną cukru, highlight-regexpktóry ignoruje wielkość liter i tłumaczy spację w wyrażeniu regularnym, aby dopasować dowolną białą spację. Poręczny.

jrockway
źródło
23
Aby wyczyścić podświetlenia, użyj: M-x unhighligh-regexkey-chord: C-x w r... Ponadto fraza podświetlenia nie jest w pełni rozróżniana wielkości liter. Tylko początkowe małe litery (słów) nie uwzględniają wielkości liter. (Przypuszczam, że miało to zająć się fredvs Fred) .. np. Generuje wyrażenie regularne takie jak:[Cc]at[ ]+[Dd]og
Peter.O
Dzięki, Twój komentarz dotyczący różnicy jest dla mnie wyraźniejszy niż wbudowana pomoc.
Joshua Goldberg
1
Uwaga: literówka: powinno być unhighlight-regexpzamiast unhighligh-regex(brak ti p).
Zelphir Kaltstahl
36

Wpisz C-s, a następnie wpisz bieżące słowo lub typ C-w. Jako bonus możesz teraz nacisnąć C-sponownie, aby wyszukać słowo.

Nazywa się to wyszukiwaniem przyrostowym .

ShreevatsaR
źródło
11
Jeśli chodzi o to, co jest warte, teraz zdaję sobie sprawę z intencji pytania: chcesz, aby wystąpienia były podświetlane „na stałe” (dopóki nie wyłączysz), nawet gdy wykonujesz inne czynności, takie jak poruszanie się, pisanie itp. W tym celu Cs (wyszukiwanie przyrostowe ) nie zadziała (podświetlenie jest „tymczasowe”; możesz poruszać się po buforze, ale ciężko jest wykonać nową edycję). Korzystam z M-x highlight-regexprozwiązania (i zagłosowałem za nim) (i powiązałem je ze skrótem).
ShreevatsaR
15

Używam bezczynności

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

Mx idle-highlight ustawia licznik czasu bezczynności, który podświetla wszystkie wystąpienia w buforze słowa pod punktem.

Aby włączyć to dla wszystkich trybów programowania, w ~/.emacs.d/init.el:

;; highlight words
(add-hook 'prog-mode-hook (lambda () (idle-highlight-mode t)))
Jasio
źródło
Wystąpiły niespójności z wewnętrznymi zaczepami lambda. Może rozważ wezwanie defun.
Darryl Hebbes
10

Symbol światła podświetli dowolny punkt symbolu, który się skończył.

Alternatywnie możesz użyć argumentu wystąp , który wyświetli listę wszystkich wierszy pasujących do wyrażenia regularnego. Przydatne jest szybkie przeglądanie wszystkich funkcji w klasie.

ieure
źródło
Wydaje się to bardzo miłe, ale skąd wiadomo, czy znalazł ten sam symbol, czy inny symbol o tej samej nazwie?
HelloGoodbye
6

Spróbuj http://www.emacswiki.org/emacs/msearch.el Wszystkie wystąpienia tekstu zaznaczonego kursorem są podświetlone. Musisz przeciągnąć ciąg, który chcesz podświetlić. Umożliwia to łatwą zmianę wyboru bez zmiany podświetlenia.

Jeśli chcesz zachować podświetlenie łańcucha, możesz je zamrozić.

Możesz zniewolić bufor do innego bufora. Tekst wybrany w buforze głównym będzie również podświetlony w buforze slave. Jest to przydatne do porównywania buforów. Jest to również przydatne do robienia notatek w jednym buforze, podczas gdy badasz tekst w innym. Możesz mieć zbiór słów kluczowych w buforze notatek. Przeciągnij po takim słowie kluczowym, a jego wystąpienia w badanym tekście zostaną podświetlone.

Używam tego od lat. Niedawno dodałem zamrażanie. Więc może coś jest zepsute. Jeśli tak jest, zostaw mi notatkę na http://www.emacswiki.org/emacs/msearch lub tutaj.

Tobias
źródło
5

To może nie być tak miłe, jak się spodziewałeś, ale jeśli umieścisz

(global-hi-lock-mode 1)

w .emacspliku, możesz wpisać, C-x w h REGEX <RET> <RET>aby podświetlić wszystkie wystąpienia REGEXi C-x w r REGEX <RET>ponownie je usunąć. Ponownie, nie tak eleganckie, jak prawdopodobnie byś chciał, ale zadziała.

dancavallaro
źródło
5

Nikt nie wspomniał o symbol-overlaytrybie . Zasadniczo jest to lepsze przepisanie highlight-symbol-mode. „Lepszy” jak w, nie zawiera błędów oryginalnego symbolu podświetlenia (takich jak tymczasowe zacinanie się podświetlenia lub znikanie tymczasowego podświetlenia w celu poruszania się wewnątrz podświetlonego słowa; lub brak możliwości podświetlenia symboli, takich jak *) , lepiej zintegrowane i utrzymywane. Zobacz paragraf „Zalety” jego README.

Możesz go zainstalować jak zwykle za pomocą M-xpackage-install (pamiętaj, aby wcześniej zaktualizować listę pakietów za pomocą package-list-packages) . Dla porównania, na dole załączyłem kod, którego używam, aby włączyć tryb i wyłączyć kilka bardziej zaawansowanych funkcji, których możesz lub nie chcesz.

Notepad ++ ma wygodną funkcję: jeśli wybierzesz słowo w tekście (niekoniecznie słowo kluczowe), słowo zostanie podświetlone w całym tekście. Czy można to zrobić również w Emacsie? A jeśli tak, to w jaki sposób?

Po włączeniu overlay-symbol, wystąpienia na ekranie będą pokazywane dla każdego słowa, na które umieścisz kursor po przekroczeniusymbol-overlay-idle-time limitu czasu (domyślnie czas oczekiwania wynosi 0,5 s, można go skonfigurować za pomocą zmiennej) . Jeśli słowo nie jest podświetlane, oznacza to, że na ekranie jest tylko jedno dopasowanie (to, na które umieściłeś kursor) , więc nie ma potrzeby podświetlania go.

Byłoby wspaniale, gdyby podświetlenia były trwałe, tj. Odsunięcie punktu od podświetlonego słowa nie powinno spowodować usunięcia podświetlenia.

Aby trwale podświetlić słowo pod kursorem, dostępna jest funkcja symbol-overlay-put . Aby nie podkreślić, nazwij to jeszcze raz.

W moim przykładzie konfiguracji jest powiązany z klawiszem Logo+ `.


(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
Cześć aniele
źródło
symbol-overlay-modebył dokładnie tym, czego szukałem. Wiązanie symbol-overlay-putz klawiszem F jest przydatne do przełączania podświetlenia danego słowa w pliku.
Matt Kneiser,
2

Polecenia w bibliotece highlight.el umożliwiają (od) wyróżnianie tekstu pasującego do wyrażenia regularnego (w tym przypadku symbolu), przy użyciu nakładek lub właściwości tekstu. Możesz przełączać się między wystąpieniami. Podświetlanie może być tymczasowe lub trwałe. (więcej informacji) .

Rysował
źródło
2

Spróbuj iedit . Podświetla słowo w punkcie i pozwala łatwo edytować wszystkie jego wystąpienia. Po dodatkowym naciśnięciu klawisza (C- ') ukrywa wszystkie wiersze bez tego słowa. Bardzo przydatne!

Phob
źródło
0

To może się nie podświetlić, ale wyszuka słowo bez konieczności wpisywania go ...

kiedy dotrzesz do słowa, które chciałeś wyszukać, CS, a następnie przeczytaj całe słowo za pomocą CW, a następnie możesz CS i wyszuka je. W moim Emacsie podświetla również wszystkie instancje w dokumencie.

Jerzy
źródło