2013-06-15 3 views
5

snakemake는 컴파일보다는 워크 플로우에 초점을 맞춘 파이썬과 같은 대체품입니다. 그것은 꽤 좋지만 또한 꽤 새로운데, Emacs에서이 모드를 찾지 못하는 것 같습니다. 난 그냥 아주 간단한 무언가 원하는 : 이맥스 설명서를 숙독에서 기본 모드에서 아주 약간의 수정, 그래서를, 나는 init.el에 다음과 같은 시작 : 메이크업과 같은snakemake 용 emacs 모드?

(define-derived-mode snake-mode fundamental-mode 
    ... 
) 

, snakemake 실제 (들여 쓰기에 대한 엄격한 탭 "\ t"문자가 아니라, 이맥스가 TAB 입력시 기본적으로 어떻게 작동하는지). 대신 "C-q TAB"을 입력하면 버퍼에 실제 탭 문자가 저장됩니다.이 방법은 기본 모드에서 Snakefile을 사용하여 시도했지만 완벽하게 실행됩니다. 따라서이 모드에서 TAB을 원할 때마다 "C-q TAB"을 입력하지 않으려면 뱀 모드를 만들기 위해 Tab 키를 "C-q TAB"(또는 이와 비슷한 것)로 리바 인딩해야합니다. 그래서 이맥스 설명서를 숙독하고 시도 :

(define-derived-mode snake-mode fundamental-mode 
    (global-set-key (kbd "\t") (kbd "C-q \t")) 
    ... 
) 

하지만 다른 대안이 작동하지 않습니다 ... 어쩌면 권장 연습 Tab 키와 같은 표준 키를하지 않는 리 바인딩?

싶습니다 뱀 모드로 다른 추가는 파이썬에 따라 구문 강조 (그러나 하지 어떤 파이썬 행동, 예를 들어, 파이썬 들여 쓰기 행동이) 단지, 이러한 2

는 결론을위한 "뱀 모드 (snake-mode)"를 만드는 기본 모드와 파일 이름이 "Snakefile"인 경우 뱀 모드를 호출하는 간단한 수정 방법을 찾고 있었지만 이미 이맥스 매뉴얼을 숙독하는 데 몇 시간을 소비했습니다. 인터넷 검색을하고있어, 내가 가까이 있지 않은 것 같아. 이것은 매우 간단하며 가능하다고 확신합니다. 어떤 충고?

감사

머레이는

답변

4

다음 (어느 정도 우아한, 나는 생각한다. .. 최소한 그것은 꽤 짧다) kludge는 지금 당장 트릭을한다. 그것은 실제로 내가 원하는 두 가지를합니다. 즉, (1) TAB 키를 좋은 방식으로 리바 인딩합니다. (2) 파이썬에 따라 구문 강조를합니다 (게다가 파일이 호출 될 때만이 모드로 이동합니다 좋은 "Snakefile은"), 따라서 이것은 내가 최대 논쟁, 확신,이 얼마나 우아한 내 질문에

; snake-mode 
(add-to-list 'auto-mode-alist '("Snakefile" . snake-mode)) 

(defun insert-tab() 
    (interactive) 
    (insert "  ")) ; a "real" tab, i.e., what "C-q \t" would give 

(define-minor-mode snake-mode 
    "Snakemake." 
    :lighter " snake-make" 
    (python-mode) 
    (setq indent-line-function 'insert-tab) 
) 

; how to hard-code "\t" to a "real" tab (not recommended) 
; (global-set-key "\t" `insert-tab) 

; end snake-mode 

응답입니다. 그리고 snakemake에 대한 적절한 모드 ("규칙"및 "출력 :"등과 같은 snakemake 특정 단어를 강조 표시)에 대한 여행 시작일뿐입니다.

+0

이 "솔루션"에 대한 약간의 추가 정보 : "삽입 탭"기능은 이미 emacs에 정의되어 있으므로 (defun snake-tab() ... 또는 이미없는 다른 이름 네임 스페이스 – user2489449

1

매크로 define-derived-mode는 자동으로 정의 모드의 이름을 따서 명명 키맵을 제공합니다. 당신은 단순히이 같은 탭 삽입 TAB 키를 만들기 위해 define-key과 함께 그것을 사용할 수 있습니다 : 그것은 지능적를 삽입하여 줄을 들여 쓰기 때문에 다른 방법

(define-derived-mode snake-mode fundamental-mode "Snake" 
    "A mode for Python's snakemake." 
    (define-key snake-mode-map "\t" 'self-insert-command)) 

을, 당신은 당신의 모드의 들여 쓰기 메커니즘을 설정할 수 있습니다 라인이 시작될 때마다 (싱글) TAB을 입력하십시오. 그런 식으로 다시 바인딩 할 필요가 없습니다 TAB 물론 지능형 들여 쓰기를 올바르게 구현하는 것이 키를 리바 인딩하는 것보다 훨씬 어렵습니다. 자세한 내용은 lunaryorn의 답변을 참조하십시오.

1

하지 마십시오. 주요 모드가 들여 쓰기를 처리하는 방식이 아닙니다. 그들은 TAB을 리바 인드해서는 안됩니다. C-h v indent-line-function :

현재 줄을 들여 쓰는 기능. 이 함수는 인수없이 호출됩니다. 자동 들여 쓰기를 수행 할 수없는 곳 (예 : 문자열 내부)에서 을 호출하면 함수는 단순히 'noindent'를 반환해야합니다. 이 기능을 설정하면 TAB 들여 쓰기를 적절하게 만들 수 있습니다. 정말로 필요하지 않으면 TAB을 리 바인드하지 마십시오.

키 바인딩을 다른 키 바인딩에 바인딩 할 수 없기 때문에 어쨌든 작동하지 않습니다.

대신, 들여 쓰기 이맥스 사용 탭 문자를하려면 모드 기능에 tindent-tabs-mode를 설정하고, 들여 쓰기가 적절하게 언어의 규칙에 따라 기능, indent-line-function 버퍼 로컬로 설정합니다. 분명히이 함수를 직접 작성해야합니다.