2013-02-14 4 views
3

Emacs Lisp (또는 Lisp에 대해서는 아무 것도 모르겠습니다.) 나는 매우 단순 해 보이는 것을하고 싶지만, 온라인 가이드에는 운이 없다. .packet 파일에 대해 "packet-mode.el"을 만들고 싶습니다. Emacs에서 새 모드 만들기

(define-derived-mode packet-mode fundamental-mode 
    (font-lock-add-keywords 'c++-mode `(("packet" . font-lock-keyword-face))) 
    (c++-mode)) 

    (add-to-list 'auto-mode-alist '("\\.packet\\'" . packet-mode) 
    (provide 'packet-mode) 

가 나는 또한 순서를 전환 시도했습니다 변경 C++ 모드의 나머지 부분을 유지하면서,

  • 는 C를 사용 ++ 모드
  • packet 키워드를 확인 : 나는 다음을 수행 할 명령문은 패킷 모드이지만 C++ 강조 표시는 중단됩니다.

    나는

    packet foo { 
        int bar; 
    } 
    

    structpacket 대신에 사용 된 경우 일 것 같은 방법을 강조한다는 의미에서 struct처럼 행동하는 packet을하고 싶습니다.

    (defvar packet-mode-font-lock-keywords 
        '(("\\<packet\\>" . font-lock-keyword-face))) 
    (define-derived-mode packet-mode c++-mode "Packet" 
        "A major mode to edit GNU ld script files." 
        (font-lock-add-keywords nil packet-mode-font-lock-keywords)) 
    (add-to-list 'auto-mode-alist '("\\.packet\\'" . packet-mode)) 
    (provide 'packet-mode) 
    

    장소 packet-mode.el을 디렉토리로 load-path 및 에 (선택적으로) 컴파일 바이트 : 여기

+4

왜 'C++ - mode'에서 직접 파생되지 않습니까? – Thomas

+0

@ 토마스, 어떻게해야할지 모르겠다. 위의 코드를 예제를 통해 복사 할 수 있습니다. 스 니펫을 주시겠습니까? – Nick

+1

'C-h f define-derived-mode'를 시도하여 코드가 실제로하는 일을 좀 더 잘 이해하십시오. – Thomas

답변

7

packet-mode.el에 투입해야 할 것입니다.

이제 .emacs.el(require 'packet-mode)을 추가하십시오.

+3

'font-lock-add-keywords'를 모드 정의 내에서 mode 인수로'nil'을 사용하는 것이 더 낫습니다 :'(define-derived-mode-mode-C++-mode "패킷" -add-keywords nil '(("packet". font-lock-keyword-face))))' – Stefan

+0

@ 스 테판 : 왜? 그것도 그렇게 작동합니다. 나는 그것이 이맥스 소스 전체에서 최상위 레벨에서 끝난 것을 보았다. – sds

+0

@sds "emacs 전체"와 같은 어설 션을 만들 때 몇 가지 예를 들어야합니다. @ Stefan의 이유 중 100 %가 아니지만 'font-lock-add-keywords'문서는 자신의 길은 더 이상 파생 된 모드에서 작동한다고 제안하지만 그렇지 않습니다. –

관련 문제