Как мне получить доступ к содержимому текущего региона в Emacs Lisp?
Вопрос
Я хочу получить доступ к содержимому текущего региона в виде строки внутри функции.Например:
(concat "stringa" (get-region-as-string) "stringb")
Спасибо
Эд
Решение
buffer-substring
вместе с region-beginning
и region-end
могу это сделать.
Другие советы
Как говорит Старблу, (buffer-substring (mark) (point))
возвращает содержимое региона, если отметка установлена.Если вы не хотите свойства строки, вы можете использовать 'buffer-substring-no-properties
вариант.
Однако, если вы пишете интерактивный есть лучший способ получить конечные точки региона, используя форму (interactive "r")
.Вот пример из simple.el
:
(defun count-lines-region (start end) "Print number of lines and characters in the region." (interactive "r") (message "Region has %d lines, %d characters" (count-lines start end) (- end start)))
При вызове из кода Lisp (interactive ...)
форма игнорируется, поэтому вы можете использовать эту функцию для подсчета строк в любой часть буфера, а не только регион, передав соответствующие аргументы:например, (count-lines-region (point-min) (point-max))
для подсчета строк в суженной части буфера.Но при интерактивном вызове (interactive ...)
форма оценивается, и "r"
code предоставляет точку и метку в виде двух числовых аргументов, начиная с наименьшего.
См. Руководство по Emacs Lisp, разделы 21.2.1 Использование интерактивного режима и 21.2.2 Символы кода для интерактивного.
Если вы хотите скопировать содержимое региона в коде Lisp в доступную пользователю структуру данных, такую как kill-ring, X-буфер обмена или регистр, руководство Emacs Lisp рекомендует использовать filter-buffer-substring
вместо просто buffer-substring
.Перед копированием функция применяет функции фильтра из переменной списка с именем filter-buffer-substring-functions
.Функция была добавлено в версии 22.3.