22

我需要访问 Emacs 缓冲区中的选择。我找到了这篇文章如何在 Emacs Lisp 中访问当前区域的内容? 它对我有很大帮助。

但有一个问题。第一次选择(突出显示)一个区域时,它可以正常工作,但是当我按 Cg 并将光标正常移动到另一个地方而不突出显示任何字符时,我得到了一个从最后一个标记到当前点的字符串,而我期望一个空的.

实际上我需要实现一个函数,它将当前选择(突出显示)作为字符串返回,如果没有突出显示,则返回空字符串。下面的代码可能会更清楚地表达我。


(defun get-search-term ()
  (interactive)
  (let (
        (selection (buffer-substring-no-properties (region-beginning) (region-end))))
    (if (= (length selection) 0)
        (message "empty string")
      (message selection))))

有什么建议么?非常感谢!

4

2 回答 2

31

交互的“r”规范是愚蠢的。你明白为什么了。

(defun get-search-term (beg end)
  "message region or \"empty string\" if none highlighted"
  (interactive (if (use-region-p)
                   (list (region-beginning) (region-end))
                 (list (point-min) (point-min))))
  (let ((selection (buffer-substring-no-properties beg end)))
    (if (= (length selection) 0)
        (message "empty string")
      (message selection))))

我的意思不是愚蠢和无用的“愚蠢”;只是它不关心标记是否处于活动状态。我认为它早于瞬态标记模式。

编辑:在上面使用(point-min)两次会使代码在重新阅读时更难理解。这是一个更好的实现:

(defun get-search-term (beg end)
  "message region or \"empty string\" if none highlighted"
  (interactive (if (use-region-p)
                   (list (region-beginning) (region-end))
                 (list nil nil)))
  (message "%s" (if (and beg end)
                    (buffer-substring-no-properties beg end)
                  "empty string")))
于 2012-05-15T06:21:25.423 回答
1

检查变量标记激活,例如。Ch v 标记激活

==> mark-active 是在“C 源代码”中定义的变量。它的值是 nil Local in buffer Apropos;全局值为零

以任何方式设置时自动变为缓冲区本地。

文档:非零表示标记和区域当前在此缓冲区中处于活动状态。

(defun get-search-term ()
  (interactive)
  (if mark-active
      (let (
        (selection (buffer-substring-no-properties (region-beginning) (region-end))))
    (if (= (length selection) 0)
        (message "empty string")
      (message selection))
    )
    (error "mark not active"))
  )
于 2012-05-15T16:22:27.003 回答