strpos в Emacs Lisp - PullRequest
       16

strpos в Emacs Lisp

2 голосов
/ 09 октября 2010

Есть ли встроенная функция Emacs Lisp, которая ведет себя как strpos() в PHP ?Он должен вернуть позицию первого появления данной строки в текущем буфере.Функция search-forward хороша, но она изменяет положение символа.

Ответы [ 2 ]

5 голосов
/ 09 октября 2010

Функция, соответствующая strpos в PHP, для поиска строки внутри другой строки - search из пакета cl:

(require 'cl)
(search needle haystack :start2 offset)

Если вы хотите найти строку в буфере, используйте search-forward. Так как это изменяет текущий буфер и точку внутри этого буфера, вам нужно обернуть вашу функцию внутри save-excursion; это распространенная идиома Emacs Lisp. Вам также следует обернуть вашу функцию в save-match-data, чтобы не мешать поискам того, что вызывает ваш код.

(save-match-data
  (save-excursion
    (set-buffer haystack)
    (goto-char (or offset (point-min)))
    (let ((pos (search-forward needle nil t)))
      ...)))
3 голосов
/ 09 октября 2010

Вы можете сделать:

;; does not modify match-data
(string-match-p (regexp-quote "string") (buffer-string))

или

;; does modify match-data
(string-match (regexp-quote "string") (buffer-string))

Но эти вызовы делают копию строки, что непрактично. Лучшим решением было бы использовать это:

(defun my-strpos (string)
  "mimic strpos"
  (save-excursion
    (save-match-data
      (goto-char (point-min))               ; or not
      (when (search-forward string nil t)
        (match-beginning 0)))))

Это также зависит от того, что вы хотите сделать после нахождения позиции. Документация для сопоставления данных может быть полезной. Если вы хотите использовать послесловие match-data, удалите вызов 'save-match-data.

...