Есть ли встроенная функция Emacs Lisp, которая ведет себя как strpos()
in PHP? Он должен вернуть позицию первого вхождения данной строки в текущий буфер. Функция search-forward
хороша, но она изменяет положение символа.strpos in Emacs Lisp
ответ
Вы можете сделать:
;; 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. Если вы хотите использовать match-data
послесловия, удалите вызов 'save-match-data
.
функция, соответствующая 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)))
...)))
- 1. regex issue in emacs lisp
- 2. Вложение backquote и `in emacs lisp
- 3. Emacs Lisp
- 4. Синтаксический в Emacs Lisp
- 5. Emacs Lisp подсветка синтаксиса
- 6. Расширение синтаксиса emacs-lisp
- 7. common lisp и emacs
- 8. Emacs Lisp вопрос
- 9. emacs lowfer lisp scroll
- 10. strstr() в emacs lisp?
- 11. Emacs lisp char-table
- 12. PPRINT в Emacs Lisp?
- 13. Emacs lisp highlighting
- 14. "exec" в Emacs lisp?
- 15. emacs lisp pcase error
- 16. strtotime for Emacs Lisp
- 17. Emacs without Lisp
- 18. Emacs lisp: Отладка таймеров?
- 19. emacs lisp не запускается
- 20. Emacs Lisp вывод на печать
- 21. Руководство по функциям Emacs Lisp?
- 22. Emacs отступа после: конфигурации Emacs-Lisp
- 23. формат лямбда в Emacs Lisp
- 24. Как изменить конфигурацию emacs в Lisp In A Box
- 25. Как записать результат replace-regexp-in-string в emacs lisp
- 26. Что означает исходный код^L in (Emacs Lisp)?
- 27. в emacs-lisp, как правильно использовать replace-regexp-in-string?
- 28. Недопустимая функция в Emacs Lisp
- 29. Переопределение функции в Emacs Lisp
- 30. Strpos in php не работает
'(buffer-string)' делает копию содержимого буфера, поэтому для больших буферов это нецелесообразно. – Gilles
@ Gilles - очень верно, я добавлю примечание, указывающее, что я должен был первоначально. Благодарю. –
Я пришел к решению так же, как и ваш код в конце. Благодарю. –