Geben Sie die Shell-Variante in den lokalen Emacs-Variablen für die Datei an

964
bignose

Wie kann ich die Shell-Variante für eine Datei in den lokalen Emacs-Variablen dieser Datei angeben, wenn die Datei kein eigenständiges Programm ist?

In Emacs kann ich angeben, dass eine Shell-Include-Datei im shModus geöffnet werden soll, indem in den Editorhinweisen eine lokale Variable festgelegt wird:

# Local variables: # coding: utf-8 # mode: sh # End: # vim: fileencoding=utf-8 filetype=bash : 

Ich kann für Vim angeben, dass die Shell-Variante der Datei speziell Bash ist, und sie befolgt den Editorhinweis, um die Bash-Syntax hervorzuheben. Emacs hat jedoch einen shModus, der alle Schalenvarianten abdeckt.

Emacs interpretiert eine solche Datei richtig, wenn sie eine Shebang-Linie hat (zB #! /bin/bash). Einige Dateien sind jedoch keine eigenständigen Programme, daher möchte ich nicht, dass diese Dateien eine Shebang-Zeile haben.

Der Emacs- shModus behandelt diese Dateien als Posix-Shell-Syntax, was sie jedoch nicht sind. shModus hat das Konzept einer "Variante" der Shell-Syntax. Ich kann jedoch nicht herausfinden, wie man im Editor-Editor der Datei festlegt, welche Variante für die Datei verwendet werden soll.

Wie kann ich die Editor-Hinweise in der Datei festlegen, um Emacs mitzuteilen, dass seine Syntax Bash ist?

Update 2014-04-24: Ich habe den Fehler # 17333 von Emacs für dieses fehlende Verhalten gemeldet .

3
Der Fehlerbericht von bignose (http://debbugs.gnu.org/cgi/bugreport.cgi?bug=17333) wurde behoben. In der nächsten Emacs-Version (vermutlich 24.5) wird dies wirklich so einfach wie das Festlegen von "sh-shell" als dateilokale Variable. Yay! Bis dahin funktioniert [meine Antwort unten] (http://superuser.com/a/743456/66748) wirklich, ohne eine explizite Shebang-Linie hinzuzufügen (ungeachtet des anfänglichen Eindrucks von bignose). Ben Liblit vor 10 Jahren 0
Der Fix zum Bugnose-Fehlerbericht wird in Emacs 25.1 angezeigt. In der Datei `NEWS` heißt es:„ Im sh-Modus können Sie jetzt `sh-shell` als dateilokale Variable verwenden, um den verwendeten Shell-Typ (` bash`, `csh` usw.) anzugeben. Ben Liblit vor 8 Jahren 0

1 Antwort auf die Frage

2
Ben Liblit

Wenn Sie sich den sh-modeCode anschauen, scheint es, als hätte jemand beabsichtigt, dies durch Setzen sh-shelloder vielleicht sh-shell-fileals dateilokale Variable zuzulassen . Weder funktioniert aber tatsächlich. Bitte überlegen Sie in diesem Fall einen Fehlerbericht an den sh-modeBetreuer. Es scheint wirklich so, als sollte es so einfach sein wie das Hinzufügen sh-shell: bashzu Ihrem Datei-lokalen Variablenblock, und das war vielleicht sogar die ursprüngliche Absicht, aber es funktioniert einfach nicht.

Was funktioniert, ist eines der folgenden:

  1. Benennen Sie Ihre Datei mit einem Ende .bash.

  2. Fügen Sie eval: (sh-set-shell "bash")Ihrem Datei-lokalen Variablenblock hinzu. Standardmäßig zeigt Emacs eine Warnung an, dass dies möglicherweise unsicherer Code ist, der jedoch deaktiviert werden kann.

Ich habe einen Fehlerbericht eingereicht, danke. bignose vor 10 Jahren 1
Der Befehl "sh-set-shell" führt das Falsche aus: Er * fügt * eine Shebang-Zeile zu einer Datei hinzu, die speziell keine haben sollte. bignose vor 10 Jahren 0
"sh-set-shell" fügt nur eine Shebang-Linie hinzu, wenn es interaktiv aufgerufen wird oder mit einem dritten Argument, das nicht "nil" ist. Wenn er wie oben vorgeschlagen angerufen wird, fügt er keine Shebang-Linie hinzu. Probieren Sie es aus und überzeugen Sie sich selbst. Ben Liblit vor 10 Jahren 0