Поиск выделенного текста в Emacs
-
03-07-2019 - |
Вопрос
Я использую emacs для просмотра и редактирования кода и других текстовых файлов.Я хотел знать, есть ли способ выполнить поиск вперед или назад по тексту, который отмечен в текущем буфере.Похоже на то, что я могу сделать в блокноте или wordpad.Например, могу ли я пометить некоторый текст в буфере и выполнить C-s или C-r и иметь возможность выполнять поиск по выделенному тексту, фактически не вводя весь текст поиска?
Спасибо,
Рохит
Решение
ДА. M-W
(чтобы получить копию выделенного текста) C-s <RET> C-y <RET>
.Затем повторите C-s
по мере необходимости.Аналогично для C-r
.
Другие советы
@Alex прибивает это к рукам.
Другой вариант, который я использую довольно часто, - это C-s C-w
для поиска слова после текущего знака.Ударяя C-w
многократно увеличивает поиск с помощью дополнительных слов (например,, C-s C-w C-w C-w
выполняет поиск по 3 словам после текущей метки).
Аналогично, C-s M-s C-e
выполняет поиск остальной части строки после текущей метки и C-s C-M-y
выполняет поиск символа после метки.Оба они повторяются одним и тем же способом (первый - несколько неуклюжим повторением M-s C-e
после C-s
).
Я использую следующее, у которого нет проблемы с необходимостью вводить более одной последовательной C-s, чтобы найти более поздние вхождения:
(defun search-selection (beg end)
"search for selected text"
(interactive "r")
(kill-ring-save beg end)
(isearch-mode t nil nil nil)
(isearch-yank-pop)
)
(define-key global-map (kbd "<C-f3>") 'search-selection)
Недостатком предыдущего кода является то, что выделенный текст копируется с натяжкой.В следующем коде этой проблемы нет:
(defun search-selection (beg end)
"search for selected text"
(interactive "r")
(let (
(selection (buffer-substring-no-properties beg end))
)
(deactivate-mark)
(isearch-mode t nil nil nil)
(isearch-yank-string selection)
)
)
(define-key global-map (kbd "<C-f3>") 'search-selection)
В других ответах описывается, как искать скопированный текст или как искать слово в точке.Но ни один из них на самом деле не описывает, как "выполнять поиск по выделенному тексту".
Добавление следующего хука сделает так, что выбранный в данный момент текст будет текстом, используемым для isearch:
(defun jrh-isearch-with-region ()
"Use region as the isearch text."
(when mark-active
(let ((region (funcall region-extract-function nil)))
(deactivate-mark)
(isearch-push-state)
(isearch-yank-string region))))
(add-hook 'isearch-mode-hook #'jrh-isearch-with-region)
Подсказка:Это прекрасно сочетается с расширить-регион.
Самая короткая последовательность клавиш для этого следующая M-w C-s M-y.
Для этого есть отличная функция: isearch-forward-symbol-at-point
.Он выделяет все вхождения слова, в которых расположена ваша точка - нет необходимости ставить точку в начале слова.Затем вы можете перейти к следующему или предыдущему с помощью C-s или C-r.
Обратите внимание, что это точное совпадение:если вы используете его на hi
это не будет совпадать chill
например.
Я сопоставил if с command-f
(mac OSX): (global-set-key (kbd "s-f") 'isearch-forward-symbol-at-point)
в файле инициализации.
Приведенные выше ответы (включая принятый), ИМХО, слишком громоздки.Я нашел следующую информацию, и она мне нравится намного больше:
“Ctrl+s, Ctrl+w”.Поиск текущего слова, но ты должен двигаться курсор в начале слова первый.
http://xah-forum.blogspot.com/2009/08/search-word-under-cursor-in-emacs.html
Вы можете найти справку C-s, выполнив команду C-h k C-s, и там написано:
Введите DEL, чтобы отменить последний введенный элемент в конце строки поиска.Введите RET для выхода, оставив точку в найденном местоположении.Введите LFD (C-j), чтобы соответствовать концу строки.Введите C-s для повторного поиска в прямом направлении, C-r для повторного поиска в обратном направлении. Введите C-w, чтобы выдернуть следующее слово или символ из буфера перейдите в конец строки поиска и выполните поиск по ней.Введите C-M-w, чтобы удалить символ из конца строки поиска.Введите C-M-y, чтобы переместить символ char из buffer в конец строки поиска и выполнить поиск по нему.Введите M-s C-e, чтобы перетянуть остаток строки в конец строки поиска и выполнить поиск по ней.Тип C-y, чтобы выдернуть последнюю строку уничтоженного текста.Введите M-y, чтобы заменить строку просто выдернул в поисковую строку строку, убитую перед ней.Введите C-q чтобы заключить управляющий символ в кавычки для его поиска.Введите C-x 8 RET, чтобы добавить символ для поиска по имени в Юникоде, с завершением.C-g во время поиска или когда поиск не удался, отменяет ввод того, что было найдено успешно.C-g при успешном завершении поиска прерывает работу и перемещает точку в исходную точку.
Если вы попытаетесь завершить работу с пустой строкой поиска, это вызовет неинкрементный поиск.
Введите M-c, чтобы переключить режим поиска с учетом регистра.Введите M-s i, чтобы переключить поиск в невидимом тексте.Введите M-r, чтобы переключить режим регулярного выражения.Введите M-s w, чтобы переключить режим word.Введите M-s _, чтобы переключить режим символов.Тип M-s', чтобы переключить сворачивание символов.
Введите M-s SPC, чтобы включить сопоставление пробелов.При инкрементном поиске пробелу или пробелам обычно соответствует любой пробел, определенный переменной ‘search-whitespace-regexp’;смотрите также переменные ‘isearch-lax-пробел’ и ‘isearch-regexp-lax-пробел’.
Введите M-s e, чтобы отредактировать строку поиска в минибуфере.
Также поддерживается поисковое кольцо из предыдущих 16 строк поиска.Введите M-n для поиска следующего элемента в поисковом кольце.Введите M-p для поиска предыдущего элемента в кольце поиска.Введите C-M-i, чтобы заполнить строку поиска, используя кольцо поиска.
Введите M-%, чтобы запустить ‘запрос-замена" на строку для замены из последней строки поиска.Введите C-M-%, чтобы запустить ‘запрос-заменить-регулярное выражение" с последней строкой поиска .Введите M-s o, чтобы запустить "occurred’, который показывает последнюю строку поиска .Введите M-s h r, чтобы запустить ‘highlight-regexp’, который выделяет последнюю строку поиска.
Введите C-h b, чтобы отобразить все привязки клавиш Isearch.Введите C-h k для отображения документации по ключу Isearch.Введите C-h m, чтобы отобразить документацию по Режиму Isearch.