【问题标题】:setting a regular expression into the emacs header line在 emacs 标题行中设置正则表达式
【发布时间】:2013-12-06 12:01:45
【问题描述】:

所以我是 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)
            )
          )
        )
      )

美中不足只有一个:重新搜索向后移动点。我希望它保持原样。

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

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

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

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

【问题讨论】:

    标签: regex search emacs header lisp


    【解决方案1】:

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

    (save-excursion &rest BODY)

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

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

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

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

    【讨论】:

    • 完美运行,非常感谢。但是,虽然我暂时不需要自己再次访问 emacs LISP(可能),但我很好奇为什么在我的代码示例中取消注释顶部的注释行意味着 `(temp-string) 行不再是返回值?
    • 找到了答案::eval 只使用了 first 形式,其余的则默默地忽略。请参阅我的更新答案。
    猜你喜欢
    • 1970-01-01
    • 2011-08-08
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多