2009-03-03 6 views

ответ

49

buffer-substring вместе с region-beginning и region-end может сделать это.

+0

Это замечательно, спасибо. Я определенно не нашел бы этого сам. – Singletoned

59

Как отмечает starblue, (buffer-substring (mark) (point)) возвращает содержимое региона, если знак установлен. Если вы не хотите string properties, вы можете использовать вариант 'buffer-substring-no-properties.

Однако, если вы пишите команду interactive, лучший способ получить конечные точки региона можно с помощью формы (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 Using Interactive и 21.2.2 Code Characters for interactive.

4

Если вы хотите скопировать содержимое региона в код Lisp в доступную пользователю структуру данных, такую ​​как kill-ring, X clipboard или register, руководство Emacs Lisp рекомендует использовать filter-buffer-substring вместо простого buffer-substring. Перед копированием функция применяет функции фильтра из переменной списка, которая называется filter-buffer-substring-functions. Функция была added in version 22.3.