Emacs變數名和 Emacs
變數名和 Emacs f90-mode
中的下劃線
在 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"
(單詞)。如果我將其更改為"_"
(symbol) 或"."
(punctuation),我會得到所需的行為,但隨後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)))
我添加了 a
let
以免永久更改語法,並且曾經ad-add-advice
能夠將其放入循環中。
一種解決方案是使用 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
。