2011-11-09 74 views
8

emacs中的ESS/Stata模式錯誤地縮進緊跟在操作符後面的行後面的行。它似乎錯誤地將這些行解釋爲多行命令。修復ESS/Stata中令人討厭的EMACS標籤行爲

例如:

gen foo = 1 

/* generate another variable */ 
    gen bar = 1 

線 「根棒= 1」 不應被縮進。它看起來像EMACS解釋註釋中作爲操作符的尾部斜槓,並認爲這行代碼跨越兩行。

實際上,stata中的多行命令有3個尾部斜線,而沒有3個尾部斜槓的換行符表示語句結束。例如下面的縮進將是正確的:

gen bar = 1 
gen /// 
    foo = 1 

有什麼我可以放在我的.emacs來糾正這種行爲?我不想完全放棄自動Tab鍵 - 除了/ *看起來像這樣的* /以外的所有內容,它都可以很好地工作。

感謝,

PNJ

回答

5

你說得對,ESS解釋後/作爲續行的指示。這是硬編碼到功能ess-continued-statement-p,所以要修改你必須重寫代碼的行爲。以下代碼(在您的.emacs中)適用於您的示例。

(eval-after-load 'ess-mode 
    '(defun ess-continued-statement-p() 
    "this is modified code" 
    (let ((eol (point))) 
     (save-excursion 
     (cond ((memq (preceding-char) '(nil ?\, ?\; ?\} ?\{ ?\])) 
       nil) 
       ;; ((bolp)) 
       ((= (preceding-char) ?\)) 
       (forward-sexp -2) 
       (looking-at "if\\b[ \t]*(\\|function\\b[ \t]*(\\|for\\b[ \t]*(\\|while\\b[ \t]*(")) 
       ((progn (forward-sexp -1) 
         (and (looking-at "else\\b\\|repeat\\b") 
          (not (looking-at "else\\s_\\|repeat\\s_")))) 
       (skip-chars-backward " \t") 
       (or (bolp) 
        (= (preceding-char) ?\;))) 
       (t 
       (progn (goto-char eol) 
         (skip-chars-backward " \t") 
         (or (and (> (current-column) 1) 
           (save-excursion (backward-char 1) 

     ;;;; Modified code starts here: ;;;; 
               (or (looking-at "[-:+*><=]") 
                (and (looking-at "/") 
                 (save-excursion (backward-char 1) 
                     (not (looking-at "*"))))))) 
     ;;;; End of modified code ;;;; 

          (and (> (current-column) 3) 
           (progn (backward-char 3) 
             (looking-at "%[^ \t]%"))))))))))) 
+0

['defadvice'](http://www.gnu.org/software/emacs/elisp/html_node/Advising-Functions.html)可能是這裏更清潔的替代。 – jfs

+0

泰勒,我將你的代碼複製到我的.emacs中,但行爲沒有改變。我的*消息*緩衝區中沒有錯誤或任何明顯的錯誤。任何進一步的建議或我可以做的事情來幫助診斷? – pnj

+0

如果將doc-string添加到重新定義的函數中,則可以檢查它是否已用「C-h f ess-continued-statement-p」加載。如果您沒有看到文檔字符串,則修改後的代碼不會被評估。這表明有些東西是用'eval-after-load'命令運行的,比如引用了錯誤的模式。我將在上面添加一個文檔字符串。 – Tyler