将字符定义为单词边界



我已经定义了字符,使其在乳胶模式下表现为单词成分,我对结果非常满意。唯一困扰我的是像alphabeta这样的序列被视为单个单词(当然,这是预期的行为(。

有没有办法让 emacs 将特定字符解释为单词"starter"?这样,它将始终被视为其后面的单词的一部分,但永远不会被视为其前面的单词的一部分。

为清楚起见,下面是一个示例:

alphabeta
^          ^
1          2

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

我怎样才能做到这一点?

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

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

M-x find-library RET subword RET

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

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

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

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

编辑 2:从 Emacs 24.3(目前是候选版本(开始,子字模式通过新的 subword-forward-regexpsubword-backward-regexp 变量(用于简单的修改(以及 subword-forward-functionsubword-backward-function 变量(用于更复杂的修改(来促进这一点。

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

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

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

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

以下内容(只是实验(很接近,但 2 处M-<backspace>只会删除"beta",而不是前面的"\"。

我想你可以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 "." ?\)))))

最新更新