在 Emacs 中使用 编辑 Fortran f90-mode
,我希望“单词命令” M-b
、M-f
、M-d
等M-DEL
作用于由下划线分隔的“单词”。另一方面,对于语法高亮、诸如C-M-f
等命令,下划线显然不能分隔标识符。
subword-mode
部分地做到了这一点:M-f
并M-d
按照我想要的方式行事,但M-b
仍然M-DEL
对待所有的标识符作为一个单词。举例说明:如果点在 后some_thing
,M-b
( subword-backward
) 会将其移动到s
;之后,M-f
( subword-forward
) 会将点移至_
。
在 中f90-mode
,_
有语法类"w"
(单词)。如果我将其更改为"_"
(符号)或"."
(标点符号),我会得到所需的行为,但随后some_thing
也将是两个单词的字体锁定和完成。例如,program my_prog; end
只会完成end my
,并且write_me
会被错误地字体化(write
作为关键字)。
我如何同时获得这两件事?
PS:这是 GNU Emacs 24。
编辑:这是我最终使用的完整代码,建立在 cadrians 答案的基础上(谢谢!)
(let ((adv (cons 'advice
(lambda ()
(let ((os (char-syntax ?_)))
(modify-syntax-entry ?_ "_")
ad-do-it
(modify-syntax-entry ?_ (string os))))))
(fun '(subword-forward subword-kill subword-backward
subword-backward-kill subword-downcase subword-upcase
subword-transpose)))
(dolist (f fun)
(ad-add-advice f (list 'underscore-wrap nil t adv)
'around 'last)
(ad-activate f)))
我添加了一个let
以免永久更改语法,并且过去可以ad-add-advice
将其放入循环中。
答案1
一种解决方案是使用 defadvice:
(defadvice forward-word (around eif-forward-word activate)
"forward-word, with the underscore not being a letter"
(interactive "p")
(modify-syntax-entry ?_ "_")
ad-do-it
(modify-syntax-entry ?_ "w"))
修改forward-word
、backword-word
、left-word
、 和right-word
。