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

我想在函数内以string的forms访问当前区域的内容。 例如:

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

谢谢

埃德

buffer-substringregion-beginningregion-end可以做到这一点。

如starblue所示,如果标记被设置, (buffer-substring (mark) (point))将返回区域的内容。 如果你不想要string属性 ,你可以使用'buffer-substring-no-properties变体。

但是,如果您正在编写交互式命令,则有一种更好的方法可以使用表单(interactive "r")获取区域的端点。 以下是simple.el的一个例子:

 (defun count-lines-region(start end)
   “打印区域中的行数和字符数”。
   (交互式“r”)
   (消息“地区有%d行,%d个字符”
        (计数行开始结束)( - 结束开始)))

当从Lisp代码调用时, (interactive ...)表单被忽略,所以你可以使用这个函数通过传递适当的参数来计算缓冲区任何部分的行数,而不仅仅是区域:例如, (count-lines-region (point-min) (point-max))来计算缓冲区变窄部分的行数。 但是,当交互调用时, (interactive ...)表单被评估, "r"代码提供点和标记,作为两个数值参数,最小的第一个。

请参阅Emacs Lisp手册,第21.2.1节“ 使用交互式”和“ 21.2.2代码字符”进行交互 。

如果要将Lisp代码中的区域内容复制到用户可访问的数据结构(如kill-ring,X剪贴板或registry),Emacs Lisp手册build议使用filter-buffer-substring而不是简单的buffer-substring 。 在复制之前,函数应用名为filter-buffer-substring-functions的列表variables中的filter-buffer-substring-functions 。 该function在版本22.3中添加 。