0

我发现自己在缓冲区中混合了绝对路径(通过自动生成org-structure-template-alist)和相对路径(手写)。

尝试解决方案:

(let ((curdir (replace-regexp-in-string
               (expand-file-name "~/") "~/"
               (file-name-directory
                (or load-file-name buffer-file-name)))))
  (replace-regexp (concat "\"" curdir "(?1:([A-z]|[0-9]|/)*)" "\"") "\1")
  (message curdir))

但它似乎根本不起作用。这是尝试修复一个几乎可以正常工作的版本,该版本仅无法删除周围的引号:

(replace-regexp curdir "")

第三次尝试:

(replace-regexp (concat ":tangle \"" curdir "\([A-z-+/.]+\)\"") "\1")
4

1 回答 1

1

听起来您想匹配 HOME 目录下的引用绝对路径,并将它们转换为未引用的相对路径,那么如何:

(replace-regexp
 (concat "\"" (regexp-quote (expand-file-name "~/")) "\\(.*?\\)\"")
 "\\1")

我怀疑您的大多数问题源于不理解 Emacs 的正则表达式语法,以及在用字符串表示正则表达式时的额外转义要求,因为您在这些领域有各种错误。

特别是,请记住 Emacs正则表达式\( \)用于分组(或\(?: \)用于非捕获组),并且在字符串中您需要转义作为正则表达式语法一部分的所有反斜杠。您应该阅读以下内容:

  • C-hig (elisp) Syntax for Strings RET
  • C-hig (elisp) Regular Expressions RET

另外,请注意regexp-quote将非文字值合并到正则表达式时的使用。(所有支持正则表达式的语言都将具有与此类似的功能,不使用它是自找麻烦。)

我强烈建议使用M-x regexp-builder RET交互式构建您的正则表达式。这无疑会为您节省很多挫败感,想知道为什么您的模式与您的预期不符。

于 2013-03-03T03:59:25.620 回答