变量名和 Emacs `f90-mode` 中的下划线

变量名和 Emacs `f90-mode` 中的下划线

在 Emacs 中使用 编辑 Fortran f90-mode,我希望“单词命令” M-bM-fM-dM-DEL作用于由下划线分隔的“单词”。另一方面,对于语法高亮、诸如C-M-f等命令,下划线显然不能分隔标识符。

subword-mode部分地做到了这一点:M-fM-d按照我想要的方式行事,但M-b仍然M-DEL对待所有的标识符作为一个单词。举例说明:如果点在 后some_thingM-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-wordbackword-wordleft-word、 和right-word

相关内容