2011-11-09 7 views
8

emacsのESS/Stataモードは、演算子で終わる行に続く行を間違ってインデントします。これらの行を複数行のコマンドとして誤って解釈しているようです。例えばESS/Stataで望ましくないEMACSタブ動作を修正しました

gen foo = 1 

/* generate another variable */ 
    gen bar = 1 

線 "GENバー= 1" は、インデントされるべきではありません。 EMACSはコメント内の末尾のスラッシュを演算子として解釈し、このコード行が2行に及ぶと考えているようです。

実際、stataの複数行のコマンドには3つの末尾のスラッシュがあり、3つの末尾のスラッシュのない改行はステートメントの終わりを示します。例えば次の字下げは正しいでしょう:

gen bar = 1 
gen /// 
    foo = 1 

この動作を修正するために私の.emacsに入れることができるものはありますか?私は完全に自動タブを放棄したくありません - これは/ *このように見えるコメント以外のすべてに対してはうまく動作します* /。

おかげで、

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にコピーしましたが、動作は変わりません。私の* Messages *バッファにエラーや何も明白ではありません。診断の手助けをするために私ができることは何ですか? – pnj

+0

再定義された関数にドキュメント文字列を追加すると、 'C-h f-ess-continue-statement-p'がロードされていることを確認できます。 doc-stringが表示されない場合、変更されたコードは評価されません。これは、間違ったモードが引用されているなど、 'eval-after-load'コマンドで何かが実行されていることを示します。上記のdoc-stringを追加します。 – Tyler

関連する問題