2011-11-09 5 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에 넣을 수있는 것이 있습니까? 자동 탭핑을 완전히 포기하고 싶지는 않습니다. */* */*처럼 보이는 주석을 제외하고는 모두 잘 작동합니다.

감사합니다,

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

re-defined 함수에 doc-string을 추가하면,'C -h f-ess-continue-statement-p'가로드되었는지 확인할 수 있습니다. doc 문자열이 표시되지 않으면 수정 된 코드가 평가되지 않습니다. 그것은 잘못된 모드가 인용되는 것과 같이'eval-after-load' 명령으로 실행되는 무언가가 있음을 나타냅니다. 위의 문서 문자열을 추가하겠습니다. – Tyler