2010-03-02 2 views

답변

24

체크 아웃 도서관 fic-mode.el은, 그것은 C에서 검증 된 ++ 및 이맥스 리스프.

이 질문에 대답하기 위해 특별히 작성되었습니다. 여러 모드에 추가 할 수있는 쉬운 방법을 요청 않았다

(require 'fic-mode) 
(add-hook 'c++-mode-hook 'turn-on-fic-mode) 

Wei Hu하지만, 그래서 여기 간다 :

설치는 표준 패키지처럼

(defun add-something-to-mode-hooks (mode-list something) 
    "helper function to add a callback to multiple hooks" 
    (dolist (mode mode-list) 
    (add-hook (intern (concat (symbol-name mode) "-mode-hook")) something))) 

(add-something-to-mode-hooks '(c++ tcl emacs-lisp) 'turn-on-fic-mode) 
+0

좋은 일, 고마워! 이렇게 간단한 코드로 어떻게이 작업을 해결할 수 있었는지 간단히 설명해 주시겠습니까? 또한 모드 훅을 하나씩 추가하는 대신 모든 활성화 된 모드를 정의하는 데 사용할 수있는 사용자 정의 가능한 변수'fic-modes '를 갖는 것이 좋습니다. –

+1

@WeiHu 아주 작은 코드로 어떻게 해결 되었는가에 관해서는 코드를 읽는 것만으로 가치가 있습니다. font-lock은 문제를 해결할 수있는 풍부한 프레임 워크를 제공합니다. 실제 키는 하이라이트 할 문자열을 결정하는 루틴 (정규 표현식과 반대)을 호출하는 폰트 잠금 설정을 사용하는 것이 었습니다 ("fic-search-for-keyword"가 될 것입니다). 문자열이 주석/문자열에 있음을 나타냅니다. –

+0

그래서 문자열과 주석이 특별한 글꼴을 사용한다는 사실을 이용하고 있습니다. 가양 성이있을 수 있습니까? –

3

상당히 까다 롭습니다. 픽스 메 모드에서는 font-lock을 사용하여 강조 표시를하므로 키워드를 강조 표시하기 위해 유형별로 작동합니다. 글꼴 잠금은 매우 낮은 수준에서 후크합니다. 기본적으로 모든 변경 후에 버퍼의 내용이 실행됩니다. 그것은 현대 컴퓨터에서 즉각적으로 나타날 수 있도록 고도로 최적화되어 있습니다.

왼쪽 가장자리의 TODO 표시기는 고정되어 있습니다. 함수를 실행하면 현재 TODO가 모두 강조 표시됩니다. 버퍼를 변경 (TODO 추가 또는 제거)하면 프린지 인디케이터가 변경되지 않습니다. 함수가 다시 실행될 때만 변경됩니다.

접근법은 구문 표에 들어가야합니다. 먼저 주석을 작성한 다음 키워드를 찾으십시오. 까다로운 부분은 대화식으로 (즉, 입력 할 때) 이렇게하는 것입니다. 이 작업을 수행하려면 font-lock 구문을 사용할 수 있어야하지만 주석 구문 표를 검색 한 다음 키워드에 대해 제공하는 함수는 버퍼가 변경 될 때마다 실행되므로 매우 효율적입니다. 변경된 지역에서만 실행됩니다.) 이 모든 것을 font-lock-keywords이 아닌 font-lock-syntactic-keywords에 채우기를 원할 것입니다. 구문 패스가 키워드 전달 전에 발생하기 전에 구문 키워드 패스가 발생하고 주석 자체가 설정되기 전에 주석 내에 TODO를 설정해야하기 때문입니다.

+0

와우. 그건 내가 생각했던 것보다 훨씬 까다 롭다. –

+0

생각보다 쉽고 까다 롭습니다. 전체 폰트 잠금 고리와 결합은 그다지 어렵지는 않지만, 어려운 점이 있습니다. 왜냐하면 여러분이 코멘트에 있는지 알아내는 것이 정말 까다 롭기 때문입니다. 적어도 나는 지금까지 그것을 이해할 수 없었다. 그래서 코드 예는 아직 없습니다 ..... –

2

미안해 전체 작업 코드 답이 아니다는 ..... 어쩌면이 도움이 될 것입니다 CC-모드에서 FN c-in-literal 및 CSHARP 모드에서 비슷한 csharp-in-literal이있다. 반환 값은 C 스타일의 주석 인 경우 이고, C 타입의 주석 인 경우 c++ 인 경우 스타일 주석입니다. 원하는 코드를 얻으려면 코드에 Emacs :TODO indicator at left side 을 추가하면됩니다.

(defun annotate-todo() 
    "put fringe marker on TODO: lines in the curent buffer" 
    (interactive) 
    (let (lit) 
    (save-excursion 
    (goto-char (point-min)) 
    (while (re-search-forward "TODO:" nil t) 
     (progn 
     (setq lit (c-in-literal)) ;; or csharp-in-literal 
     (if (or (eq lit 'c) (eq lit 'c++)) 
      (let ((overlay (make-overlay (- (point) 5) (point)))) 
       (overlay-put overlay 'before-string 
          (propertize "A" 
             'display 
             '(left-fringe ;; right 
             horizontal-bar 
             better-fringes-important-bitmap)))))))))) 
+0

답해 주셔서 감사합니다. @Joe가 말했듯이, FixmeMode가 개선 된 답변을 정말 좋아할 것입니다. FixmeMode가 형식 기반으로 작동하기 때문입니다. –

+0

그래, 그건 의미가있다.측면에서 볼 때, 이미 화면에있는 것을 강조하는 것이 소스 코드에서 FIXME의 대략적인 위치를 시각적으로 표시하는 것만 큼 유용하지는 않습니다. 시각적 인 diff 도구는 컴파일 오류를 표시하는 Eclipse와 마찬가지로 Visual Studio에서도 마찬가지입니다. 나는 그것에 대해 개별적으로 물었다 : http://stackoverflow.com/questions/2348679/emacs-todo-indicator-on-left-fringe-has-a-strange-side-effect-deleting-charact – Cheeso