В emacs lisp, есть ли способ поиска текста, который будет соответствовать строке, которая перекрывает текущую точку? - PullRequest
2 голосов
/ 31 мая 2011

Я не совсем эксперт по LISP, поэтому, пожалуйста, простите довольно новый вопрос.

Я пишу довольно простую функцию elisp, пытаясь найти короткую строку в той же строке, что и текущий курсорпозиция.Соответствующая часть кода, как написано сейчас:

(let ((matchpos (search-forward myword (line-end-position) t)))
  (if matchpos
      (goto-char (- matchpos (length myword)))
    (setq matchpos (search-backward myword (line-beginning-position) t)))
  ...

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

Есть ли какой-либо вариант в поиске-в обратном направлении, которое соответствует любой строке, которая начинается до точки?

Редактировать: Возможно, приведен пример, так как отвечающие не совсем понимают вопрос.Предположим, я ищу строку «search this», и моя строка выглядит следующим образом (точка, отмеченная *):

I want to search this string, I have code to search t*his string

К сожалению, фрагмент кода, показанный выше, перемещает точку на сначала вхождение «search this» в строке выше.Я хочу, чтобы точка заканчивалась в начале секундной строки "search this", той, которая в данный момент содержит точку, поскольку она является ближайшей.

Ответы [ 3 ]

3 голосов
/ 31 мая 2011

Второй аргумент search-forward ограничивает поиск, поэтому, чтобы найти строку в текущей строке, перейдите к началу строки и используйте конец строки в качестве границы:

(beginning-of-line)
(search-forward myword (line-end-position))

Если вы не хотите перемещать точку, используйте save-excursion для ее сохранения:

(save-excursion
  (beginning-of-line)
  (search-forward myword (line-end-position)))
1 голос
/ 01 июня 2011

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

Что-то вроде:

(goto-char (min (end-of-line-position)
                (+ (point) (length myword))))
(setq matchpos (search-backward myword (line-beginning-position) t))

Это будет работать, так как вы переместили точку в сторону для search-backword.

Другое решение было быпереходите к началу строки и многократно ищите вперед, пока не пройдете точку.

0 голосов
/ 01 июня 2011

шаблон регулярного выражения "\=" соответствует текущей точке. если вы включите это в свое выражение, это должно дать вам то, что вам нужно.

...