将字符定义为单词边界

时间:2012-05-04 02:51:46

标签: emacs syntax

我已经将\字符定义为乳胶模式中的单词成分,我对结果非常满意。唯一困扰我的是像\alpha\beta这样的序列被视为一个单词(当然是预期的行为)。

有没有办法让emacs将特定字符解释为单词“starter”?通过这种方式,它始终被认为是跟随它的单词的一部分,但从不是它之前的单词的一部分。

为清楚起见,这是一个例子:

\alpha\beta
^          ^
1          2

如果该点位于1并按M-d,则应删除字符串“\ alpha”。 如果该点位于2并按M-<backspace>,则应删除字符串“\ beta”。

我如何实现这一目标?

2 个答案:

答案 0 :(得分:3)

另一个想法:
您的要求非常类似于subword-mode为camelCase提供的内容。

您无法自定义子字体模式的行为 - 正则表达式是硬编码的 - 但您当然可以复制该库并根据您的目的对其进行修改。

M-x find-library RET subword RET

这可能是一个非常强大的解决方案。

修改:根据建议更新评论:

  

对于记录,在subword.el中的函数[[:upper:]][\\\\[:upper:]]中将subword-forward-internal的每个实例更改为subword-backward-internal效果很好=)(只要“\” “被定义为”w“语法)。

就个人而言,我更倾向于制作库的副本,而不是直接编辑它,除非为了使现有的库更具通用性,最简单的解决方案似乎是移动那些正则表达式。变量 - 在此之后,为此类目的使用缓冲区本地修改版本将是微不足道的。

编辑2:从Emacs 24.3开始(目前为release candidate),子词模式通过新的subword-forward-regexpsubword-backward-regexp变量实现了这一点(简单来说)修改),以及subword-forward-functionsubword-backward-function变量(用于更复杂的修改)。

通过在乳胶模式下使用所需的值使这些正则表达式变量缓冲局部化,您可以直接使用子字模式。

答案 1 :(得分:2)

您应该能够使用语法文本属性来实现它:

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

编辑:实际上,我不确定你是否可以做到这一点?

以下(仅仅是实验)很接近,但{2}的M-<backspace>只会删除“beta”,而不会删除前面的“\”。

我想你可以将backward-kill-word重新映射到一个检查前面“\”的函数并将其杀死。非常hacky,但如果没有更清洁的解决方案,它可能会成功。

之前我没有玩过这个功能;也许其他人可以澄清。

(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 "." ?\\)))))
相关问题