Emacs

變數名和 Emacs f90-mode 中的下劃線

  • July 23, 2014

在 Emacs 中使用 編輯 Fortran ,f90-mode我希望“單詞命令” M-b、、、M-f等作用於由下劃線分隔的“單詞”。另一方面,對於語法高亮、類似命令等,下劃線顯然不能分隔標識符。M-d``M-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"(單詞)。如果我將其更改為"_"(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)))

我添加了 alet以免永久更改語法,並且曾經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-wordbackword-wordleft-wordright-word

引用自:https://unix.stackexchange.com/questions/134637