如何访问Emacs Lisp中当前区域的内容?

时间:2009-03-03 10:13:04

标签: emacs lisp region

我想以函数中的字符串形式访问当前区域的内容。例如:

(concat "stringa" (get-region-as-string) "stringb")

由于

3 个答案:

答案 0 :(得分:69)

正如starblue所说,如果设置了标记,(buffer-substring (mark) (point))将返回该区域的内容。如果您不想使用string properties,则可以使用'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 Using Interactive21.2.2 Code Characters for interactive部分。

答案 1 :(得分:56)

buffer-substring以及region-beginningregion-end可以做到这一点。

答案 2 :(得分:5)

如果要将Lisp代码中的区域内容复制到用户可访问的数据结构(如kill-ring,X剪贴板或寄存器),Emacs Lisp手册建议使用filter-buffer-substring而不是buffer-substring 。在复制之前,该函数应用名为filter-buffer-substring-functions的列表变量中的过滤函数。该函数为added in version 22.3