5

我已经将\角色定义为在 Latex 模式下作为单词成分,我对结果非常满意。唯一困扰我的是序列 like\alpha\beta被视为一个单词(当然,这是预期的行为)。

有没有办法让emacs将特定字符解释为单词“starter”?这样,它总是被认为是它后面的单词的一部分,而不是它前面的单词的一部分。

为了清楚起见,这里有一个例子:

\alpha\beta
^          ^
1          2

如果该点在1并且我按下M-d,则字符串 "\alpha" 应该被杀死。如果该点在2并且我按下M-<backspace>,则字符串 "\beta" 应该被杀死。

我怎样才能做到这一点?

4

2 回答 2

3

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

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

M-x find-library RET subword RET

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

编辑:根据建议更新评论:

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

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

编辑 2:从 Emacs 24.3(目前是一个候选版本)开始,subword-mode 使用新的subword-forward-regexpsubword-backward-regexp变量(用于简单修改)和subword-forward-functionsubword-backward-function变量(用于更复杂的修改)促进了这一点。

通过使这些正则表达式变量在 Latex 模式下具有所需值的局部缓冲区,您可以直接使用 subword-mode。

于 2012-05-04T13:20:02.227 回答
2

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

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

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

以下(只是实验)很接近,但M-<backspace>在 2 处只会删除“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 "." ?\\)))))
于 2012-05-04T03:06:41.990 回答