2011-11-09 19 views
8

Emac'lerdeki ESS/Stata modu, operatörler arasında biten satırları takip eden satırları hatalı olarak girintiler. Bu satırları çok satırlı komutlar olarak yanlış yorumluyor gibi görünüyor. Örneğinİstenmeyen EMACS sekme davranışı, ESS/Stata'da düzeltildi

:

gen foo = 1 

/* generate another variable */ 
    gen bar = 1 

hattı "gen bar = 1" girintili olmamalıdır. Görünüşe göre, EMACS, yorumdaki izleyen çizgiyi bir operatör olarak yorumluyor ve bu kod satırının iki satırı kapsadığını düşünüyor.

Aslında, Stata içinde satırlı komutlar açıklamada sonunu göstermektedir 3 arka eğik çizgiler olmayan 3 arka eğik ve yeni satır bulunmaktadır. Örneğin. Aşağıdaki girinti doğru olacaktır: Ben bu davranışı düzeltmek için benim .emacs koyabilirsiniz şey

gen bar = 1 
gen /// 
    foo = 1 

var mı? Otomatik sekmeyi tamamen vazgeçmek istemiyorum -/* bunun gibi görünen yorumlar hariç her şey için çok iyi çalışıyor * /.

sayesinde

PNJ

cevap

5

Haklısın, ESS hat devamında bir göstergesi olarak sondaki / yorumlar. Bu, kodu yeniden yazmanız gereken davranışı değiştirmek için ess-continued-statement-p işlevine kodlanmıştır. Aşağıdaki kod (sizin için .emacs) örnekleriniz için çalışır.

(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) temiz alternatif burada olabilir. – jfs

+0

Tyler, Kodunuzu .emac'lere kopyaladım, ancak davranış değişmedi. * Mesajlar * tamponunda hiçbir hata veya açık bir şey yok. Tanıya yardımcı olmak için yapabileceğim başka öneriler veya şeyler var mı? – pnj

+0

Yeniden tanımlanmış işleve bir doc-string eklerseniz, 'C-h f ess-continue-statement-p' ile yüklendiğini kontrol edebilirsiniz. Doküman dizini görmüyorsanız, değiştirilen kod değerlendirilmiyor. Bu, yanlış modda belirtildiği gibi, 'load-after-load' komutuyla çalıştırılan bir şeyin var olduğunu gösterir. Yukarıdaki bir doc-string ekleyeceğim. – Tyler