2013-06-15 6 views
5

snakemake ist ein Python-ähnlicher Ersatz für make, der mehr auf Workflows als auf Kompilierung ausgerichtet ist. Es ist ziemlich nett, aber auch ziemlich neu, und ich finde keinen Modus dafür in Emacs. Ich möchte nur etwas sehr einfach: Eine sehr leichte Modifikation von Grundmoden, so dass ich in das Emacs-Handbuch durchlesen, begann ich folgend in init.el:Emacs-Modus für Snakemake?

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

wie Marke, ist snakemake streng über Einzüge (tatsächliche Tab "\ t" Zeichen, nicht wie Emacs standardmäßig verhält, wenn man TAB eingibt). Wenn ich stattdessen "C-q TAB" eintrage, wird ein echtes Tab-Zeichen in den Puffer geschrieben: das funktioniert, ich habe es mit einem Snakefile im Grundmodus versucht und es läuft perfekt. Um also nicht jedesmal "C-q TAB" eingeben zu müssen, wenn ich ein TAB in diesem Modus möchte, besteht die erste Hinzufügung, die ich zum Snake-Modus machen möchte, darin, die TAB-Taste an "C-q TAB" (oder etwas Ähnliches) neu zu binden. So las ich das Handbuch Emacs und versucht:

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

aber diese und andere Alternativen arbeiten nicht ... vielleicht rebinding Standardtasten wie der TAB-Taste wird nicht empfohlen?

die andere neben den Schlange-Modus Ich mag würde es Syntax markieren Python nach (aber nicht haben keinen Python Verhalten, zB Python Einrücken Verhalten)

Zum Schluss nur diese 2 Einfache Änderungen am fundamental-Modus beim Erstellen eines "Snake-Modus" und eine Möglichkeit, auch Snake-Modus aufzurufen, wenn der Dateiname "Snakefile" ist, war alles was ich suchte, aber ich habe schon mehrere Stunden damit verbracht, das Emacs Handbuch zu lesen etwas googeln, und es scheint, ich bin nicht einmal in der Nähe. Das ist so einfach und ich bin mir ziemlich sicher, dass es möglich ist; irgendein Rat?

Dank

Murray

Antwort

4

Die folgende (etwas elegant, glaube ich ... zumindest gut es kurz ist) kludge funktioniert der Trick für jetzt. Es tut in der Tat die beiden Dinge, die ich für bat, dh (1) erneut bindet die TAB-Taste (auf eine nette Art), und (2) tut Syntax-Hervorhebung nach Python (plus es geht nur in diesen Modus, wenn die Datei aufgerufen wird „Snakefile“, das ist schön), und damit beantwortet diese meine Frage

; 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 

Wie elegant das ist, ist, ich bin sicher, zur Debatte. Und es ist nur ein Anfang auf einer Reise für einen richtigen Modus für snakemake (das Hervorhebung für snakemake spezifische Wörter wie "Regel" und "Ausgabe:" usw.)

+0

Ein kleines Addendum zu dieser "Lösung": die Funktion "Einfügen-Tab" ist bereits in Emacs definiert, also sollte man lieber (defn snake-tab() ... oder einen anderen Namen, der nicht schon drin ist der Namespace – user2489449

1

Die define-derived-mode Makro stellt automatisch eine keymap nach dem Modus genannt es definiert. Sie können das mit define-key verwenden gemeinsam die TAB Schlüssel einfach zu machen, eine Registerkarte wie folgt einfügen:

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

Alternativ können Sie den Einzug Mechanismus des Modus so einstellen, dass sie auf intelligente Weise eine Zeileneinzüge durch ein Einfügen (single) TAB am Anfang der Zeile, wenn dies angebracht ist. Auf diese Weise müssen Sie nicht erneut TAB binden, obwohl es natürlich viel schwieriger ist, intelligentes Einrücken richtig als das einfache Rebind eines Schlüssels zu implementieren. Siehe die Antwort von Lunaryorn für weitere Informationen.

1

Tun Sie dies nicht. Es ist nicht so, wie große Modi den Einzug behandeln sollen. Sie sollten nie TAB binden, siehe C-h v indent-line-function:

Funktion zum Einrücken der aktuellen Zeile. Diese Funktion wird ohne Argumente aufgerufen. Wenn es irgendwo aufgerufen wird, wo die automatische Einrückung nicht möglich ist (z. B. innerhalb einer Zeichenfolge), sollte die Funktion einfach "noindent" zurückgeben. Wenn Sie diese Funktion einstellen, müssen Sie TAB entsprechend einrücken. Binden Sie TAB nicht erneut, es sei denn, Sie müssen es wirklich.

Es wird sowieso nicht funktionieren, weil Sie keine Tastenbindungen an andere Tastenbindungen binden können.

Stattdessen legen indent-tabs-mode zu t in Ihrer Mode-Funktion, Emacs Verwendung Tabulatoren für Einzug zu machen, und setzen indent-line-function Puffer-lokal zu einer Funktion, die Einzüge entsprechend den Regeln der Sprache nach. Sie müssen diese Funktion natürlich selbst schreiben.

Verwandte Themen