Как выделить все вхождения слова в буфер Emacs?


83

В Notepad ++ есть удобная функция: если вы выбираете слово в тексте (не обязательно ключевое слово), оно выделяется по всему тексту. Можно ли это сделать и в Emacs? И если да, то как?

Он не обязательно должен работать точно так же, как Notepad ++ (т. Е. Через выделение); В идеале я хотел бы настроить привязку клавиш, которая заставляет выделять все вхождения слова под курсором.

Было бы здорово, если бы подсветка была постоянной, т.е. перемещение точки от выделенного слова не должно приводить к удалению выделения.

Кроме того, было бы полезно, если бы существовало решение, позволяющее перемещаться между выделениями (с помощью пользовательских привязок клавиш).

Ответы:


41

Может быть, highlight-symbol.el на http://nschum.de/src/emacs/highlight-symbol/ - это то, что вы ищете:

альтернативный текст


1
Я попробовал, но не смог заставить его работать - emacs жаловался на «значение символа как переменной недействительно: подсветка символа-простоя-задержка».
Headcrab

1
У меня была именно эта проблема. Я закончил тем, что закомментировал всю часть (defcustom highlight-symbol-idle-delay ...) и переместил (defvar highlight-symbol-idle-delay ...) до (defun highlight-symbol-update-timer ... ), что позволит избежать ошибки.
polyglot

1
Да, наконец, я сделал то же самое.
Headcrab

1
Извините, но я не вижу необходимости добавлять внешний пакет для этой задачи! См. Сообщение jrockway.
mefiX

4
@mefiX: встроенная функция удобна для одноразового использования. Внешний пакет добавляет удобство (среди прочего) выделения слова под курсором всего одним нажатием клавиши, а также автоматически меняет цвет выделения для разных слов. Да, вы можете сделать это с помощью встроенной функции, но зачем тратить минуты и сотни нажатий клавиш вместо нескольких секунд и нажатий клавиш, если вы делаете это часто? Тот, кто голосует против, кажется недальновидным: кто-то может найти этот пакет полезным, даже если вы этого не сделаете.
полиглот

85

Эти hi-lockпредложения хороши. Я думаю, что проще использовать M-xверсии:

M-x highlight-regexp RET <REGEXP>

M-x highlight-phrase RET <REGEXP>

highlight-phraseэто просто немного сахара, highlight-regexpкоторый игнорирует регистр и переводит пробел в регулярном выражении для соответствия произвольным пробелам. Удобно.


23
Чтобы убрать выделение, используйте: M-x unhighligh-regexkey-chord: C-x w r... Кроме того, фраза выделения не полностью нечувствительна к регистру. Только начальные строчные буквы (слов) не учитывают регистр. (Я полагаю, это было предназначено для борьбы с fredvs Fred) .. например, он генерирует регулярное выражение, подобное:[Cc]at[ ]+[Dd]og
Peter.O

Спасибо, ваш комментарий о разнице более понятен, чем встроенная справка.
Джошуа Голдберг

1
Примечание. Опечатка: должно быть unhighlight-regexpвместо unhighligh-regex(отсутствует tи p).
Zelphir Kaltstahl

36

Введите C-s, а затем введите текущее слово или тип C-w. В качестве бонуса теперь вы можете нажать еще C-sраз, чтобы найти слово.

Это называется инкрементным поиском .


11
Как бы то ни было, теперь я понимаю цель вопроса: вы хотите, чтобы вхождения выделялись «постоянно» (пока вы не отключите его), даже когда вы выполняете другую работу, например, перемещение, ввод текста и т. Д. Для этого Cs (добавочный поиск ) не будет работать (выделение "временное"; вы можете перемещаться по буферу, но выполнять новую работу по редактированию сложно). Я использую (и проголосовал за) M-x highlight-regexpрешение (и привязал его к ярлыку).
ShreevatsaR

15

То, что я использую, это незанятое выделение

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

Mx idle-highlight устанавливает таймер простоя, который выделяет все вхождения в буфере слова под точкой.

Чтобы включить его для всех режимов программирования, в ~/.emacs.d/init.el:

