47

我想将当前区域的内容作为函数中的字符串访问。例如:

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

谢谢

埃德

4

3 回答 3

77

正如starblue所说,(buffer-substring (mark) (point))如果设置了标记,则返回该区域的内容。如果您不想要字符串属性,则可以使用'buffer-substring-no-properties变体。

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

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

当从 Lisp 代码调用时,(interactive ...)表单被忽略,因此您可以使用此函数通过传递适当的参数来计算缓冲区中任何部分的行数,而不仅仅是区域:例如,(count-lines-region (point-min) (point-max))计算缩小部分中的行数的缓冲区。但是当交互调用时,(interactive ...)表单会被计算,"r"代码提供点和标记,作为两个数字参数,最小的在前。

请参阅 Emacs Lisp 手册,第21.2.1 节使用 Interactive21.2.2 Code Characters for interactive部分。

于 2009-03-03T10:51:18.153 回答
62

buffer-substring一起region-beginning并且region-end可以做到这一点。

于 2009-03-03T10:23:15.333 回答
5

如果您想将 Lisp 代码中的区域内容复制到用户可访问的数据结构(如 kill-ring、X 剪贴板或寄存器),Emacs Lisp 手册建议使用filter-buffer-substring而不是简单的buffer-substring. 在复制之前,该函数应用来自名为 的列表变量的过滤器函数filter-buffer-substring-functions。该功能是在 22.3 版本中添加的

于 2014-03-03T05:39:35.257 回答