2012-05-04 38 views
5

我已經定義了\字符在乳膠模式下表現爲單詞組成,我對結果非常滿意。唯一困擾我的是像\alpha\beta這樣的序列被當作一個單詞(這當然是預期的行爲)。將字符定義爲單詞邊界

有沒有辦法讓emacs將一個特定的字符解釋爲單詞「starter」?這種方式總是被視爲跟隨它的單詞的一部分,但從來沒有在它之前的單詞的一部分。

爲了清楚起見,這裏有一個例子:

\alpha\beta 
^  ^
1   2 

如果點在1,我按M-d,字符串「\阿爾法」應該被殺死。 如果點在2,並且我按M-<backspace>,則應該殺死字符串「\ beta」。

我該如何做到這一點?

回答

3

另一種思考:
你的要求是非常喜歡什麼subword-mode提供了駝峯。

您無法自定義子字模式的行爲 - 正則表達式是硬編碼的 - 但您肯定可以複製該庫並對其進行修改。

M-Xfind-libraryRETsubwordRET

這大概是一個非常強大的解決方案。

編輯:從註釋更新,如提示:

爲了記錄在案,改變[[:upper:]]每個實例[\\\\[:upper:]]在功能subword-forward-internalsubword-backward-internal內subword.el的偉大工程=)(只要因爲「\」被定義爲「w」語法)。

個人而言,我會更傾向於使圖書館的副本不是直接編輯它,除非爲使現有的圖書館多一點的通用,爲此,最簡單的解決辦法似乎是目的將這些正則表達式轉換爲變量 - 之後,爲了這種目的而使用緩衝區本地修改版本將是微不足道的。

編輯2:作爲Emacs的24.3的(現爲release candidate),子字模式有利於這與新subword-forward-regexpsubword-backward-regexp變量(簡單的修改),並且subword-forward-functionsubword-backward-function變量(用於更復雜的修飾)。

通過使乳膠模式中的緩衝區局部變量具有所需的值,您可以直接使用子字模式。

+0

是的,我一直在想如果subword模式可能有任何幫助。我會檢查出正則表達式。 – Malabarba

+0

實際上,如果設法讓'\\'被視爲大寫字母,_subword-mode_會爲我做剩下的事情。我認爲這是在*語法屬性*中配置的,但我還不確定。 – Malabarba

+0

不錯的想法,但它看起來對我來說就好像你不能有一個大寫字母而沒有指定它的小寫變體? (我正在查看'(elisp)字符串和字符'下的'Case Tables'和'Case Conversion',以及'(elisp)中的'[:upper:]'和'[:lower:]' Char)。 – phils

2

你應該能夠實現這種利用語法文本屬性:

M-:(info "(elisp) Syntax Properties")RET

編輯:其實,我不知道,如果你能準確地做這個?

以下(這只是試驗)是接近的,但M-<backspace>在2將只會刪除「測試版」,而不是前面的「\」。

我想你可以將backward-kill-word重新映射爲一個函數,該函數檢查前面的「\」並殺死它。相當黑客,但如果沒有更清晰的解決方案,它可能會訣竅。

我以前沒有玩過此功能;也許別人可以澄清。

(modify-syntax-entry ?\\ "w") 
(setq parse-sexp-lookup-properties t) 
(setq syntax-propertize-function 'my-propertize-syntax) 
(defun my-propertize-syntax (start end) 
    "Set custom syntax properties." 
    (save-excursion 
    (goto-char start) 
    (while (re-search-forward "\\w\\\\" end t) 
     (put-text-property 
     (1- (point)) (point) 'syntax-table (cons "." ?\\)))))