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.