Sublinha em nomes de variáveis e no f90-mode do Emacs

3

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.

    
por xebtl 05.06.2014 / 14:53

1 resposta

1

Uma solução é usar 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"))

Modifique forward-word , backword-word , left-word e right-word .

    
por 20.07.2014 / 13:29

Tags