Я хочу получить доступ к содержимому текущей области в виде строки внутри функции. Например:
(concat "stringa" (get-region-as-string) "stringb")
Спасибо
Ed
Я хочу получить доступ к содержимому текущей области в виде строки внутри функции. Например:
(concat "stringa" (get-region-as-string) "stringb")
Спасибо
Ed
buffer-substring вместе с region-beginning и region-end может это сделать.
Как отмечает starblue, (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" поставляет точку и знак как два числовых аргумента, наименьший сначала.
См. руководство Emacs Lisp, разделы 21.2.1 Использование интерактивных и 21.2.2 Символы кода для интерактивных.
Если вы хотите скопировать содержимое региона в код Lisp в доступную пользователю структуру данных, такую как kill-ring, X clipboard или register, руководство Emacs Lisp рекомендует использовать filter-buffer-substring вместо просто buffer-substring. Перед копированием функция применяет функции фильтра из переменной списка filter-buffer-substring-functions. Функция была добавлена в версию 22.3.