2014-03-01 63 views
2

我正在嘗試更改子字模式命令(子字前向,子字後退等)停止的位置。Emacs - 子字詞正則表達式澄清

我注意到subword.el提供了正向和反向匹配的正則表達式,我一直在試圖在添加更多的子詞分隔符方面取得進展。

我真的很喜歡的是一些關於subword正則表達式究竟是如何工作的澄清,至於究竟是什麼被匹配,以便我可能能夠改變它以包括我想停止的字符。我對正則表達式有一個基本的理解,之前已經使用過它們,但從來沒有像subword.el那樣大。

我不一定需要兩個正則表達式的幫助。任何有關向其中一個現有正則表達式添加額外分隔符的指導都會得到同樣的讚賞,因爲這是我改變它們的目標,但我真的想知道關於如何設置正則表達式的一些信息。

最後,在尋找解決方案時,我找到了this related StackOverflow question。我讀過它,但subword.el不包含正則表達式本身,因爲它看起來出現在相關問題的引用部分,我不明白該引用部分中最後一個括號內的含義是什麼。

編輯:

嘗試把我所期待的更清晰的情況下做的,我只是想按Ctrl +左/右在Emacs(子詞前/後)爲行動儘可能與Eclipse接近,因爲我希望光標移動的方式類似,一旦到達,就停止在行尾Ctrl +左/右

Here is another related StackOverflow question。 「v蛇」命令與我所尋找的命令非常接近,但稍微偏離了一點,因爲我希望在該命令行結束時停止繼續執行下一個命令。

+0

請注意,對於更復雜的子字模式定製,您可以定義替代函數以分配給「子字前向函數」和「子字後向函數」變量。如果您正在考慮更改任意字符的語法,以便在子字模式之外獲得不同的行爲,那麼您可能會發現基於函數的方法較少。 – phils

+1

這裏是一個線索的鏈接,其中包含一個您可以修改以適應您喜歡的行爲的示例。由於某些主要模式會更改語法表,因此您需要爲通常使用的任何模式編寫例外:http://stackoverflow.com/questions/18675201/alternative-to-forward-word-backward-word- to-include-symbols-eg – lawlist

回答

3
  1. 答案在你的最後一段的問題是包含在同一個鏈接頁面上的其他答案:(modify-syntax-entry ?\\ "w")。這使得反斜槓成爲一個字的組成部分,所以字功能把它當作一個字的一部分。

  2. 請註明您試圖實現,特別的行爲,你的意思是什麼「增加更多的子詞的分隔符。

  3. subword.el正則表達式是相當簡單的。你說你不需要幫助理解這些正則表達式。但是,那麼通過詢問「子字正則表達式的構造方式」是什麼意思?他們可能是手工構建的(基於你已經瞭解他們的各個部分)。

  4. 一個猜測,因爲你的描述目前還不清楚,你要找的所有東西是指定一些額外的字符作爲非字語法。如果這是你的意思,「增加更多的子詞分隔符」,那麼就這樣做。如果,例如,你想要的字符a是一種非文字字符,然後做這樣的事情:

    ;(修改 - 語法條目的?「」)或者另一個非字組成的語法類(這使用標點符號)

    這使得a是一個標點符號而不是字成分字符。如果你想要一些其他語法類而不是標點符號,那麼選擇它類似。


意見後更新

例如,如果你想要的任何標點符號的語法作用一樣大寫字母,這將做到這一點:

(defvar subword-forward-regexp 
    "\\W*\\(\\(\\([[:upper:]]\\|\\s.\\)*\\(\\W\\)?\\)[[:lower:][:digit:]]*\\)" 
    "Regexp used by `subword-forward-internal'.") 

(defvar subword-backward-regexp 
    "\\(\\(\\W\\|[[:lower:][:digit:]]\\)\\(\\([[:upper:]]\\|\\s.\\)+\\W*\\)\\|\\W\\w+\\)" 
    "Regexp used by `subword-backward-internal'.") 

或者,如果你想,只要,與大寫字母相同,就可以做到這一點:

(defvar subword-forward-regexp 
    "\\W*\\(\\([,[:upper:]]*\\(\\W\\)?\\)[[:lower:][:digit:]]*\\)" 
    "Regexp used by `subword-forward-internal'.") 

(defvar subword-backward-regexp 
    "\\(\\(\\W\\|[[:lower:][:digit:]]\\)\\([,[:upper:]]+\\W*\\)\\|\\W\\w+\\)" 
    "Regexp used by `subword-backward-internal'.") 

如果這仍然不是你想要的,那麼試着解釋你想要的更好一點。例如,你沒有給出一個例子 - 既不是積極的(應該停在這裏)也不是消極的(不應該在這裏停止)。你讓那些試圖幫助你猜測的人比他們應該做的更多,這是不高效的。

+0

對不起,讓我試着澄清一下自己。總的來說,通過「劃界」,我的意思是我想改變正則表達式,以便它們停止附加字符,例如符號,parens等。就單詞/非單詞差異而言,我應該更改我想停止對字符字符的字符? – mellowmaroon

+0

「停止」是什麼意思?如果你想要一個字符不被認爲是一個字或子字的一部分,那麼給它一個非字的語法。 例如,如果您希望將其作爲啓動子字的字符處理,例如,大寫的情況下,請按照如何在當前子字代碼中處理'[:upper:]' - 例如,讓正則表達式做的任何'[:上:]'或你的字符等 – Drew

+0

我已經添加額外的信息,原來的職位,只是需要我想要的結果。對於「停止」,我打算讓子字詞的功能發揮作用,以便除了首都之外,這個點將「停止」,或者移動到我想的字符,例如parens,引號,以及行的開始和結尾。文字內的字母。 – mellowmaroon