Editando o Fortran no Emacs com f90-mode , eu gostaria que os "comandos de palavra" M-b , M-f , M-d , M-DEL e assim por diante agissem em "palavras" como separados por sublinhados. Por outro lado, para o realce de sintaxe, comandos como C-M-f e assim por diante, os sublinhados obviamente não devem separar identificadores.
subword-mode parcialmente faz isso: M-f e M-d agem como eu quero, mas M-b e M-DEL ainda tratam o identificador todo como uma palavra. Para ilustrar: se o ponto for depois de some_thing , M-b ( subword-backward ) irá movê-lo para s ; depois disso, M-f ( subword-forward ) irá se mover para _ .
Em f90-mode , _ tem classe de sintaxe "w" (word). Se eu alterá-lo para "_" (símbolo) ou "." (pontuação), obtenho o comportamento desejado, mas, em seguida, some_thing também será duas palavras para bloqueio de fonte e conclusão. Por exemplo, program my_prog; end será preenchido apenas para end my e write_me será incorretamente marcado ( write como uma palavra-chave).
Como obtenho as duas coisas ao mesmo tempo?
PS: Este é o GNU Emacs 24.
EDIT: Aqui está o código completo que acabei usando, com base na resposta de cadriais (obrigado!)
(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)))
Adicionei let para não alterar a sintaxe permanentemente e usei ad-add-advice para poder colocá-la em loop.