regex - 在 emacs 标题行中设置正则表达式

标签 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)
            )
          )
        )
      )

美中不足的是:re-search-backward 移动了重点。我希望它留在原地。

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

其次,不管这是不是真的:正如您从注释代码中可以看出的那样,我一直在尝试通过保存 point 的值然后重置位置来解决它。代码的顺序假设列表的最后一个元素是返回的元素。

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

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

最佳答案

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

(save-excursion &rest BODY)

Save point, mark, and current buffer; execute BODY; restore those things.

所以代替 (re-search-backward "../../.."nil t nil) 你会放:

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

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

关于regex - 在 emacs 标题行中设置正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20423393/

相关文章:

javascript - 如何使用 regex-Javascript 检查字符串中是否存在 "undefined"测试

正则表达式中的 MySQL 和单词边界

java - 重写 RegEx 以在 Java 中使用

java - 如何获取lucene索引的所有文件?

javascript - 如何理解javascript React中的这段代码

emacs - 在 emacs 中为 CoffeeScript 提供更好的颜色语法?

java - 修改正则表达式以允许 float

php - 搜索功能不适用于多个单词

Emacs:list-packages [不匹配]

Emacs:如何获得默认主题?