2012-05-04 36 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 "." ?\\)))))