Regex 在Emacs缓冲区中相对化绝对路径

Regex 在Emacs缓冲区中相对化绝对路径,regex,emacs,relative-path,absolute-path,Regex,Emacs,Relative Path,Absolute Path,我发现自己的缓冲区中混合了绝对路径(通过组织结构模板自动生成)和相对路径(手工编写) 尝试解决方案: (let ((curdir (replace-regexp-in-string (expand-file-name "~/") "~/" (file-name-directory (or load-file-name buffer-file-name))))) (replace-regexp (con

我发现自己的缓冲区中混合了绝对路径(通过
组织结构模板自动生成)和相对路径(手工编写)

尝试解决方案:

(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")

听起来您想匹配主目录下带引号的绝对路径,并将它们转换为不带引号的相对路径,那么:

(替换regexp
(concat“\”(regexp引号(扩展文件名“~/”)\(.*?\)\)
"\\1")
我怀疑您的大多数问题都源于不理解Emacs的regexp语法,以及在用字符串表示regexp时的额外转义要求,因为您在这些方面有各种错误

特别要记住,Emacs regexp使用
\(\)
进行分组(或
\(?:\)
进行非捕获组),并且在字符串中,需要转义regexp语法中的所有反斜杠。您应该阅读以下内容:

  • 字符串的C-hig
    (elisp)语法
  • C-hig
    (elisp)正则表达式
另外,请注意在将非文字值合并到regexp中时使用的
regexp quote
。(所有支持regexp的语言都有类似的功能,不使用它会带来麻烦。)

我强烈建议使用M-x
regexp builder
RET以交互方式构建regexp。这无疑会帮你省去很多挫折,让你想知道为什么你的模式不符合你的预期