将正则表达式设置到emacs标题行中

时间:2013-12-06 12:01:46

标签: regex search emacs header lisp

所以我是emacs lisp的新手,而且我有一个长文件,文本墙被日期分解。有时我看不到我正在读书的日期而没有向上滚动并失去我的位置,我决定我希望能够随时看到这一点。

在略读手册,借用代码示例并在黑暗中进行狂野刺杀之后,以下工作非常精彩:

(add-hook 'text-mode-hook
      (lambda ()
        (setq header-line-format
          '(:eval
                    ;;(setq temp-point point)
            (setq temp-string
              (if (re-search-backward "../../.." nil t nil) (match-string 0) '("no date"))
              )
            ;;(goto-char 'temp-point)
            `(temp-string)
            )
          )
        )
      )

美中不足只有一只苍蝇:重新搜索 - 向后移动点。我希望它保持不变。

首先,是否有一个函数可以在不移动点并返回匹配的情况下进行正则表达式搜索?

其次,以及这是否正确:正如你可以从评论代码中看出我一直试图通过保存点的值然后重置位置来解决它。代码的顺序是假设列表的最后一个元素是返回的元素。

然而,这个假设似乎并不总是成立:只要我取消注释第一行(实际上只要它是有效代码就可以),标题就会被设置为空字符串。

如果有人能告诉我哪里出错了,那就太好了。此外,如果我有任何不良习惯或解决问题的方法不够有效,请指出它们。

1 个答案:

答案 0 :(得分:2)

您正在寻找save-excursion宏。将其包裹在您的搜索周围,它将撤消任何移动。引用文档字符串:

  

(save-excursion &rest BODY)

     

保存点,标记和当前缓冲区;执行BODY;恢复那些东西。

所以取代(re-search-backward "../../.." nil t nil)你要放置:

(save-excursion
  (re-search-backward "../../.." nil t nil))

至于为什么取消注释第一行会改变结果,这与:eval在模式/标题行格式规范中的工作方式有关。 mode-line-format的文档字符串表示它是(:eval FORM) - 只有一个表单 - 显然它会在第一个表单之后默默地忽略任何表单。 (你的直觉是正确的:大部分时间都会返回表单中的最后一个值,:eval的行为确实令人惊讶。)