;; highlight words
(add-hook 'prog-mode-hook (lambda () (idle-highlight-mode t)))

У меня были некоторые несоответствия с внутренними хуками лямбды. Возможно, подумайте о том, чтобы позвонить в defun.
Дэррил Хеббс

10

Световой символ будет выделять любую точку символа, которая закончилась.

В качестве альтернативы вы можете использовать событие , в котором перечислены все строки, соответствующие регулярному выражению. Полезно быстро увидеть все функции в классе.


Это кажется очень приятным, но как узнать, нашел ли он тот же символ или другой символ с тем же именем?
HelloGoodbye

6

Попробуйте http://www.emacswiki.org/emacs/msearch.el Все вхождения текста, выделенного курсором, будут выделены. Вы должны перетащить строку, которую хотите выделить. Это позволяет вам легко изменить выделение, не меняя выделения.

Если вы хотите сохранить выделение строки, вы можете зафиксировать ее.

Вы можете подчинить буфер другому буферу. Текст, выбранный в главном буфере, также будет выделен в подчиненном буфере. Это полезно для сравнения буферов. Это также полезно для заметок в одном буфере, пока вы исследуете текст в другом. У вас может быть набор ключевых слов в буфере заметок. Перетащите такое ключевое слово, и его появление в исследуемом тексте будет выделено.

Я использую это уже много лет. Добавил заморозку совсем недавно. Так что, может, что-то сломалось. Если это так, оставьте мне сообщение на http://www.emacswiki.org/emacs/msearch или здесь.


5

Это может быть не так хорошо, как вы надеялись, но если вы поставите

(global-hi-lock-mode 1)

в вашем .emacsфайл , то вы можете ввести , C-x w h REGEX <RET> <RET>чтобы выделить все места где REGEX, и C-x w r REGEX <RET>для снятия выделения их снова. Опять же, не так элегантно, как вам хотелось бы, но это сработает.



5

Никто не упомянул symbol-overlayрежим . По сути, это лучший вариант highlight-symbol-mode. «Лучше», как в, не содержит ошибок исходного символа выделения (например, временное заедание выделения или исчезновение временного выделения при перемещении внутри выделенного слова; или невозможность выделения таких символов, как *) , лучше интегрированы и поддерживаются. См. Параграф «Преимущества» в README.

Вы можете установить его как обычно, с помощью M-xpackage-install (не забудьте заранее обновить список пакетов с помощью package-list-packages) . Для справки, внизу я прикрепил код, который использую для включения режима и отключения некоторых более продвинутых функций, которые могут вам понадобиться, а могут и не понадобиться.

В Notepad ++ есть удобная функция: если вы выбираете слово в тексте (не обязательно ключевое слово), оно выделяется по всему тексту. Можно ли это сделать и в Emacs? И если да, то как?

После включения overlay-symbolна экране будут отображаться вхождения для каждого слова, на которое вы поместили курсор после тайм-аута (тайм-аут по умолчанию составляет 0,5 с, может быть настроен с помощью symbol-overlay-idle-timeпеременной) . Если слово не выделяется, это означает, что на экране только одно совпадение (то, на которое вы поместили курсор) , поэтому выделять его не нужно.

Было бы здорово, если бы выделения были постоянными, т.е. перемещение точки от выделенного слова не должно приводить к удалению выделения.

Для постоянного выделения слова под курсором есть функция symbol-overlay-put . Чтобы снять выделение, вызовите его еще раз.

В моем примере конфигурации он привязан к 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

symbol-overlay-modeбыло именно то, что я искал. Привязка symbol-overlay-putк клавише F удобна для переключения выделения данного слова в файле.
Мэтт Кнайзер

2

Команды в библиотеке highlight.el позволяют (отменить) выделение текста, соответствующего регулярному выражению (в данном случае символу), с помощью наложений или свойств текста. Вы можете переключаться между вхождениями. Выделение может быть временным или постоянным. (подробнее) .


2

Попробуйте iedit . Он выделяет слово в точке и позволяет легко редактировать все его вхождения. Дополнительным нажатием клавиши (C- ') он скрывает все строки, в которых нет этого слова. Очень удобно!


0

Возможно, это не будет выделяться, но будет искать слово без необходимости вводить его ...

когда вы дойдете до слова, которое хотите найти, CS, затем прочитайте все слово с помощью CW, затем вы можете CS, и он будет искать его. В моем Emacs он также выделяет все экземпляры в документе.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.