Вопрос

Я использую 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top