簡體   English   中英

在emacs的“自定義”模式下,需要多少反斜杠來逃避正則表達式?

[英]How many backslashes are required to escape regexps in emacs' “Customize” mode?

我正在嘗試使用emacs的customize-group軟件包來調整我的設置的某些部分,而且我受到了阻礙。 在使用自定義進行更改后,我在.emacs文件中看到類似這樣的內容:

'(tramp-backup-directory-alist (quote (("\\\\`.*\\\\'" . "~/.emacs.d/autobackups"))))

這是將以下內容放入自定義文本字段的結果:

Regexp matching filename: \\`.*\\'

這是一個有代表性的例子:我實際上試圖改變一些想要正則表達式的東西,它們都顯示出同樣的問題。 有多少層報價,真的嗎? 我似乎無法找到神奇的反斜杠數來獲得我所要求的gosh-dang事情,即使是最簡單的正則表達式,如.* 現在,給定的定制產生 - 沒有。 它沒有改變emacs的默認行為。

更好的是,這在哪里記錄了? 谷歌有點困難,但我在那里以及官方文檔和Emacs維基中都嘗試過很多東西。 在自定義模式下,需要在正常表達式中使用多少副反斜杠的權威來源實際工作 - 或者至少是以某種警告而不是默默地失敗?


編輯:正如經常在憤怒中提出的問題一樣,我問的是錯誤的問題。 幸運的是,下面的答案讓我得到了我需要的問題的答案,這是關於引用規則的。 我將嘗試寫下我在這里學到的內容,因為我發現文檔和Googleable資源令人抓狂。 所以這里是我通過反復試驗找到的引用規則,我希望他們幫助別人,激勵糾正,或兩者兼而有之。

當emacs自定義模式緩沖區要求您提供“正則表達式匹配文件名”時,正如emacs經常出現的那樣,它既簡潔又特殊( 創作者的個性多久被賦予創作!)。 一方面,這意味着一個正則表達式將與搜索匹配項的文件的整個路徑進行比較,而不僅僅是文件本身的名稱,正如您可能從術語“文件名”中所假設的那樣。 例如,這與emacs的buffer-file-name函數中使用的“filename”相同。

此外,雖然如果你把foo放在字段中,你會看到寫入實際文件的"foo" (帶雙引號),這不足以引用而不是正確的引用。 你需要引用你的正則表達式,引用樣式,據我所知,只有emacs使用:``backtick-foo-single-quote'`scheme。 然后你需要逃避它,使它成為\\`backslash-backtick-foo-backslash-single-quote\\' (如果你認為在Markdown輸入是一件令人頭疼的事情,那么在emacs中更是如此)。

除此之外,emacs似乎有一個規則. regexp特殊字符與文件名開頭的/不匹配,因此,正如我上面發生的那樣,經典的.*模式似乎沒有任何匹配:為了匹配“所有文件”,你實際上需要regexp /.* ,然后你\\`/.*\\'自定義模式的報價格式來生成\\`/.*\\' ,然后自定義繪制另一層轉義到它並將其寫入自定義文件。

我的一個努力的最終結果 - 一個設置,使#autosave#文件不會使你正在工作的目錄變得無效,而是所有人都住在一個地方:

(custom-set variables
  '(auto-save-file-name-transforms (quote (
    ("\\`/[^/]*:\\([^/]*/\\)*\\([^/]*\\)\\'" "~/.emacs.d/autobackups/\\2" t)
    ("\\`/.*/\\(.*?\\)\\'" "~/.emacs.d/autobackups/\\1" t)
))))

elisp的反斜杠對你的理智的威脅遠大於括號。


編輯2 :我再次出錯的時候了。 我終於找到了相關的文檔(當然是通過閱讀另一個Stack Overflow問題 !): Regexp Backslash Constructs 對我來說困惑的關鍵點:反引號和單引號在這個上下文中沒有引用:它們相當於perl的^$特殊字符。 反斜杠后綴構造匹配錨定在要檢查匹配的字符串開頭的空字符串,反斜杠 - 單引號構造匹配未考慮字符串末尾的空字符串。 並且通過“正在考慮的字符串”,我的意思是“緩沖區,在這種情況下恰好只包含一個文件路徑,但如果你想要匹配,你需要匹配整個dang事物,因為這是elisp的全局正則表達式行為“。

向上帝發誓,就像處理外星文明一樣。


編輯3 :為了避免混淆未來的讀者 -

  • \\`是用於“緩沖區開頭”的emacs正則表達式。 (參見Perl的\\A
  • \\'是用於“緩沖區結束”的emacs正則表達式。 (參見Perl的\\Z
  • ^是“行首”的常用成語正則表達式。 它可以在emacs中使用。
  • $是“行尾”的常用成語正則表達式。 它可以在emacs中使用。

因為正在使用多行文本體系的正則表達式搜索在emacs中比在其他地方更常見(例如Mx occur ),所以在emacs中使用反引號和單引號特殊字符,並且盡我所知,它們被用於自定義模式的上下文,因為如果您正在考慮自定義模式字段的通用未知輸入,它可能包含換行符,因此您希望使用緩沖區開頭和緩沖區結束特殊字符,因為開始和結束輸入的輸入不保證是一行的開頭和結尾

我不確定是否后悔劫持我自己的Stack Overflow問題,並將其轉化為博客文章。

在customize字段中,您將根據此處描述語法輸入regexp。 當custom將regexp寫入字符串時,regexp中的任何反斜杠或雙引號字符都將按照常規字符串轉義約定進行轉義。

簡而言之,只需在regexp字段中輸入單個反斜杠,它們就會在寫入.emacs的結果custom-set-variables子句中正確加倍。

另外:由於regexp用於匹配文件名,因此您可以嘗試打開包含您要匹配的文件的目錄,然后運行Mx re-builder RET 然后,您可以以字符串轉義格式輸入正則表達式,以確認它與這些文件匹配。 通過在dired緩沖區中鍵入% m ,您可以輸入非轉義格式的正則表達式(即,就像在自定義字段中一樣),並且dired將標記匹配的文件名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM