Як виділити всі входження слова в буфер 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 ... ), що дозволить уникнути помилки.
поліглот

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... Крім того, виділена фраза не повністю чує регістр. Тільки початкові малі літери (слів) ae не робили регістру чутливими. (Припускаю, це було призначено для боротьби з 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)))

У мене були деякі невідповідності з внутрішніми гачками лямбди. Можливо, подумайте про те, щоб зателефонувати розбещеним.
Дарріл Хеббс,

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

Позначте інтерактивне виділення

Має бути:

C- x w hслово<RET> <RET>


1
По-перше, режим hi-lock повинен бути ввімкнений режимом hi-lock Mx. Тоді це працює. Крім того, посилання на інтерактивне підсвічування мертве. Зараз воно знаходиться тут: gnu.org/software/emacs/manual/html_node/emacs/…
аспірин

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 зручна для перемикання виділення даного слова у файлі.
Matt Kneiser

2

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


2

Спробуйте iedit . Він виділяє слово в точці і дозволяє легко редагувати всі його входження. За допомогою додаткового натискання клавіші (C- ') він приховує всі рядки без цього слова. Дуже зручно!


0

Можливо, це не виділить, але буде шукати слово без необхідності вводити його ...

коли ви дійшли до слова, яке ви хотіли шукати, CS, то прочитайте повне слово за допомогою CW, тоді ви зможете CS, і він буде його шукати. У моєму Emacs він також висвітлює всі випадки в документі.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.